Bläddra i källkod

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

ChenYL 11 månader sedan
förälder
incheckning
ca3ee2e7fb
45 ändrade filer med 727 tillägg och 52 borttagningar
  1. 1 1
      doc/技术文档.md
  2. 15 0
      src/main/java/com/punchsettle/server/atomic/mapper/PunchInStatsWeekMapper.java
  3. 3 1
      src/main/java/com/punchsettle/server/atomic/mapper/PunchInTaskHistoryMapper.java
  4. 1 1
      src/main/java/com/punchsettle/server/atomic/service/IPunchInRecordService.java
  5. 1 1
      src/main/java/com/punchsettle/server/atomic/service/IPunchInService.java
  6. 12 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInStatsMonthService.java
  7. 22 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInStatsWeekService.java
  8. 12 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInStatusService.java
  9. 12 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInTaskExtService.java
  10. 18 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInTaskHistoryService.java
  11. 12 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInTaskService.java
  12. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInRecordServiceImpl.java
  13. 1 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInServiceImpl.java
  14. 30 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInStatsMonthServiceImpl.java
  15. 26 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInStatusServiceImpl.java
  16. 26 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInTaskExtServiceImpl.java
  17. 36 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInTaskHistoryServiceImpl.java
  18. 31 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInTaskServiceImpl.java
  19. 25 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInStatsMonthQuery.java
  20. 26 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInStatsWeekQuery.java
  21. 20 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInStatusQuery.java
  22. 20 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInTaskExtQuery.java
  23. 26 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInTaskHistoryQuery.java
  24. 28 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PunchInTaskQuery.java
  25. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInCalendarDataVO.java
  26. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInDataQuery.java
  27. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInDataVO.java
  28. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInQuery.java
  29. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRecordDataVO.java
  30. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRecordQuery.java
  31. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRecordRequest.java
  32. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRecordVO.java
  33. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRequest.java
  34. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInVO.java
  35. 1 1
      src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInWithRecordVO.java
  36. 6 6
      src/main/java/com/punchsettle/server/service/controller/PunchInController.java
  37. 2 4
      src/main/java/com/punchsettle/server/service/manager/IPunchInManager.java
  38. 6 6
      src/main/java/com/punchsettle/server/service/manager/IPunchInManagerV1.java
  39. 6 1
      src/main/java/com/punchsettle/server/service/manager/ISettleManager.java
  40. 4 4
      src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerImpl.java
  41. 11 12
      src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerV1Impl.java
  42. 46 0
      src/main/java/com/punchsettle/server/service/manager/impl/PunchInStatsWeekServiceImpl.java
  43. 2 2
      src/main/java/com/punchsettle/server/service/manager/impl/SettleManagerV1Impl.java
  44. 202 0
      src/main/java/com/punchsettle/server/task/PunchInCoreTask.java
  45. 26 0
      src/main/java/com/punchsettle/server/utiis/DateUtils.java

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

@@ -994,7 +994,7 @@ ui设计工具:即时设计
 | id                   | bigint       | 主键                               | 主键索引 |
 | user_id              | bigint       | 用户id                             | 普通索引 |
 | task_unique_id       | bigint       | 任务唯一ID                         | 普通索引 |
-| stats_time           | char(7)      | 统计时间(格式:yyyy-周数)        | 普通索引 |
+| stats_time           | char(7)      | 统计时间(格式:yyyy-W周数)       | 普通索引 |
 | punch_in_total_count | int          | 本周需打卡数                       |          |
 | punch_in_count       | int          | 本周已打卡数                       |          |
 | punch_in_done_count  | int          | 本周完成打卡数                     |          |

+ 15 - 0
src/main/java/com/punchsettle/server/atomic/mapper/PunchInStatsWeekMapper.java

@@ -0,0 +1,15 @@
+package com.punchsettle.server.atomic.mapper;
+
+import com.punchsettle.server.atomic.entity.PunchInStatsWeek;
+
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡任务周数据统计 Mapper
+ * @date 2025/04/08 10:30
+ */
+public interface PunchInStatsWeekMapper extends Mapper<PunchInStatsWeek> {
+
+}

+ 3 - 1
src/main/java/com/punchsettle/server/atomic/mapper/PunchInTaskHistoryMapper.java

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

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

@@ -3,7 +3,7 @@ package com.punchsettle.server.atomic.service;
 import java.util.List;
 
 import com.punchsettle.server.atomic.entity.PunchInRecord;
