Procházet zdrojové kódy

【feat】【v3】
1.完善打卡结算逻辑

ChenYL před 11 měsíci
rodič
revize
3342654675
21 změnil soubory, kde provedl 582 přidání a 94 odebrání
  1. 1 1
      doc/sql/update-v3.sql
  2. 14 14
      doc/技术文档.md
  3. 2 2
      src/main/java/com/punchsettle/server/atomic/entity/PunchInMultiTaskExt.java
  4. 3 1
      src/main/java/com/punchsettle/server/atomic/entity/PunchInMultiTaskHistory.java
  5. 2 1
      src/main/java/com/punchsettle/server/atomic/mapper/PunchInMultiTaskHistoryMapper.java
  6. 12 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInMultiTaskExtService.java
  7. 18 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInMultiTaskHistoryService.java
  8. 12 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInMultiTaskRelaService.java
  9. 12 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInMultiTaskService.java
  10. 26 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInMultiTaskExtServiceImpl.java
  11. 36 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInMultiTaskHistoryServiceImpl.java
  12. 26 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInMultiTaskRelaServiceImpl.java
  13. 30 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInMultiTaskServiceImpl.java
  14. 3 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInStatusServiceImpl.java
  15. 20 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInMultiTaskExtQuery.java
  16. 25 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInMultiTaskHistoryQuery.java
  17. 26 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInMultiTaskQuery.java
  18. 55 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInSettleDto.java
  19. 5 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInStatusQuery.java
  20. 52 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInTaskDto.java
  21. 202 75
      src/main/java/com/punchsettle/server/task/PunchInCoreTask.java

+ 1 - 1
doc/sql/update-v3.sql

