فهرست منبع

【feat】【v3】
1.完善缓存调用逻辑
2.优化代码逻辑

ChenYL 10 ماه پیش
والد
کامیت
104fe0a7f9

+ 1 - 1
src/main/java/com/punchsettle/server/constant/CacheNameConstant.java

@@ -91,7 +91,7 @@ public class CacheNameConstant {
     /**
      * 任务统计数据
      */
-    public static final String TASK_STAT = "taskStat";
+    public static final String STAT_TASK = "taskStat";
 
     /**
      * 任务打卡记录

+ 1 - 1
src/main/java/com/punchsettle/server/constant/SettleResultEnum.java

@@ -13,7 +13,7 @@ import lombok.Getter;
 @AllArgsConstructor
 public enum SettleResultEnum {
 
-    SETTLE("已结算"),
+    SETTLED("已结算"),
     REVOKE_SETTLED("撤销结算"),
     NO_SETTLED("无需结算");
 

+ 0 - 50
src/main/java/com/punchsettle/server/pojo/punchIn/PiTaskHistoryStatVO.java

@@ -1,50 +0,0 @@
-package com.punchsettle.server.pojo.punchIn;
-
-import java.time.LocalTime;
-
-import com.punchsettle.server.constant.PunchInResultEnum;
-import com.punchsettle.server.constant.SettleResultEnum;
-
-import lombok.Data;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @date 2025/4/24 16:04
- * @description 打卡任务打卡记录统计 VO
- */
-@Data
-public class PiTaskHistoryStatVO {
-
-    /**
-     * 打卡日期
-     */
-    private String punchInDate;
-
-    /**
-     * 次数记录
-     */
-    private Integer countTrack;
-
-    /**
-     * 时间记录
-     */
-    private LocalTime timeTrack;
-
-    /**
-     * 打卡结果(DONE-完成,UNDONE-未完成)
-     * @see PunchInResultEnum
-     */
-    private PunchInResultEnum punchInResult;
-
-    /**
-     * 结算结果(未结算-UNSETTLED,已结算-SETTLED)
-     * @see SettleResultEnum
-     */
-    private SettleResultEnum settleResult;
-
-    /**
-     * 结算奖励积分
-     */
-    private Integer settlePoints;
-}

+ 12 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PiTaskHistoryVO.java

@@ -5,6 +5,7 @@ import java.time.LocalTime;
 import com.punchsettle.server.constant.PunchInMethodEnum;
 import com.punchsettle.server.constant.PunchInResultEnum;
 
+import com.punchsettle.server.constant.SettleResultEnum;
 import lombok.Data;
 
 /**
@@ -46,4 +47,15 @@ public class PiTaskHistoryVO {
      * @see PunchInResultEnum
      */
     private PunchInResultEnum punchInResult;
+
+    /**
+     * 结算状态
+     * @see SettleResultEnum
+     */
+    private SettleResultEnum settleResult;
+
+    /**
+     * 结算积分
+     */
+    private Integer settlePoints;
 }

+ 2 - 2
src/main/java/com/punchsettle/server/pojo/punchIn/PiTaskStatVO.java

@@ -51,9 +51,9 @@ public class PiTaskStatVO {
     private Integer points;
 
     /**
-     * 打卡任务打卡记录统计
+     * 打卡记录
      */
-    private List<PiTaskHistoryStatVO> piTaskHistoryStatVOS;
+    private List<PiTaskHistoryVO> piTaskHistoryVOS;
 
     /**
      * 折线图统计数据

+ 7 - 1
src/main/java/com/punchsettle/server/pojo/settle/SettleTaskRelaHistoryQuery.java

@@ -4,6 +4,7 @@ import com.punchsettle.server.constant.SettleResultEnum;
 import lombok.Data;
 
 import java.util.Collection;
+import java.util.List;
 
 /**
  * @author tyuio
@@ -43,5 +44,10 @@ public class SettleTaskRelaHistoryQuery {
      * 结算状态
      * @see SettleResultEnum
      */
-    private SettleResultEnum settleResult;
+    private List<SettleResultEnum> settleResults;
+
+    /**
+     * 任务唯一ID
+     */
+    private Long taskUniqueId;
 }

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/ucharts/LineSeriesVO.java

@@ -19,5 +19,5 @@ public class LineSeriesVO {
     /**
      * 数据
      */
-    private Integer[] data;
+    private Object[] data;
 }

+ 0 - 1
src/main/java/com/punchsettle/server/service/controller/PunchInController.java

