skyline 1 gadu atpakaļ
vecāks
revīzija
9538d1494d

+ 19 - 19
admin-web/src/views/admin/index.vue

@@ -45,9 +45,9 @@
 
 
             <div class="trend-summary">
-              总实付服务费:
+              总收益金额:
               <el-tag type="success">{{ u.fmt.fmtMoney(state.homeOneExtra.payServiceAmount) }}元</el-tag>
-              总量:
+              总订单数量:
               <el-tag type="danger">{{ state.homeOneExtra.totalPower }}Kwh</el-tag>
             </div>
           </div>
@@ -108,7 +108,7 @@ const state = reactive({
     {
       num1: '0',
       num2: '-12.32',
-      num3: '今日洗车用电量(kwh)',
+      num3: '今日注册会员数(人)',
       num4: 'fa fa-meetup',
       color1: '#FF6462',
       color2: '--next-color-primary-lighter',
@@ -117,7 +117,7 @@ const state = reactive({
     {
       num1: '0',
       num2: '-12.32',
-      num3: '今日洗车用水量(m³)',
+      num3: '今日收益金额(元)',
       num4: 'fa fa-meetup',
       color1: '#FF6462',
       color2: '--next-color-primary-lighter',
@@ -126,7 +126,7 @@ const state = reactive({
     {
       num1: '0',
       num2: '+42.32',
-      num3: '今日订单总金额(元)',
+      num3: '今日洗车消费总金额(元)',
       num4: 'iconfont icon-ditu',
       color1: '#6690F9',
       color2: '--next-color-success-lighter',
@@ -135,7 +135,7 @@ const state = reactive({
     {
       num1: '0',
       num2: '-10.01',
-      num3: '今日实付总服务费(元)',
+      num3: '订单平均消费金额(元)',
       num4: 'fa fa-github-alt',
       color1: '#FF6462',
       color2: '--next-color-danger-lighter',
@@ -144,7 +144,7 @@ const state = reactive({
     {
       num1: '0',
       num2: '-10.01',
-      num3: '今日洗车人数',
+      num3: '今日订单数量(笔)',
       num4: 'fa fa-github-alt',
       color1: '#FF6462',
       color2: '--next-color-danger-lighter',
@@ -153,7 +153,7 @@ const state = reactive({
     {
       num1: '0',
       num2: '-10.01',
-      num3: '今日洗车订单数(笔)',
+      num3: '洗车平均时长(分钟)',
       num4: 'fa fa-github-alt',
       color1: '#FF6462',
       color2: '--next-color-danger-lighter',
@@ -336,7 +336,7 @@ const initPieChart = (dataMap: any) => {
   const option = {
     backgroundColor: state.charts.bgColor,
     title: {
-      text: '洗车站电桩状态',
+      text: '洗车设备状态',
       x: 'left',
       textStyle: {fontSize: '15', color: state.charts.color},
     },
@@ -424,7 +424,7 @@ const initEchartsResize = () => {
 };
 
 const loadCurrentEquipmentStatus = () => {
-  $get(`connector/statConnectorStatus`, {stationId: state.currentStationId}).then((res: any) => {
+  $get(`stat/washDeviceStatus`, {stationId: state.currentStationId}).then((res: any) => {
     //console.log(res)
     initPieChart(res || {});
   })
@@ -435,7 +435,7 @@ const loadStationStat = () => {
   let start = state.dateRange[0]
   let end = state.dateRange[1]
   let size = u.date.diff(new Date(start), new Date(end)) + 1;
-  $post(`stat/dashboard`, {
+  $post(`stat/trend`, {
     startTime: start,
     endTime: end,
     type: 'day',
@@ -449,16 +449,16 @@ const loadStationStat = () => {
 }
 
 const loadStationStatToday = () => {
-  $get(`stat/stationTodayStat`, {stationId: state.currentStationId}).then((res: any) => {
+  $get(`stat/dashboard`, {stationId: state.currentStationId}).then((res: any) => {
     //console.log(res)
     if (!u.isEmptyOrNull(res)) {
-      let {chargeUsers, totalOrders, totalPower, totalMoney, elecMoney, payServiceAmount} = res
-      state.homeOne[0].num1 = totalPower;
-      state.homeOne[1].num1 = u.fmt.fmtMoney(totalMoney);
-      state.homeOne[2].num1 = u.fmt.fmtMoney(elecMoney);
-      state.homeOne[3].num1 = u.fmt.fmtMoney(payServiceAmount);
-      state.homeOne[4].num1 = chargeUsers;
-      state.homeOne[5].num1 = totalOrders;
+      let {todayIncome, todayConsumptionAmount, todayRegisteredMembers, todayWashOrders, avgOrderPrice, avgOrderDuration} = res
+      state.homeOne[0].num1 = todayRegisteredMembers;
+      state.homeOne[1].num1 = u.fmt.fmtMoney(todayIncome);
+      state.homeOne[2].num1 = u.fmt.fmtMoney(todayConsumptionAmount);
+      state.homeOne[3].num1 = u.fmt.fmtMoney(avgOrderPrice);
+      state.homeOne[4].num1 = todayWashOrders;
+      state.homeOne[5].num1 = avgOrderDuration;
     }
 
   })

+ 36 - 6
car-wash-admin/src/main/java/com/kym/admin/controller/StatController.java

@@ -2,14 +2,15 @@ package com.kym.admin.controller;
 
 import com.kym.common.R;
 import com.kym.common.controller.IController;
+import com.kym.entity.queryParams.StatQueryParam;
 import com.kym.service.StatService;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 /**
  * 统计数据
+ *
+ * @author skyline
  */
 @RestController
 @RequestMapping("/stat")
@@ -21,9 +22,38 @@ public class StatController extends IController {
         this.statService = statService;
     }
 
-    @PostMapping("/dashboard")
-    public R<?> dashboard() {
-        return R.success(statService.dashboard());
+    /**
+     * 站点今日概要
+     *
+     * @param stationId
+     * @return
+     */
+    @GetMapping("/dashboard")
+    public R<?> dashboard(@RequestParam String stationId) {
+        return R.success(statService.dashboard(stationId));
+    }
+
+
+    /**
+     * 站点设备状态
+     *
+     * @param stationId
+     * @return
+     */
+    @GetMapping("/washDeviceStatus")
+    public R<?> washDeviceStatus(@RequestParam String stationId) {
+        return R.success(statService.washDeviceStatus(stationId));
+    }
+
+    /**
+     * 站点趋势数据
+     *
+     * @param params
+     * @return
+     */
+    @PostMapping("/trend")
+    public R<?> trend(@ModelAttribute StatQueryParam params) {
+        return R.success(statService.trend(params));
     }
 
 }

+ 0 - 35
car-wash-entity/src/main/java/com/kym/entity/queryParams/EquipmentQueryParam.java

@@ -1,35 +0,0 @@
-package com.kym.entity.queryParams;
-
-import com.kym.entity.common.PageParams;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author skyline
- * @description 充电桩查询参数
- * @date 2023-08-22 18:56
- */
-@Data
-public class EquipmentQueryParam extends PageParams {
-
-    /**
-     * 充电站id
-     */
-    private String stationId;
-
-    /**
-     * 充电桩id
-     */
-    private String equipmentId;
-
-    /**
-     * 充电枪id
-     */
-    private String connectorId;
-
-    /**
-     * 状态
-     */
-    private Integer status;
-}

+ 0 - 14
car-wash-entity/src/main/java/com/kym/entity/queryParams/OrderQueryParams.java

@@ -1,14 +0,0 @@
-package com.kym.entity.queryParams;
-
-import com.kym.entity.common.PageParams;
-import lombok.Data;
-
-/**
- * @author skyline
- * @description 订单查询
- * @date 2023-11-06 11:59
- */
-@Data
-public class OrderQueryParams extends PageParams {
-    private Integer invoiceStatus;
-}

+ 3 - 0
car-wash-entity/src/main/java/com/kym/entity/vo/DashboardVo.java

@@ -1,8 +1,11 @@
 package com.kym.entity.vo;
 
+import lombok.Data;
+
 /**
  * 数据看板
  */
+@Data
 public class DashboardVo {
     /**
      * 当日收益金额

+ 36 - 0
car-wash-entity/src/main/java/com/kym/entity/vo/StationTrendVo.java

@@ -0,0 +1,36 @@
+package com.kym.entity.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 站点数据趋势
+ */
+@Data
+public class StationTrendVo {
+    /**
+     * 统计时间
+     */
+    private LocalDateTime statTime;
+
+    /**
+     * 订单数量
+     */
+    private Integer totalOrders;
+
+    /**
+     * 订单总金额
+     */
+    private Integer totalAmount;
+
+    /**
+     * 订单应付总金额
+     */
+    private Integer amountReceivable;
+
+    /**
+     * 订单实收总金额
+     */
+    private Integer amountReceived;
+}

+ 6 - 0
car-wash-mapper/src/main/java/com/kym/mapper/WashOrderMapper.java

@@ -1,7 +1,12 @@
 package com.kym.mapper;
 
 import com.kym.entity.WashOrder;
+import com.kym.entity.queryParams.StatQueryParam;
+import com.kym.entity.vo.StationTrendVo;
 import com.kym.mapper.mybatisplus.MyBaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,5 @@ import com.kym.mapper.mybatisplus.MyBaseMapper;
  */
 public interface WashOrderMapper extends MyBaseMapper<WashOrder> {
 
+    List<StationTrendVo> StationTrend(@Param("params") StatQueryParam params);
 }

+ 48 - 0
car-wash-mapper/src/main/resources/mappers/WashOrderMapper.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.kym.mapper.WashOrderMapper">
+
+    <resultMap id="StationStatMap" type="com.kym.entity.vo.StationTrendVo">
+        <result column="stat_time" property="statTime"/>
+        <result column="total_orders" property="totalOrders"/>
+        <result column="total_amount" property="totalAmount"/>
+        <result column="amount_receivable" property="amountReceivable"/>
+        <result column="amount_received" property="amountReceived"/>
+
+    </resultMap>
+
+
+    <select id="StationTrend" resultMap="StationStatMap" parameterType="com.kym.entity.queryParams.StatQueryParam">
+        SELECT
+        <if test="params.stationIds != null and params.stationId != ''">
+            t1.station_id,
+        </if>
+        DATE_FORMAT(t1.start_time, '%Y-%m-%d') stat_time,
+        count(t1.id) total_orders,
+        SUM(t1.amount) total_amount,
+        SUM(t1.amount_receivable) amount_receivable,
+        SUM(t1.amount_received) amount_received
+        FROM
+        (SELECT
+        *
+        FROM
+        t_wash_order
+        <where>
+            <if test="params.stationId != null and params.stationId != ''">
+                and station_id = #{params.stationId}
+            </if>
+        </where>
+        ) t1
+        GROUP BY stat_time
+        <trim prefix="having" suffixOverrides="and">
+            <if test="params.startTime != null">
+                stat_time &gt;= #{params.startTime} and
+            </if>
+            <if test="params.endTime != null">
+                stat_time &lt;= #{params.endTime} and
+            </if>
+        </trim>
+        order by stat_time desc
+    </select>
+
+</mapper>

+ 13 - 1
car-wash-service/src/main/java/com/kym/service/StatService.java

@@ -1,7 +1,10 @@
 package com.kym.service;
 
+import com.kym.entity.queryParams.StatQueryParam;
 import com.kym.entity.vo.DashboardVo;
+import com.kym.entity.vo.StationTrendVo;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -11,20 +14,29 @@ public interface StatService {
 
     // 实时指标
     Map<String, Integer> getTodayConsumption();
+
     Map<String, Integer> getTodayRegistrations();
 
     // 缓存指标(5分钟刷新)
     Map<String, Integer> getMonthConsumption();
+
     Integer getMonthRegistrations();
 
     // 历史指标(每日预计算)
     Integer getTotalConsumption();
+
     Integer getTotalRegistrations();
 
     // 复合指标
     Integer getAvgPrice();
+
     Integer getAvgDuration();
+
     Double getAvgFrequency();
 
-    DashboardVo dashboard();
+    DashboardVo dashboard(String stationId);
+
+    Map<String, Long> washDeviceStatus(String stationId);
+
+    List<StationTrendVo> trend(StatQueryParam params);
 }

+ 7 - 2
car-wash-service/src/main/java/com/kym/service/WashOrderService.java

@@ -1,14 +1,17 @@
 package com.kym.service;
 
+import com.kym.entity.WashOrder;
 import com.kym.entity.common.PageBean;
 import com.kym.entity.common.PageParams;
-import com.kym.entity.WashOrder;
 import com.kym.entity.queryParams.DeviceQueryParams;
+import com.kym.entity.queryParams.StatQueryParam;
 import com.kym.entity.queryParams.WashOrderQueryParams;
+import com.kym.entity.vo.StationTrendVo;
 import com.kym.entity.vo.WashOrderVo;
 import com.kym.service.mybatisplus.MyBaseService;
 
 import java.time.LocalDate;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -33,7 +36,7 @@ public interface WashOrderService extends MyBaseService<WashOrder> {
 
     Object detail(long id);
 
-    Map<String,Integer> sumAmountByDate(LocalDate statDay);
+    Map<String, Integer> sumAmountByDate(LocalDate statDay);
 
     Map<String, Integer> sumMonthAmount(LocalDate statDay);
 
@@ -42,4 +45,6 @@ public interface WashOrderService extends MyBaseService<WashOrder> {
     Map<String, Integer> countMonthOrdersCount(LocalDate statDay);
 
     WashOrder getOrderInProgressByUserId(long userId);
+
+    List<StationTrendVo> stationTrend(StatQueryParam params);
 }

+ 74 - 3
car-wash-service/src/main/java/com/kym/service/impl/StatServiceImpl.java

@@ -1,17 +1,28 @@
 package com.kym.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.pagehelper.PageHelper;
+import com.kym.common.utils.CommUtil;
+import com.kym.entity.WashDevice;
 import com.kym.entity.WashOrder;
+import com.kym.entity.queryParams.StatQueryParam;
 import com.kym.entity.vo.DashboardVo;
+import com.kym.entity.vo.StationTrendVo;
 import com.kym.service.StatService;
 import com.kym.service.UserService;
+import com.kym.service.WashDeviceService;
 import com.kym.service.WashOrderService;
+import com.kym.service.cache.KymCache;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.TemporalAdjusters;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 
 /**
@@ -20,10 +31,14 @@ import java.util.Map;
 @Service
 public class StatServiceImpl implements StatService {
     private final UserService userService;
-    private WashOrderService washOrderService;
+    private final WashOrderService washOrderService;
 
-    public StatServiceImpl(UserService userService) {
+    private final WashDeviceService washDeviceService;
+
+    public StatServiceImpl(UserService userService, WashOrderService washOrderService, WashDeviceService washDeviceService) {
         this.userService = userService;
+        this.washOrderService = washOrderService;
+        this.washDeviceService = washDeviceService;
     }
 
     @Override
@@ -109,9 +124,65 @@ public class StatServiceImpl implements StatService {
         return users == 0 ? 0 : (double) Math.round((double) list.size() / users * 100) / 100;
     }
 
+    /**
+     * 今日概要
+     *
+     * @return
+     */
     @Override
-    public DashboardVo dashboard() {
+    public DashboardVo dashboard(String stationId) {
+        // 截止到现在今日的所有洗车订单
+        var todayOrders = washOrderService.lambdaQuery()
+                .eq(WashOrder::getStationId, stationId)
+                .lt(WashOrder::getStartTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN))
+                .list();
+
+        // 概要
         DashboardVo dashboardVo = new DashboardVo();
+        dashboardVo.setTodayIncome(todayOrders.stream().mapToInt(WashOrder::getAmount).sum());
+        dashboardVo.setMonthIncome(0); // todo
+        dashboardVo.setTotalIncome(0); // todo
+        dashboardVo.setTodayConsumptionAmount(todayOrders.stream().mapToInt(WashOrder::getAmount).sum());
+        dashboardVo.setMonthConsumptionAmount(0); // todo
+        dashboardVo.setTotalConsumptionAmount(0); // todo
+        dashboardVo.setTodayRegisteredMembers(9); //todo
+        dashboardVo.setMonthRegisteredMembers(0); //todo
+        dashboardVo.setTodayWashOrders(todayOrders.size());
+        dashboardVo.setMonthWashOrders(0); // todo
+        dashboardVo.setTotalWashOrders(0); // todo
+        dashboardVo.setAvgOrderPrice(0); // todo
+        dashboardVo.setAvgOrderDuration(0); // todo
+        dashboardVo.setAvgWashFrequency(0.0); // todo
+
         return dashboardVo;
     }
+
+
+    /**
+     * 统计站点的设备状态情况
+     *
+     * @param stationId
+     * @return
+     */
+    @Override
+    public Map<String, Long> washDeviceStatus(String stationId) {
+        return washDeviceService.lambdaQuery().eq(WashDevice::getStationId, stationId).list()
+                .stream().collect((Collectors.groupingBy(WashDevice::getState, Collectors.counting())));
+    }
+
+    @Override
+    public List<StationTrendVo> trend(StatQueryParam params) {
+        // 判断数据权限
+        var adminStationIds = KymCache.INSTANCE.getAdminUserStationIds(StpUtil.getLoginIdAsLong());
+        if (CommUtil.isEmptyOrNull(params.getStationId()) && CommUtil.isNotEmptyAndNull(adminStationIds)) {
+            params.setStationId(adminStationIds.get(0));
+        }
+        if (CommUtil.isNotEmptyAndNull(params.getStationId()) && CommUtil.isNotEmptyAndNull(adminStationIds) && !adminStationIds.contains(params.getStationId())) {
+            params.setStationId(adminStationIds.get(0));
+        }
+
+
+
+        return washOrderService.stationTrend(params);
+    }
 }

+ 7 - 0
car-wash-service/src/main/java/com/kym/service/impl/WashOrderServiceImpl.java

@@ -15,7 +15,9 @@ import com.kym.entity.WashOrder;
 import com.kym.entity.common.PageBean;
 import com.kym.entity.common.PageParams;
 import com.kym.entity.queryParams.DeviceQueryParams;
+import com.kym.entity.queryParams.StatQueryParam;
 import com.kym.entity.queryParams.WashOrderQueryParams;
+import com.kym.entity.vo.StationTrendVo;
 import com.kym.entity.vo.WashOrderVo;
 import com.kym.mapper.WashOrderMapper;
 import com.kym.service.AccountService;
@@ -273,5 +275,10 @@ public class WashOrderServiceImpl extends MyBaseServiceImpl<WashOrderMapper, Was
                 .eq(WashOrder::getPayStatus, WashOrder.PAY_STATUS_未支付)
                 .one();
     }
+
+    @Override
+    public List<StationTrendVo> stationTrend(StatQueryParam params) {
+        return baseMapper.StationTrend(params);
+    }
     //endregion
 }