@@ -258,7 +258,7 @@ CREATE TABLE `punch_in_multi_task` (
 CREATE TABLE `punch_in_multi_task_ext` (
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
   `user_id` bigint NOT NULL COMMENT '用户ID',
-  `multi_task_unique_id` bigint NOT NULL COMMENT '多任务ID',
+  `multi_task_id` bigint NOT NULL COMMENT '多任务ID',
   `dimension` varchar(10) NOT NULL COMMENT '使用维度(一天-ONE_DAY,多天-MULTI_DAY)',
   `initial_value` int NOT NULL COMMENT '起始值(单位:次)',
   `extra_points` int NOT NULL COMMENT '奖励的积分(额外)',

+ 14 - 14
doc/技术文档.md

@@ -620,20 +620,20 @@ ui设计工具:即时设计
 
 表名:punch_in_multi_task_ext
 
-| 字段                 | 类型        | 描述                                     | 索引     |
-| -------------------- | ----------- | ---------------------------------------- | -------- |
-| id                   | bigint      | 主键                                     | 主键索引 |
-| user_id              | bigint      | 用户ID                                   | 普通索引 |
-| multi_task_unique_id | bigint      | 多任务ID                                 | 普通索引 |
-| dimension            | varchar(10) | 使用维度(一天-ONE_DAY,多天-MULTI_DAY) |          |
-| initial_value        | int         | 起始值(单位:次)                       |          |
-| extra_points         | int         | 奖励的积分(额外)                       |          |
-| created_by           | bigint      | 创建人                                   |          |
-| creation_time        | timestamp   | 创建时间                                 |          |
-| last_updated_by      | bigint      | 最后更新人                               |          |
-| last_update_time     | timestamp   | 最后更新时间                             |          |
-| version              | bigint      | 版本号                                   |          |
-| delete_flag          | tinyint     | 逻辑删除标志(0-未删除,1-已删除)       |          |
+| 字段             | 类型        | 描述                                     | 索引     |
+| ---------------- | ----------- | ---------------------------------------- | -------- |
+| id               | bigint      | 主键                                     | 主键索引 |
+| user_id          | bigint      | 用户ID                                   | 普通索引 |
+| multi_task_id    | bigint      | 多任务ID                                 | 普通索引 |
+| dimension        | varchar(10) | 使用维度(一天-ONE_DAY,多天-MULTI_DAY) |          |
+| initial_value    | int         | 起始值(单位:次)                       |          |
+| extra_points     | int         | 奖励的积分(额外)                       |          |
+| created_by       | bigint      | 创建人                                   |          |
+| creation_time    | timestamp   | 创建时间                                 |          |
+| last_updated_by  | bigint      | 最后更新人                               |          |
+| last_update_time | timestamp   | 最后更新时间                             |          |
+| version          | bigint      | 版本号                                   |          |
+| delete_flag      | tinyint     | 逻辑删除标志(0-未删除,1-已删除)       |          |
 
 
 

+ 2 - 2
src/main/java/com/punchsettle/server/atomic/entity/PunchInMultiTaskExt.java

@@ -33,8 +33,8 @@ public class PunchInMultiTaskExt extends BaseEntity implements Serializable {
     /**
      * 多任务ID
      */
-    @Column(name = "multi_task_unique_id")
-    private Long multiTaskUniqueId;
+    @Column(name = "multi_task_id")
+    private Long multiTaskId;
 
     /**
      * 使用维度(一天-ONE_DAY,多天-MULTI_DAY)

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

@@ -6,6 +6,7 @@ import java.math.BigDecimal;
 
 import com.punchsettle.server.common.pojo.BaseEntity;
 
+import com.punchsettle.server.constant.PunchInStatusEnum;
 import jakarta.persistence.Column;
 import jakarta.persistence.Table;
 import lombok.Data;
@@ -39,9 +40,10 @@ public class PunchInMultiTaskHistory extends BaseEntity implements Serializable
 
     /**
      * 打卡状态(DONE-完成,UNDONE-未完成)
+     * @see PunchInStatusEnum
      */
     @Column(name = "punch_in_status")
-    private String punchInStatus;
+    private PunchInStatusEnum punchInStatus;
 
     /**
      * 总任务数

+ 2 - 1
src/main/java/com/punchsettle/server/atomic/mapper/PunchInMultiTaskHistoryMapper.java

@@ -1,6 +1,7 @@
 package com.punchsettle.server.atomic.mapper;
 
 import com.punchsettle.server.atomic.entity.PunchInMultiTaskHistory;
+import tk.mybatis.mapper.additional.update.batch.BatchUpdateSelectiveMapper;
 import tk.mybatis.mapper.common.Mapper;
 
 /**
@@ -9,6 +10,6 @@ import tk.mybatis.mapper.common.Mapper;
  * @description 打卡多任务记录表 Mapper
  * @date 2025/04/08 10:30
  */
-public interface PunchInMultiTaskHistoryMapper extends Mapper<PunchInMultiTaskHistory> {
+public interface PunchInMultiTaskHistoryMapper extends Mapper<PunchInMultiTaskHistory>, BatchUpdateSelectiveMapper<PunchInMultiTaskHistory> {
 
 }

+ 12 - 0
src/main/java/com/punchsettle/server/atomic/service/IPunchInMultiTaskExtService.java

@@ -1,5 +1,10 @@
 package com.punchsettle.server.atomic.service;
 
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskExt;
+import com.punchsettle.server.pojo.punchIn.PunchInMultiTaskExtQuery;
+
+import java.util.List;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -7,4 +12,11 @@ package com.punchsettle.server.atomic.service;
  * @description 打卡多任务拓展表 service
  */
 public interface IPunchInMultiTaskExtService {
+
+    /**
+     * 根据条件查询打卡多任务拓展表
+     * @param punchInMultiTaskExtQuery
+     * @return
+     */
+    List<PunchInMultiTaskExt> queryByCondition(PunchInMultiTaskExtQuery punchInMultiTaskExtQuery);
 }

+ 18 - 0
src/main/java/com/punchsettle/server/atomic/service/IPunchInMultiTaskHistoryService.java

@@ -1,5 +1,10 @@
 package com.punchsettle.server.atomic.service;
 
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskHistory;
+import com.punchsettle.server.pojo.punchIn.PunchInMultiTaskHistoryQuery;
+
+import java.util.List;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -7,4 +12,17 @@ package com.punchsettle.server.atomic.service;
  * @description 打卡多任务记录表 service
  */
 public interface IPunchInMultiTaskHistoryService {
+
+    /**
+     * 根据条件查询打卡多任务记录表
+     * @param punchInMultiTaskHistoryQuery 查询条件
+     * @return 打卡多任务记录表列表
+     */
+    List<PunchInMultiTaskHistory> queryByCondition(PunchInMultiTaskHistoryQuery punchInMultiTaskHistoryQuery);
+
+    /**
+     * 批量更新打卡多任务记录表
+     * @param punchInMultiTaskHistoryList
+     */
+    void batchUpdate(List<PunchInMultiTaskHistory> punchInMultiTaskHistoryList);
 }

+ 12 - 0
src/main/java/com/punchsettle/server/atomic/service/IPunchInMultiTaskRelaService.java

@@ -1,5 +1,10 @@
 package com.punchsettle.server.atomic.service;
 
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskRela;
+
+import java.util.Collection;
+import java.util.List;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -7,4 +12,11 @@ package com.punchsettle.server.atomic.service;
  * @description 打卡多任务关联表 service
  */
 public interface IPunchInMultiTaskRelaService {
+
+    /**
+     * 根据多任务id查询多任务关联表
+     * @param multiTaskIds
+     * @return
+     */
+    List<PunchInMultiTaskRela> queryByMultiTaskId(Collection<Long> multiTaskIds);
 }

+ 12 - 0
src/main/java/com/punchsettle/server/atomic/service/IPunchInMultiTaskService.java

@@ -1,5 +1,10 @@
 package com.punchsettle.server.atomic.service;
 
+import com.punchsettle.server.atomic.entity.PunchInMultiTask;
+import com.punchsettle.server.pojo.punchIn.PunchInMultiTaskQuery;
+
+import java.util.List;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -7,4 +12,11 @@ package com.punchsettle.server.atomic.service;
  * @description 打卡多任务表 service
  */
 public interface IPunchInMultiTaskService {
+
+    /**
+     * 根据条件查询打卡多任务表
+     * @param punchInMultiTaskQuery
+     * @return
+     */
+    List<PunchInMultiTask> queryByCondition(PunchInMultiTaskQuery punchInMultiTaskQuery);
 }

+ 26 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInMultiTaskExtServiceImpl.java

@@ -1,7 +1,18 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskExt;
+import com.punchsettle.server.atomic.mapper.PunchInMultiTaskExtMapper;
 import com.punchsettle.server.atomic.service.IPunchInMultiTaskExtService;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.pojo.punchIn.PunchInMultiTaskExtQuery;
+import com.punchsettle.server.utiis.WeekendUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
+
+import java.util.List;
 
 /**
  * @author tyuio
@@ -11,4 +22,19 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class PunchInMultiTaskExtServiceImpl implements IPunchInMultiTaskExtService {
+
+    @Autowired
+    private PunchInMultiTaskExtMapper punchInMultiTaskExtMapper;
+
+    @Override
+    public List<PunchInMultiTaskExt> queryByCondition(PunchInMultiTaskExtQuery punchInMultiTaskExtQuery) {
+        Assert.isNull(punchInMultiTaskExtQuery);
+
+        Weekend<PunchInMultiTaskExt> weekend = WeekendUtils.createExcludeAuditFields(PunchInMultiTaskExt.class);
+        WeekendCriteria<PunchInMultiTaskExt, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(punchInMultiTaskExtQuery.getMultiTaskIds())) {
+            criteria.andIn(PunchInMultiTaskExt::getMultiTaskId, punchInMultiTaskExtQuery.getMultiTaskIds());
+        }
+        return punchInMultiTaskExtMapper.selectByExample(weekend);
+    }
 }

+ 36 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInMultiTaskHistoryServiceImpl.java

@@ -1,7 +1,19 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskHistory;
+import com.punchsettle.server.atomic.mapper.PunchInMultiTaskHistoryMapper;
 import com.punchsettle.server.atomic.service.IPunchInMultiTaskHistoryService;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.pojo.punchIn.PunchInMultiTaskHistoryQuery;
+import com.punchsettle.server.utiis.WeekendUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
+
+import java.util.List;
 
 /**
  * @author tyuio
@@ -11,4 +23,28 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class PunchInMultiTaskHistoryServiceImpl implements IPunchInMultiTaskHistoryService {
+
+    @Autowired
+    private PunchInMultiTaskHistoryMapper punchInMultiTaskHistoryMapper;
+
+    @Override
+    public List<PunchInMultiTaskHistory> queryByCondition(PunchInMultiTaskHistoryQuery punchInMultiTaskHistoryQuery) {
+        Assert.isNull(punchInMultiTaskHistoryQuery);
+
+        Weekend<PunchInMultiTaskHistory> weekend = WeekendUtils.createExcludeAuditFields(PunchInMultiTaskHistory.class);
+        WeekendCriteria<PunchInMultiTaskHistory, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(punchInMultiTaskHistoryQuery.getPunchInMultiTaskUniqueIds())) {
+            criteria.andIn(PunchInMultiTaskHistory::getPunchInMultiTaskUniqueId, punchInMultiTaskHistoryQuery.getPunchInMultiTaskUniqueIds());
+        }
+        if (StringUtils.hasText(punchInMultiTaskHistoryQuery.getPunchInDate())) {
+            criteria.andEqualTo(PunchInMultiTaskHistory::getPunchInDate, punchInMultiTaskHistoryQuery.getPunchInDate());
+        }
+        return punchInMultiTaskHistoryMapper.selectByExample(weekend);
+    }
+
+    @Override
+    public void batchUpdate(List<PunchInMultiTaskHistory> punchInMultiTaskHistoryList) {
+        Assert.notEmpty(punchInMultiTaskHistoryList);
+        punchInMultiTaskHistoryMapper.batchUpdateSelective(punchInMultiTaskHistoryList);
+    }
 }

+ 26 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInMultiTaskRelaServiceImpl.java

@@ -1,7 +1,17 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskRela;
+import com.punchsettle.server.atomic.mapper.PunchInMultiTaskRelaMapper;
 import com.punchsettle.server.atomic.service.IPunchInMultiTaskRelaService;
+import com.punchsettle.server.utiis.WeekendUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
+
+import java.util.Collection;
+import java.util.List;
 
 /**
  * @author tyuio
@@ -11,4 +21,20 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class PunchInMultiTaskRelaServiceImpl implements IPunchInMultiTaskRelaService {
+
+    @Autowired
+    private PunchInMultiTaskRelaMapper punchInMultiTaskRelaMapper;
+
+    @Override
+    public List<PunchInMultiTaskRela> queryByMultiTaskId(Collection<Long> multiTaskIds) {
+        if (!CollectionUtils.isEmpty(multiTaskIds)) {
+            return List.of();
+        }
+        Weekend<PunchInMultiTaskRela> weekend = WeekendUtils.createExcludeAuditFields(PunchInMultiTaskRela.class);
+        WeekendCriteria<PunchInMultiTaskRela, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(multiTaskIds)) {
+            criteria.andIn(PunchInMultiTaskRela::getPunchInMultiTaskId, multiTaskIds);
+        }
+        return punchInMultiTaskRelaMapper.selectByExample(weekend);
+    }
 }

+ 30 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInMultiTaskServiceImpl.java

@@ -1,7 +1,19 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import com.punchsettle.server.atomic.entity.PunchInMultiTask;
+import com.punchsettle.server.atomic.mapper.PunchInMultiTaskMapper;
 import com.punchsettle.server.atomic.service.IPunchInMultiTaskService;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.pojo.punchIn.PunchInMultiTaskQuery;
+import com.punchsettle.server.utiis.WeekendUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
+
+import java.util.List;
+import java.util.Objects;
 
 /**
  * @author tyuio
@@ -11,4 +23,22 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class PunchInMultiTaskServiceImpl implements IPunchInMultiTaskService {
+
+    @Autowired
+    private PunchInMultiTaskMapper punchInMultiTaskMapper;
+
+    @Override
+    public List<PunchInMultiTask> queryByCondition(PunchInMultiTaskQuery punchInMultiTaskQuery) {
+        Assert.isNull(punchInMultiTaskQuery);
+
+        Weekend<PunchInMultiTask> weekend = WeekendUtils.createExcludeAuditFields(PunchInMultiTask.class);
+        WeekendCriteria<PunchInMultiTask, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(punchInMultiTaskQuery.getUserIds())) {
+            criteria.andIn(PunchInMultiTask::getUserId, punchInMultiTaskQuery.getUserIds());
+        }
+        if (Objects.nonNull(punchInMultiTaskQuery.getMultiTaskTaskStatus())) {
+            criteria.andEqualTo(PunchInMultiTask::getMultiTaskStatus, punchInMultiTaskQuery.getMultiTaskTaskStatus());
+        }
+        return punchInMultiTaskMapper.selectByExample(weekend);
+    }
 }

+ 3 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInStatusServiceImpl.java

@@ -35,6 +35,9 @@ public class PunchInStatusServiceImpl implements IPunchInStatusService {
         if (!CollectionUtils.isEmpty(punchInStatusQuery.getTaskUniqueIds())) {
             criteria.andIn(PunchInStatus::getPunchInTaskUniqueId, punchInStatusQuery.getTaskUniqueIds());
         }
+        if (!CollectionUtils.isEmpty(punchInStatusQuery.getUserIds())) {
+            criteria.andIn(PunchInStatus::getUserId, punchInStatusQuery.getUserIds());
+        }
         return punchInStatusMapper.selectByExample(weekend);
     }
 }

+ 20 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PunchInMultiTaskExtQuery.java

@@ -0,0 +1,20 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import lombok.Data;
+
+import java.util.Collection;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/16 9:40
+ * @description 打卡多任务拓展 查询类
+ */
+@Data
+public class PunchInMultiTaskExtQuery {
+
+    /**
+     * 多任务id
+     */
+    private Collection<Long> multiTaskIds;
+}

+ 25 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PunchInMultiTaskHistoryQuery.java

@@ -0,0 +1,25 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import lombok.Data;
+
+import java.util.Collection;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/16 9:46
+ * @description 打卡多任务记录表 查询类
+ */
+@Data
+public class PunchInMultiTaskHistoryQuery {
+
+    /**
+     * 打卡多任务记录表唯一id
+     */
+    private Collection<Long> punchInMultiTaskUniqueIds;
+
+    /**
+     * 打卡日期
+     */
+    private String punchInDate;
+}

+ 26 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PunchInMultiTaskQuery.java

@@ -0,0 +1,26 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import com.punchsettle.server.constant.ArchiveStatusEnum;
+import lombok.Data;
+
+import java.util.Collection;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/16 9:24
+ * @description 打卡多任务 查询类
+ */
+@Data
+public class PunchInMultiTaskQuery {
+
+    /**
+     * 用户id列表
+     */
+    private Collection<Long> userIds;
+
+    /**
+     * 任务状态
+     */
+    private ArchiveStatusEnum multiTaskTaskStatus;
+}

+ 55 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PunchInSettleDto.java

@@ -0,0 +1,55 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import com.punchsettle.server.atomic.entity.PunchInMultiTask;
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskExt;
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskHistory;
+import com.punchsettle.server.atomic.entity.PunchInStatus;
+import com.punchsettle.server.atomic.entity.PunchInTaskHistory;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/16 10:17
+ * @description 打卡结算 DTO
+ */
+@Data
+public class PunchInSettleDto {
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 打卡多任务
+     */
+    private PunchInMultiTask punchInMultiTask;
+
+    /**
+     * 打卡多任务拓展信息
+     */
+    private List<PunchInMultiTaskExt> punchInMultiTaskExtList;
+
+    /**
+     * 多任务打卡记录
+     */
+    private PunchInMultiTaskHistory punchInMultiTaskHistory;
+
+    /**
+     * 打卡多任务关联的打卡记录
+     */
+    private List<PunchInTaskHistory> relaPunchInTaskHistories;
+
+    /**
+     * 打卡多任务状态
+     */
+    private PunchInStatus punchInStatusInMultiTask;
+
+    /**
+     * 打卡任务列表
+     */
+    private List<PunchInTaskDto> punchInTaskDtoList;
+}

+ 5 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PunchInStatusQuery.java

@@ -17,4 +17,9 @@ public class PunchInStatusQuery {
      * 打卡任务唯一id集合
      */
     private Collection<Long> taskUniqueIds;
+
+    /**
+     * 用户id集合
+     */
+    private Collection<Long> userIds;
 }

+ 52 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PunchInTaskDto.java

@@ -0,0 +1,52 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import java.util.List;
+
+import com.punchsettle.server.atomic.entity.PunchInStatsMonth;
+import com.punchsettle.server.atomic.entity.PunchInStatsWeek;
+import com.punchsettle.server.atomic.entity.PunchInStatus;
+import com.punchsettle.server.atomic.entity.PunchInTask;
+import com.punchsettle.server.atomic.entity.PunchInTaskExt;
+import com.punchsettle.server.atomic.entity.PunchInTaskHistory;
+
+import lombok.Data;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/16 10:17
+ * @description 打卡结算 DTO
+ */
+@Data
+public class PunchInTaskDto {
+
+    /**
+     * 打卡任务
+     */
+    private PunchInTask punchInTask;
+
+    /**
+     * 打卡任务拓展信息
+     */
+    private List<PunchInTaskExt> punchInTaskExtList;
+
+    /**
+     * 打卡记录
+     */
+    private PunchInTaskHistory punchInTaskHistory;
+
+    /**
+     * 打卡周数据据统计
+     */
+    private PunchInStatsWeek punchInStatsWeek;
+
+    /**
+     * 打卡月数据据统计
+     */
+    private PunchInStatsMonth punchInStatsMonth;
+
+    /**
+     * 打卡状态
+     */
+    private PunchInStatus punchInStatus;
+}

+ 202 - 75
src/main/java/com/punchsettle/server/task/PunchInCoreTask.java

@@ -1,5 +1,9 @@
 package com.punchsettle.server.task;
 
+import com.punchsettle.server.atomic.entity.PunchInMultiTask;
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskExt;
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskHistory;
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskRela;
 import com.punchsettle.server.atomic.entity.PunchInStatsMonth;
 import com.punchsettle.server.atomic.entity.PunchInStatsWeek;
 import com.punchsettle.server.atomic.entity.PunchInStatus;
@@ -8,6 +12,7 @@ import com.punchsettle.server.atomic.entity.PunchInTaskExt;
 import com.punchsettle.server.atomic.entity.PunchInTaskHistory;
 import com.punchsettle.server.atomic.service.IPunchInMultiTaskExtService;
 import com.punchsettle.server.atomic.service.IPunchInMultiTaskHistoryService;
+import com.punchsettle.server.atomic.service.IPunchInMultiTaskRelaService;
 import com.punchsettle.server.atomic.service.IPunchInMultiTaskService;
 import com.punchsettle.server.atomic.service.IPunchInStatsMonthService;
 import com.punchsettle.server.atomic.service.IPunchInStatsWeekService;
@@ -17,9 +22,14 @@ import com.punchsettle.server.atomic.service.IPunchInTaskHistoryService;
 import com.punchsettle.server.atomic.service.IPunchInTaskService;
 import com.punchsettle.server.constant.ArchiveStatusEnum;
 import com.punchsettle.server.constant.PunchInStatusEnum;
+import com.punchsettle.server.pojo.punchIn.PunchInMultiTaskExtQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInMultiTaskHistoryQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInMultiTaskQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInSettleDto;
 import com.punchsettle.server.pojo.punchIn.PunchInStatsMonthQuery;
 import com.punchsettle.server.pojo.punchIn.PunchInStatsWeekQuery;
 import com.punchsettle.server.pojo.punchIn.PunchInStatusQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInTaskDto;
 import com.punchsettle.server.pojo.punchIn.PunchInTaskExtQuery;
 import com.punchsettle.server.pojo.punchIn.PunchInTaskHistoryQuery;
 import com.punchsettle.server.pojo.punchIn.PunchInTaskQuery;
@@ -30,14 +40,12 @@ import com.punchsettle.server.utiis.DateUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
 
 import java.time.LocalDate;
-import java.time.temporal.TemporalField;
-import java.time.temporal.WeekFields;
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -64,29 +72,30 @@ public class PunchInCoreTask {
         log.info("========== 打卡定时任务 结束执行 ==========");
     }
 
-//    public void punchInInTask(PunchInTask punchInTask, List<PunchInTaskExt> punchInTaskExtList,
-//                        PunchInTaskHistory punchInTaskHistory,
-//                        PunchInStatsWeek punchInStatsWeek, PunchInStatsMonth punchInStatsMonth, PunchInStatus punchInStatus,
-//                        ) {
-//
-//        PunchInStatusEnum punchInStatusEnum = punchInManager.judgePunchInStatusInTask(punchInTask, punchInTaskHistory);
-//
-//        int taskPoints = settleManager.calculatePointsInTask(punchInTask, punchInTaskExtList, punchInTaskHistory, punchInStatsWeek, punchInStatsMonth, punchInStatus);
-//
-//    }
-//
-//    public void punchInInMultiTask(PunchInStatus punchInStatus,
-//                                   List<PunchInTaskHistory> punchInTaskHistoryList,
-//        PunchInMultiTask punchInMultiTask, List<PunchInMultiTaskExt> punchInMultiTaskExtList,
-//        PunchInMultiTaskHistory punchInMultiTaskHistory) {
-//
-//        PunchInStatusEnum punchInStatusEnum1 =
-//            punchInManager.judgePunchInStatusInMultiTask(punchInMultiTask, punchInTaskHistoryList);
-//
-//        int multiTaskPoints = settleManager.calculatePointsInMultiTask(punchInMultiTask, punchInMultiTaskExtList,
-//            punchInMultiTaskHistory, punchInStatus);
-//
-//    }
+    // public void punchInInTask(PunchInTask punchInTask, List<PunchInTaskExt> punchInTaskExtList,
+    // PunchInTaskHistory punchInTaskHistory,
+    // PunchInStatsWeek punchInStatsWeek, PunchInStatsMonth punchInStatsMonth, PunchInStatus punchInStatus,
+    // ) {
+    //
+    // PunchInStatusEnum punchInStatusEnum = punchInManager.judgePunchInStatusInTask(punchInTask, punchInTaskHistory);
+    //
+    // int taskPoints = settleManager.calculatePointsInTask(punchInTask, punchInTaskExtList, punchInTaskHistory,
+    // punchInStatsWeek, punchInStatsMonth, punchInStatus);
+    //
+    // }
+    //
+    // public void punchInInMultiTask(PunchInStatus punchInStatus,
+    // List<PunchInTaskHistory> punchInTaskHistoryList,
+    // PunchInMultiTask punchInMultiTask, List<PunchInMultiTaskExt> punchInMultiTaskExtList,
+    // PunchInMultiTaskHistory punchInMultiTaskHistory) {
+    //
+    // PunchInStatusEnum punchInStatusEnum1 =
+    // punchInManager.judgePunchInStatusInMultiTask(punchInMultiTask, punchInTaskHistoryList);
+    //
+    // int multiTaskPoints = settleManager.calculatePointsInMultiTask(punchInMultiTask, punchInMultiTaskExtList,
+    // punchInMultiTaskHistory, punchInStatus);
+    //
+    // }
 
     @Autowired
     private IPunchInTaskService punchInTaskService;
@@ -115,88 +124,206 @@ public class PunchInCoreTask {
     @Autowired
     private IPunchInMultiTaskHistoryService punchInMultiTaskHistoryService;
 
+    @Autowired
+    private IPunchInMultiTaskRelaService punchInMultiTaskRelaService;
+
     @Autowired
     private ICalendarManager calendarManager;
 
-    public void manual(Long userId, String punchInDateStr) {
-        // 判断打卡日期是否节假日
-        boolean holidayFlag = calendarManager.judgeHoliday(punchInDateStr);
+    public void manual(List<Long> userIds, String punchInDateStr) {
+        List<PunchInSettleDto> punchInSettleData = getPunchInSettleData(userIds, punchInDateStr);
+
+        List<PunchInTaskHistory> updatePunchInTaskHistories = new ArrayList<>(punchInSettleData.size());
+        List<PunchInMultiTaskHistory> updatePunchInMultiTaskHistories = new ArrayList<>(punchInSettleData.size());
+        for (PunchInSettleDto punchInSettle : punchInSettleData) {
+            // 单任务处理部分
+            for (PunchInTaskDto punchInTaskDto : punchInSettle.getPunchInTaskDtoList()) {
+                PunchInTaskHistory updatePunchInTaskHistory = new PunchInTaskHistory();
+                updatePunchInTaskHistory.setId(punchInTaskDto.getPunchInTaskHistory().getId());
+                updatePunchInTaskHistory.setPunchInStatus(PunchInStatusEnum.UNDONE);
+
+                // 判断打卡状态
+                PunchInStatusEnum punchInStatusResult = punchInManager.judgePunchInStatusInTask(punchInTaskDto.getPunchInTask(), punchInTaskDto.getPunchInTaskHistory());
+                punchInSettle.getPunchInMultiTaskHistory().setPunchInStatus(punchInStatusResult);
+                updatePunchInTaskHistory.setPunchInStatus(punchInStatusResult);
+
+                // TODO 要判断并设置结算状态
+                // 计算积分
+                int taskPoints = settleManager.calculatePointsInTask(punchInTaskDto.getPunchInTask(), punchInTaskDto.getPunchInTaskExtList(),
+                        punchInTaskDto.getPunchInTaskHistory(), punchInTaskDto.getPunchInStatsWeek(),
+                        punchInTaskDto.getPunchInStatsMonth(), punchInTaskDto.getPunchInStatus());
+                updatePunchInTaskHistory.setSettlePoints(taskPoints);
+
+                // TODO 要设置结算任务执行ID
+
+                // 还有其他的要设置
+                updatePunchInTaskHistory.setSettleTaskHistoryId(punchInTaskDto.getPunchInTask().getId());
+                updatePunchInTaskHistories.add(updatePunchInTaskHistory);
+            }
+
+            // 多任务处理部分
+            PunchInMultiTaskHistory updatePunchInMultiTaskHistory = new PunchInMultiTaskHistory();
+
+            // 判断多任务打卡状态并设置
+            PunchInStatusEnum punchInStatusEnumResult = punchInManager.judgePunchInStatusInMultiTask(punchInSettle.getPunchInMultiTask(),
+                    punchInSettle.getRelaPunchInTaskHistories());
+            punchInSettle.getPunchInMultiTaskHistory().setPunchInStatus(punchInStatusEnumResult);
+            updatePunchInMultiTaskHistory.setPunchInStatus(punchInStatusEnumResult);
+
+            int multiTaskPoints = settleManager.calculatePointsInMultiTask(punchInSettle.getPunchInMultiTask(),
+                    punchInSettle.getPunchInMultiTaskExtList(), punchInSettle.getPunchInMultiTaskHistory(),
+                    punchInSettle.getPunchInStatusInMultiTask());
+            updatePunchInMultiTaskHistory.setSettlePoints(multiTaskPoints);
+
+            // TODO 要判断并设置结算状态
+            // TODO 要设置结算任务执行ID
+            updatePunchInMultiTaskHistories.add(updatePunchInMultiTaskHistory);
+        }
+
+        punchInTaskHistoryService.batchUpdate(updatePunchInTaskHistories);
+        punchInMultiTaskHistoryService.batchUpdate(updatePunchInMultiTaskHistories);
+    }
+
+    /**
+     * 获取用户ID-打卡结算数据关联
+     * @param userIds 设计的用户
+     * @param punchInDateStr 打卡日期
+     * @return
+     */
+    private List<PunchInSettleDto> getPunchInSettleData(List<Long> userIds, String punchInDateStr) {
         // 打卡日期
         LocalDate punchInDate = LocalDate.parse(punchInDateStr);
-        // 本周是第几周
-        TemporalField weekOfYearField = WeekFields.ISO.weekOfYear();
-        int weekOfYear = punchInDate.get(weekOfYearField);
 
+        // 获取多任务信息,用户ID-多任务关联
+        PunchInMultiTaskQuery punchInMultiTaskQuery = new PunchInMultiTaskQuery();
+        punchInMultiTaskQuery.setMultiTaskTaskStatus(ArchiveStatusEnum.ACTIVE);
+        punchInMultiTaskQuery.setUserIds(userIds);
+        List<PunchInMultiTask> punchInMultiTasks = punchInMultiTaskService.queryByCondition(punchInMultiTaskQuery);
+        Map<Long, PunchInMultiTask> punchInMultiTaskMap = punchInMultiTasks.stream().collect(Collectors.toMap(PunchInMultiTask::getUserId, Function.identity(), (key1, key2) -> key1));
+
+        // 多任务ID
+        Set<Long> multiTaskIds = punchInMultiTasks.stream().map(PunchInMultiTask::getId).collect(Collectors.toSet());
+        // 多任务唯一ID
+        Set<Long> multiTaskUniqueIds = punchInMultiTasks.stream().map(PunchInMultiTask::getMultiTaskUniqueId).collect(Collectors.toSet());
+
+        // 获取多任务拓展信息,多任务ID-多任务拓展关联
+        PunchInMultiTaskExtQuery punchInMultiTaskExtQuery = new PunchInMultiTaskExtQuery();
+        punchInMultiTaskExtQuery.setMultiTaskIds(multiTaskIds);
+        List<PunchInMultiTaskExt> punchInMultiTaskExtList = punchInMultiTaskExtService.queryByCondition(punchInMultiTaskExtQuery);
+        Map<Long, List<PunchInMultiTaskExt>> punchInMultiTaskExtMap = punchInMultiTaskExtList.stream().collect(Collectors.groupingBy(PunchInMultiTaskExt::getMultiTaskId));
+
+        // 获取多任务打卡历史信息,多任务唯一ID-多任务打卡历史关联
+        PunchInMultiTaskHistoryQuery punchInMultiTaskHistoryQuery = new PunchInMultiTaskHistoryQuery();
+        punchInMultiTaskHistoryQuery.setPunchInMultiTaskUniqueIds(multiTaskUniqueIds);
+        punchInMultiTaskHistoryQuery.setPunchInDate(punchInDateStr);
+        List<PunchInMultiTaskHistory> punchInMultiTaskHistories = punchInMultiTaskHistoryService.queryByCondition(punchInMultiTaskHistoryQuery);
+        Map<Long, PunchInMultiTaskHistory> punchInMultiTaskHistoryMap = punchInMultiTaskHistories.stream().collect(Collectors.toMap(PunchInMultiTaskHistory::getPunchInMultiTaskUniqueId, Function.identity(), (key1, key2)->key1));
+
+        // 打卡任务状态,用户ID-打卡状态关联
+        PunchInStatusQuery punchInStatusQuery = new PunchInStatusQuery();
+        punchInStatusQuery.setUserIds(userIds);
+        List<PunchInStatus> punchInStatusList = punchInStatusService.queryByCondition(punchInStatusQuery);
+        Map<Long, List<PunchInStatus>> punchInStatusMap = punchInStatusList.stream().collect(Collectors.groupingBy(PunchInStatus::getUserId));
+
+        // 多任务关联打卡任务,多任务ID-多任务关联打卡任务关联
+        List<PunchInMultiTaskRela> punchInMultiTaskRelaList = punchInMultiTaskRelaService.queryByMultiTaskId(multiTaskIds);
+        Map<Long, List<PunchInMultiTaskRela>> punchInMultiTaskRelaMap = punchInMultiTaskRelaList.stream().collect(Collectors.groupingBy(PunchInMultiTaskRela::getPunchInMultiTaskId));
+
+        // 获取打卡记录,用户ID-打卡记录关联
         PunchInTaskHistoryQuery punchInTaskHistoryQuery = new PunchInTaskHistoryQuery();
         punchInTaskHistoryQuery.setPunchInDate(punchInDateStr);
-        punchInTaskHistoryQuery.setUserIds(Arrays.asList(userId));
+        punchInTaskHistoryQuery.setUserIds(userIds);
         List<PunchInTaskHistory> punchInTaskHistories = punchInTaskHistoryService.queryByCondition(punchInTaskHistoryQuery);
-        if(CollectionUtils.isEmpty(punchInTaskHistories)) {
-            log.info("用户:{} 在打卡日期:{} 没有查询到打卡记录", userId, punchInDateStr);
-            return;
-        }
+        Map<Long, List<PunchInTaskHistory>> punchInTaskHistoryMap = punchInTaskHistories.stream().collect(Collectors.groupingBy(PunchInTaskHistory::getUserId));
 
+        // 打卡任务唯一ID
         Set<Long> punchInTaskUniqueIdList = punchInTaskHistories.stream().map(PunchInTaskHistory::getPunchInTaskUniqueId).collect(Collectors.toSet());
+
+        // 获取打卡任务信息,打卡任务唯一ID-打卡任务关联
         PunchInTaskQuery punchInTaskQuery = new PunchInTaskQuery();
         punchInTaskQuery.setTaskStatus(ArchiveStatusEnum.ACTIVE);
         punchInTaskQuery.setTaskUniqueIds(punchInTaskUniqueIdList);
         List<PunchInTask> punchInTasks = punchInTaskService.queryByCondition(punchInTaskQuery);
-        if(CollectionUtils.isEmpty(punchInTasks)) {
-            log.info("用户:{} 在打卡日期:{} 没有查询到打卡任务", userId, punchInDateStr);
-            return;
-        }
         Map<Long, PunchInTask> punchInTaskMap = punchInTasks.stream().collect(Collectors.toMap(PunchInTask::getTaskUniqueId, Function.identity(), (key1, key2) -> key1));
 
-        // 拓展表
+        // 打卡任务ID
         Set<Long> punchInTaskIds = punchInTasks.stream().map(PunchInTask::getId).collect(Collectors.toSet());
+
+        // 获取打卡任务拓展表,打卡任务ID-打卡任务拓展关联
         PunchInTaskExtQuery punchInTaskExtQuery = new PunchInTaskExtQuery();
         punchInTaskExtQuery.setPunchInTaskIds(punchInTaskIds);
         List<PunchInTaskExt> punchInTaskExtList = punchInTaskExtService.queryByCondition(punchInTaskExtQuery);
         Map<Long, List<PunchInTaskExt>> punchInTaskExtGroupList = punchInTaskExtList.stream().collect(Collectors.groupingBy(PunchInTaskExt::getPunchInTaskId));
 
-        // 打卡任务周数据统计
+        // 获取打卡任务周数据统计,打卡任务唯一ID-打卡任务周数据统计关联
         PunchInStatsWeekQuery punchInStatsWeekQuery = new PunchInStatsWeekQuery();
         punchInStatsWeekQuery.setTaskUniqueIds(punchInTaskUniqueIdList);
         punchInStatsWeekQuery.setStatsTime(DateUtils.getYearWeek(punchInDate));
         List<PunchInStatsWeek> punchInStatsWeekList = punchInStatsWeekService.queryByCondition(punchInStatsWeekQuery);
         Map<Long, PunchInStatsWeek> punchInStatsWeekMap = punchInStatsWeekList.stream().collect(Collectors.toMap(PunchInStatsWeek::getTaskUniqueId, Function.identity(), (key1, key2)->key1));
 
-        // 打卡任务月数据统计
+        // 获取打卡任务月数据统计,打卡任务唯一ID-打卡任务月数据统计关联
         PunchInStatsMonthQuery punchInStatsMonthQuery = new PunchInStatsMonthQuery();
         punchInStatsMonthQuery.setTaskUniqueIds(punchInTaskUniqueIdList);
-        punchInStatsMonthQuery.setStatsTime(DateUtils.getYearWeek(punchInDate));
+        punchInStatsMonthQuery.setStatsTime(DateUtils.getYearMonth(punchInDate));
         List<PunchInStatsMonth> punchInStatsMonthList = punchInStatsMonthService.queryByCondition(punchInStatsMonthQuery);
         Map<Long, PunchInStatsMonth> punchInStatsMonthMap = punchInStatsMonthList.stream().collect(Collectors.toMap(PunchInStatsMonth::getTaskUniqueId, Function.identity(), (key1, key2)->key1));
 
-        // 打卡任务状态
-        PunchInStatusQuery punchInStatusQuery = new PunchInStatusQuery();
-        punchInStatusQuery.setTaskUniqueIds(punchInTaskUniqueIdList);
-        List<PunchInStatus> punchInStatusList = punchInStatusService.queryByCondition(punchInStatusQuery);
-        Map<Long, PunchInStatus> punchInStatusMap = punchInStatusList.stream().collect(Collectors.toMap(PunchInStatus::getPunchInTaskUniqueId, Function.identity(), (key1, key2)->key1));
-
-        List<PunchInTaskHistory> updatePunchInTaskHistories = punchInTaskHistories.stream().map(punchInTaskHistory -> {
-            PunchInTaskHistory updatePunchInTaskHistory = new PunchInTaskHistory();
-            updatePunchInTaskHistory.setId(punchInTaskHistory.getId());
-            updatePunchInTaskHistory.setPunchInStatus(PunchInStatusEnum.UNDONE);
-            // 设置打卡状态
-            PunchInTask punchInTask = punchInTaskMap.get(punchInTaskHistory.getPunchInTaskUniqueId());
-            PunchInStatusEnum punchInStatusResult = punchInManager.judgePunchInStatusInTask(punchInTask, punchInTaskHistory);
-            punchInTaskHistory.setPunchInStatus(punchInStatusResult);
-            updatePunchInTaskHistory.setPunchInStatus(punchInStatusResult);
-
-            // 计算积分
-            List<PunchInTaskExt> tempPunchInTaskExtList = punchInTaskExtGroupList.get(punchInTask.getId());
-            PunchInStatsWeek punchInStatsWeek = punchInStatsWeekMap.get(punchInTask.getTaskUniqueId());
-            PunchInStatsMonth punchInStatsMonth = punchInStatsMonthMap.get(punchInTask.getTaskUniqueId());
-            PunchInStatus punchInStatus = punchInStatusMap.get(punchInTask.getTaskUniqueId());
-            int taskPoints = settleManager.calculatePointsInTask(punchInTask, tempPunchInTaskExtList, punchInTaskHistory, punchInStatsWeek, punchInStatsMonth, punchInStatus);
-            updatePunchInTaskHistory.setSettlePoints(taskPoints);
-
-            // 还有其他的要设置
-
-            return updatePunchInTaskHistory;
+        return userIds.stream().map(userId -> {
+            PunchInSettleDto punchInSettleDto = new PunchInSettleDto();
+            punchInSettleDto.setUserId(userId);
+
+            PunchInMultiTask punchInMultiTask = punchInMultiTaskMap.get(userId);
+            punchInSettleDto.setPunchInMultiTask(punchInMultiTask);
+
+            List<PunchInMultiTaskExt> tempPunchInMultiTaskExtList = punchInMultiTaskExtMap.get(punchInMultiTask.getId());
+            punchInSettleDto.setPunchInMultiTaskExtList(tempPunchInMultiTaskExtList);
+
+            PunchInMultiTaskHistory punchInMultiTaskHistory = punchInMultiTaskHistoryMap.get(punchInMultiTask.getMultiTaskUniqueId());
+            punchInSettleDto.setPunchInMultiTaskHistory(punchInMultiTaskHistory);
+
+            List<PunchInStatus> tempPunchInStatusList = punchInStatusMap.get(userId);
+            PunchInStatus punchInStatusInMultiTask = tempPunchInStatusList.stream().filter(v -> Objects.nonNull(v.getPunchInMultiTaskUniqueId())).findFirst().get();
+            punchInSettleDto.setPunchInStatusInMultiTask(punchInStatusInMultiTask);
+
+            List<PunchInMultiTaskRela> tempPunchInMultiTaskRelaList = punchInMultiTaskRelaMap.get(punchInMultiTask.getId());
+            Set<Long> relaContainTaskIdList = tempPunchInMultiTaskRelaList.stream().map(PunchInMultiTaskRela::getPunchInTaskId).collect(Collectors.toSet());
+
+            Map<Long, PunchInStatus> punchInStatusInTaskMap = tempPunchInStatusList.stream().filter(v -> Objects.nonNull(v.getPunchInTaskUniqueId())).collect(Collectors.toMap(PunchInStatus::getPunchInTaskUniqueId, Function.identity(), (key1, key2) -> key1));
+
+            List<PunchInTaskHistory> tempPunchInTaskHistories = punchInTaskHistoryMap.get(userId);
+            List<PunchInTaskDto> punchInTaskDtoList = new ArrayList<>(tempPunchInTaskHistories.size());
+            List<PunchInTaskHistory> relaPunchInTaskHistories = new ArrayList<>(relaContainTaskIdList.size());
+            for (PunchInTaskHistory punchInTaskHistory : tempPunchInTaskHistories) {
+                PunchInTaskDto punchInTaskDto = new PunchInTaskDto();
+                punchInTaskDto.setPunchInTaskHistory(punchInTaskHistory);
+
+                PunchInTask punchInTask = punchInTaskMap.get(punchInTaskHistory.getPunchInTaskUniqueId());
+                punchInTaskDto.setPunchInTask(punchInTask);
+                if (relaContainTaskIdList.contains(punchInTask.getId())) {
+                    relaPunchInTaskHistories.add(punchInTaskHistory);
+                }
+
+                List<PunchInTaskExt> tempPunchInTaskExtList = punchInTaskExtGroupList.get(punchInTask.getId());
+                punchInTaskDto.setPunchInTaskExtList(tempPunchInTaskExtList);
+
+                PunchInStatsWeek punchInStatsWeek = punchInStatsWeekMap.get(punchInTask.getTaskUniqueId());
+                punchInTaskDto.setPunchInStatsWeek(punchInStatsWeek);
+
+                PunchInStatsMonth punchInStatsMonth = punchInStatsMonthMap.get(punchInTask.getTaskUniqueId());
+                punchInTaskDto.setPunchInStatsMonth(punchInStatsMonth);
+
+                PunchInStatus punchInStatus = punchInStatusInTaskMap.get(punchInTaskHistory.getPunchInTaskUniqueId());
+                punchInTaskDto.setPunchInStatus(punchInStatus);
+
+                punchInTaskDtoList.add(punchInTaskDto);
+            }
+
+            punchInSettleDto.setPunchInTaskDtoList(punchInTaskDtoList);
+            punchInSettleDto.setRelaPunchInTaskHistories(relaPunchInTaskHistories);
+
+            return punchInSettleDto;
         }).collect(Collectors.toList());
-        punchInTaskHistoryService.batchUpdate(updatePunchInTaskHistories);
-    }
 
+    }
 }