skyline 1 vuosi sitten
vanhempi
säilyke
c24dbbe445

+ 19 - 5
car-wash-admin/src/main/java/com/kym/admin/jobs/StatJob.java

@@ -9,6 +9,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDate;
+import java.util.ArrayList;
 
 /**
  * 数据统计定时任务
@@ -36,11 +37,24 @@ public class StatJob {
     @Scheduled(cron = "0 30 0 * * ?")
     public void generateDailyStat() {
         LocalDate yesterday = LocalDate.now().minusDays(1);
-        DailyStat stat = new DailyStat();
-        stat.setConsumption(washOrderService.sumAmountByDate(yesterday));
-        stat.setRegistrations(userService.countByDailyRegister(yesterday));
-        stat.setOrdersCount(washOrderService.countOrdersCountByDate(yesterday));
-        dailyStatService.save(stat);
+
+        // todo 总收入,跨店收入,跨店支出等(从分账表来)
+        var amountMap = washOrderService.sumMonthAmount(yesterday);
+        var registerMap = userService.countByDailyRegister(yesterday);
+        var ordersCount = washOrderService.countOrdersCountByDate(yesterday);
+
+        var statList = new ArrayList<DailyStat>();
+
+        amountMap.forEach((k, v) -> {
+            DailyStat stat = new DailyStat();
+            stat.setStatDate(yesterday);
+            stat.setStationId(k);
+            stat.setConsumption(v);
+            stat.setRegistrations(registerMap.getOrDefault(k, 0));
+            stat.setOrdersCount(ordersCount.getOrDefault(k, 0));
+            statList.add(stat);
+        });
+        dailyStatService.saveBatch(statList);
     }
 
 }

+ 21 - 3
car-wash-entity/src/main/java/com/kym/entity/DailyStat.java

@@ -1,12 +1,11 @@
 package com.kym.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.kym.entity.BaseEntity;
-import java.io.Serializable;
-import java.time.LocalDate;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.time.LocalDate;
+
 /**
  * <p>
  * 日统计表
@@ -27,6 +26,25 @@ public class DailyStat extends BaseEntity {
      */
     private LocalDate statDate;
 
+    /**
+     * 站点id
+     */
+    private String stationId;
+
+    /**
+     * 总收入(分)
+     */
+    private Integer totalIncome;
+
+    /**
+     * 跨店收入(分)
+     */
+    private Integer crossIncome;
+
+    /**
+     * 跨店支出(分)
+     */
+    private Integer crossExpend;
     /**
      * 消费金额(分)
      */

+ 5 - 0
car-wash-entity/src/main/java/com/kym/entity/DeviceRelation.java