-import com.punchsettle.server.pojo.punchin.PunchInRecordQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInRecordQuery;
 
 /**
  * @author tyuio

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

@@ -3,7 +3,7 @@ package com.punchsettle.server.atomic.service;
 import java.util.List;
 
 import com.punchsettle.server.atomic.entity.PunchIn;
-import com.punchsettle.server.pojo.punchin.PunchInQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInQuery;
 
 /**
  * @author tyuio

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

@@ -1,5 +1,10 @@
 package com.punchsettle.server.atomic.service;
 
+import com.punchsettle.server.atomic.entity.PunchInStatsMonth;
+import com.punchsettle.server.pojo.punchIn.PunchInStatsMonthQuery;
+
+import java.util.List;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -7,4 +12,11 @@ package com.punchsettle.server.atomic.service;
  * @description 打卡任务月数据统计 service
  */
 public interface IPunchInStatsMonthService {
+
+    /**
+     * 根据条件查询打卡任务月数据统计
+     * @param punchInStatsMonthQuery
+     * @return
+     */
+    List<PunchInStatsMonth> queryByCondition(PunchInStatsMonthQuery punchInStatsMonthQuery);
 }

+ 22 - 0
src/main/java/com/punchsettle/server/atomic/service/IPunchInStatsWeekService.java

@@ -0,0 +1,22 @@
+package com.punchsettle.server.atomic.service;
+
+import com.punchsettle.server.atomic.entity.PunchInStatsWeek;
+import com.punchsettle.server.pojo.punchIn.PunchInStatsWeekQuery;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/8 10:37
+ * @description 打卡任务周数据统计 service
+ */
+public interface IPunchInStatsWeekService {
+
+    /**
+     * 根据条件查询打卡任务周数据统计
+     * @param punchInStatsWeekQuery
+     * @return
+     */
+    List<PunchInStatsWeek> queryByCondition(PunchInStatsWeekQuery punchInStatsWeekQuery);
+}

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

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

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

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

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

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

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

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

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

@@ -12,7 +12,7 @@ import com.punchsettle.server.atomic.entity.PunchInRecord;
 import com.punchsettle.server.atomic.mapper.PunchInRecordMapper;
 import com.punchsettle.server.atomic.service.IPunchInRecordService;
 import com.punchsettle.server.common.utils.Assert;
-import com.punchsettle.server.pojo.punchin.PunchInRecordQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInRecordQuery;
 
 import tk.mybatis.mapper.weekend.Weekend;
 import tk.mybatis.mapper.weekend.WeekendCriteria;

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

@@ -11,7 +11,7 @@ import com.punchsettle.server.atomic.entity.PunchIn;
 import com.punchsettle.server.atomic.mapper.PunchInMapper;
 import com.punchsettle.server.atomic.service.IPunchInService;
 import com.punchsettle.server.common.utils.Assert;
-import com.punchsettle.server.pojo.punchin.PunchInQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInQuery;
 
 import tk.mybatis.mapper.weekend.Weekend;
 import tk.mybatis.mapper.weekend.WeekendCriteria;

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

@@ -1,7 +1,19 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import com.punchsettle.server.atomic.entity.PunchInStatsMonth;
+import com.punchsettle.server.atomic.mapper.PunchInStatsMonthMapper;
 import com.punchsettle.server.atomic.service.IPunchInStatsMonthService;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.pojo.punchIn.PunchInStatsMonthQuery;
+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 PunchInStatsMonthServiceImpl implements IPunchInStatsMonthService {
+
+    @Autowired
+    private PunchInStatsMonthMapper punchInStatsMonthMapper;
+
+    @Override
+    public List<PunchInStatsMonth> queryByCondition(PunchInStatsMonthQuery punchInStatsMonthQuery) {
+        Assert.isNull(punchInStatsMonthQuery);
+
+        Weekend<PunchInStatsMonth> weekend = WeekendUtils.createExcludeAuditFields(PunchInStatsMonth.class);
+        WeekendCriteria<PunchInStatsMonth, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(punchInStatsMonthQuery.getTaskUniqueIds())) {
+            criteria.andIn(PunchInStatsMonth::getTaskUniqueId, punchInStatsMonthQuery.getTaskUniqueIds());
+        }
+        if (Objects.nonNull(punchInStatsMonthQuery.getStatsTime())) {
+            criteria.andEqualTo(PunchInStatsMonth::getStatsTime, punchInStatsMonthQuery.getStatsTime());
+        }
+        return punchInStatsMonthMapper.selectByExample(weekend);
+    }
 }

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

