Parcourir la source

【feat】【v3】
1.优化结算逻辑代码

ChenYL il y a 11 mois
Parent
commit
76ff599bab
18 fichiers modifiés avec 678 ajouts et 535 suppressions
  1. 1 1
      src/main/java/com/punchsettle/server/atomic/entity/PiTaskHistory.java
  2. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PiMultiTaskExtServiceImpl.java
  3. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PiMultiTaskHistoryServiceImpl.java
  4. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PiMultiTaskRelaServiceImpl.java
  5. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PiMultiTaskServiceImpl.java
  6. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PiStatusServiceImpl.java
  7. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PiTaskExtServiceImpl.java
  8. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PiTaskHistoryServiceImpl.java
  9. 8 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PiTaskServiceImpl.java
  10. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/StatPiTaskMonthServiceImpl.java
  11. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/SysDictItemServiceImpl.java
  12. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/SysDictServiceImpl.java
  13. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/UserServiceImpl.java
  14. 1 1
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInSettleData.java
  15. 20 0
      src/main/java/com/punchsettle/server/service/manager/IPunchInSettleManager.java
  16. 636 0
      src/main/java/com/punchsettle/server/service/manager/impl/PunchInSettleManagerImpl.java
  17. 1 1
      src/main/java/com/punchsettle/server/service/manager/impl/StatPiTaskWeekServiceImpl.java
  18. 0 520
      src/main/java/com/punchsettle/server/task/PunchInCoreTask.java

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/entity/PiTaskHistory.java