@@ -36,6 +36,11 @@ public class DeviceRelation extends BaseEntity {
      */
     private String shortId;
 
+    /**
+     * 工位序号名称:①号工位
+     */
+    private String seqName;
+
     /**
      * 产品key
      */

+ 1 - 0
car-wash-entity/src/main/java/com/kym/entity/common/RedisKeys.java

@@ -18,6 +18,7 @@ public interface RedisKeys {
     String SHORT_ID_TO_PRODUCT_KEY_AND_DEVICE_NAME = "SHORT_ID_TO_PRODUCT_KEY_AND_DEVICE_NAME:";
     String STATION_ID_TO_INVESTOR_ADMIN_USER_ID = "STATION_ID_TO_INVESTOR_ADMIN_USER_ID:";
     String USER_ID_TO_STATION_ID = "USER_ID_TO_STATION_ID:";
+    String SHORT_ID_TO_SEQ_NAME = "SHORT_ID_TO_SEQ_NAME:";
 
     // =======================================洗车======================================
 

+ 4 - 2
car-wash-entity/src/main/java/com/kym/entity/vo/WashDeviceVo.java

@@ -4,8 +4,6 @@ import com.kym.entity.BaseEntity;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
-import java.time.LocalDateTime;
-
 /**
  * 洗车设备
  *
@@ -38,6 +36,10 @@ public class WashDeviceVo extends BaseEntity {
      * 站点编号
      */
     private String shortId;
+    /**
+     * 工位编号
+     */
+    private String seqName;
 
     /**
      * 功能

+ 4 - 6
car-wash-service/src/main/java/com/kym/service/StatService.java

@@ -1,10 +1,8 @@
 package com.kym.service;
 
-import com.kym.common.R;
 import com.kym.entity.vo.DashboardVo;
 
-import java.math.BigDecimal;
-import java.time.Duration;
+import java.util.Map;
 
 /**
  * 统计
@@ -12,11 +10,11 @@ import java.time.Duration;
 public interface StatService {
 
     // 实时指标
-    Integer getTodayConsumption();
-    Integer getTodayRegistrations();
+    Map<String, Integer> getTodayConsumption();
+    Map<String, Integer> getTodayRegistrations();
 
     // 缓存指标(5分钟刷新)
-    Integer getMonthConsumption();
+    Map<String, Integer> getMonthConsumption();
     Integer getMonthRegistrations();
 
     // 历史指标(每日预计算)

+ 5 - 4
car-wash-service/src/main/java/com/kym/service/UserService.java

@@ -2,14 +2,15 @@ package com.kym.service;
 
 import com.github.yulichang.base.MPJBaseService;
 import com.kym.common.R;
-import com.kym.entity.queryParams.CommonQueryParam;
-import com.kym.entity.vo.CustomUserVo;
-import com.kym.entity.common.PageBean;
 import com.kym.entity.User;
+import com.kym.entity.common.PageBean;
+import com.kym.entity.queryParams.CommonQueryParam;
 import com.kym.entity.queryParams.WxLoginParams;
+import com.kym.entity.vo.CustomUserVo;
 import com.kym.entity.vo.UserVo;
 
 import java.time.LocalDate;
+import java.util.Map;
 
 /**
  * <p>
@@ -31,7 +32,7 @@ public interface UserService extends MPJBaseService<User> {
 
     PageBean<CustomUserVo> listCustomUser(CommonQueryParam params);
 
-    Integer countByDailyRegister(LocalDate statDay);
+    Map<String, Integer> countByDailyRegister(LocalDate statDay);
 
     Integer countMonthRegister(LocalDate statDay);
 }

+ 5 - 4
car-wash-service/src/main/java/com/kym/service/WashOrderService.java

@@ -9,6 +9,7 @@ import com.kym.entity.vo.WashOrderVo;
 import com.kym.service.mybatisplus.MyBaseService;
 
 import java.time.LocalDate;
+import java.util.Map;
 
 /**
  * <p>
@@ -32,12 +33,12 @@ public interface WashOrderService extends MyBaseService<WashOrder> {
 
     Object detail(long id);
 
-    Integer sumAmountByDate(LocalDate statDay);
+    Map<String,Integer> sumAmountByDate(LocalDate statDay);
 
-    Integer sumMonthAmount(LocalDate statDay);
+    Map<String, Integer> sumMonthAmount(LocalDate statDay);
 
-    Integer countOrdersCountByDate(LocalDate statDay);
+    Map<String, Integer> countOrdersCountByDate(LocalDate statDay);
 
-    Integer countMonthOrdersCount(LocalDate statDay);
+    Map<String, Integer> countMonthOrdersCount(LocalDate statDay);
 
 }

+ 7 - 0
car-wash-service/src/main/java/com/kym/service/cache/KymCache.java

@@ -172,6 +172,13 @@ public enum KymCache {
         return SHORT_ID_TO_PRODUCT_KEY_AND_DEVICE_NAME_MAPPING.entrySet().stream().filter(entry -> (productKey + "," + deviceName).equals(entry.getValue())).map(Map.Entry::getKey).findFirst().get();
     }
 
+    public void putShortId2SeqName(Map<String, String> map) {
+        map.forEach((k, v) -> KymCacheInjector.redisTemplate.opsForValue().set(RedisKeys.SHORT_ID_TO_SEQ_NAME + k, v));
+    }
+    public String getSeqNameByShortId(String shortId) {
+        return KymCacheInjector.redisTemplate.opsForValue().get(RedisKeys.SHORT_ID_TO_SEQ_NAME + shortId);
+    }
+
 
     @Component
     public static class KymCacheInjector {

+ 2 - 0
car-wash-service/src/main/java/com/kym/service/impl/DeviceRelationServiceImpl.java

@@ -28,6 +28,8 @@ public class DeviceRelationServiceImpl extends MyBaseServiceImpl<DeviceRelationM
             KymCache.INSTANCE.putWashShortId2ProductKeyAndDeviceName(Map.of(item.getShortId(), item.getProductKey() + "," + item.getDeviceName()));
             // shortId和stationId的对应关系
             KymCache.INSTANCE.putShortId2StationId(Map.of(item.getShortId(), item.getStationId()));
+            // shortId和seqName的对应关系
+            KymCache.INSTANCE.putShortId2SeqName(Map.of(item.getShortId(), item.getSeqName()));
         });
     }
 

+ 9 - 6
car-wash-service/src/main/java/com/kym/service/impl/StatServiceImpl.java

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
 import java.time.LocalDate;
 import java.time.LocalTime;
 import java.time.temporal.TemporalAdjusters;
+import java.util.Map;
 
 
 /**
@@ -26,17 +27,17 @@ public class StatServiceImpl implements StatService {
     }
 
     @Override
-    public Integer getTodayConsumption() {
+    public Map<String, Integer> getTodayConsumption() {
         return washOrderService.sumAmountByDate(LocalDate.now());
     }
 
     @Override
-    public Integer getTodayRegistrations() {
+    public Map<String, Integer> getTodayRegistrations() {
         return userService.countByDailyRegister(LocalDate.now());
     }
 
     @Override
-    public Integer getMonthConsumption() {
+    public Map<String, Integer> getMonthConsumption() {
         return washOrderService.sumMonthAmount(LocalDate.now());
     }
 
@@ -62,9 +63,11 @@ public class StatServiceImpl implements StatService {
      */
     @Override
     public Integer getAvgPrice() {
-        int totalAmount = washOrderService.sumMonthAmount(LocalDate.now());
-        int totalOrders = washOrderService.countMonthOrdersCount(LocalDate.now());
-        return totalOrders == 0 ? 0 : totalAmount / totalOrders;
+//        int totalAmountMap = washOrderService.sumMonthAmount(LocalDate.now());
+//        int totalOrdersMap = washOrderService.countMonthOrdersCount(LocalDate.now());
+//        // todo 按照站点 分组统计
+//        return totalOrders == 0 ? 0 : totalAmount / totalOrders;
+        return null;
     }
 
     /**

+ 3 - 2
car-wash-service/src/main/java/com/kym/service/impl/UserServiceImpl.java

@@ -291,11 +291,12 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
      * @return
      */
     @Override
-    public Integer countByDailyRegister(LocalDate statDay) {
+    public Map<String, Integer> countByDailyRegister(LocalDate statDay) {
         LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
         wrapper.ge(User::getCreateTime, LocalDateTime.of(statDay, LocalTime.MIN));
         wrapper.gt(User::getCreateTime, LocalDateTime.of(statDay, LocalTime.MAX));
-        return (int) count(wrapper);
+        // 按照站点分组统计订单数量
+        return list(wrapper).stream().collect(Collectors.groupingBy(User::getStationId, Collectors.summingInt(o -> 1)));
     }
 
     /**

+ 3 - 2
car-wash-service/src/main/java/com/kym/service/impl/WashDeviceServiceImpl.java

@@ -3,14 +3,14 @@ package com.kym.service.impl;
 import cn.dev33.satoken.stp.StpUtil;
 import com.github.pagehelper.PageHelper;
 import com.kym.common.utils.CommUtil;
-import com.kym.entity.common.PageBean;
 import com.kym.entity.WashDevice;
+import com.kym.entity.common.PageBean;
 import com.kym.entity.queryParams.DeviceQueryParams;
 import com.kym.entity.vo.WashDeviceVo;
 import com.kym.mapper.WashDeviceMapper;
-import com.kym.service.cache.KymCache;
 import com.kym.service.WashDeviceService;
 import com.kym.service.WashOrderService;
+import com.kym.service.cache.KymCache;
 import com.kym.service.mybatisplus.MyBaseServiceImpl;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -57,6 +57,7 @@ public class WashDeviceServiceImpl extends MyBaseServiceImpl<WashDeviceMapper, W
             var vo = new WashDeviceVo().setCurrentUserId(currentUserId);
             BeanUtils.copyProperties(washDevice, vo);
             vo.setShortId(KymCache.INSTANCE.getShortIdByProductKeyAndDeviceName(washDevice.getProductKey(), washDevice.getDeviceName()));
+            vo.setSeqName(KymCache.INSTANCE.getSeqNameByShortId(vo.getShortId()));
             voList.add(vo);
         }
         return voList;

+ 16 - 8
car-wash-service/src/main/java/com/kym/service/impl/WashOrderServiceImpl.java

@@ -30,6 +30,8 @@ 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;
 
 /**
  * <p>
@@ -196,12 +198,14 @@ public class WashOrderServiceImpl extends MyBaseServiceImpl<WashOrderMapper, Was
      * @return
      */
     @Override
-    public Integer sumAmountByDate(LocalDate statDay) {
+    public Map<String, Integer> sumAmountByDate(LocalDate statDay) {
         LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
         wrapper.select(WashOrder::getAmount);
         wrapper.ge(WashOrder::getStartTime, LocalDateTime.of(statDay, LocalTime.MIN));
         wrapper.gt(WashOrder::getStartTime, LocalDateTime.of(statDay, LocalTime.MAX));
-        return list(wrapper).stream().mapToInt(WashOrder::getAmount).sum();
+        var list = list(wrapper);
+        // 按照站点分组统计金额
+        return list.stream().collect(Collectors.groupingBy(WashOrder::getStationId, Collectors.summingInt(WashOrder::getAmount)));
     }
 
     /**
@@ -211,14 +215,16 @@ public class WashOrderServiceImpl extends MyBaseServiceImpl<WashOrderMapper, Was
      * @return
      */
     @Override
-    public Integer sumMonthAmount(LocalDate statDay) {
+    public Map<String, Integer> sumMonthAmount(LocalDate statDay) {
         var startTime = statDay.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
         var endTime = statDay.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
         LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
         wrapper.select(WashOrder::getAmount);
         wrapper.ge(WashOrder::getStartTime, startTime);
         wrapper.gt(WashOrder::getStartTime, endTime);
-        return list(wrapper).stream().mapToInt(WashOrder::getAmount).sum();
+        var list = list(wrapper);
+        // 按照站点分组统计金额
+        return list.stream().collect(Collectors.groupingBy(WashOrder::getStationId, Collectors.summingInt(WashOrder::getAmount)));
     }
 
     /**
@@ -228,11 +234,12 @@ public class WashOrderServiceImpl extends MyBaseServiceImpl<WashOrderMapper, Was
      * @return
      */
     @Override
-    public Integer countOrdersCountByDate(LocalDate statDay) {
+    public Map<String, Integer> countOrdersCountByDate(LocalDate statDay) {
         LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
         wrapper.ge(WashOrder::getStartTime, LocalDateTime.of(statDay, LocalTime.MIN));
         wrapper.gt(WashOrder::getStartTime, LocalDateTime.of(statDay, LocalTime.MAX));
-        return (int) count(wrapper);
+        // 按照站点分组统计订单数量
+        return list(wrapper).stream().collect(Collectors.groupingBy(WashOrder::getStationId, Collectors.summingInt(o -> 1)));
     }
 
     /**
@@ -242,13 +249,14 @@ public class WashOrderServiceImpl extends MyBaseServiceImpl<WashOrderMapper, Was
      * @return
      */
     @Override
-    public Integer countMonthOrdersCount(LocalDate statDay) {
+    public Map<String, Integer> countMonthOrdersCount(LocalDate statDay) {
         var startTime = statDay.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
         var endTime = statDay.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
         LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
         wrapper.ge(WashOrder::getStartTime, startTime);
         wrapper.gt(WashOrder::getStartTime, endTime);
-        return (int) count(wrapper);
+        // 按照站点分组统计订单数量
+        return list(wrapper).stream().collect(Collectors.groupingBy(WashOrder::getStationId, Collectors.summingInt(o -> 1)));
     }
     //endregion
 }