@@ -1,7 +1,18 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import com.punchsettle.server.atomic.entity.PunchInStatus;
+import com.punchsettle.server.atomic.mapper.PunchInStatusMapper;
 import com.punchsettle.server.atomic.service.IPunchInStatusService;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.pojo.punchIn.PunchInStatusQuery;
+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 PunchInStatusServiceImpl implements IPunchInStatusService {
+
+    @Autowired
+    private PunchInStatusMapper punchInStatusMapper;
+
+    @Override
+    public List<PunchInStatus> queryByCondition(PunchInStatusQuery punchInStatusQuery) {
+        Assert.isNull(punchInStatusQuery);
+
+        Weekend<PunchInStatus> weekend = WeekendUtils.createExcludeAuditFields(PunchInStatus.class);
+        WeekendCriteria<PunchInStatus, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(punchInStatusQuery.getTaskUniqueIds())) {
+            criteria.andIn(PunchInStatus::getPunchInTaskUniqueId, punchInStatusQuery.getTaskUniqueIds());
+        }
+        return punchInStatusMapper.selectByExample(weekend);
+    }
 }

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

@@ -1,7 +1,18 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import com.punchsettle.server.atomic.entity.PunchInTaskExt;
+import com.punchsettle.server.atomic.mapper.PunchInTaskExtMapper;
 import com.punchsettle.server.atomic.service.IPunchInTaskExtService;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.pojo.punchIn.PunchInTaskExtQuery;
+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 PunchInTaskExtServiceImpl implements IPunchInTaskExtService {
+
+    @Autowired
+    private PunchInTaskExtMapper punchInTaskExtMapper;
+
+    @Override
+    public List<PunchInTaskExt> queryByCondition(PunchInTaskExtQuery punchInTaskExtQuery) {
+        Assert.isNull(punchInTaskExtQuery);
+
+        Weekend<PunchInTaskExt> weekend = WeekendUtils.createExcludeAuditFields(PunchInTaskExt.class);
+        WeekendCriteria<PunchInTaskExt, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(punchInTaskExtQuery.getPunchInTaskIds())) {
+            criteria.andIn(PunchInTaskExt::getPunchInTaskId, punchInTaskExtQuery.getPunchInTaskIds());
+        }
+        return punchInTaskExtMapper.selectByExample(weekend);
+    }
 }

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

@@ -1,7 +1,19 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import com.punchsettle.server.atomic.entity.PunchInTaskHistory;
+import com.punchsettle.server.atomic.mapper.PunchInTaskHistoryMapper;
 import com.punchsettle.server.atomic.service.IPunchInTaskHistoryService;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.pojo.punchIn.PunchInTaskHistoryQuery;
+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 PunchInTaskHistoryServiceImpl implements IPunchInTaskHistoryService {
+
+    @Autowired
+    private PunchInTaskHistoryMapper punchInTaskHistoryMapper;
+
+    @Override
+    public List<PunchInTaskHistory> queryByCondition(PunchInTaskHistoryQuery punchInTaskHistoryQuery) {
+        Assert.isNull(punchInTaskHistoryQuery);
+
+        Weekend<PunchInTaskHistory> weekend = WeekendUtils.createExcludeAuditFields(PunchInTaskHistory.class);
+        WeekendCriteria<PunchInTaskHistory, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(punchInTaskHistoryQuery.getUserIds())) {
+            criteria.andIn(PunchInTaskHistory::getUserId, punchInTaskHistoryQuery.getUserIds());
+        }
+        if (StringUtils.hasText(punchInTaskHistoryQuery.getPunchInDate())) {
+            criteria.andEqualTo(PunchInTaskHistory::getPunchInDate, punchInTaskHistoryQuery.getPunchInDate());
+        }
+        return punchInTaskHistoryMapper.selectByExample(weekend);
+    }
+
+    @Override
+    public void batchUpdate(List<PunchInTaskHistory> punchInTaskHistories) {
+        Assert.notEmpty(punchInTaskHistories);
+        punchInTaskHistoryMapper.batchUpdateSelective(punchInTaskHistories);
+    }
 }

+ 31 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInTaskServiceImpl.java

@@ -1,7 +1,20 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import com.punchsettle.server.atomic.entity.PunchInTask;
+import com.punchsettle.server.atomic.mapper.PunchInTaskMapper;
 import com.punchsettle.server.atomic.service.IPunchInTaskService;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.constant.ArchiveStatusEnum;