@@ -40,7 +40,7 @@ public class PiTaskHistory extends BaseEntity implements Serializable {
      * 打卡任务唯一ID
      */
     @Column(name = "task_unique_id")
-    private Long punchInTaskUniqueId;
+    private Long taskUniqueId;
 
     /**
      * 打卡日期

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/PiMultiTaskExtServiceImpl.java

@@ -30,7 +30,7 @@ public class PiMultiTaskExtServiceImpl implements IPiMultiTaskExtService {
     public List<PiMultiTaskExt> queryByCondition(PiMultiTaskExtQuery piMultiTaskExtQuery) {
         Assert.isNull(piMultiTaskExtQuery);
 
-        Weekend<PiMultiTaskExt> weekend = WeekendUtils.createExcludeAuditFields(PiMultiTaskExt.class);
+        Weekend<PiMultiTaskExt> weekend = WeekendUtils.createExcludeProperties(PiMultiTaskExt.class);
         WeekendCriteria<PiMultiTaskExt, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(piMultiTaskExtQuery.getMultiTaskIds())) {
             criteria.andIn(PiMultiTaskExt::getMultiTaskId, piMultiTaskExtQuery.getMultiTaskIds());

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/PiMultiTaskHistoryServiceImpl.java

@@ -31,7 +31,7 @@ public class PiMultiTaskHistoryServiceImpl implements IPiMultiTaskHistoryService
     public List<PiMultiTaskHistory> queryByCondition(PiMultiTaskHistoryQuery piMultiTaskHistoryQuery) {
         Assert.isNull(piMultiTaskHistoryQuery);
 
-        Weekend<PiMultiTaskHistory> weekend = WeekendUtils.createExcludeAuditFields(PiMultiTaskHistory.class);
+        Weekend<PiMultiTaskHistory> weekend = WeekendUtils.createExcludeProperties(PiMultiTaskHistory.class);
         WeekendCriteria<PiMultiTaskHistory, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(piMultiTaskHistoryQuery.getPunchInMultiTaskUniqueIds())) {
             criteria.andIn(PiMultiTaskHistory::getMultiTaskUniqueId, piMultiTaskHistoryQuery.getPunchInMultiTaskUniqueIds());

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/PiMultiTaskRelaServiceImpl.java

@@ -30,7 +30,7 @@ public class PiMultiTaskRelaServiceImpl implements IPiMultiTaskRelaService {
         if (!CollectionUtils.isEmpty(multiTaskIds)) {
             return List.of();
         }
-        Weekend<PiMultiTaskRela> weekend = WeekendUtils.createExcludeAuditFields(PiMultiTaskRela.class);
+        Weekend<PiMultiTaskRela> weekend = WeekendUtils.createExcludeProperties(PiMultiTaskRela.class);
         WeekendCriteria<PiMultiTaskRela, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(multiTaskIds)) {
             criteria.andIn(PiMultiTaskRela::getMultiTaskId, multiTaskIds);

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/PiMultiTaskServiceImpl.java

@@ -31,7 +31,7 @@ public class PiMultiTaskServiceImpl implements IPiMultiTaskService {
     public List<PiMultiTask> queryByCondition(PiMultiTaskQuery piMultiTaskQuery) {
         Assert.isNull(piMultiTaskQuery);
 
-        Weekend<PiMultiTask> weekend = WeekendUtils.createExcludeAuditFields(PiMultiTask.class);
+        Weekend<PiMultiTask> weekend = WeekendUtils.createExcludeProperties(PiMultiTask.class);
         WeekendCriteria<PiMultiTask, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(piMultiTaskQuery.getUserIds())) {
             criteria.andIn(PiMultiTask::getUserId, piMultiTaskQuery.getUserIds());

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/PiStatusServiceImpl.java

@@ -30,7 +30,7 @@ public class PiStatusServiceImpl implements IPiStatusService {
     public List<PiStatus> queryByCondition(PiStatusQuery piStatusQuery) {
         Assert.isNull(piStatusQuery);
 
-        Weekend<PiStatus> weekend = WeekendUtils.createExcludeAuditFields(PiStatus.class);
+        Weekend<PiStatus> weekend = WeekendUtils.createExcludeProperties(PiStatus.class);
         WeekendCriteria<PiStatus, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(piStatusQuery.getTaskUniqueIds())) {
             criteria.andIn(PiStatus::getTaskUniqueId, piStatusQuery.getTaskUniqueIds());

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/PiTaskExtServiceImpl.java

@@ -30,7 +30,7 @@ public class PiTaskExtServiceImpl implements IPiTaskExtService {
     public List<PiTaskExt> queryByCondition(PiTaskExtQuery piTaskExtQuery) {
         Assert.isNull(piTaskExtQuery);
 
-        Weekend<PiTaskExt> weekend = WeekendUtils.createExcludeAuditFields(PiTaskExt.class);
+        Weekend<PiTaskExt> weekend = WeekendUtils.createExcludeProperties(PiTaskExt.class);
         WeekendCriteria<PiTaskExt, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(piTaskExtQuery.getPunchInTaskIds())) {
             criteria.andIn(PiTaskExt::getTaskId, piTaskExtQuery.getPunchInTaskIds());

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/PiTaskHistoryServiceImpl.java

@@ -31,7 +31,7 @@ public class PiTaskHistoryServiceImpl implements IPiTaskHistoryService {
     public List<PiTaskHistory> queryByCondition(PiTaskHistoryQuery piTaskHistoryQuery) {
         Assert.isNull(piTaskHistoryQuery);
 
-        Weekend<PiTaskHistory> weekend = WeekendUtils.createExcludeAuditFields(PiTaskHistory.class);
+        Weekend<PiTaskHistory> weekend = WeekendUtils.createExcludeProperties(PiTaskHistory.class);
         WeekendCriteria<PiTaskHistory, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(piTaskHistoryQuery.getUserIds())) {
             criteria.andIn(PiTaskHistory::getUserId, piTaskHistoryQuery.getUserIds());

+ 8 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/PiTaskServiceImpl.java

@@ -3,6 +3,7 @@ package com.punchsettle.server.atomic.service.impl;
 import com.punchsettle.server.atomic.entity.PiTask;
 import com.punchsettle.server.atomic.mapper.PiTaskMapper;
 import com.punchsettle.server.atomic.service.IPiTaskService;
+import com.punchsettle.server.common.pojo.BaseEntity;
 import com.punchsettle.server.common.utils.Assert;
 import com.punchsettle.server.pojo.punchIn.PiTaskQuery;
 import com.punchsettle.server.utiis.WeekendUtils;
@@ -31,7 +32,7 @@ public class PiTaskServiceImpl implements IPiTaskService {
     public List<PiTask> queryByCondition(PiTaskQuery piTaskQuery) {
         Assert.isNull(piTaskQuery);
 
-        Weekend<PiTask> weekend = WeekendUtils.createExcludeAuditFields(PiTask.class);
+        Weekend<PiTask> weekend = Weekend.of(PiTask.class);
         WeekendCriteria<PiTask, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(piTaskQuery.getUserIds())) {
             criteria.andIn(PiTask::getCreatedBy, piTaskQuery.getUserIds());
@@ -42,6 +43,12 @@ public class PiTaskServiceImpl implements IPiTaskService {
         if (Objects.nonNull(piTaskQuery.getArchiveStatus())) {
             criteria.andEqualTo(PiTask::getArchiveStatus, piTaskQuery.getArchiveStatus());
         }
+
+        weekend.excludeProperties(BaseEntity::getCreationTime,
+                BaseEntity::getLastUpdatedBy,
+                BaseEntity::getLastUpdateTime,
+                BaseEntity::getVersion,
+                BaseEntity::getDeleteFlag);
         return piTaskMapper.selectByExample(weekend);
     }
 }

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/StatPiTaskMonthServiceImpl.java

@@ -31,7 +31,7 @@ public class StatPiTaskMonthServiceImpl implements IStatPiTaskMonthService {
     public List<StatPiTaskMonth> queryByCondition(PiStatsMonthQuery piStatsMonthQuery) {
         Assert.isNull(piStatsMonthQuery);
 
-        Weekend<StatPiTaskMonth> weekend = WeekendUtils.createExcludeAuditFields(StatPiTaskMonth.class);
+        Weekend<StatPiTaskMonth> weekend = WeekendUtils.createExcludeProperties(StatPiTaskMonth.class);
         WeekendCriteria<StatPiTaskMonth, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(piStatsMonthQuery.getTaskUniqueIds())) {
             criteria.andIn(StatPiTaskMonth::getTaskUniqueId, piStatsMonthQuery.getTaskUniqueIds());

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/SysDictItemServiceImpl.java

@@ -33,7 +33,7 @@ public class SysDictItemServiceImpl implements ISysDictItemService {
             return List.of();
         }
 
-        Weekend<SysDictItem> weekend = WeekendUtils.createExcludeAuditFields(SysDictItem.class);
+        Weekend<SysDictItem> weekend = WeekendUtils.createExcludeProperties(SysDictItem.class);
         WeekendCriteria<SysDictItem, Object> criteria = weekend.weekendCriteria();
         if (Objects.nonNull(dictItemQuery.getDictId())) {
             criteria.andEqualTo(SysDictItem::getDictId, dictItemQuery.getDictId());

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/SysDictServiceImpl.java

@@ -33,7 +33,7 @@ public class SysDictServiceImpl implements ISysDictService {
             return null;
         }
 
-        Weekend<SysDict> weekend = WeekendUtils.createExcludeAuditFields(SysDict.class);
+        Weekend<SysDict> weekend = WeekendUtils.createExcludeProperties(SysDict.class);
         WeekendCriteria<SysDict, Object> criteria = weekend.weekendCriteria();
         if (StringUtils.hasText(dictQuery.getDictCode())) {
             criteria.andEqualTo(SysDict::getDictCode, dictQuery.getDictCode());

+ 1 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/UserServiceImpl.java

@@ -71,7 +71,7 @@ public class UserServiceImpl implements IUserService {
             return List.of();
         }
 
-        Weekend<User> weekend = WeekendUtils.createExcludeAuditFields(User.class);
+        Weekend<User> weekend = WeekendUtils.createExcludeProperties(User.class);
         WeekendCriteria<User, Object> criteria = weekend.weekendCriteria();
         criteria.andIn(User::getId, ids);
         return userMapper.selectByExample(weekend);

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchIn/PunchInSettleData.java

@@ -14,7 +14,7 @@ import java.util.List;
  * @author tyuio
  * @version 1.0.0
  * @date 2025/4/16 10:17
- * @description 打卡结算 DTO
+ * @description 打卡结算数据
  */
 @Data
 public class PunchInSettleData {

+ 20 - 0
src/main/java/com/punchsettle/server/service/manager/IPunchInSettleManager.java

@@ -0,0 +1,20 @@
+package com.punchsettle.server.service.manager;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/18 16:38
+ * @description 打卡结算服务类
+ */
+public interface IPunchInSettleManager {
+
+    /**
+     * 打卡结算
+     * @param userIds 用户列表
+     * @param punchInDateStr 打卡日期
+     * @param settleTaskHistoryId 结算任务ID
+     */
+    void punchInSettle(List<Long> userIds, String punchInDateStr, Long settleTaskHistoryId);
+}

+ 636 - 0
src/main/java/com/punchsettle/server/service/manager/impl/PunchInSettleManagerImpl.java

@@ -0,0 +1,636 @@
+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.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import com.punchsettle.server.atomic.entity.PiMultiTask;
+import com.punchsettle.server.atomic.entity.PiMultiTaskExt;
+import com.punchsettle.server.atomic.entity.PiMultiTaskHistory;
+import com.punchsettle.server.atomic.entity.PiMultiTaskRela;
+import com.punchsettle.server.atomic.entity.PiStatus;
+import com.punchsettle.server.atomic.entity.PiStatusHistory;
+import com.punchsettle.server.atomic.entity.PiTask;
+import com.punchsettle.server.atomic.entity.PiTaskExt;
+import com.punchsettle.server.atomic.entity.PiTaskHistory;
+import com.punchsettle.server.atomic.entity.SettlePointsHistory;
+import com.punchsettle.server.atomic.entity.StatPiTaskMonth;
+import com.punchsettle.server.atomic.entity.StatPiTaskWeek;
+import com.punchsettle.server.atomic.entity.User;
+import com.punchsettle.server.atomic.service.IPiMultiTaskExtService;
+import com.punchsettle.server.atomic.service.IPiMultiTaskHistoryService;
+import com.punchsettle.server.atomic.service.IPiMultiTaskRelaService;
+import com.punchsettle.server.atomic.service.IPiMultiTaskService;
+import com.punchsettle.server.atomic.service.IPiStatusHistoryService;
+import com.punchsettle.server.atomic.service.IPiStatusService;
+import com.punchsettle.server.atomic.service.IPiTaskExtService;
+import com.punchsettle.server.atomic.service.IPiTaskHistoryService;
+import com.punchsettle.server.atomic.service.IPiTaskService;
+import com.punchsettle.server.atomic.service.ISettlePointsHistoryService;
+import com.punchsettle.server.atomic.service.IStatPiTaskMonthService;
+import com.punchsettle.server.atomic.service.IStatPiTaskWeekService;
+import com.punchsettle.server.atomic.service.IUserService;
+import com.punchsettle.server.constant.ArchiveStatusEnum;
+import com.punchsettle.server.constant.ContinueStageEnum;
+import com.punchsettle.server.constant.ContinueStatusEnum;
+import com.punchsettle.server.constant.PunchInResultEnum;
+import com.punchsettle.server.constant.SettleResultEnum;
+import com.punchsettle.server.pojo.punchIn.PiMultiTaskExtQuery;
+import com.punchsettle.server.pojo.punchIn.PiMultiTaskHistoryQuery;
+import com.punchsettle.server.pojo.punchIn.PiMultiTaskQuery;
+import com.punchsettle.server.pojo.punchIn.PiStatusQuery;
+import com.punchsettle.server.pojo.punchIn.PiTaskData;
+import com.punchsettle.server.pojo.punchIn.PiTaskExtQuery;
+import com.punchsettle.server.pojo.punchIn.PiTaskHistoryQuery;
+import com.punchsettle.server.pojo.punchIn.PiTaskQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInSettleData;
+import com.punchsettle.server.service.manager.ICalendarManager;
+import com.punchsettle.server.service.manager.IPunchInManager;
+import com.punchsettle.server.service.manager.IPunchInSettleManager;
+import com.punchsettle.server.service.manager.ISettleManager;
+import com.punchsettle.server.utiis.DateUtils;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/18 16:39
+ * @description 打卡结算服务类
+ */
+@Slf4j
+@Component
+public class PunchInSettleManagerImpl implements IPunchInSettleManager {
+
+    /**
+     * 默认数值100
+     */
+    private static final BigDecimal ONE_HUNDRED = new BigDecimal(100);
+
+    /**
+     * 默认百分比 0.00%
+     */
+    private static final BigDecimal ZERO_RATE = new BigDecimal("0.00");
+
+    @Autowired
+    private IPiTaskService piTaskService;
+
+    @Autowired
+    private IPiTaskExtService piTaskExtService;
+
+    @Autowired
+    private IPiTaskHistoryService piTaskHistoryService;
+
+    @Autowired
+    private IStatPiTaskMonthService statPiTaskMonthService;
+
+    @Autowired
+    private IStatPiTaskWeekService statPiTaskWeekService;
+
+    @Autowired
+    private IPiStatusService piStatusService;
+
+    @Autowired
+    private IPiStatusHistoryService piStatusHistoryService;
+
+    @Autowired
+    private IPiMultiTaskService piMultiTaskService;
+
+    @Autowired
+    private IPiMultiTaskExtService piMultiTaskExtService;
+
+    @Autowired
+    private IPiMultiTaskHistoryService piMultiTaskHistoryService;
+
+    @Autowired
+    private IPiMultiTaskRelaService piMultiTaskRelaService;
+
+    @Autowired
+    private ICalendarManager calendarManager;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private ISettlePointsHistoryService settlePointsHistoryService;
+
+    @Autowired
+    private IPunchInManager punchInManager;
+
+    @Autowired
+    private ISettleManager settleManager;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void punchInSettle(List<Long> userIds, String punchInDateStr, Long settleTaskHistoryId) {
+        // 打卡日期
+        LocalDate punchInDate = LocalDate.parse(punchInDateStr);
+        // 是否周一
+        boolean isMonday = DayOfWeek.MONDAY.equals(punchInDate.getDayOfWeek());
+        // 是否周日
+        boolean isSunday = DayOfWeek.SUNDAY.equals(punchInDate.getDayOfWeek());
+        // 是否打卡所在月第一天
+        boolean isFirstDayOfMonth = punchInDate.getDayOfMonth() == 1;
+        // 是否打卡所在月最后一天
+        boolean isLastDayOfMonth = punchInDate.getDayOfMonth() == punchInDate.lengthOfMonth();
+        // 周期数
+        String yearWeek = DateUtils.getYearWeek(punchInDate);
+        // 月份数
+        String yearMonth = DateUtils.getYearMonth(punchInDate);
+
+        // 打卡任务状态记录 新增列表
+        List<PiStatusHistory> addPiStatusHistories = new ArrayList<>();
+        // 打卡任务周统计 新增列表
+        List<StatPiTaskWeek> addStatPiTaskWeekList = new ArrayList<>();
+        // 打卡任务月统计 新增列表
+        List<StatPiTaskMonth> addStatPiTaskMonthList = new ArrayList<>();
+        // 结算积分记录 新增列表
+        List<SettlePointsHistory> addSettlePointsHistories = new ArrayList<>();
+        // 用户信息 更新列表
+        List<User> updateUserList = new ArrayList<>();
+        // 打卡状态 更新列表
+        List<PiStatus> updatePiStatusList = new ArrayList<>();
+        // 打卡任务记录 更新列表
+        List<PiTaskHistory> updatePunchInTaskHistories = new ArrayList<>();
+        // 打卡多任务记录 更新列表
+        List<PiMultiTaskHistory> updatePunchInMultiTaskHistories = new ArrayList<>(userIds.size());
+        // 获取结算数据
+        List<PunchInSettleData> punchInSettleData = getPunchInSettleData(userIds, punchInDateStr);
+
+        // 打卡结算逻辑
+        for (PunchInSettleData punchInSettle : punchInSettleData) {
+            // 结算总积分
+            int settlePoints = 0;
+
+            // 单任务处理部分
+            for (PiTaskData piTaskData : punchInSettle.getPiTaskDataList()) {
+                // 打卡任务
+                PiTask piTask = piTaskData.getPiTask();
+                // 打卡任务打卡记录
+                PiTaskHistory piTaskHistory = piTaskData.getPiTaskHistory();
+                // 打卡任务状态
+                PiStatus piStatus = piTaskData.getPiStatus();
+                // 打卡任务拖扎信息
+                List<PiTaskExt> piTaskExtList = piTaskData.getPiTaskExtList();
+
+                // 状态变更前记录历史状态
+                PiStatusHistory piStatusHistoryInTask = new PiStatusHistory();
+                BeanUtils.copyProperties(piStatus, piStatusHistoryInTask);
+                addPiStatusHistories.add(piStatusHistoryInTask);
+
+                PiTaskHistory updatePiTaskHistory = new PiTaskHistory();
+                updatePiTaskHistory.setId(piTaskHistory.getId());
+
+                // 记录当前状态数据
+                updatePiTaskHistory.setTaskContinueStatus(piStatus.getTaskContinueStatus());
+                updatePiTaskHistory.setTaskContinueDay(piStatus.getTaskContinueDay());
+                updatePiTaskHistory.setContinueStage(piStatus.getContinueStage());
+                updatePiTaskHistory.setStageStartDate(piStatus.getStageStartDate());
+                updatePiTaskHistory.setStageEndDate(piStatus.getStageEndDate());
+                updatePiTaskHistory.setContinueInterruptedCount(piStatus.getContinueInterruptedCount());
+
+                // 判断打卡结果
+                PunchInResultEnum punchInResult = punchInManager.judgePunchInResultInTask(piTask, piTaskHistory);
+                punchInSettle.getPiMultiTaskHistory().setPunchInResult(punchInResult);
+                updatePiTaskHistory.setPunchInResult(punchInResult);
+
+                // 更新状态表数据
+                piStatus.setStatusDate(punchInDateStr);
+
+                // 设置任务连续状态
+                ContinueStatusEnum oldTaskContinueStatus = piStatus.getTaskContinueStatus();
+                piStatus.setTaskContinueStatus(punchInResult.equals(PunchInResultEnum.DONE)
+                        ? ContinueStatusEnum.CONTINUE : ContinueStatusEnum.INTERRUPTED);
+                piStatus.setTaskContinueDay(oldTaskContinueStatus.equals(piStatus.getTaskContinueStatus())
+                        ? piStatus.getTaskContinueDay() + 1 : 1);
+
+                // 旧的连续阶段
+                ContinueStageEnum oldContinueStage = piStatus.getContinueStage();
+                // 判断当前处于的连续阶段
+                ContinueStageEnum continueStageResult =
+                        punchInManager.judgeContinueStageInTask(piTask, piTaskHistory, piStatus, punchInDate);
+                piStatus.setContinueStage(continueStageResult);
+                // 下面3种情况不处理:宽限期 变 宽限期;正常打卡期 变 正常打卡期;惩罚期 变 惩罚期;
+                // 宽限期 变 正常打卡期,则设置阶段开始时间,重置中断次数
+                if (ContinueStageEnum.GRACE_STAGE.equals(oldContinueStage)
+                        && ContinueStageEnum.NORMAL_STAGE.equals(continueStageResult)) {
+                    piStatus.setStageStartDate(punchInDate);
+                    piStatus.setContinueInterruptedCount(0);
+                }
+                // 如果正常打卡期 变 惩罚期,则设置阶段开始时间和阶段结束时间,增加中断次数
+                if (ContinueStageEnum.NORMAL_STAGE.equals(oldContinueStage)
+                        && ContinueStageEnum.PENALTY_STAGE.equals(continueStageResult)) {
+                    piStatus.setStageStartDate(punchInDate);
+                    piStatus.setStageEndDate(punchInDate.plusDays(piTask.getPenaltyDay()));
+                    piStatus.setContinueInterruptedCount(piStatus.getContinueInterruptedCount() + 1);
+                }
+                // 如果惩罚期 变 正常打卡期,则设置阶段开始时间
+                if (ContinueStageEnum.PENALTY_STAGE.equals(oldContinueStage)
+                        && ContinueStageEnum.NORMAL_STAGE.equals(continueStageResult)) {
+                    piStatus.setStageStartDate(punchInDate);
+                }
+
+                // 周一或月初
+                if (isMonday || isFirstDayOfMonth) {
+                    piStatus.setRepeatCategory(piTask.getRepeatCategory());
+                    piStatus.setRepeatCustomDay(piTask.getRepeatCustomDay());
+                }
+
+                // 周一
+                if (isMonday) {
+                    piStatus.setStatTimeInWeek(yearWeek);
+
+                    // 设置本周总打卡次数
+                    int PunchInTotalCountInWeek = punchInManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(),
+                            piTask.getRepeatCustomDay(), DateUtils.getFirstDayOfWeek(punchInDate),
+                            DateUtils.getLastDayOfWeek(punchInDate));
+                    piStatus.setPunchInTotalCountInWeek(PunchInTotalCountInWeek);
+
+                    // 重置数据
+                    piStatus.setPunchInCountInWeek(0);
+                    piStatus.setPunchInDoneCountInWeek(0);
+                    piStatus.setRepeatPrevTotalCountInWeek(0);
+                    piStatus.setRepeatStartDateInWeek(punchInDate);
+                }
+
+                // 打卡日所在月的第一天
+                if (isFirstDayOfMonth) {
+                    piStatus.setStatTimeInMonth(yearMonth);
+
+                    // 设置本月总打卡次数
+                    int PunchInTotalCountInMonth = punchInManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(),
+                            piTask.getRepeatCustomDay(), DateUtils.getFirstDayOfMonth(punchInDate),
+                            DateUtils.getLastDayOfMonth(punchInDate));
+                    piStatus.setPunchInTotalCountInMonth(PunchInTotalCountInMonth);
+
+                    // 重置数据
+                    piStatus.setPunchInCountInMonth(0);
+                    piStatus.setPunchInDoneCountInMonth(0);
+                    piStatus.setRepeatPrevTotalCountInMonth(0);
+                    piStatus.setRepeatStartDateInMonth(punchInDate);
+                }
+
+                // 重复类型发生变换,总打卡次数=历史真实发生的总打卡次数+变换前发生的总打卡次数+变换后可能的总打卡次数
+                if (!piStatus.getRepeatCategory().equals(piTask.getRepeatCategory())) {
+                    // 历史真实发生的总打卡次数(周)
+                    Integer oldPrevTotalCountInWeek = Optional.ofNullable(piStatus.getRepeatPrevTotalCountInWeek()).orElse(0);
+                    // 变换前发生的总打卡次数(周)
+                    int prevTotalCountInWeek = punchInManager.getPunchInTotalCountInRange(piStatus.getRepeatCategory(),
+                            piStatus.getRepeatCustomDay(), piStatus.getRepeatStartDateInWeek(),
+                            punchInDate.minusDays(1));
+                    // 变换后可能的总打卡次数(周)
+                    int punchInTotalCountInWeek = punchInManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(), piTask.getRepeatCustomDay(), punchInDate, DateUtils.getLastDayOfWeek(punchInDate));
+
+                    // 历史真实发生的总打卡次数(月)
+                    Integer oldPrevTotalCountInMonth = Optional.ofNullable(piStatus.getRepeatPrevTotalCountInMonth()).orElse(0);
+                    // 变换前发生的总打卡次数(月)
+                    int prevTotalCountInMonth = punchInManager.getPunchInTotalCountInRange(piStatus.getRepeatCategory(),
+                            piStatus.getRepeatCustomDay(), piStatus.getRepeatStartDateInMonth(),
+                            punchInDate.minusDays(1));
+                    // 变换后可能的总打卡次数(月 )
+                    int punchInTotalCountInMonth = punchInManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(), piTask.getRepeatCustomDay(), punchInDate, DateUtils.getLastDayOfMonth(punchInDate));
+
+                    // 设置实时数据
+                    piStatus.setRepeatPrevTotalCountInWeek(prevTotalCountInWeek + oldPrevTotalCountInWeek);
+                    piStatus.setPunchInTotalCountInWeek(piStatus.getRepeatPrevTotalCountInWeek() + punchInTotalCountInWeek);
+                    piStatus.setRepeatPrevTotalCountInMonth(prevTotalCountInMonth + oldPrevTotalCountInMonth);
+                    piStatus.setPunchInTotalCountInMonth(piStatus.getRepeatPrevTotalCountInMonth() + punchInTotalCountInMonth);
+                }
+
+                // 存在打卡记录则已打卡数加1
+                if (Objects.nonNull(piTaskHistory)) {
+                    piStatus.setPunchInCountInWeek(piStatus.getPunchInCountInWeek() + 1);
+                    piStatus.setPunchInCountInMonth(piStatus.getPunchInCountInMonth() + 1);
+                }
+
+                // 完成打卡则完成打卡数记录加一
+                if (PunchInResultEnum.DONE.equals(punchInResult)) {
+                    piStatus.setPunchInDoneCountInWeek(piStatus.getPunchInDoneCountInWeek() + 1);
+                    piStatus.setPunchInDoneCountInMonth(piStatus.getPunchInDoneCountInMonth() + 1);
+                }
+
+                // 计算积分
+                int taskPoints = settleManager.calculatePointsInTask(piTask, piTaskExtList, piTaskHistory, piStatus);
+                piStatus.setPointsInWeek(piStatus.getPointsInWeek() + taskPoints);
+                piStatus.setPointsInMonth(piStatus.getPointsInMonth() + taskPoints);
+                settlePoints += taskPoints;
+
+                // 打卡记录 更新
+                updatePiTaskHistory.setSettlePoints(taskPoints);
+                updatePiTaskHistory.setSettleResult(SettleResultEnum.SETTLED);
+                updatePiTaskHistory.setSettlePiTaskId(piTask.getId());
+                updatePiTaskHistory.setSettleTaskHistoryId(settleTaskHistoryId);
+
+                updatePiStatusList.add(piStatus);
+                updatePunchInTaskHistories.add(updatePiTaskHistory);
+                if (isSunday) {
+                    StatPiTaskWeek statPiTaskWeek = new StatPiTaskWeek();
+                    statPiTaskWeek.setUserId(punchInSettle.getUserId());
+                    statPiTaskWeek.setTaskUniqueId(piTask.getUniqueId());
+                    statPiTaskWeek.setStatTime(piStatus.getStatTimeInWeek());
+                    statPiTaskWeek.setPunchInTotalCount(piStatus.getPunchInTotalCountInWeek());
+                    statPiTaskWeek.setPunchInCount(piStatus.getPunchInCountInWeek());
+                    statPiTaskWeek.setPunchInDoneCount(piStatus.getPunchInDoneCountInWeek());
+                    statPiTaskWeek.setPoints(piStatus.getPointsInWeek());
+
+                    Integer punchInTotalCount = Optional.ofNullable(piStatus.getPunchInTotalCountInWeek()).orElse(0);
+                    if (punchInTotalCount == 0) {
+                        statPiTaskWeek.setPunchInRate(ZERO_RATE);
+                        statPiTaskWeek.setPunchInDoneRate(ZERO_RATE);
+                    } else {
+                        Integer punchInCount = Optional.ofNullable(piStatus.getPunchInCountInWeek()).orElse(0);
+                        Integer punchInDoneCount = Optional.ofNullable(piStatus.getPunchInDoneCountInWeek()).orElse(0);
+                        BigDecimal totalCount = new BigDecimal(punchInTotalCount);
+
+                        BigDecimal punchInRate = BigDecimal.valueOf(punchInCount).divide(totalCount, 2, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
+                        statPiTaskWeek.setPunchInRate(punchInRate);
+
+                        BigDecimal punchInDoneRate = BigDecimal.valueOf(punchInDoneCount).divide(totalCount, 2, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
+                        statPiTaskWeek.setPunchInDoneRate(punchInDoneRate);
+                    }
+
+                    addStatPiTaskWeekList.add(statPiTaskWeek);
+                }
+
+                if (isLastDayOfMonth) {
+                    StatPiTaskMonth statPiTaskMonth = new StatPiTaskMonth();
+                    statPiTaskMonth.setUserId(punchInSettle.getUserId());
+                    statPiTaskMonth.setTaskUniqueId(piTask.getUniqueId());
+                    statPiTaskMonth.setStatTime(piStatus.getStatTimeInMonth());
+                    statPiTaskMonth.setPunchInTotalCount(piStatus.getPunchInTotalCountInMonth());
+                    statPiTaskMonth.setPunchInCount(piStatus.getPunchInCountInMonth());
+                    statPiTaskMonth.setPunchInDoneCount(piStatus.getPunchInDoneCountInMonth());
+                    statPiTaskMonth.setPoints(piStatus.getPointsInMonth());
+
+                    Integer punchInTotalCount = Optional.ofNullable(piStatus.getPunchInTotalCountInMonth()).orElse(0);
+                    if (punchInTotalCount == 0) {
+                        statPiTaskMonth.setPunchInRate(ZERO_RATE);
+                        statPiTaskMonth.setPunchInDoneRate(ZERO_RATE);
+                    } else {
+                        Integer punchInCount = Optional.ofNullable(piStatus.getPunchInCountInMonth()).orElse(0);
+                        Integer punchInDoneCount = Optional.ofNullable(piStatus.getPunchInDoneCountInMonth()).orElse(0);
+                        BigDecimal totalCount = new BigDecimal(punchInTotalCount);
+
+                        BigDecimal punchInRate = BigDecimal.valueOf(punchInCount).divide(totalCount, 2, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
+                        statPiTaskMonth.setPunchInRate(punchInRate);
+
+                        BigDecimal punchInDoneRate = BigDecimal.valueOf(punchInDoneCount).divide(totalCount, 2, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
+                        statPiTaskMonth.setPunchInDoneRate(punchInDoneRate);
+                    }
+
+                    addStatPiTaskMonthList.add(statPiTaskMonth);
+                }
+            }
+
+            // 打卡多任务
+            PiMultiTask piMultiTask = punchInSettle.getPiMultiTask();
+            // 打卡多任务打卡记录
+            PiMultiTaskHistory piMultiTaskHistory = punchInSettle.getPiMultiTaskHistory();
+            // 打卡多任务状态
+            PiStatus piStatusInMultiTask = punchInSettle.getPiStatus();
+
+            // 状态变更前记录历史状态
+            PiStatusHistory piStatusHistoryInMultiTask =  new PiStatusHistory();
+            BeanUtils.copyProperties(piStatusInMultiTask, piStatusHistoryInMultiTask);
+            addPiStatusHistories.add(piStatusHistoryInMultiTask);
+
+            // 多任务处理部分
+            PiMultiTaskHistory updatePiMultiTaskHistory = new PiMultiTaskHistory();
+
+            // 判断多任务打卡状态并设置
+            PunchInResultEnum punchInResult = punchInManager.judgePunchInResultInMultiTask(piMultiTask, punchInSettle.getRelaPunchInTaskHistories());
+            piMultiTaskHistory.setPunchInResult(punchInResult);
+            updatePiMultiTaskHistory.setPunchInResult(punchInResult);
+
+            // 设置统计时间
+            piStatusInMultiTask.setStatusDate(punchInDateStr);
+            // 设置任务连续状态
+            ContinueStatusEnum oldTaskContinueStatus = piStatusInMultiTask.getTaskContinueStatus();
+            piStatusInMultiTask.setTaskContinueStatus(punchInResult.equals(PunchInResultEnum.DONE)
+                    ? ContinueStatusEnum.CONTINUE : ContinueStatusEnum.INTERRUPTED);
+            piStatusInMultiTask.setTaskContinueDay(oldTaskContinueStatus.equals(piStatusInMultiTask.getTaskContinueStatus())
+                    ? piStatusInMultiTask.getTaskContinueDay() + 1 : 1);
+
+            int multiTaskPoints = settleManager.calculatePointsInMultiTask(piMultiTask,
+                    punchInSettle.getPiMultiTaskExtList(), piMultiTaskHistory,
+                    punchInSettle.getPiStatus());
+            settlePoints += multiTaskPoints;
+
+            updatePiMultiTaskHistory.setSettlePoints(multiTaskPoints);
+            updatePiMultiTaskHistory.setSettleResult(SettleResultEnum.SETTLED);
+            updatePiMultiTaskHistory.setSettleTaskHistoryId(settleTaskHistoryId);
+            updatePunchInMultiTaskHistories.add(updatePiMultiTaskHistory);
+
+            User user = punchInSettle.getUser();
+            Integer totalPoints = Optional.ofNullable(user.getTotalPoints()).orElse(0);
+            Integer unusedPoints = Optional.ofNullable(user.getUnusedPoints()).orElse(0);
+
+            User updateUser = new User();
+            updateUser.setId(user.getId());
+            updateUser.setTotalPoints(totalPoints);
+            updateUser.setUnusedPoints(unusedPoints + settlePoints);
+            updateUserList.add(user);
+
+            SettlePointsHistory addSettlePointsHistory = new SettlePointsHistory();
+            addSettlePointsHistory.setSettleTaskHistoryId(settleTaskHistoryId);
+            addSettlePointsHistory.setUserId(user.getId());
+            addSettlePointsHistory.setSettleDate(punchInDateStr);
+            addSettlePointsHistory.setSettlePoints(settlePoints);
+            addSettlePointsHistory.setBeforeSettlePoints(totalPoints);
+            addSettlePointsHistory.setAfterSettlePoints(totalPoints + settlePoints);
+            addSettlePointsHistories.add(addSettlePointsHistory);
+        }
+
+        // 数据入库
+        if (!CollectionUtils.isEmpty(updateUserList)) {
+            userService.batchUpdateUser(updateUserList);
+        }
+        if (!CollectionUtils.isEmpty(addSettlePointsHistories)) {
+            settlePointsHistoryService.insertList(addSettlePointsHistories);
+        }
+        if (!CollectionUtils.isEmpty(addPiStatusHistories)) {
+            piStatusHistoryService.insertList(addPiStatusHistories);
+        }
+        if (!CollectionUtils.isEmpty(addStatPiTaskWeekList)) {
+            statPiTaskWeekService.insertList(addStatPiTaskWeekList);
+        }
+        if (!CollectionUtils.isEmpty(addStatPiTaskMonthList)) {
+            statPiTaskMonthService.insertList(addStatPiTaskMonthList);
+        }
+        if (!CollectionUtils.isEmpty(updatePiStatusList)) {
+            piStatusService.batchUpdate(updatePiStatusList);
+        }
+        if (!CollectionUtils.isEmpty(updatePunchInTaskHistories)) {
+            piTaskHistoryService.batchUpdate(updatePunchInTaskHistories);
+        }
+        if (!CollectionUtils.isEmpty(updatePunchInMultiTaskHistories)) {
+            piMultiTaskHistoryService.batchUpdate(updatePunchInMultiTaskHistories);
+        }
+    }
+
+    /**
+     * 获取用户ID-打卡结算数据关联
+     *
+     * @param userIds 设计的用户
+     * @param punchInDateStr 打卡日期
+     * @return
+     */
+    private List<PunchInSettleData> getPunchInSettleData(List<Long> userIds, String punchInDateStr) {
+        // 用户信息, 用户ID-用户信息关联
+        List<User> users = userService.listByIds(userIds);
+        Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key1));
+
+        // 获取多任务信息,用户ID-多任务关联
+        PiMultiTaskQuery piMultiTaskQuery = new PiMultiTaskQuery();
+        piMultiTaskQuery.setMultiTaskTaskStatus(ArchiveStatusEnum.ACTIVE);
+        piMultiTaskQuery.setUserIds(userIds);
+        List<PiMultiTask> piMultiTasks = piMultiTaskService.queryByCondition(piMultiTaskQuery);
+        Map<Long, PiMultiTask> piMultiTaskMap = piMultiTasks.stream()
+                .collect(Collectors.toMap(PiMultiTask::getUserId, Function.identity(), (key1, key2) -> key1));
+
+        // 多任务ID
+        Set<Long> multiTaskIds = piMultiTasks.stream().map(PiMultiTask::getId).collect(Collectors.toSet());
+        // 多任务唯一ID
+        Set<Long> multiTaskUniqueIds = piMultiTasks.stream().map(PiMultiTask::getUniqueId).collect(Collectors.toSet());
+
+        // 获取多任务拓展信息,多任务ID-多任务拓展关联
+        PiMultiTaskExtQuery piMultiTaskExtQuery = new PiMultiTaskExtQuery();
+        piMultiTaskExtQuery.setMultiTaskIds(multiTaskIds);
+        List<PiMultiTaskExt> piMultiTaskExtList = piMultiTaskExtService.queryByCondition(piMultiTaskExtQuery);
+        Map<Long, List<PiMultiTaskExt>> piMultiTaskExtMap =
+                piMultiTaskExtList.stream().collect(Collectors.groupingBy(PiMultiTaskExt::getMultiTaskId));
+
+        // 获取多任务打卡历史信息,多任务唯一ID-多任务打卡历史关联
+        PiMultiTaskHistoryQuery piMultiTaskHistoryQuery = new PiMultiTaskHistoryQuery();
+        piMultiTaskHistoryQuery.setPunchInMultiTaskUniqueIds(multiTaskUniqueIds);
+        piMultiTaskHistoryQuery.setPunchInDate(punchInDateStr);
+        List<PiMultiTaskHistory> piMultiTaskHistories =
+                piMultiTaskHistoryService.queryByCondition(piMultiTaskHistoryQuery);
+        Map<Long, PiMultiTaskHistory> piMultiTaskHistoryMap = piMultiTaskHistories.stream().collect(
+                Collectors.toMap(PiMultiTaskHistory::getMultiTaskUniqueId, Function.identity(), (key1, key2) -> key1));
+
+        // 打卡任务状态
+        PiStatusQuery piStatusQuery = new PiStatusQuery();
+        piStatusQuery.setUserIds(userIds);
+        List<PiStatus> piStatusList = piStatusService.queryByCondition(piStatusQuery);
+        // 打卡任务状态,多任务唯一ID-打卡状态关联
+        Map<Long, PiStatus> piStatusMapInMultiTask = piStatusList.stream().filter(v -> Objects.nonNull(v.getMultiTaskUniqueId())).collect(Collectors.toMap(PiStatus::getMultiTaskUniqueId, Function.identity(), (key1, key2) -> key1));
+        // 打卡任务状态,任务唯一ID-打卡状态关联
+        Map<Long, PiStatus> piStatusMapInTask = piStatusList.stream().filter(v -> Objects.nonNull(v.getTaskUniqueId())).collect(Collectors.toMap(PiStatus::getTaskUniqueId, Function.identity(), (key1, key2) -> key1));
+
+        // 多任务关联打卡任务,多任务ID-多任务关联打卡任务关联
+        List<PiMultiTaskRela> piMultiTaskRelaList = piMultiTaskRelaService.queryByMultiTaskId(multiTaskIds);
+        Map<Long, List<PiMultiTaskRela>> piMultiTaskRelaMap =
+                piMultiTaskRelaList.stream().collect(Collectors.groupingBy(PiMultiTaskRela::getMultiTaskId));
+
+        // 获取打卡任务信息,打卡任务唯一ID-打卡任务关联
+        PiTaskQuery piTaskQuery = new PiTaskQuery();
+        piTaskQuery.setTaskStatus(ArchiveStatusEnum.ACTIVE);
+        piTaskQuery.setArchiveStatus(ArchiveStatusEnum.ACTIVE);
+        piTaskQuery.setUserIds(userIds);
+        List<PiTask> piTasks = piTaskService.queryByCondition(piTaskQuery);
+        Map<Long, List<PiTask>> piTaskMap =
+                piTasks.stream().collect(Collectors.groupingBy(PiTask::getCreatedBy));
+
+        // 获取打卡记录,任务唯一 ID-打卡记录关联
+        PiTaskHistoryQuery piTaskHistoryQuery = new PiTaskHistoryQuery();
+        piTaskHistoryQuery.setPunchInDate(punchInDateStr);
+        piTaskHistoryQuery.setUserIds(userIds);
+        List<PiTaskHistory> punchInTaskHistories = piTaskHistoryService.queryByCondition(piTaskHistoryQuery);
+        Map<Long, PiTaskHistory> piTaskHistoryMap =
+                punchInTaskHistories.stream().collect(Collectors.toMap(PiTaskHistory::getTaskUniqueId, Function.identity(), (key1, key2) -> key1));
+
+        // 打卡任务ID
+        Set<Long> punchInTaskIds = piTasks.stream().map(PiTask::getId).collect(Collectors.toSet());
+
+        // 获取打卡任务拓展表,打卡任务ID-打卡任务拓展关联
+        PiTaskExtQuery piTaskExtQuery = new PiTaskExtQuery();
+        piTaskExtQuery.setPunchInTaskIds(punchInTaskIds);
+        List<PiTaskExt> piTaskExtList = piTaskExtService.queryByCondition(piTaskExtQuery);
+        Map<Long, List<PiTaskExt>> piTaskExtGroupList =
+                piTaskExtList.stream().collect(Collectors.groupingBy(PiTaskExt::getTaskId));
+
+        return userIds.stream().map(userId -> {
+            PunchInSettleData punchInSettleData = new PunchInSettleData();
+
+            // 设置用户ID
+            punchInSettleData.setUserId(userId);
+
+            // 获取并设置用户信息
+            User user = userMap.get(userId);
+            punchInSettleData.setUser(user);
+
+            // TODO 获取并设置多任务打卡信息,这个不可能为空,为空则用户初始注册时创建时有问题
+            PiMultiTask piMultiTask = piMultiTaskMap.get(userId);
+            punchInSettleData.setPiMultiTask(piMultiTask);
+
+            // 获取并设置对应的拓展信息
+            List<PiMultiTaskExt> tempPiMultiTaskExtList = piMultiTaskExtMap.get(piMultiTask.getId());
+            punchInSettleData.setPiMultiTaskExtList(tempPiMultiTaskExtList);
+
+            // 获取并设置对应的多任务打卡记录
+            PiMultiTaskHistory piMultiTaskHistory = piMultiTaskHistoryMap.get(piMultiTask.getUniqueId());
+            punchInSettleData.setPiMultiTaskHistory(piMultiTaskHistory);
+
+            // 获取多任务与打卡任务的关联信息
+            List<PiMultiTaskRela> tempPiMultiTaskRelaList = piMultiTaskRelaMap.get(piMultiTask.getId());
+            Set<Long> relaContainTaskIdList =
+                    tempPiMultiTaskRelaList.stream().map(PiMultiTaskRela::getTaskId).collect(Collectors.toSet());
+
+            // 获取并设置多任务的状态信息
+            PiStatus piStatusInMultiTask = piStatusMapInMultiTask.get(piMultiTask.getUniqueId());
+            punchInSettleData.setPiStatus(piStatusInMultiTask);
+
+            // 获取任务列表
+            List<PiTask> piTasksList = piTaskMap.get(userId);
+            // 打卡任务数据
+            List<PiTaskData> piTaskDataList = new ArrayList<>(piTasksList.size());
+            // 关联的打卡任务记录
+            List<PiTaskHistory> relaPunchInTaskHistories = new ArrayList<>(relaContainTaskIdList.size());
+
+            for (PiTask piTask : piTasksList) {
+                PiTaskData piTaskData = new PiTaskData();
+                piTaskData.setPiTask(piTask);
+
+                // 获取并设置打卡任务
+                PiTaskHistory piTaskHistory = piTaskHistoryMap.get(piTask.getUniqueId());
+                piTaskData.setPiTaskHistory(piTaskHistory);
+
+                //设置多任务与打卡记录的关联信息
+                if (relaContainTaskIdList.contains(piTask.getId())) {
+                    relaPunchInTaskHistories.add(piTaskHistory);
+                }
+
+                // 获取并设置拓展信息
+                List<PiTaskExt> tempPiTaskExtList = piTaskExtGroupList.get(piTask.getId());
+                piTaskData.setPiTaskExtList(tempPiTaskExtList);
+
+                // 获取并设置任务状态
+                PiStatus piStatusInTask = piStatusMapInTask.get(piTask.getUniqueId());
+                piTaskData.setPiStatus(piStatusInTask);
+
+                piTaskDataList.add(piTaskData);
+            }
+
+            punchInSettleData.setPiTaskDataList(piTaskDataList);
+            punchInSettleData.setRelaPunchInTaskHistories(relaPunchInTaskHistories);
+
+            return punchInSettleData;
+        }).collect(Collectors.toList());
+    }
+}