@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.punchsettle.server.pojo.punchIn.PiTaskHistoryStatVO;
 import com.punchsettle.server.pojo.punchIn.PiTaskRequest;
 import com.punchsettle.server.pojo.punchIn.PiTaskSimpleVO;
 import com.punchsettle.server.pojo.punchIn.PiTaskStatQuery;

+ 0 - 1
src/main/java/com/punchsettle/server/service/manager/IPunchInManager.java

@@ -4,7 +4,6 @@ import java.util.List;
 
 import com.punchsettle.server.atomic.entity.PiTask;
 import com.punchsettle.server.atomic.entity.PiTaskHistory;
-import com.punchsettle.server.pojo.punchIn.PiTaskHistoryStatVO;
 import com.punchsettle.server.pojo.punchIn.PiTaskRequest;
 import com.punchsettle.server.pojo.punchIn.PiTaskSimpleVO;
 import com.punchsettle.server.pojo.punchIn.PiTaskStatQuery;

+ 3 - 0
src/main/java/com/punchsettle/server/service/manager/impl/AccountManagerImpl.java

@@ -132,6 +132,9 @@ public class AccountManagerImpl implements IAccountManager {
             addAccount.setPoints(0);
             addAccount.setAccountName(request.getAccountName());
             accountService.insert(addAccount);
+            // 清理缓存
+            clearCache(userId);
+
             return;
         }
 

+ 118 - 34
src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerImpl.java

@@ -1,8 +1,9 @@
 package com.punchsettle.server.service.manager.impl;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalTime;
-import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
@@ -13,6 +14,10 @@ import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import com.punchsettle.server.atomic.entity.SettleTaskRelaHistory;
+import com.punchsettle.server.atomic.service.ISettleTaskRelaHistoryService;
+import com.punchsettle.server.constant.SettleResultEnum;
+import com.punchsettle.server.pojo.settle.SettleTaskRelaHistoryQuery;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
@@ -45,7 +50,6 @@ import com.punchsettle.server.constant.StatPeriodEnum;
 import com.punchsettle.server.constant.VersionStatusEnum;
 import com.punchsettle.server.pojo.punchIn.PiTaskHistoryQuery;
 import com.punchsettle.server.pojo.punchIn.PiTaskHistorySimpleVO;
-import com.punchsettle.server.pojo.punchIn.PiTaskHistoryStatVO;
 import com.punchsettle.server.pojo.punchIn.PiTaskHistoryVO;
 import com.punchsettle.server.pojo.punchIn.PiTaskQuery;
 import com.punchsettle.server.pojo.punchIn.PiTaskRequest;