+import com.punchsettle.server.pojo.punchIn.PunchInTaskQuery;
+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 +24,22 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class PunchInTaskServiceImpl implements IPunchInTaskService {
+
+    @Autowired
+    private PunchInTaskMapper punchInTaskMapper;
+
+    @Override
+    public List<PunchInTask> queryByCondition(PunchInTaskQuery punchInTaskQuery) {
+        Assert.isNull(punchInTaskQuery);
+
+        Weekend<PunchInTask> weekend = WeekendUtils.createExcludeAuditFields(PunchInTask.class);
+        WeekendCriteria<PunchInTask, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(punchInTaskQuery.getTaskUniqueIds())) {
+            criteria.andIn(PunchInTask::getTaskUniqueId, punchInTaskQuery.getTaskUniqueIds());
+        }
+        if (Objects.nonNull(punchInTaskQuery.getTaskStatus())) {
+            criteria.andEqualTo(PunchInTask::getTaskStatus, punchInTaskQuery.getTaskStatus());
+        }
+        return punchInTaskMapper.selectByExample(weekend);
+    }
 }

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

@@ -0,0 +1,25 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import java.util.Collection;
+
+import lombok.Data;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/15 20:52
+ * @description 打卡任务月数据统计 查询类
+ */
+@Data
+public class PunchInStatsMonthQuery {
+
+    /**
+     * 打卡任务唯一id集合
+     */
+    private Collection<Long> taskUniqueIds;
+
+    /**
+     * 统计时间(格式:yyyy-W周数)
+     */
+    private String statsTime;
+}

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

@@ -0,0 +1,26 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import lombok.Data;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/15 20:52
+ * @description 打卡任务周数据统计 查询类
+ */
+@Data
+public class PunchInStatsWeekQuery {
+
+    /**
+     * 打卡任务唯一id集合
+     */
+    private Collection<Long> taskUniqueIds;
+
+    /**
+     * 统计时间(格式:yyyy-W周数)
+     */
+    private String statsTime;
+}

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

@@ -0,0 +1,20 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import java.util.Collection;
+
+import lombok.Data;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/15 20:52
+ * @description 打卡任务状态 查询类
+ */
+@Data
+public class PunchInStatusQuery {
+
+    /**
+     * 打卡任务唯一id集合
+     */
+    private Collection<Long> taskUniqueIds;
+}

+ 20 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PunchInTaskExtQuery.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/15 21:19
+ * @description 打卡任务拓展 查询类
+ */
+@Data
+public class PunchInTaskExtQuery {
+
+    /**
+     * 打卡任务id
+     */
+    private Collection<Long> punchInTaskIds;
+}

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

@@ -0,0 +1,26 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import lombok.Data;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/15 17:26
+ * @description 打卡任务记录查询类
+ */
+@Data
+public class PunchInTaskHistoryQuery {
+
+    /**
+     * 用户id列表
+     */
+    private Collection<Long> userIds;
+
+    /**
+     * 打卡日期,格式:yyyy-MM-dd
+     */
+    private String punchInDate;
+}

+ 28 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PunchInTaskQuery.java

@@ -0,0 +1,28 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import java.util.Collection;
+
+import com.punchsettle.server.constant.ArchiveStatusEnum;
+import jakarta.persistence.Column;
+import lombok.Data;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/15 17:26
+ * @description 打卡任务查询类
+ */
+@Data
+public class PunchInTaskQuery {
+
+    /**
+     * 打卡任务唯一ID列表
+     */
+    private Collection<Long> taskUniqueIds;
+
+    /**
+     * 任务状态(活跃-ACTIVE,归档-ARCHIVE)
+     * @see ArchiveStatusEnum
+     */
+    private ArchiveStatusEnum taskStatus;
+}

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInCalendarDataVO.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInCalendarDataVO.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import java.time.LocalTime;
 

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInDataQuery.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInDataQuery.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInDataVO.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInDataVO.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import java.math.BigDecimal;
 import java.util.List;

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInQuery.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInQuery.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import java.util.List;
 

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInRecordDataVO.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRecordDataVO.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import java.time.LocalTime;
 

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInRecordQuery.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRecordQuery.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import java.util.List;
 

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInRecordRequest.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRecordRequest.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInRecordVO.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRecordVO.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import com.punchsettle.server.constant.PunchInStatusViewEnum;
 

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInRequest.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInRequest.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import java.time.LocalTime;
 

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInVO.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInVO.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import java.time.LocalTime;
 

+ 1 - 1
src/main/java/com/punchsettle/server/pojo/punchin/PunchInWithRecordVO.java → src/main/java/com/punchsettle/server/pojo/punchinV1/PunchInWithRecordVO.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.pojo.punchin;
+package com.punchsettle.server.pojo.punchinV1;
 
 import java.time.LocalTime;
 import java.util.List;

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