+ 1 - 1
src/main/java/com/punchsettle/server/service/manager/impl/StatPiTaskWeekServiceImpl.java

@@ -33,7 +33,7 @@ public class StatPiTaskWeekServiceImpl implements IStatPiTaskWeekService {
     public List<StatPiTaskWeek> queryByCondition(StatPiTaskWeekQuery statPiTaskWeekQuery) {
         Assert.isNull(statPiTaskWeekQuery);
 
-        Weekend<StatPiTaskWeek> weekend = WeekendUtils.createExcludeAuditFields(StatPiTaskWeek.class);
+        Weekend<StatPiTaskWeek> weekend = WeekendUtils.createExcludeProperties(StatPiTaskWeek.class);
         WeekendCriteria<StatPiTaskWeek, Object> criteria = weekend.weekendCriteria();
         if (!CollectionUtils.isEmpty(statPiTaskWeekQuery.getTaskUniqueIds())) {
             criteria.andIn(StatPiTaskWeek::getTaskUniqueId, statPiTaskWeekQuery.getTaskUniqueIds());

+ 0 - 520
src/main/java/com/punchsettle/server/task/PunchInCoreTask.java

@@ -73,11 +73,7 @@ import java.util.stream.Collectors;
 @Component
 public class PunchInCoreTask {
 
-    @Autowired
-    private IPunchInManager punchInManager;
 
-    @Autowired
-    private ISettleManager settleManager;
 
     public void execute() {
         log.info("========== 打卡定时任务 开始执行 ==========");
@@ -110,521 +106,5 @@ public class PunchInCoreTask {
     //
     // }
 
-    /**
-     * 默认数值100
-     */
-    private static final BigDecimal ONE_HUNDRED = new BigDecimal(100);
 
-    /**
-     * 默认百分比 0.00%
-     */
-    private static final BigDecimal ZERO_RATE = new BigDecimal("0.00");
-
-    @Autowired
-    private IPiTaskService piTaskService;
-
-    @Autowired
-    private IPiTaskExtService piTaskExtService;
-
-    @Autowired
-    private IPiTaskHistoryService piTaskHistoryService;
-
-    @Autowired
-    private IStatPiTaskMonthService statPiTaskMonthService;
-
-    @Autowired
-    private IStatPiTaskWeekService statPiTaskWeekService;
-
-    @Autowired
-    private IPiStatusService piStatusService;
-
-    @Autowired
-    private IPiStatusHistoryService piStatusHistoryService;
-
-    @Autowired
-    private IPiMultiTaskService piMultiTaskService;
-
-    @Autowired
-    private IPiMultiTaskExtService piMultiTaskExtService;
-
-    @Autowired
-    private IPiMultiTaskHistoryService piMultiTaskHistoryService;
-
-    @Autowired
-    private IPiMultiTaskRelaService piMultiTaskRelaService;
-
-    @Autowired
-    private ICalendarManager calendarManager;
-
-    @Autowired
-    private IUserService userService;
-
-    @Autowired
-    private ISettlePointsHistoryService settlePointsHistoryService;
-
-    public void manual(List<Long> userIds, String punchInDateStr, Long settleTaskHistoryId) {
-        List<PunchInSettleData> punchInSettleData = getPunchInSettleData(userIds, punchInDateStr);
-
-        // 打卡日期
-        LocalDate punchInDate = LocalDate.parse(punchInDateStr);
-        // 是否周一
-        boolean isMonday = DayOfWeek.MONDAY.equals(punchInDate.getDayOfWeek());
-        // 是否周日
-        boolean isSunday = DayOfWeek.SUNDAY.equals(punchInDate.getDayOfWeek());
-        // 是否打卡所在月第一天
-        boolean isFirstDayOfMonth = punchInDate.getDayOfMonth() == 1;
-        // 是否打卡所在月最后一天
-        boolean isLastDayOfMonth = punchInDate.getDayOfMonth() == punchInDate.lengthOfMonth();
-        // 周期数
-        String yearWeek = DateUtils.getYearWeek(punchInDate);
-        // 月份数
-        String yearMonth = DateUtils.getYearMonth(punchInDate);
-
-        List<PiStatusHistory> addPiStatusHistories = new ArrayList<>();
-        List<StatPiTaskWeek> addStatPiTaskWeekList = new ArrayList<>();
-        List<StatPiTaskMonth> addStatPiTaskMonthList = new ArrayList<>();
-        List<SettlePointsHistory> addSettlePointsHistories = new ArrayList<>();
-        List<User> updateUserList = new ArrayList<>();
-        List<PiStatus> updatePiStatusList = new ArrayList<>();
-        List<PiTaskHistory> updatePunchInTaskHistories = new ArrayList<>();
-        List<PiMultiTaskHistory> updatePunchInMultiTaskHistories = new ArrayList<>(punchInSettleData.size());
-        for (PunchInSettleData punchInSettle : punchInSettleData) {
-            // 结算总积分
-            int settlePoints = 0;
-
-            // 单任务处理部分
-            for (PiTaskData piTaskData : punchInSettle.getPiTaskDataList()) {
-                PiTask piTask = piTaskData.getPiTask();
-                PiTaskHistory piTaskHistory = piTaskData.getPiTaskHistory();
-                PiStatus piStatus = piTaskData.getPiStatus();
-                List<PiTaskExt> piTaskExtList = piTaskData.getPiTaskExtList();
-
-                // 变更前记录历史状态
-                PiStatusHistory piStatusHistory = new PiStatusHistory();
-                BeanUtils.copyProperties(piStatus, piStatusHistory);
-
-                PiTaskHistory updatePiTaskHistory = new PiTaskHistory();
-                updatePiTaskHistory.setId(piTaskHistory.getId());
-
-                // 记录当前状态数据
-                updatePiTaskHistory.setTaskContinueStatus(piStatus.getTaskContinueStatus());
-                updatePiTaskHistory.setTaskContinueDay(piStatus.getTaskContinueDay());
-                updatePiTaskHistory.setContinueStage(piStatus.getContinueStage());
-                updatePiTaskHistory.setStageStartDate(piStatus.getStageStartDate());
-                updatePiTaskHistory.setStageEndDate(piStatus.getStageEndDate());
-                updatePiTaskHistory.setContinueInterruptedCount(piStatus.getContinueInterruptedCount());
-
-                // 判断打卡结果
-                PunchInResultEnum punchInResult = punchInManager.judgePunchInResultInTask(piTask, piTaskHistory);
-                punchInSettle.getPiMultiTaskHistory().setPunchInResult(punchInResult);
-                updatePiTaskHistory.setPunchInResult(punchInResult);
-
-                // 更新状态表数据
-                piStatus.setStatusDate(punchInDateStr);
-
-                // 设置任务连续状态
-                ContinueStatusEnum oldTaskContinueStatus = piStatus.getTaskContinueStatus();
-                piStatus.setTaskContinueStatus(punchInResult.equals(PunchInResultEnum.DONE)
-                    ? ContinueStatusEnum.CONTINUE : ContinueStatusEnum.INTERRUPTED);
-                piStatus.setTaskContinueDay(oldTaskContinueStatus.equals(piStatus.getTaskContinueStatus())
-                    ? piStatus.getTaskContinueDay() + 1 : 1);
-
-                // 旧的连续阶段
-                ContinueStageEnum oldContinueStage = piStatus.getContinueStage();
-                // 判断当前处于的连续阶段
-                ContinueStageEnum continueStageResult =
-                    punchInManager.judgeContinueStageInTask(piTask, piTaskHistory, piStatus, punchInDate);
-                piStatus.setContinueStage(continueStageResult);
-                // 下面3种情况不处理:宽限期 变 宽限期;正常打卡期 变 正常打卡期;惩罚期 变 惩罚期;
-                // 宽限期 变 正常打卡期,则设置阶段开始时间,重置中断次数
-                if (ContinueStageEnum.GRACE_STAGE.equals(oldContinueStage)
-                    && ContinueStageEnum.NORMAL_STAGE.equals(continueStageResult)) {
-                    piStatus.setStageStartDate(punchInDate);
-                    piStatus.setContinueInterruptedCount(0);
-                }
-                // 如果正常打卡期 变 惩罚期,则设置阶段开始时间和阶段结束时间,增加中断次数
-                if (ContinueStageEnum.NORMAL_STAGE.equals(oldContinueStage)
-                    && ContinueStageEnum.PENALTY_STAGE.equals(continueStageResult)) {
-                    piStatus.setStageStartDate(punchInDate);
-                    piStatus.setStageEndDate(punchInDate.plusDays(piTask.getPenaltyDay()));
-                    piStatus.setContinueInterruptedCount(piStatus.getContinueInterruptedCount() + 1);
-                }
-                // 如果惩罚期 变 正常打卡期,则设置阶段开始时间
-                if (ContinueStageEnum.PENALTY_STAGE.equals(oldContinueStage)
-                    && ContinueStageEnum.NORMAL_STAGE.equals(continueStageResult)) {
-                    piStatus.setStageStartDate(punchInDate);
-                }
-
-                // 周一或月初
-                if (isMonday || isFirstDayOfMonth) {
-                    piStatus.setRepeatCategory(piTask.getRepeatCategory());
-                    piStatus.setRepeatCustomDay(piTask.getRepeatCustomDay());
-                }
-
-                // 周一
-                if (isMonday) {
-                    piStatus.setStatTimeInWeek(yearWeek);
-
-                    // 设置本周总打卡次数
-                    int PunchInTotalCountInWeek = punchInManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(),
-                        piTask.getRepeatCustomDay(), DateUtils.getFirstDayOfWeek(punchInDate),
-                        DateUtils.getLastDayOfWeek(punchInDate));
-                    piStatus.setPunchInTotalCountInWeek(PunchInTotalCountInWeek);
-
-                    // 重置数据
-                    piStatus.setPunchInCountInWeek(0);
-                    piStatus.setPunchInDoneCountInWeek(0);
-                    piStatus.setRepeatPrevTotalCountInWeek(0);
-                    piStatus.setRepeatStartDateInWeek(punchInDate);
-                }
-
-                // 打卡日所在月的第一天
-                if (isFirstDayOfMonth) {
-                    piStatus.setStatTimeInMonth(yearMonth);
-
-                    // 设置本月总打卡次数
-                    int PunchInTotalCountInMonth = punchInManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(),
-                            piTask.getRepeatCustomDay(), DateUtils.getFirstDayOfMonth(punchInDate),
-                            DateUtils.getLastDayOfMonth(punchInDate));
-                    piStatus.setPunchInTotalCountInMonth(PunchInTotalCountInMonth);
-
-                    // 重置数据
-                    piStatus.setPunchInCountInMonth(0);
-                    piStatus.setPunchInDoneCountInMonth(0);
-                    piStatus.setRepeatPrevTotalCountInMonth(0);
-                    piStatus.setRepeatStartDateInMonth(punchInDate);
-                }
-
-                // 重复类型发生变换,总打卡次数=历史真实发生的总打卡次数+变换前发生的总打卡次数+变换后可能的总打卡次数
-                if (!piStatus.getRepeatCategory().equals(piTask.getRepeatCategory())) {
-                    // 历史真实发生的总打卡次数(周)
-                    Integer oldPrevTotalCountInWeek = Optional.ofNullable(piStatus.getRepeatPrevTotalCountInWeek()).orElse(0);
-                    // 变换前发生的总打卡次数(周)
-                    int prevTotalCountInWeek = punchInManager.getPunchInTotalCountInRange(piStatus.getRepeatCategory(),
-                            piStatus.getRepeatCustomDay(), piStatus.getRepeatStartDateInWeek(),
-                            punchInDate.minusDays(1));
-                    // 变换后可能的总打卡次数(周)
-                    int punchInTotalCountInWeek = punchInManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(), piTask.getRepeatCustomDay(), punchInDate, DateUtils.getLastDayOfWeek(punchInDate));
-
-                    // 历史真实发生的总打卡次数(月)
-                    Integer oldPrevTotalCountInMonth = Optional.ofNullable(piStatus.getRepeatPrevTotalCountInMonth()).orElse(0);
-                    // 变换前发生的总打卡次数(月)
-                    int prevTotalCountInMonth = punchInManager.getPunchInTotalCountInRange(piStatus.getRepeatCategory(),
-                            piStatus.getRepeatCustomDay(), piStatus.getRepeatStartDateInMonth(),
-                            punchInDate.minusDays(1));
-                    // 变换后可能的总打卡次数(月 )
-                    int punchInTotalCountInMonth = punchInManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(), piTask.getRepeatCustomDay(), punchInDate, DateUtils.getLastDayOfMonth(punchInDate));
-
-                    // 设置实时数据
-                    piStatus.setRepeatPrevTotalCountInWeek(prevTotalCountInWeek + oldPrevTotalCountInWeek);
-                    piStatus.setPunchInTotalCountInWeek(piStatus.getRepeatPrevTotalCountInWeek() + punchInTotalCountInWeek);
-                    piStatus.setRepeatPrevTotalCountInMonth(prevTotalCountInMonth + oldPrevTotalCountInMonth);
-                    piStatus.setPunchInTotalCountInMonth(piStatus.getRepeatPrevTotalCountInMonth() + punchInTotalCountInMonth);
-                }
-
-                // 存在打卡记录则已打卡数加1
-                if (Objects.nonNull(piTaskHistory)) {
-                    piStatus.setPunchInCountInWeek(piStatus.getPunchInCountInWeek() + 1);
-                    piStatus.setPunchInCountInMonth(piStatus.getPunchInCountInMonth() + 1);
-                }
-
-                // 完成打卡则完成打卡数记录加一
-                if (PunchInResultEnum.DONE.equals(punchInResult)) {
-                    piStatus.setPunchInDoneCountInWeek(piStatus.getPunchInDoneCountInWeek() + 1);
-                    piStatus.setPunchInDoneCountInMonth(piStatus.getPunchInDoneCountInMonth() + 1);
-                }
-
-                // 计算积分
-                int taskPoints = settleManager.calculatePointsInTask(piTask, piTaskExtList, piTaskHistory, piStatus);
-                piStatus.setPointsInWeek(piStatus.getPointsInWeek() + taskPoints);
-                piStatus.setPointsInMonth(piStatus.getPointsInMonth() + taskPoints);
-                settlePoints += taskPoints;
-
-                // 打卡记录 更新
-                updatePiTaskHistory.setSettlePoints(taskPoints);
-                updatePiTaskHistory.setSettleResult(SettleResultEnum.SETTLED);
-                updatePiTaskHistory.setSettlePiTaskId(piTask.getId());
-                updatePiTaskHistory.setSettleTaskHistoryId(settleTaskHistoryId);
-
-                addPiStatusHistories.add(piStatusHistory);
-                updatePiStatusList.add(piStatus);
-                updatePunchInTaskHistories.add(updatePiTaskHistory);
-                if (isSunday) {
-                    StatPiTaskWeek statPiTaskWeek = new StatPiTaskWeek();
-                    statPiTaskWeek.setUserId(punchInSettle.getUserId());
-                    statPiTaskWeek.setTaskUniqueId(piTask.getUniqueId());
-                    statPiTaskWeek.setStatTime(piStatus.getStatTimeInWeek());
-                    statPiTaskWeek.setPunchInTotalCount(piStatus.getPunchInTotalCountInWeek());
-                    statPiTaskWeek.setPunchInCount(piStatus.getPunchInCountInWeek());
-                    statPiTaskWeek.setPunchInDoneCount(piStatus.getPunchInDoneCountInWeek());
-                    statPiTaskWeek.setPoints(piStatus.getPointsInWeek());
-
-                    Integer punchInTotalCount = Optional.ofNullable(piStatus.getPunchInTotalCountInWeek()).orElse(0);
-                    if (punchInTotalCount == 0) {
-                        statPiTaskWeek.setPunchInRate(ZERO_RATE);
-                        statPiTaskWeek.setPunchInDoneRate(ZERO_RATE);
-                    } else {
-                        Integer punchInCount = Optional.ofNullable(piStatus.getPunchInCountInWeek()).orElse(0);
-                        Integer punchInDoneCount = Optional.ofNullable(piStatus.getPunchInDoneCountInWeek()).orElse(0);
-                        BigDecimal totalCount = new BigDecimal(punchInTotalCount);
-
-                        BigDecimal punchInRate = BigDecimal.valueOf(punchInCount).divide(totalCount, 2, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
-                        statPiTaskWeek.setPunchInRate(punchInRate);
-
-                        BigDecimal punchInDoneRate = BigDecimal.valueOf(punchInDoneCount).divide(totalCount, 2, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
-                        statPiTaskWeek.setPunchInDoneRate(punchInDoneRate);
-                    }
-
-                    addStatPiTaskWeekList.add(statPiTaskWeek);
-                }
-
-                if (isLastDayOfMonth) {
-                    StatPiTaskMonth statPiTaskMonth = new StatPiTaskMonth();
-                    statPiTaskMonth.setUserId(punchInSettle.getUserId());
-                    statPiTaskMonth.setTaskUniqueId(piTask.getUniqueId());
-                    statPiTaskMonth.setStatTime(piStatus.getStatTimeInMonth());
-                    statPiTaskMonth.setPunchInTotalCount(piStatus.getPunchInTotalCountInMonth());
-                    statPiTaskMonth.setPunchInCount(piStatus.getPunchInCountInMonth());
-                    statPiTaskMonth.setPunchInDoneCount(piStatus.getPunchInDoneCountInMonth());
-                    statPiTaskMonth.setPoints(piStatus.getPointsInMonth());
-
-                    Integer punchInTotalCount = Optional.ofNullable(piStatus.getPunchInTotalCountInMonth()).orElse(0);
-                    if (punchInTotalCount == 0) {
-                        statPiTaskMonth.setPunchInRate(ZERO_RATE);
-                        statPiTaskMonth.setPunchInDoneRate(ZERO_RATE);
-                    } else {
-                        Integer punchInCount = Optional.ofNullable(piStatus.getPunchInCountInMonth()).orElse(0);
-                        Integer punchInDoneCount = Optional.ofNullable(piStatus.getPunchInDoneCountInMonth()).orElse(0);
-                        BigDecimal totalCount = new BigDecimal(punchInTotalCount);
-
-                        BigDecimal punchInRate = BigDecimal.valueOf(punchInCount).divide(totalCount, 2, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
-                        statPiTaskMonth.setPunchInRate(punchInRate);
-
-                        BigDecimal punchInDoneRate = BigDecimal.valueOf(punchInDoneCount).divide(totalCount, 2, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
-                        statPiTaskMonth.setPunchInDoneRate(punchInDoneRate);
-                    }
-
-                    addStatPiTaskMonthList.add(statPiTaskMonth);
-                }
-            }
-
-            PiMultiTask piMultiTask = punchInSettle.getPiMultiTask();
-            PiMultiTaskHistory piMultiTaskHistory = punchInSettle.getPiMultiTaskHistory();
-            PiStatus piStatus = punchInSettle.getPiStatus();
-
-            PiStatusHistory piStatusHistory =  new PiStatusHistory();
-            BeanUtils.copyProperties(piStatus, piStatusHistory);
-            addPiStatusHistories.add(piStatusHistory);
-
-            // 多任务处理部分
-            PiMultiTaskHistory updatePiMultiTaskHistory = new PiMultiTaskHistory();
-
-            // 判断多任务打卡状态并设置
-            PunchInResultEnum punchInResult = punchInManager.judgePunchInResultInMultiTask(piMultiTask, punchInSettle.getRelaPunchInTaskHistories());
-            piMultiTaskHistory.setPunchInResult(punchInResult);
-            updatePiMultiTaskHistory.setPunchInResult(punchInResult);
-
-            // 设置统计时间
-            piStatus.setStatusDate(punchInDateStr);
-            // 设置任务连续状态
-            ContinueStatusEnum oldTaskContinueStatus = piStatus.getTaskContinueStatus();
-            piStatus.setTaskContinueStatus(punchInResult.equals(PunchInResultEnum.DONE)
-                    ? ContinueStatusEnum.CONTINUE : ContinueStatusEnum.INTERRUPTED);
-            piStatus.setTaskContinueDay(oldTaskContinueStatus.equals(piStatus.getTaskContinueStatus())
-                    ? piStatus.getTaskContinueDay() + 1 : 1);
-
-            int multiTaskPoints = settleManager.calculatePointsInMultiTask(piMultiTask,
-                punchInSettle.getPiMultiTaskExtList(), piMultiTaskHistory,
-                punchInSettle.getPiStatus());
-            settlePoints += multiTaskPoints;
-
-            updatePiMultiTaskHistory.setSettlePoints(multiTaskPoints);
-            updatePiMultiTaskHistory.setSettleResult(SettleResultEnum.SETTLED);
-            updatePiMultiTaskHistory.setSettleTaskHistoryId(settleTaskHistoryId);
-            updatePunchInMultiTaskHistories.add(updatePiMultiTaskHistory);
-
-            User user = punchInSettle.getUser();
-            Integer totalPoints = Optional.ofNullable(user.getTotalPoints()).orElse(0);
-            Integer unusedPoints = Optional.ofNullable(user.getUnusedPoints()).orElse(0);
-
-            User updateUser = new User();
-            updateUser.setId(user.getId());
-            updateUser.setTotalPoints(totalPoints);
-            updateUser.setUnusedPoints(unusedPoints + settlePoints);
-            updateUserList.add(user);
-
-            SettlePointsHistory addSettlePointsHistory = new SettlePointsHistory();
-            addSettlePointsHistory.setSettleTaskHistoryId(settleTaskHistoryId);
-            addSettlePointsHistory.setUserId(user.getId());
-            addSettlePointsHistory.setSettleDate(punchInDateStr);
-            addSettlePointsHistory.setSettlePoints(settlePoints);
-            addSettlePointsHistory.setBeforeSettlePoints(totalPoints);
-            addSettlePointsHistory.setAfterSettlePoints(totalPoints + settlePoints);
-            addSettlePointsHistories.add(addSettlePointsHistory);
-        }
-
-        // 数据入库
-        if (!CollectionUtils.isEmpty(updateUserList)) {
-            userService.batchUpdateUser(updateUserList);
-        }
-        if (!CollectionUtils.isEmpty(addSettlePointsHistories)) {
-            settlePointsHistoryService.insertList(addSettlePointsHistories);
-        }
-        if (!CollectionUtils.isEmpty(addPiStatusHistories)) {
-            piStatusHistoryService.insertList(addPiStatusHistories);
-        }
-        if (!CollectionUtils.isEmpty(addStatPiTaskWeekList)) {
-            statPiTaskWeekService.insertList(addStatPiTaskWeekList);
-        }
-        if (!CollectionUtils.isEmpty(addStatPiTaskMonthList)) {
-            statPiTaskMonthService.insertList(addStatPiTaskMonthList);
-        }
-        if (!CollectionUtils.isEmpty(updatePiStatusList)) {
-            piStatusService.batchUpdate(updatePiStatusList);
-        }
-        if (!CollectionUtils.isEmpty(updatePunchInTaskHistories)) {
-            piTaskHistoryService.batchUpdate(updatePunchInTaskHistories);
-        }
-        if (!CollectionUtils.isEmpty(updatePunchInMultiTaskHistories)) {
-            piMultiTaskHistoryService.batchUpdate(updatePunchInMultiTaskHistories);
-        }
-    }
-
-    /**
-     * 获取用户ID-打卡结算数据关联
-     * 
-     * @param userIds 设计的用户
-     * @param punchInDateStr 打卡日期
-     * @return
-     */
-    private List<PunchInSettleData> getPunchInSettleData(List<Long> userIds, String punchInDateStr) {
-        // 用户信息, 用户ID-用户信息关联
-        List<User> users = userService.listByIds(userIds);
-        Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key1));
-
-        // 获取多任务信息,用户ID-多任务关联
-        PiMultiTaskQuery piMultiTaskQuery = new PiMultiTaskQuery();
-        piMultiTaskQuery.setMultiTaskTaskStatus(ArchiveStatusEnum.ACTIVE);
-        piMultiTaskQuery.setUserIds(userIds);
-        List<PiMultiTask> piMultiTasks = piMultiTaskService.queryByCondition(piMultiTaskQuery);
-        Map<Long, PiMultiTask> punchInMultiTaskMap = piMultiTasks.stream()
-            .collect(Collectors.toMap(PiMultiTask::getUserId, Function.identity(), (key1, key2) -> key1));
-
-        // 多任务ID
-        Set<Long> multiTaskIds = piMultiTasks.stream().map(PiMultiTask::getId).collect(Collectors.toSet());
-        // 多任务唯一ID
-        Set<Long> multiTaskUniqueIds = piMultiTasks.stream().map(PiMultiTask::getUniqueId).collect(Collectors.toSet());
-
-        // 获取多任务拓展信息,多任务ID-多任务拓展关联
-        PiMultiTaskExtQuery piMultiTaskExtQuery = new PiMultiTaskExtQuery();
-        piMultiTaskExtQuery.setMultiTaskIds(multiTaskIds);
-        List<PiMultiTaskExt> piMultiTaskExtList = piMultiTaskExtService.queryByCondition(piMultiTaskExtQuery);
-        Map<Long, List<PiMultiTaskExt>> punchInMultiTaskExtMap =
-            piMultiTaskExtList.stream().collect(Collectors.groupingBy(PiMultiTaskExt::getMultiTaskId));
-
-        // 获取多任务打卡历史信息,多任务唯一ID-多任务打卡历史关联
-        PiMultiTaskHistoryQuery piMultiTaskHistoryQuery = new PiMultiTaskHistoryQuery();
-        piMultiTaskHistoryQuery.setPunchInMultiTaskUniqueIds(multiTaskUniqueIds);
-        piMultiTaskHistoryQuery.setPunchInDate(punchInDateStr);
-        List<PiMultiTaskHistory> punchInMultiTaskHistories =
-            piMultiTaskHistoryService.queryByCondition(piMultiTaskHistoryQuery);
-        Map<Long, PiMultiTaskHistory> punchInMultiTaskHistoryMap = punchInMultiTaskHistories.stream().collect(
-            Collectors.toMap(PiMultiTaskHistory::getMultiTaskUniqueId, Function.identity(), (key1, key2) -> key1));
-
-        // 打卡任务状态,用户ID-打卡状态关联
-        PiStatusQuery piStatusQuery = new PiStatusQuery();
-        piStatusQuery.setUserIds(userIds);
-        List<PiStatus> piStatusList = piStatusService.queryByCondition(piStatusQuery);
-        Map<Long, List<PiStatus>> punchInStatusMap =
-            piStatusList.stream().collect(Collectors.groupingBy(PiStatus::getUserId));
-
-        // 多任务关联打卡任务,多任务ID-多任务关联打卡任务关联
-        List<PiMultiTaskRela> piMultiTaskRelaList = piMultiTaskRelaService.queryByMultiTaskId(multiTaskIds);
-        Map<Long, List<PiMultiTaskRela>> punchInMultiTaskRelaMap =
-            piMultiTaskRelaList.stream().collect(Collectors.groupingBy(PiMultiTaskRela::getMultiTaskId));
-
-        // 获取打卡任务信息,打卡任务唯一ID-打卡任务关联
-        PiTaskQuery piTaskQuery = new PiTaskQuery();
-        piTaskQuery.setTaskStatus(ArchiveStatusEnum.ACTIVE);
-        piTaskQuery.setArchiveStatus(ArchiveStatusEnum.ACTIVE);
-        piTaskQuery.setUserIds(userIds);
-        List<PiTask> piTasks = piTaskService.queryByCondition(piTaskQuery);
-        Map<Long, PiTask> punchInTaskMap =
-            piTasks.stream().collect(Collectors.toMap(PiTask::getUniqueId, Function.identity(), (key1, key2) -> key1));
-
-        // 获取打卡记录,用户ID-打卡记录关联
-        PiTaskHistoryQuery piTaskHistoryQuery = new PiTaskHistoryQuery();
-        piTaskHistoryQuery.setPunchInDate(punchInDateStr);
-        piTaskHistoryQuery.setUserIds(userIds);
-        List<PiTaskHistory> punchInTaskHistories = piTaskHistoryService.queryByCondition(piTaskHistoryQuery);
-        Map<Long, List<PiTaskHistory>> punchInTaskHistoryMap =
-            punchInTaskHistories.stream().collect(Collectors.groupingBy(PiTaskHistory::getUserId));
-
-        // 打卡任务ID
-        Set<Long> punchInTaskIds = piTasks.stream().map(PiTask::getId).collect(Collectors.toSet());
-
-        // 获取打卡任务拓展表,打卡任务ID-打卡任务拓展关联
-        PiTaskExtQuery piTaskExtQuery = new PiTaskExtQuery();
-        piTaskExtQuery.setPunchInTaskIds(punchInTaskIds);
-        List<PiTaskExt> piTaskExtList = piTaskExtService.queryByCondition(piTaskExtQuery);
-        Map<Long, List<PiTaskExt>> punchInTaskExtGroupList =
-            piTaskExtList.stream().collect(Collectors.groupingBy(PiTaskExt::getTaskId));
-
-        return userIds.stream().map(userId -> {
-            PunchInSettleData punchInSettleData = new PunchInSettleData();
-            punchInSettleData.setUserId(userId);
-
-            User user = userMap.get(userId);
-            punchInSettleData.setUser(user);
-
-            PiMultiTask piMultiTask = punchInMultiTaskMap.get(userId);
-            punchInSettleData.setPiMultiTask(piMultiTask);
-
-            List<PiMultiTaskExt> tempPiMultiTaskExtList = punchInMultiTaskExtMap.get(piMultiTask.getId());
-            punchInSettleData.setPiMultiTaskExtList(tempPiMultiTaskExtList);
-
-            PiMultiTaskHistory piMultiTaskHistory = punchInMultiTaskHistoryMap.get(piMultiTask.getUniqueId());
-            punchInSettleData.setPiMultiTaskHistory(piMultiTaskHistory);
-
-            List<PiStatus> tempPiStatusList = punchInStatusMap.get(userId);
-            PiStatus piStatusInMultiTask =
-                tempPiStatusList.stream().filter(v -> Objects.nonNull(v.getMultiTaskUniqueId())).findFirst().get();
-            punchInSettleData.setPiStatus(piStatusInMultiTask);
-
-            List<PiMultiTaskRela> tempPiMultiTaskRelaList = punchInMultiTaskRelaMap.get(piMultiTask.getId());
-            Set<Long> relaContainTaskIdList =
-                tempPiMultiTaskRelaList.stream().map(PiMultiTaskRela::getTaskId).collect(Collectors.toSet());
-
-            Map<Long, PiStatus> punchInStatusInTaskMap =
-                tempPiStatusList.stream().filter(v -> Objects.nonNull(v.getTaskUniqueId()))
-                    .collect(Collectors.toMap(PiStatus::getTaskUniqueId, Function.identity(), (key1, key2) -> key1));
-
-            List<PiTaskHistory> tempPunchInTaskHistories = punchInTaskHistoryMap.get(userId);
-            List<PiTaskData> piTaskDataList = new ArrayList<>(tempPunchInTaskHistories.size());
-            List<PiTaskHistory> relaPunchInTaskHistories = new ArrayList<>(relaContainTaskIdList.size());
-            for (PiTaskHistory piTaskHistory : tempPunchInTaskHistories) {
-                PiTaskData piTaskData = new PiTaskData();
-                piTaskData.setPiTaskHistory(piTaskHistory);
-
-                PiTask piTask = punchInTaskMap.get(piTaskHistory.getPunchInTaskUniqueId());
-                piTaskData.setPiTask(piTask);
-                if (relaContainTaskIdList.contains(piTask.getId())) {
-                    relaPunchInTaskHistories.add(piTaskHistory);
-                }
-
-                List<PiTaskExt> tempPiTaskExtList = punchInTaskExtGroupList.get(piTask.getId());
-                piTaskData.setPiTaskExtList(tempPiTaskExtList);
-
-                PiStatus piStatus = punchInStatusInTaskMap.get(piTaskHistory.getPunchInTaskUniqueId());
-                piTaskData.setPiStatus(piStatus);
-
-                piTaskDataList.add(piTaskData);
-            }
-
-            punchInSettleData.setPiTaskDataList(piTaskDataList);
-            punchInSettleData.setRelaPunchInTaskHistories(relaPunchInTaskHistories);
-
-            return punchInSettleData;
-        }).collect(Collectors.toList());
-    }
 }