@@ -104,11 +108,19 @@ public class PunchInManagerImpl implements IPunchInManager {
     @Autowired
     private IPiStatusService piStatusService;
 
+    @Autowired
+    private ISettleTaskRelaHistoryService settleTaskRelaHistoryService;
+
     /**
      * 默认时间00:00:00.000
      */
     private static final LocalTime ZERO_TIME = LocalTime.parse("00:00:00.000");
 
+    /**
+     * 数值60
+     */
+    private static final BigDecimal SIXTY = new BigDecimal("60");
+
     @Override
     public List<PiTaskToDoVO> queryToDoList(Long currentUserId) {
         Assert.isNull(currentUserId);
@@ -541,37 +553,85 @@ public class PunchInManagerImpl implements IPunchInManager {
     }
 
     @Override
-//    @Cacheable(cacheNames = CacheNameConstant.TASK_STAT, key = "T(com.punchsettle.server.utiis.UserUtils).getCurrentUserId()+'_'+#query.taskId+'_'+#query.statTime", condition = "#query.taskId != null && #query.statTime != null && !#query.statTime.isBlank()")
+    @Cacheable(cacheNames = CacheNameConstant.STAT_TASK, key = "T(com.punchsettle.server.utiis.UserUtils).getCurrentUserId()+'_'+#query.taskId+'_'+#query.statTime", condition = "#query.taskId != null && #query.statTime != null && !#query.statTime.isBlank()")
     public PiTaskStatVO queryStat(PiTaskStatQuery query) {
         // 当前用户ID
         Long currentUserId = UserUtils.getCurrentUserId();
         // 查找打卡任务
         PiTask piTask = Optional.ofNullable(piTaskService.getById(query.getTaskId())).orElseThrow(() -> BusinessException.fail("无法查询到该打卡任务"));
 
+        // 查询统计数据
+        StatPiTask statPiTask = null;
+        // 统计范围的第一天
+        LocalDate statFirstDate = null;
+        // 统计范围的最后一天
+        LocalDate statLastDay = null;
+        // 今天
+        LocalDate today = LocalDate.now();
+
         // 构造查询条件
         StatPiTaskQuery statPiTaskQuery = new StatPiTaskQuery();
         statPiTaskQuery.setUserId(currentUserId);
         statPiTaskQuery.setTaskUniqueId(piTask.getUniqueId());
         statPiTaskQuery.setStatTime(query.getStatTime());
 
-        // 查询统计数据
-        StatPiTask statPiTask = null;
         if (StatPeriodEnum.YEAR.equals(query.getStatPeriod())) {
             statPiTask = statPiTaskYearService.queryOneByCondition(statPiTaskQuery);
+            statFirstDate = LocalDate.of(Integer.valueOf(query.getStatTime()), 1, 1);
+            statLastDay = DateUtils.getLastDayOfYear(statFirstDate);
         } else if (StatPeriodEnum.MONTH.equals(query.getStatPeriod())) {
             statPiTask = statPiTaskMonthService.queryOneByCondition(statPiTaskQuery);
-        }
-
-        if (Objects.isNull(statPiTask)) {
-             return null;
+            String[] split = query.getStatTime().split("-");
+            statFirstDate = LocalDate.of(Integer.valueOf(split[0]), Integer.valueOf(split[1]), 1);
+            statLastDay = DateUtils.getLastDayOfYear(statFirstDate);
         }
 
         // 查询打卡记录
         PiTaskHistoryQuery piTaskHistoryQuery = new PiTaskHistoryQuery();
         piTaskHistoryQuery.setUserIds(Arrays.asList(currentUserId));
         piTaskHistoryQuery.setPunchInDateLike(query.getStatTime());
+        piTaskHistoryQuery.setTaskUniqueIds(Arrays.asList(piTask.getUniqueId()));
         List<PiTaskHistory> piTaskHistories = piTaskHistoryService.queryByCondition(piTaskHistoryQuery);
 
+        // 构造折线图数据
+        List<LocalDate> dateRangeInMonth = null;
+        if (today.isBefore(statLastDay)) {
+            dateRangeInMonth = DateUtils.getDateRange(statFirstDate, today);
+        } else {
+            dateRangeInMonth = DateUtils.getDateRange(statFirstDate, statLastDay);
+        }
+        // 横坐标
+        String[] categories = dateRangeInMonth.stream().map(v -> DateUtils.MM_DD_FORMATTER.format(v)).toArray(String[]::new);
+        // 打卡日期-打卡记录 关联
+        Map<String, PiTaskHistory> piTaskHistoryMap = piTaskHistories.stream().collect(Collectors.toMap(piTaskHistory -> piTaskHistory.getPunchInDate().substring(5), Function.identity(), (key1, key2) -> key1));
+        Object[] seriesData = Arrays.stream(categories).map(category -> {
+            PiTaskHistory piTaskHistory = piTaskHistoryMap.get(category);
+            if (Objects.isNull(piTaskHistory)) {
+                return null;
+            }
+            if (PunchInMethodEnum.SINGLE.equals(piTask.getPunchInMethod())) {
+                return PunchInResultEnum.DONE.equals(piTaskHistory.getPunchInResult()) ? 1 : 0;
+            }
+            if (PunchInMethodEnum.COUNT.equals(piTask.getPunchInMethod())) {
+                return Optional.ofNullable(piTaskHistory.getCountTrack()).orElse(0);
+            }
+            if (PunchInMethodEnum.TIMING.equals(piTask.getPunchInMethod())) {
+                LocalTime timeTrack = Optional.ofNullable(piTaskHistory.getTimeTrack()).orElse(ZERO_TIME);
+                BigDecimal hourVal = BigDecimal.valueOf(timeTrack.getHour());
+                BigDecimal minVal = BigDecimal.valueOf(timeTrack.getMinute()).divide(SIXTY, 2, RoundingMode.HALF_UP);
+                return hourVal.add(minVal);
+            }
+            return null;
+        }).toArray();
+
+        // 构建折线图数据
+        LineSeriesVO lineSeriesVO = new LineSeriesVO();
+        lineSeriesVO.setName("每日打卡数据");
+        lineSeriesVO.setData(seriesData);
+        LineVO lineVO = new LineVO();
+        lineVO.setCategories(categories);
+        lineVO.setSeries(Arrays.asList(lineSeriesVO));
+
         // 查询打卡任务
         Set<Long> piTaskIds = piTaskHistories.stream().map(PiTaskHistory::getTaskId).collect(Collectors.toSet());
         PiTaskQuery piTaskQuery = new PiTaskQuery();
@@ -580,35 +640,42 @@ public class PunchInManagerImpl implements IPunchInManager {
         // 打卡任务ID-打卡任务对象关联
         Map<Long, PiTask> piTaskMap = piTasks.stream().collect(Collectors.toMap(PiTask::getId, Function.identity(), (key1, key2) -> key1));
 
-        // 统计范围的第一天
-        String statFirstTimeStr = null;
-        if (StatPeriodEnum.MONTH.equals(query.getStatPeriod())) {
-            String[] split = query.getStatTime().split("-");
-            statFirstTimeStr = String.format("%s-%s-01", split[0], split[1]);
-        }
-        LocalDate statFirstTime = LocalDate.parse(statFirstTimeStr);
-        List<LocalDate> dateRangeInMonth = DateUtils.getDateRange(statFirstTime, LocalDate.now());
-        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd");
-        String[] categories = dateRangeInMonth.stream().map(v -> dateTimeFormatter.format(v)).toArray(String[]::new);
-        Integer[] lineSeriesData = piTaskHistories.stream().map(PiTaskHistory::getCountTrack).toArray(Integer[]::new);
-
-        LineSeriesVO lineSeriesVO = new LineSeriesVO();
-        lineSeriesVO.setName("每日打卡次数");
-        lineSeriesVO.setData(lineSeriesData);
-        LineVO lineVO = new LineVO();
-        lineVO.setCategories(categories);
-        lineVO.setSeries(Arrays.asList(lineSeriesVO));
+        // 获取结算数据
+        SettleTaskRelaHistoryQuery settleTaskRelaHistoryQuery = new SettleTaskRelaHistoryQuery();
+        settleTaskRelaHistoryQuery.setSettleDateFrom(statFirstDate.toString());
+        settleTaskRelaHistoryQuery.setSettleDateTo(statLastDay.toString());
+        settleTaskRelaHistoryQuery.setUserIds(Arrays.asList(UserUtils.getCurrentUserId()));
+        settleTaskRelaHistoryQuery.setSettleResults(Arrays.asList(SettleResultEnum.SETTLED, SettleResultEnum.NO_SETTLED));
+        settleTaskRelaHistoryQuery.setTaskUniqueId(piTask.getUniqueId());
+        List<SettleTaskRelaHistory> settleTaskRelaHistories = settleTaskRelaHistoryService.queryByCondition(settleTaskRelaHistoryQuery);
+        // 结算日期 - 结算信息 关联
+        Map<String, SettleTaskRelaHistory> settleTaskRelaHistoryMap = settleTaskRelaHistories.stream().collect(Collectors.toMap(SettleTaskRelaHistory::getSettleDate, Function.identity(), (key1, key2) -> key1));
 
         // 组装数据
-        List<PiTaskHistoryStatVO> piTaskHistoryStatVOS = piTaskHistories.stream().map(piTaskHistory -> {
-            PiTaskHistoryStatVO piTaskHistoryStatVO = new PiTaskHistoryStatVO();
-            BeanUtils.copyProperties(piTaskHistory, piTaskHistoryStatVO);
-            return piTaskHistoryStatVO;
+        List<PiTaskHistoryVO> piTaskHistoryVOS = piTaskHistories.stream().map(piTaskHistory -> {
+            PiTask tempPiTask = piTaskMap.get(piTaskHistory.getTaskId());
+            SettleTaskRelaHistory settleTaskRelaHistory = settleTaskRelaHistoryMap.get(piTaskHistory.getPunchInDate());
+
+            PiTaskHistoryVO piTaskHistoryVO = new PiTaskHistoryVO();
+            piTaskHistoryVO.setPunchInDate(piTaskHistory.getPunchInDate());
+            if (Objects.nonNull(tempPiTask)) {
+                piTaskHistoryVO.setPunchInMethod(tempPiTask.getPunchInMethod());
+            }
+            if (Objects.nonNull(settleTaskRelaHistory)) {
+                piTaskHistoryVO.setSettleResult(settleTaskRelaHistory.getSettleResult());
+                piTaskHistoryVO.setSettlePoints(Optional.ofNullable(settleTaskRelaHistory.getSettlePoints()).orElse(0));
+            }
+            piTaskHistoryVO.setPunchInResult(piTaskHistory.getPunchInResult());
+            piTaskHistoryVO.setCountTrack(piTaskHistory.getCountTrack());
+            piTaskHistoryVO.setTimeTrack(piTaskHistory.getTimeTrack());
+            return piTaskHistoryVO;
         }).collect(Collectors.toList());
 
         PiTaskStatVO piTaskStatVO = new PiTaskStatVO();
-        BeanUtils.copyProperties(statPiTask, piTaskStatVO);
-        piTaskStatVO.setPiTaskHistoryStatVOS(piTaskHistoryStatVOS);
+        if (Objects.nonNull(statPiTask)) {
+            BeanUtils.copyProperties(statPiTask, piTaskStatVO);
+        }
+        piTaskStatVO.setPiTaskHistoryVOS(piTaskHistoryVOS);
         piTaskStatVO.setLineVO(lineVO);
         return piTaskStatVO;
     }
@@ -685,15 +752,32 @@ public class PunchInManagerImpl implements IPunchInManager {
         List<PiTask> piTasks = piTaskService.queryByCondition(piTaskQuery);
         // 任务ID - 任务信息
         Map<Long, PiTask> piTaskMap = piTasks.stream().collect(Collectors.toMap(PiTask::getId, Function.identity(), (key1, key2) -> key1));
+
+        // 获取结算数据
+        SettleTaskRelaHistoryQuery settleTaskRelaHistoryQuery = new SettleTaskRelaHistoryQuery();
+        settleTaskRelaHistoryQuery.setSettleDate(punchInDate);
+        settleTaskRelaHistoryQuery.setUserIds(Arrays.asList(UserUtils.getCurrentUserId()));
+        settleTaskRelaHistoryQuery.setSettleResults(Arrays.asList(SettleResultEnum.SETTLED, SettleResultEnum.NO_SETTLED));
+        List<SettleTaskRelaHistory> settleTaskRelaHistories = settleTaskRelaHistoryService.queryByCondition(settleTaskRelaHistoryQuery);
+        // 任务唯一ID - 结算信息 关联
+        Map<Long, SettleTaskRelaHistory> settleTaskRelaHistoryMap = settleTaskRelaHistories.stream().collect(Collectors.toMap(SettleTaskRelaHistory::getPiTaskUniqueId, Function.identity(), (key1, key2) -> key1));
+
         // 打卡记录
         List<PiTaskHistoryVO> piTaskHistoryVOS = tempPiTaskHistories.stream().map(piTaskHistory -> {
+            // 获取打卡任务
             PiTask piTask = piTaskMap.get(piTaskHistory.getTaskId());
+            // 获取结算信息
+            SettleTaskRelaHistory settleTaskRelaHistory = settleTaskRelaHistoryMap.get(piTaskHistory.getTaskUniqueId());
 
             PiTaskHistoryVO piTaskHistoryVO = new PiTaskHistoryVO();
             if (Objects.nonNull(piTask)) {
                 piTaskHistoryVO.setTaskName(piTask.getTaskName());
                 piTaskHistoryVO.setPunchInMethod(piTask.getPunchInMethod());
             }
+            if (Objects.nonNull(settleTaskRelaHistory)) {
+                piTaskHistoryVO.setSettleResult(settleTaskRelaHistory.getSettleResult());
+                piTaskHistoryVO.setSettlePoints(settleTaskRelaHistory.getSettlePoints());
+            }
             piTaskHistoryVO.setTimeTrack(piTaskHistory.getTimeTrack());
             piTaskHistoryVO.setCountTrack(piTaskHistory.getCountTrack());
             piTaskHistoryVO.setPunchInResult(piTaskHistory.getPunchInResult());
@@ -733,7 +817,7 @@ public class PunchInManagerImpl implements IPunchInManager {
             cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.TASK_PUNCH_IN_HISTORY, CacheNameConstant.TASK_HISTORY_LIST_FOR_USER), String.valueOf(userId));
         }
         if (deleteStat) {
-            cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.TASK_STAT), String.valueOf(userId));
+            cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.STAT_TASK), String.valueOf(userId));
         }
 
     }

+ 2 - 2
src/main/java/com/punchsettle/server/service/manager/impl/SettleManagerImpl.java

@@ -170,7 +170,7 @@ public class SettleManagerImpl implements ISettleManager {
             addSettleUserHistory.setSettleTaskHistoryId(settleTaskHistoryId);
             addSettleUserHistory.setBeforeSettlePoints(0);
             addSettleUserHistory.setAfterSettlePoints(0);
-            addSettleUserHistory.setSettleResult(SettleResultEnum.SETTLE);
+            addSettleUserHistory.setSettleResult(SettleResultEnum.SETTLED);
             addSettleUserHistory.setDistributeStatus(PointsDistributeStatusEnum.NOT_DISTRIBUTE);
             addSettleUserHistories.add(addSettleUserHistory);
 
@@ -234,7 +234,7 @@ public class SettleManagerImpl implements ISettleManager {
                 if (Objects.nonNull(piTaskHistory)) {
                     addSettleTaskRelaHistory.setPiTaskHistoryId(piTaskHistory.getId());
                 }
-                addSettleTaskRelaHistory.setSettleResult(SettleResultEnum.SETTLE);
+                addSettleTaskRelaHistory.setSettleResult(SettleResultEnum.SETTLED);
                 addSettleTaskRelaHistory.setSettlePoints(settlePoints);
                 addSettleTaskRelaHistories.add(addSettleTaskRelaHistory);
             }

+ 5 - 2
src/main/java/com/punchsettle/server/service/manager/impl/SettleTaskRelaHistoryServiceImpl.java

@@ -56,8 +56,11 @@ public class SettleTaskRelaHistoryServiceImpl implements ISettleTaskRelaHistoryS
         if (StringUtils.hasText(query.getSettleDateTo())) {
             criteria.andLessThanOrEqualTo(SettleTaskRelaHistory::getSettleDate, query.getSettleDateTo());
         }
-        if (Objects.nonNull(query.getSettleResult())) {
-            criteria.andEqualTo(SettleTaskRelaHistory::getSettleResult, query.getSettleResult());
+        if (!CollectionUtils.isEmpty(query.getSettleResults())) {
+            criteria.andIn(SettleTaskRelaHistory::getSettleResult, query.getSettleResults());
+        }
+        if (Objects.nonNull(query.getTaskUniqueId())) {
+            criteria.andEqualTo(SettleTaskRelaHistory::getPiTaskUniqueId, query.getTaskUniqueId());
         }
         return settleTaskRelaHistoryMapper.selectByExample(weekend);
     }

+ 33 - 17
src/main/java/com/punchsettle/server/service/manager/impl/StatManagerImpl.java

@@ -2,6 +2,7 @@ package com.punchsettle.server.service.manager.impl;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -13,13 +14,6 @@ import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import com.punchsettle.server.atomic.entity.RewardExchangeHistory;
-import com.punchsettle.server.atomic.entity.SettleUserHistory;
-import com.punchsettle.server.atomic.service.IRewardExchangeHistoryService;
-import com.punchsettle.server.atomic.service.ISettleUserHistoryService;
-import com.punchsettle.server.pojo.reward.RewardExchangeHistoryQuery;
-import com.punchsettle.server.pojo.settle.SettleUserHistoryQuery;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.Cache;
 import org.springframework.cache.CacheManager;
@@ -32,7 +26,9 @@ import com.punchsettle.server.atomic.IStatPiTaskService;
 import com.punchsettle.server.atomic.StatPiTask;
 import com.punchsettle.server.atomic.entity.PiTask;
 import com.punchsettle.server.atomic.entity.PiTaskHistory;
+import com.punchsettle.server.atomic.entity.RewardExchangeHistory;
 import com.punchsettle.server.atomic.entity.SettleTaskRelaHistory;
+import com.punchsettle.server.atomic.entity.SettleUserHistory;
 import com.punchsettle.server.atomic.entity.StatNewUser;
 import com.punchsettle.server.atomic.entity.StatPiTaskMonth;
 import com.punchsettle.server.atomic.entity.StatPiTaskWeek;
@@ -41,9 +37,10 @@ import com.punchsettle.server.atomic.entity.StatPoints;
 import com.punchsettle.server.atomic.entity.User;
 import com.punchsettle.server.atomic.service.IPiTaskHistoryService;
 import com.punchsettle.server.atomic.service.IPiTaskService;
+import com.punchsettle.server.atomic.service.IRewardExchangeHistoryService;
 import com.punchsettle.server.atomic.service.ISettleTaskRelaHistoryService;
+import com.punchsettle.server.atomic.service.ISettleUserHistoryService;
 import com.punchsettle.server.atomic.service.IStatNewUserService;
-import com.punchsettle.server.atomic.service.IStatPiTaskWeekService;
 import com.punchsettle.server.atomic.service.IStatPointsService;
 import com.punchsettle.server.atomic.service.IUserService;
 import com.punchsettle.server.common.utils.Assert;
@@ -54,17 +51,22 @@ import com.punchsettle.server.constant.StatPeriodEnum;
 import com.punchsettle.server.constant.UserCategoryEnum;
 import com.punchsettle.server.core.config.BizProperties;
 import com.punchsettle.server.pojo.punchIn.PiTaskHistoryQuery;
+import com.punchsettle.server.pojo.reward.RewardExchangeHistoryQuery;
 import com.punchsettle.server.pojo.settle.SettleTaskRelaHistoryQuery;
+import com.punchsettle.server.pojo.settle.SettleUserHistoryQuery;
 import com.punchsettle.server.pojo.stat.StatNewUserQuery;
 import com.punchsettle.server.pojo.stat.StatPiTaskQuery;
 import com.punchsettle.server.pojo.stat.StatPointsQuery;
 import com.punchsettle.server.pojo.ucharts.LineSeriesVO;
 import com.punchsettle.server.pojo.ucharts.LineVO;
+import com.punchsettle.server.service.manager.IPunchInCoreManager;
 import com.punchsettle.server.service.manager.IStatManager;
 import com.punchsettle.server.service.manager.IUserManager;
 import com.punchsettle.server.utiis.DateUtils;
 import com.punchsettle.server.utiis.UserUtils;
 
+import lombok.extern.slf4j.Slf4j;
+
 /**
  * @author myou
  * @version 1.0.0
@@ -92,9 +94,6 @@ public class StatManagerImpl implements IStatManager {
     @Autowired
     private BizProperties bizProperties;
 
-    @Autowired
-    private IStatPiTaskWeekService statPiTaskWeekService;
-
     @Autowired
     private ISettleTaskRelaHistoryService settleTaskRelaHistoryService;
 
@@ -116,6 +115,9 @@ public class StatManagerImpl implements IStatManager {
     @Autowired
     private IRewardExchangeHistoryService rewardExchangeHistoryService;
 
+    @Autowired
+    private IPunchInCoreManager punchInCoreManager;
+
     @Override
     @Cacheable(cacheNames = CacheNameConstant.STAT_POINTS_LINE, key = "T(com.punchsettle.server.utiis.UserUtils).getCurrentUserId()")
     public LineVO queryStatPointsLine() {
@@ -268,13 +270,20 @@ public class StatManagerImpl implements IStatManager {
             return;
         }
 
+        // 是否本周最后一天
+        boolean isLastDay = false;
+        // 统计时间
         String statTimeStr = null;
         if (StatPeriodEnum.WEEK.equals(statPeriod)) {
             statTimeStr = DateUtils.getYearWeek(statTime);
+            isLastDay = DayOfWeek.SUNDAY.equals(statTime.getDayOfWeek());
         } else if (StatPeriodEnum.MONTH.equals(statPeriod)) {
             statTimeStr = DateUtils.getYearMonth(statTime);
+            isLastDay = statTime.lengthOfMonth() == statTime.getDayOfMonth();
         } else if (StatPeriodEnum.YEAR.equals(statPeriod)) {
             statTimeStr = DateUtils.getYear(statTime);
+            LocalDate lastDayOfYear = DateUtils.getLastDayOfYear(statTime);
+            isLastDay = lastDayOfYear.equals(statTime);
         }
 
         StatPiTaskQuery statPiTaskQuery = new StatPiTaskQuery();
@@ -289,7 +298,7 @@ public class StatManagerImpl implements IStatManager {
         settleTaskRelaHistoryQuery.setUserIds(userIds);
         settleTaskRelaHistoryQuery.setSettleDateFrom(statFirstDay.toString());
         settleTaskRelaHistoryQuery.setSettleDateTo(statLastDay.toString());
-        settleTaskRelaHistoryQuery.setSettleResult(SettleResultEnum.SETTLE);
+        settleTaskRelaHistoryQuery.setSettleResults(Arrays.asList(SettleResultEnum.SETTLED));
         List<SettleTaskRelaHistory> settleTaskRelaHistorieList = settleTaskRelaHistoryService.queryByCondition(settleTaskRelaHistoryQuery);
         // 任务唯一ID - 结算任务关联记录
         Map<Long, List<SettleTaskRelaHistory>> settleTaskRelaHistoryMap = settleTaskRelaHistorieList.stream().collect(Collectors.groupingBy(SettleTaskRelaHistory::getPiTaskUniqueId));
@@ -303,7 +312,7 @@ public class StatManagerImpl implements IStatManager {
             // 获取结算数据
             List<SettleTaskRelaHistory> settleTaskRelaHistories = settleTaskRelaHistoryMap.get(piTask.getUniqueId());
             // 统计数据
-            StatPiTask newStatPiTask = statPiTaskData(statPeriod, settleTaskRelaHistories);
+            StatPiTask newStatPiTask = statTaskData(statPeriod, piTask, settleTaskRelaHistories, isLastDay, statFirstDay, statLastDay);
             // 获取统计数据
             StatPiTask oldStatPiTaskWeek = statPiTaskDataMap.get(piTask.getUniqueId());
 
@@ -331,13 +340,20 @@ public class StatManagerImpl implements IStatManager {
     /**
      * 重新统计打卡任务数据,如果不存在结算记录,则所有数据为0
      * @param statPeriod 统计周期
+     * @param piTask 任务信息
      * @param settleTaskRelaHistories 结算记录
+     * @param isLastDay 本周期最后一天
      * @return
      */
-    private StatPiTask statPiTaskData(StatPeriodEnum statPeriod, List<SettleTaskRelaHistory> settleTaskRelaHistories) {
-        List<SettleTaskRelaHistory> list = CollectionUtils.isEmpty(settleTaskRelaHistories) ? List.of() : settleTaskRelaHistories.stream().filter(v -> SettleResultEnum.SETTLE.equals(v.getSettleResult())).toList();
+    private StatPiTask statTaskData(StatPeriodEnum statPeriod, PiTask piTask, List<SettleTaskRelaHistory> settleTaskRelaHistories, boolean isLastDay, LocalDate statFirstDay, LocalDate statLastDay) {
+        List<SettleTaskRelaHistory> list = CollectionUtils.isEmpty(settleTaskRelaHistories) ? List.of() : settleTaskRelaHistories.stream().filter(v -> SettleResultEnum.SETTLED.equals(v.getSettleResult())).toList();
         // 总需打卡数
-        int punchInTotalCount = list.size();
+        int punchInTotalCount = 0;
+        if (isLastDay) {
+            punchInTotalCount = list.size();
+        } else {
+            punchInTotalCount = punchInCoreManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(), piTask.getRepeatCustomDay(), statFirstDay, statLastDay);
+        }
         // 打卡数
         int punchInCount = (int) list.stream().filter(v -> Objects.nonNull(v.getPiTaskHistoryId())).count();
         // 打卡完成数
@@ -421,7 +437,7 @@ public class StatManagerImpl implements IStatManager {
         SettleUserHistoryQuery settleUserHistoryQuery = new SettleUserHistoryQuery();
         settleUserHistoryQuery.setSettleDate(statDate.toString());
         settleUserHistoryQuery.setUserIds(userIds);
-        settleUserHistoryQuery.setSettleResults(Arrays.asList(SettleResultEnum.SETTLE, SettleResultEnum.NO_SETTLED));
+        settleUserHistoryQuery.setSettleResults(Arrays.asList(SettleResultEnum.SETTLED, SettleResultEnum.NO_SETTLED));
         List<SettleUserHistory> settleUserHistories = settleUserHistoryService.querySettleUserHistory(settleUserHistoryQuery);
         // 用户ID-结算数据 关联
         Map<Long, SettleUserHistory> settleUserHistoryMap = settleUserHistories.stream().collect(Collectors.toMap(SettleUserHistory::getUserId, Function.identity(), (key1, key2) -> key1));

+ 1 - 1
src/main/java/com/punchsettle/server/task/SettlePointsTask.java

@@ -70,7 +70,7 @@ public class SettlePointsTask {
         SettleUserHistoryQuery settleUserHistoryQuery = new SettleUserHistoryQuery();
         settleUserHistoryQuery.setSettleDate(punchInDate);
         settleUserHistoryQuery.setUserIds(userIds);
-        settleUserHistoryQuery.setSettleResults(Arrays.asList(SettleResultEnum.SETTLE, SettleResultEnum.NO_SETTLED));
+        settleUserHistoryQuery.setSettleResults(Arrays.asList(SettleResultEnum.SETTLED, SettleResultEnum.NO_SETTLED));
         List<SettleUserHistory> settleUserHistories = settleUserHistoryService.querySettleUserHistory(settleUserHistoryQuery);
         // 已结算的用户列表
         Set<Long> settleUserIds = settleUserHistories.stream().map(SettleUserHistory::getUserId).collect(Collectors.toSet());

+ 1 - 1
src/main/java/com/punchsettle/server/task/StatTask.java

@@ -97,6 +97,6 @@ public class StatTask {
         }
 
         // 清除缓存
-        cacheManager.getCache(CacheNameConstant.TASK_STAT).clear();
+        cacheManager.getCache(CacheNameConstant.STAT_TASK).clear();
     }
 }