@@ -14,12 +14,12 @@ import com.punchsettle.server.common.valid.Delete;
 import com.punchsettle.server.common.valid.Query;
 import com.punchsettle.server.common.valid.Save;
 import com.punchsettle.server.common.valid.Update;
-import com.punchsettle.server.pojo.punchin.PunchInDataQuery;
-import com.punchsettle.server.pojo.punchin.PunchInDataVO;
-import com.punchsettle.server.pojo.punchin.PunchInRecordRequest;
-import com.punchsettle.server.pojo.punchin.PunchInRequest;
-import com.punchsettle.server.pojo.punchin.PunchInVO;
-import com.punchsettle.server.pojo.punchin.PunchInWithRecordVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInDataQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInDataVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInRecordRequest;
+import com.punchsettle.server.pojo.punchinV1.PunchInRequest;
+import com.punchsettle.server.pojo.punchinV1.PunchInVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInWithRecordVO;
 import com.punchsettle.server.service.manager.IPunchInManagerV1;
 
 /**

+ 2 - 4
src/main/java/com/punchsettle/server/service/manager/IPunchInManager.java

@@ -27,17 +27,15 @@ public interface IPunchInManager {
      * 判断打卡状态
      * @param punchInTask 当前打卡任务
      * @param punchInTaskHistory 打卡记录
-     * @param holidayFlag 是否是节假日(是-true,否-false)
      * @return
      */
-    PunchInStatusEnum judgePunchInStatusInTask(PunchInTask punchInTask, PunchInTaskHistory punchInTaskHistory, boolean holidayFlag);
+    PunchInStatusEnum judgePunchInStatusInTask(PunchInTask punchInTask, PunchInTaskHistory punchInTaskHistory);
 
     /**
      * 判断打卡状态(多任务)
      * @param punchInMultiTask 打卡多任务任务
      * @param punchInTaskHistoryList 打卡记录
-     * @param multiTaskNum 参与多任务计算数量
      * @return
      */
-    PunchInStatusEnum judgePunchInStatusInMultiTask(PunchInMultiTask punchInMultiTask, List<PunchInTaskHistory> punchInTaskHistoryList, int multiTaskNum);
+    PunchInStatusEnum judgePunchInStatusInMultiTask(PunchInMultiTask punchInMultiTask, List<PunchInTaskHistory> punchInTaskHistoryList);
 }

+ 6 - 6
src/main/java/com/punchsettle/server/service/manager/IPunchInManagerV1.java

@@ -12,12 +12,12 @@ import com.punchsettle.server.atomic.entity.PunchInTask;
 import com.punchsettle.server.atomic.entity.PunchInTaskExt;
 import com.punchsettle.server.atomic.entity.PunchInTaskHistory;
 import com.punchsettle.server.constant.PunchInStatusEnum;
-import com.punchsettle.server.pojo.punchin.PunchInDataQuery;
-import com.punchsettle.server.pojo.punchin.PunchInDataVO;
-import com.punchsettle.server.pojo.punchin.PunchInRecordRequest;
-import com.punchsettle.server.pojo.punchin.PunchInRequest;
-import com.punchsettle.server.pojo.punchin.PunchInVO;
-import com.punchsettle.server.pojo.punchin.PunchInWithRecordVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInDataQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInDataVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInRecordRequest;
+import com.punchsettle.server.pojo.punchinV1.PunchInRequest;
+import com.punchsettle.server.pojo.punchinV1.PunchInVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInWithRecordVO;
 
 /**
  * @author tyuio

+ 6 - 1
src/main/java/com/punchsettle/server/service/manager/ISettleManager.java

@@ -20,12 +20,16 @@ import java.util.List;
  */
 public interface ISettleManager {
 
+
     /**
      * 计算任务积分
      * @param punchInTask 打卡任务
      * @param punchInTaskExtList 打卡任务拓展信息列表
      * @param punchInTaskHistory 打卡记录
-     * @return
+     * @param punchInStatsWeek 打卡周统计
+     * @param punchInStatsMonth 打卡月统计
+     * @param punchInStatus 打卡统计
+     * @return 积分
      */
     int calculatePointsInTask(PunchInTask punchInTask, List<PunchInTaskExt> punchInTaskExtList, PunchInTaskHistory punchInTaskHistory, PunchInStatsWeek punchInStatsWeek, PunchInStatsMonth punchInStatsMonth, PunchInStatus punchInStatus);
 
@@ -35,6 +39,7 @@ public interface ISettleManager {
      * @param punchInMultiTask 打卡多任务
      * @param punchInMultiTaskExts 打卡多任务拓展信息列表
      * @param punchInMultiTaskHistory 打卡记录
+     * @param punchInStatus 打卡统计
      * @return
      */
     int calculatePointsInMultiTask(PunchInMultiTask punchInMultiTask, List<PunchInMultiTaskExt> punchInMultiTaskExts, PunchInMultiTaskHistory punchInMultiTaskHistory, PunchInStatus punchInStatus);

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

@@ -71,7 +71,7 @@ public class PunchInManagerImpl implements IPunchInManager {
     }
 
     @Override
-    public PunchInStatusEnum judgePunchInStatusInTask(PunchInTask punchInTask, PunchInTaskHistory punchInTaskHistory, boolean holidayFlag) {
+    public PunchInStatusEnum judgePunchInStatusInTask(PunchInTask punchInTask, PunchInTaskHistory punchInTaskHistory) {
         Assert.isNullInBusiness(punchInTask, "打卡任务不能为空 ");
 
         // 没有打卡记录,直接没完成
@@ -87,7 +87,7 @@ public class PunchInManagerImpl implements IPunchInManager {
 
         // 打卡任务的节假日启用配置
         CommonEnableStatusEnum holidayStatus = Optional.ofNullable(punchInTask.getHolidayStatus()).orElse(CommonEnableStatusEnum.DISABLED);
-        boolean enableHolidayFlag = CommonEnableStatusEnum.ENABLED.equals(holidayStatus) && holidayFlag;
+        boolean enableHolidayFlag = CommonEnableStatusEnum.ENABLED.equals(holidayStatus) && calendarManager.judgeHoliday(punchInTaskHistory.getPunchInDate());
 
         // 计数打卡,要区分是否节假日使用不同的判断标准
         if (PunchInMethodEnum.COUNT.equals(punchInTask.getPunchInMethod())) {
@@ -120,8 +120,8 @@ public class PunchInManagerImpl implements IPunchInManager {
     }
 
     @Override
-    public PunchInStatusEnum judgePunchInStatusInMultiTask(PunchInMultiTask punchInMultiTask, List<PunchInTaskHistory> punchInTaskHistoryList, int multiTaskNum) {
-        if (CollectionUtils.isEmpty(punchInTaskHistoryList) || multiTaskNum == 0) {
+    public PunchInStatusEnum judgePunchInStatusInMultiTask(PunchInMultiTask punchInMultiTask, List<PunchInTaskHistory> punchInTaskHistoryList) {
+        if (CollectionUtils.isEmpty(punchInTaskHistoryList)) {
             return PunchInStatusEnum.UNDONE;
         }
 

+ 11 - 12
src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerV1Impl.java

@@ -28,7 +28,6 @@ import com.punchsettle.server.constant.ConsecutiveStatusEnum;
 import com.punchsettle.server.constant.FullAttendancePeriodEnum;
 import com.punchsettle.server.constant.PunchInDimensionEnum;
 import com.punchsettle.server.constant.PunchInExtraMethodEnum;
-import com.punchsettle.server.constant.PunchInMethodMultiEnum;
 import com.punchsettle.server.constant.RepeatCategoryEnum;
 import com.punchsettle.server.service.manager.ICalendarManager;
 import org.springframework.beans.BeanUtils;
@@ -53,17 +52,17 @@ import com.punchsettle.server.constant.PunchInSettleTypeEnum;
 import com.punchsettle.server.constant.PunchInStatusEnum;
 import com.punchsettle.server.constant.PunchInStatusV1Enum;
 import com.punchsettle.server.constant.PunchInStatusViewEnum;
-import com.punchsettle.server.pojo.punchin.PunchInCalendarDataVO;
-import com.punchsettle.server.pojo.punchin.PunchInDataQuery;
-import com.punchsettle.server.pojo.punchin.PunchInDataVO;
-import com.punchsettle.server.pojo.punchin.PunchInQuery;
-import com.punchsettle.server.pojo.punchin.PunchInRecordDataVO;
-import com.punchsettle.server.pojo.punchin.PunchInRecordQuery;
-import com.punchsettle.server.pojo.punchin.PunchInRecordRequest;
-import com.punchsettle.server.pojo.punchin.PunchInRecordVO;
-import com.punchsettle.server.pojo.punchin.PunchInRequest;
-import com.punchsettle.server.pojo.punchin.PunchInVO;
-import com.punchsettle.server.pojo.punchin.PunchInWithRecordVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInCalendarDataVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInDataQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInDataVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInRecordDataVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInRecordQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInRecordRequest;
+import com.punchsettle.server.pojo.punchinV1.PunchInRecordVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInRequest;
+import com.punchsettle.server.pojo.punchinV1.PunchInVO;
+import com.punchsettle.server.pojo.punchinV1.PunchInWithRecordVO;
 import com.punchsettle.server.service.manager.IPunchInManagerV1;
 import com.punchsettle.server.service.manager.ISettleManagerV1;
 import com.punchsettle.server.utiis.DateUtils;

+ 46 - 0
src/main/java/com/punchsettle/server/service/manager/impl/PunchInStatsWeekServiceImpl.java

@@ -0,0 +1,46 @@
+package com.punchsettle.server.service.manager.impl;
+
+import com.punchsettle.server.atomic.entity.PunchInStatsWeek;
+import com.punchsettle.server.atomic.mapper.PunchInStatsWeekMapper;
+import com.punchsettle.server.atomic.service.IPunchInStatsWeekService;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.pojo.punchIn.PunchInStatsWeekQuery;
+import com.punchsettle.server.utiis.WeekendUtils;
+import lombok.extern.slf4j.Slf4j;
+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
+ * @version 1.0.0
+ * @date 2025/4/15 17:09
+ * @description 打卡任务周数据统计 service
+ */
+@Slf4j
+@Service
+public class PunchInStatsWeekServiceImpl implements IPunchInStatsWeekService {
+
+    @Autowired
+    private PunchInStatsWeekMapper punchInStatsWeekMapper;
+
+    @Override
+    public List<PunchInStatsWeek> queryByCondition(PunchInStatsWeekQuery punchInStatsWeekQuery) {
+        Assert.isNull(punchInStatsWeekQuery);
+
+        Weekend<PunchInStatsWeek> weekend = WeekendUtils.createExcludeAuditFields(PunchInStatsWeek.class);
+        WeekendCriteria<PunchInStatsWeek, Object> criteria = weekend.weekendCriteria();
+        if (!CollectionUtils.isEmpty(punchInStatsWeekQuery.getTaskUniqueIds())) {
+            criteria.andIn(PunchInStatsWeek::getTaskUniqueId, punchInStatsWeekQuery.getTaskUniqueIds());
+        }
+        if (Objects.nonNull(punchInStatsWeekQuery.getStatsTime())) {
+            criteria.andEqualTo(PunchInStatsWeek::getStatsTime, punchInStatsWeekQuery.getStatsTime());
+        }
+        return punchInStatsWeekMapper.selectByExample(weekend);
+    }
+}

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

@@ -36,8 +36,8 @@ import com.punchsettle.server.constant.PunchInCategoryEnum;
 import com.punchsettle.server.constant.PunchInRuleEnum;
 import com.punchsettle.server.constant.PunchInSettleTypeEnum;
 import com.punchsettle.server.constant.PunchInStatusV1Enum;
-import com.punchsettle.server.pojo.punchin.PunchInQuery;
-import com.punchsettle.server.pojo.punchin.PunchInRecordQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInQuery;
+import com.punchsettle.server.pojo.punchinV1.PunchInRecordQuery;
 import com.punchsettle.server.pojo.settle.SettleInfoDto;
 import com.punchsettle.server.pojo.settle.SettleQuery;
 import com.punchsettle.server.pojo.settle.SettleRequest;

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

@@ -0,0 +1,202 @@
+package com.punchsettle.server.task;
+
+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 com.punchsettle.server.atomic.service.IPunchInMultiTaskExtService;
+import com.punchsettle.server.atomic.service.IPunchInMultiTaskHistoryService;
+import com.punchsettle.server.atomic.service.IPunchInMultiTaskService;
+import com.punchsettle.server.atomic.service.IPunchInStatsMonthService;
+import com.punchsettle.server.atomic.service.IPunchInStatsWeekService;
+import com.punchsettle.server.atomic.service.IPunchInStatusService;
+import com.punchsettle.server.atomic.service.IPunchInTaskExtService;
+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.PunchInStatsMonthQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInStatsWeekQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInStatusQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInTaskExtQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInTaskHistoryQuery;
+import com.punchsettle.server.pojo.punchIn.PunchInTaskQuery;
+import com.punchsettle.server.service.manager.ICalendarManager;
+import com.punchsettle.server.service.manager.IPunchInManager;
+import com.punchsettle.server.service.manager.ISettleManager;
+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.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/15 16:24
+ * @description 打卡定时任务
+ */
+@Slf4j
+@Component
+public class PunchInCoreTask {
+
+    @Autowired
+    private IPunchInManager punchInManager;
+
+    @Autowired
+    private ISettleManager settleManager;
+
+    public void execute() {
+        log.info("========== 打卡定时任务 开始执行 ==========");
+
+        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);
+//
+//    }
+
+    @Autowired
+    private IPunchInTaskService punchInTaskService;
+
+    @Autowired
+    private IPunchInTaskExtService punchInTaskExtService;
+
+    @Autowired
+    private IPunchInTaskHistoryService punchInTaskHistoryService;
+
+    @Autowired
+    private IPunchInStatsMonthService punchInStatsMonthService;
+
+    @Autowired
+    private IPunchInStatsWeekService punchInStatsWeekService;
+
+    @Autowired
+    private IPunchInStatusService punchInStatusService;
+
+    @Autowired
+    private IPunchInMultiTaskService punchInMultiTaskService;
+
+    @Autowired
+    private IPunchInMultiTaskExtService punchInMultiTaskExtService;
+
+    @Autowired
+    private IPunchInMultiTaskHistoryService punchInMultiTaskHistoryService;
+
+    @Autowired
+    private ICalendarManager calendarManager;
+
+    public void manual(Long userId, String punchInDateStr) {
+        // 判断打卡日期是否节假日
+        boolean holidayFlag = calendarManager.judgeHoliday(punchInDateStr);
+        // 打卡日期
+        LocalDate punchInDate = LocalDate.parse(punchInDateStr);
+        // 本周是第几周
+        TemporalField weekOfYearField = WeekFields.ISO.weekOfYear();
+        int weekOfYear = punchInDate.get(weekOfYearField);
+
+        PunchInTaskHistoryQuery punchInTaskHistoryQuery = new PunchInTaskHistoryQuery();
+        punchInTaskHistoryQuery.setPunchInDate(punchInDateStr);
+        punchInTaskHistoryQuery.setUserIds(Arrays.asList(userId));
+        List<PunchInTaskHistory> punchInTaskHistories = punchInTaskHistoryService.queryByCondition(punchInTaskHistoryQuery);
+        if(CollectionUtils.isEmpty(punchInTaskHistories)) {
+            log.info("用户:{} 在打卡日期:{} 没有查询到打卡记录", userId, punchInDateStr);
+            return;
+        }
+
+        Set<Long> punchInTaskUniqueIdList = punchInTaskHistories.stream().map(PunchInTaskHistory::getPunchInTaskUniqueId).collect(Collectors.toSet());
+        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));
+
+        // 拓展表
+        Set<Long> punchInTaskIds = punchInTasks.stream().map(PunchInTask::getId).collect(Collectors.toSet());
+        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));
+
+        // 打卡任务周数据统计
+        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));
+
+        // 打卡任务月数据统计
+        PunchInStatsMonthQuery punchInStatsMonthQuery = new PunchInStatsMonthQuery();
+        punchInStatsMonthQuery.setTaskUniqueIds(punchInTaskUniqueIdList);
+        punchInStatsMonthQuery.setStatsTime(DateUtils.getYearWeek(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;
+        }).collect(Collectors.toList());
+        punchInTaskHistoryService.batchUpdate(updatePunchInTaskHistories);
+    }
+
+}

+ 26 - 0
src/main/java/com/punchsettle/server/utiis/DateUtils.java

@@ -4,6 +4,7 @@ import java.text.SimpleDateFormat;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.temporal.TemporalAdjusters;
+import java.time.temporal.WeekFields;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -86,4 +87,29 @@ public class DateUtils {
         return getLastWeekMonday(date).plusDays(6);
     }
 
+    /**
+     * 获取年份和周数(ISO 8601 标准)
+     * @param date
+     * @return 格式:yyyy-WWW,例如:2023-W01
+     */
+    public static String getYearWeek(LocalDate date) {
+        // 使用 ISO 标准计算周数和年份
+        int weekYear = date.get(WeekFields.ISO.weekBasedYear());
+        int weekNumber = date.get(WeekFields.ISO.weekOfWeekBasedYear());
+        // 组合年份和周数
+        return String.format("%d-W%02d", weekYear, weekNumber);
+    }
+
+    /**
+     * 获取年份和周数(ISO 8601 标准)
+     * @param date
+     * @return 格式:yyyy-MM,例如:2023-01
+     */
+    public static String getYearMonth(LocalDate date) {
+        // 使用 ISO 标准计算周数和年份
+        int year = date.getYear();
+        int month = date.getMonthValue();
+        // 组合年份和周数
+        return String.format("%d-%02d", year, month);
+    }
 }