Просмотр исходного кода

【feat】【v3】
1.完善表设计
2.完善相关逻辑

ChenYL 11 месяцев назад
Родитель
Сommit
dfe62a59af
20 измененных файлов с 229 добавлено и 49 удалено
  1. 3 3
      doc/sql/update-v3.sql
  2. 3 1
      src/main/java/com/punchsettle/server/atomic/entity/Reward.java
  3. 1 1
      src/main/java/com/punchsettle/server/atomic/entity/StatPiTaskMonth.java
  4. 1 1
      src/main/java/com/punchsettle/server/atomic/entity/StatPiTaskWeek.java
  5. 4 4
      src/main/java/com/punchsettle/server/atomic/service/IStatPiTaskMonthService.java
  6. 4 4
      src/main/java/com/punchsettle/server/atomic/service/IStatPiTaskYearService.java
  7. 6 5
      src/main/java/com/punchsettle/server/atomic/service/impl/StatPiTaskMonthServiceImpl.java
  8. 6 5
      src/main/java/com/punchsettle/server/atomic/service/impl/StatPiTaskYearServiceImpl.java
  9. 30 0
      src/main/java/com/punchsettle/server/pojo/account/AccountInfoVO.java
  10. 6 0
      src/main/java/com/punchsettle/server/pojo/punchIn/PiTaskStatQuery.java
  11. 9 4
      src/main/java/com/punchsettle/server/pojo/punchIn/PiTaskToDoVO.java
  12. 28 0
      src/main/java/com/punchsettle/server/pojo/punchIn/StatPiTaskQuery.java
  13. 0 5
      src/main/java/com/punchsettle/server/pojo/reward/RewardVO.java
  14. 27 5
      src/main/java/com/punchsettle/server/service/controller/AccountController.java
  15. 1 1
      src/main/java/com/punchsettle/server/service/controller/PunchInController.java
  16. 2 0
      src/main/java/com/punchsettle/server/service/controller/RewardController.java
  17. 13 1
      src/main/java/com/punchsettle/server/service/manager/IAccountManager.java
  18. 45 1
      src/main/java/com/punchsettle/server/service/manager/impl/AccountManagerImpl.java
  19. 36 5
      src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerImpl.java
  20. 4 3
      src/main/java/com/punchsettle/server/service/manager/impl/RewardManagerImpl.java

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

@@ -308,11 +308,11 @@ CREATE TABLE `pi_task_history` (
   `stage_start_date` date DEFAULT NULL COMMENT '阶段开始日期',
   `stage_end_date` date DEFAULT NULL COMMENT '阶段结束日期',
   `continue_interrupted_count` int DEFAULT NULL COMMENT '连续中断次数',
-  `punch_in_result` varchar(10) NOT NULL COMMENT '打卡状态(DONE-完成,UNDONE-未完成)',
+  `punch_in_result` varchar(10) DEFAULT NULL COMMENT '打卡状态(DONE-完成,UNDONE-未完成)',
   `settle_result` varchar(20) NOT NULL COMMENT '结算结果(未结算-UNSETTLED,已结算-SETTLED)',
   `settle_pi_task_id` bigint DEFAULT NULL COMMENT '结算时的打卡任务ID',
   `settle_task_history_id` bigint DEFAULT NULL COMMENT '结算任务执行记录ID',
-  `settle_points` int DEFAULT NULL COMMENT '结算奖励积分',
+  `settle_points` int DEFAULT NULL COMMENT '结算奖励积分',p
   `created_by` bigint NOT NULL COMMENT '创建人',
   `creation_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
   `last_updated_by` bigint NOT NULL COMMENT '最后更新人',
@@ -527,7 +527,7 @@ ALTER TABLE punch_settle.pi_task CHANGE reward_num points int DEFAULT 1 NOT NULL
 ALTER TABLE punch_settle.pi_task MODIFY COLUMN points int DEFAULT 1 NOT NULL COMMENT '奖励的积分(基本)';
 
 ALTER TABLE `pi_task`
-ADD COLUMN `unique_id` bigint NULL COMMENT '任务唯一ID',
+ADD COLUMN `unique_id` bigint DEFAULT NULL COMMENT '任务唯一ID',
 ADD COLUMN `task_status` varchar(10) NULL COMMENT '任务状态(活跃-ACTIVE,归档-ARCHIVE,删除-DELETE)',
 ADD COLUMN `task_version` int NULL COMMENT '任务修改版本',
 ADD COLUMN `end_date` date DEFAULT NULL  COMMENT '结束日期',

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

@@ -3,6 +3,7 @@ package com.punchsettle.server.atomic.entity;
 import java.io.Serial;
 import java.io.Serializable;
 
+import com.punchsettle.server.common.constant.CommonEnableStatusEnum;
 import com.punchsettle.server.common.pojo.BaseEntity;
 
 import com.punchsettle.server.constant.VersionStatusEnum;
@@ -64,9 +65,10 @@ public class Reward extends BaseEntity implements Serializable {
 
     /**
      * 是否启用自动兑换(ENABLED-启用,DISABLED-关闭)
+     * @see CommonEnableStatusEnum
      */
     @Column(name = "auto_status")
-    private String autoStatus;
+    private CommonEnableStatusEnum autoStatus;
 
     /**
      * 自动兑换数量

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

@@ -41,7 +41,7 @@ public class StatPiTaskMonth extends BaseEntity implements Serializable, StatPiT
     /**
      * 统计时间(格式:yyyy-MM)
      */
-    @Column(name = "stats_time")
+    @Column(name = "stat_time")
     private String statTime;
 
     /**

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

@@ -41,7 +41,7 @@ public class StatPiTaskWeek extends BaseEntity implements Serializable, StatPiTa
     /**
      * 统计时间(格式:yyyy-周数)
      */
-    @Column(name = "stats_time")
+    @Column(name = "stat_time")
     private String statTime;
 
     /**

+ 4 - 4
src/main/java/com/punchsettle/server/atomic/service/IStatPiTaskMonthService.java

@@ -2,6 +2,7 @@ package com.punchsettle.server.atomic.service;
 
 import com.punchsettle.server.atomic.entity.StatPiTaskMonth;
 import com.punchsettle.server.pojo.punchIn.PiStatsMonthQuery;
+import com.punchsettle.server.pojo.punchIn.StatPiTaskQuery;
 
 import java.util.List;
 
@@ -27,10 +28,9 @@ public interface IStatPiTaskMonthService {
     void insertList(List<StatPiTaskMonth> statPiTaskMonthList);
 
     /**
-     * 查询用户统计数据
-     * @param userId 用户id
-     * @param statTime 统计时间
+     * 查询统计数据
+     * @param query 查询条件
      * @return
      */
-    StatPiTaskMonth getByUserIdAndStatTime(Long userId, String statTime);
+    StatPiTaskMonth queryByCondition(StatPiTaskQuery query);
 }

+ 4 - 4
src/main/java/com/punchsettle/server/atomic/service/IStatPiTaskYearService.java

@@ -1,6 +1,7 @@
 package com.punchsettle.server.atomic.service;
 
 import com.punchsettle.server.atomic.entity.StatPiTaskYear;
+import com.punchsettle.server.pojo.punchIn.StatPiTaskQuery;
 
 /**
  * @author tyuio
@@ -11,10 +12,9 @@ import com.punchsettle.server.atomic.entity.StatPiTaskYear;
 public interface IStatPiTaskYearService {
 
     /**
-     * 根据用户id和统计时间查询打卡任务年数据统计
-     * @param userId
-     * @param statTime
+     * 按条件查询年统计数据
+     * @param query 查询条件
      * @return
      */
-    StatPiTaskYear getByUserIdAndStatTime(Long userId, String statTime);
+    StatPiTaskYear queryByCondition(StatPiTaskQuery query);
 }

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

@@ -5,6 +5,7 @@ import com.punchsettle.server.atomic.mapper.StatPiTaskMonthMapper;
 import com.punchsettle.server.atomic.service.IStatPiTaskMonthService;
 import com.punchsettle.server.common.utils.Assert;
 import com.punchsettle.server.pojo.punchIn.PiStatsMonthQuery;
+import com.punchsettle.server.pojo.punchIn.StatPiTaskQuery;
 import com.punchsettle.server.utiis.WeekendUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -49,13 +50,13 @@ public class StatPiTaskMonthServiceImpl implements IStatPiTaskMonthService {
     }
 
     @Override
-    public StatPiTaskMonth getByUserIdAndStatTime(Long userId, String statTime) {
-        Assert.isNull(userId);
-        Assert.isNull(statTime);
+    public StatPiTaskMonth queryByCondition(StatPiTaskQuery query) {
+        Assert.isNull(query);
 
         StatPiTaskMonth statPiTaskMonthQuery = new StatPiTaskMonth();
-        statPiTaskMonthQuery.setUserId(userId);
-        statPiTaskMonthQuery.setStatTime(statTime);
+        statPiTaskMonthQuery.setUserId(query.getUserId());
+        statPiTaskMonthQuery.setStatTime(query.getStatTime());
+        statPiTaskMonthQuery.setTaskUniqueId(query.getTaskUniqueId());
         return statPiTaskMonthMapper.selectOne(statPiTaskMonthQuery);
     }
 }

+ 6 - 5
src/main/java/com/punchsettle/server/atomic/service/impl/StatPiTaskYearServiceImpl.java

@@ -4,6 +4,7 @@ import com.punchsettle.server.atomic.entity.StatPiTaskYear;
 import com.punchsettle.server.atomic.mapper.StatPiTaskYearMapper;
 import com.punchsettle.server.atomic.service.IStatPiTaskYearService;
 import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.pojo.punchIn.StatPiTaskQuery;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -20,13 +21,13 @@ public class StatPiTaskYearServiceImpl implements IStatPiTaskYearService {
     private StatPiTaskYearMapper statPiTaskYearMapper;
 
     @Override
-    public StatPiTaskYear getByUserIdAndStatTime(Long userId, String statTime) {
-        Assert.isNull(userId);
-        Assert.isNull(statTime);
+    public StatPiTaskYear queryByCondition(StatPiTaskQuery query) {
+        Assert.isNull(query);
 
         StatPiTaskYear statPiTaskYearQuery = new StatPiTaskYear();
-        statPiTaskYearQuery.setUserId(userId);
-        statPiTaskYearQuery.setStatTime(statTime);
+        statPiTaskYearQuery.setUserId(query.getUserId());
+        statPiTaskYearQuery.setStatTime(query.getStatTime());
+        statPiTaskYearQuery.setTaskUniqueId(query.getTaskUniqueId());
         return statPiTaskYearMapper.selectOne(statPiTaskYearQuery);
     }
 }

+ 30 - 0
src/main/java/com/punchsettle/server/pojo/account/AccountInfoVO.java

@@ -0,0 +1,30 @@
+package com.punchsettle.server.pojo.account;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/30 12:11
+ * @description 账户信息 VO
+ */
+@Data
+public class AccountInfoVO {
+
+    /**
+     * 账户数量
+     */
+    private Integer accountNum;
+
+    /**
+     * 基本户
+     */
+    private AccountVO basicAccount;
+
+    /**
+     * 一般户
+     */
+    private List<AccountVO> generalAccountList;
+}

+ 6 - 0
src/main/java/com/punchsettle/server/pojo/punchIn/PiTaskStatQuery.java

@@ -15,6 +15,12 @@ import lombok.Data;
 @Data
 public class PiTaskStatQuery {
 
+    /**
+     * 打卡任务ID
+     */
+    @NotNull(message = "打卡任务ID不能为空")
+    private Long taskId;
+
     /**
      * 统计周期
      * @see StatPeriodEnum

+ 9 - 4
src/main/java/com/punchsettle/server/pojo/punchIn/PiTaskToDoVO.java

@@ -2,9 +2,9 @@ package com.punchsettle.server.pojo.punchIn;
 
 import java.time.LocalTime;
 
-import com.punchsettle.server.common.constant.CommonEnableStatusEnum;
 import com.punchsettle.server.constant.CompareRuleEnum;
 import com.punchsettle.server.constant.PunchInMethodEnum;
+import com.punchsettle.server.constant.PunchInResultEnum;
 
 import lombok.Data;
 
@@ -60,10 +60,9 @@ public class PiTaskToDoVO {
     private LocalTime timeTrack;
 
     /**
-     * 是否启用节假日奖励(ENABLED-启用,DISABLED-关闭)
-     * @see CommonEnableStatusEnum
+     * 是否已启用节假日双倍奖励且当前是节假日标志(是-true,false-否)
      */
-    private CommonEnableStatusEnum holidayStatus;
+    private Boolean holidayFlag;
 
     /**
      * 次数记录(节假日用)
@@ -84,4 +83,10 @@ public class PiTaskToDoVO {
      * 时间记录(当前)
      */
     private LocalTime currentTimeTrack;
+
+    /**
+     * 打卡结果
+     * @see PunchInResultEnum
+     */
+    private PunchInResultEnum punchInResult;
 }

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

@@ -0,0 +1,28 @@
+package com.punchsettle.server.pojo.punchIn;
+
+import lombok.Data;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/4/29 12:56
+ * @description 打卡任务统计数据 查询类
+ */
+@Data
+public class StatPiTaskQuery {
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 任务唯一ID
+     */
+    private Long taskUniqueId;
+
+    /**
+     * 统计时间
+     */
+    private String statTime;
+}

+ 0 - 5
src/main/java/com/punchsettle/server/pojo/reward/RewardVO.java

@@ -33,9 +33,4 @@ public class RewardVO {
      * @see CommonEnableStatusEnum
      */
     private CommonEnableStatusEnum autoStatus;
-
-    /**
-     * 自动兑换数量
-     */
-    private Integer autoExchangeCount;
 }

+ 27 - 5
src/main/java/com/punchsettle/server/service/controller/AccountController.java

@@ -1,8 +1,9 @@
 package com.punchsettle.server.service.controller;
 
-import java.util.List;
-
+import com.punchsettle.server.pojo.account.AccountVO;
+import com.punchsettle.server.pojo.account.AccountInfoVO;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -11,18 +12,20 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.punchsettle.server.pojo.account.AccountRequest;
-import com.punchsettle.server.pojo.account.AccountVO;
 import com.punchsettle.server.pojo.account.TransferRequest;
 import com.punchsettle.server.service.manager.IAccountManager;
 
 import jakarta.validation.constraints.NotNull;
 
+import java.util.List;
+
 /**
  * @author tyuio
  * @version 1.0.0
  * @date 2025/4/24 17:00
  * @description 账户 控制器
  */
+@Validated
 @RestController
 @RequestMapping("/account")
 public class AccountController {
@@ -30,13 +33,32 @@ public class AccountController {
     @Autowired
     private IAccountManager accountManager;
 
+    /**
+     * 查询账户信息
+     * @return
+     */
+    @GetMapping("/queryAccountInfo")
+    public AccountInfoVO queryAccountInfo() {
+        return accountManager.queryAccountInfo();
+    }
+
     /**
      * 查询账户列表
      * @return
      */
+    @GetMapping("/queryAccountList")
+    public List<AccountVO> queryAccountList() {
+        return accountManager.queryAccountList();
+    }
+
+    /**
+     * 查询指定账户信息
+     * @param id
+     * @return
+     */
     @GetMapping("/queryAccount")
-    public List<AccountVO> queryAccount() {
-        return accountManager.queryAccount();
+    public AccountVO queryAccount(@NotNull(message = "账户ID不能为空") Long id) {
+        return accountManager.queryAccount(id);
     }
 
     /**

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

@@ -120,7 +120,7 @@ public class PunchInController {
      * @param query
      * @return
      */
-    @GetMapping("/queryStat")
+    @PostMapping("/queryStat")
     public PiTaskStatVO queryStat(@RequestBody PiTaskStatQuery query) {
         return punchInManager.queryStat(query);
     }

+ 2 - 0
src/main/java/com/punchsettle/server/service/controller/RewardController.java

@@ -6,6 +6,7 @@ import com.punchsettle.server.pojo.reward.RewardExchangeRequest;
 import com.punchsettle.server.pojo.reward.RewardRequest;
 import jakarta.validation.constraints.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -22,6 +23,7 @@ import com.punchsettle.server.service.manager.IRewardManager;
  * @description 奖励 controller
  * @date 2024/11/26 15:00
  */
+@Validated
 @RestController
 @RequestMapping("/reward")
 public class RewardController {

+ 13 - 1
src/main/java/com/punchsettle/server/service/manager/IAccountManager.java

@@ -2,6 +2,7 @@ package com.punchsettle.server.service.manager;
 
 import com.punchsettle.server.pojo.account.AccountRequest;
 import com.punchsettle.server.pojo.account.AccountVO;
+import com.punchsettle.server.pojo.account.AccountInfoVO;
 import com.punchsettle.server.pojo.account.TransferRequest;
 
 import java.util.List;
@@ -14,11 +15,22 @@ import java.util.List;
  */
 public interface IAccountManager {
 
+    /**
+     * 查询账户信息
+     * @return
+     */
+    AccountInfoVO queryAccountInfo();
+
+    /**
+     * 查询账户列表
+     */
+    List<AccountVO> queryAccountList();
+
     /**
      * 查询账户
      * @return
      */
-    List<AccountVO> queryAccount();
+    AccountVO queryAccount(Long id);
 
     /**
      * 创建或者修改账户信息

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

@@ -10,6 +10,7 @@ import com.punchsettle.server.constant.AccountCategoryEnum;
 import com.punchsettle.server.constant.TransferCategoryEnum;
 import com.punchsettle.server.pojo.account.AccountRequest;
 import com.punchsettle.server.pojo.account.AccountVO;
+import com.punchsettle.server.pojo.account.AccountInfoVO;
 import com.punchsettle.server.pojo.account.TransferRequest;
 import com.punchsettle.server.pojo.punchIn.AccountQuery;
 import com.punchsettle.server.service.manager.IAccountManager;
@@ -44,7 +45,38 @@ public class AccountManagerImpl implements IAccountManager {
     private IAccountTransferHistoryService accountTransferHistoryService;
 
     @Override
-    public List<AccountVO> queryAccount() {
+    public AccountInfoVO queryAccountInfo() {
+        AccountInfoVO accountInfoVO = new AccountInfoVO();
+        accountInfoVO.setAccountNum(0);
+
+        // 查询账户数据
+        AccountQuery accountQuery = new AccountQuery();
+        accountQuery.setUserIds(Arrays.asList(UserUtils.getCurrentUserId()));
+        List<Account> accounts = accountService.getAccountByCondition(accountQuery);
+        if (CollectionUtils.isEmpty(accounts)) {
+            return accountInfoVO;
+        }
+
+        // 设置基本户
+        accounts.stream().filter(v -> AccountCategoryEnum.BASIC.equals(v.getAccountCategory())).findFirst().ifPresent(account -> {
+            AccountVO accountVO = new AccountVO();
+            BeanUtils.copyProperties(account, accountVO);
+            accountInfoVO.setBasicAccount(accountVO);
+        });
+        // 设置一般户
+        List<AccountVO> generalAccounts = accounts.stream().filter(v -> AccountCategoryEnum.GENERAL.equals(v.getAccountCategory())).map(account -> {
+            AccountVO accountVO = new AccountVO();
+            BeanUtils.copyProperties(account, accountVO);
+            return accountVO;
+        }).collect(Collectors.toList());
+        accountInfoVO.setGeneralAccountList(generalAccounts);
+
+        return accountInfoVO;
+    }
+
+    @Override
+    public List<AccountVO> queryAccountList() {
+        // 查询账户数据
         AccountQuery accountQuery = new AccountQuery();
         accountQuery.setUserIds(Arrays.asList(UserUtils.getCurrentUserId()));
         List<Account> accounts = accountService.getAccountByCondition(accountQuery);
@@ -59,6 +91,18 @@ public class AccountManagerImpl implements IAccountManager {
         }).collect(Collectors.toList());
     }
 
+    @Override
+    public AccountVO queryAccount(Long id) {
+        Assert.isNullInBusiness(id, "账户ID不能为空");
+
+        // 查询账户
+        Account account = Optional.ofNullable(accountService.getById(id)).orElseThrow(() -> BusinessException.fail("待查询账户不存在"));
+
+        AccountVO accountVO = new AccountVO();
+        BeanUtils.copyProperties(account, accountVO);
+        return accountVO;
+    }
+
     @Override
     public void saveAccount(AccountRequest request) {
         Assert.isNullInBusiness(request, "账户名称不能为空");

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

@@ -18,6 +18,7 @@ import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import com.punchsettle.server.pojo.punchIn.StatPiTaskQuery;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -46,9 +47,10 @@ import com.punchsettle.server.constant.PunchInResultEnum;
 import com.punchsettle.server.constant.PunchInResultViewEnum;
 import com.punchsettle.server.constant.PunchInSettleTypeEnum;
 import com.punchsettle.server.constant.PunchInStatusV1Enum;
-import com.punchsettle.server.constant.VersionStatusEnum;
 import com.punchsettle.server.constant.RepeatCategoryEnum;
+import com.punchsettle.server.constant.SettleResultEnum;
 import com.punchsettle.server.constant.StatPeriodEnum;
+import com.punchsettle.server.constant.VersionStatusEnum;
 import com.punchsettle.server.pojo.punchIn.PiTaskHistoryQuery;
 import com.punchsettle.server.pojo.punchIn.PiTaskHistorySimpleVO;
 import com.punchsettle.server.pojo.punchIn.PiTaskHistoryStatVO;
@@ -66,6 +68,7 @@ import com.punchsettle.server.pojo.punchinV1.PunchInDataVO;
 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.service.manager.ICalendarManager;
 import com.punchsettle.server.service.manager.IPunchInCoreManager;
 import com.punchsettle.server.service.manager.IPunchInManager;
 import com.punchsettle.server.service.manager.ISettleManagerV1;
@@ -108,6 +111,9 @@ public class PunchInManagerImpl implements IPunchInManager {
     @Autowired
     private IStatPiTaskMonthService statPiTaskMonthService;
 
+    @Autowired
+    private ICalendarManager calendarManager;
+
     /**
      * 默认显示时间00:00:00.000
      */
@@ -137,6 +143,8 @@ public class PunchInManagerImpl implements IPunchInManager {
         String todayStr = DateUtils.YYYY_MM_DD_FORMATTER.format(today);
         // 当前时间
         LocalTime nowTime = LocalTime.now();
+        // 当前是否节假日
+        boolean holidayFlag = calendarManager.judgeHoliday(todayStr);
         // 打卡任务唯一ID
         Set<Long> taskUniqueIds = piTasks.stream().map(PiTask::getUniqueId).collect(Collectors.toSet());
 
@@ -161,9 +169,15 @@ public class PunchInManagerImpl implements IPunchInManager {
                 .map(piTask -> {
                     PiTaskToDoVO piTaskToDoVO = new PiTaskToDoVO();
                     BeanUtils.copyProperties(piTask, piTaskToDoVO);
+                    piTaskToDoVO.setPunchInResult(PunchInResultEnum.UNDONE);
+                    piTaskToDoVO.setHolidayFlag(CommonEnableStatusEnum.ENABLED.equals(piTask.getHolidayStatus()) && holidayFlag);
                     // 获取并设置已打卡记录
                     PiTaskHistory piTaskHistory = piTaskHistoryMap.get(piTask.getUniqueId());
                     if (Objects.nonNull(piTaskHistory)) {
+                        // 判断当前的打卡结果
+                        PunchInResultEnum punchInResult = punchInCoreManager.judgePunchInResultInTask(piTask, piTaskHistory);
+
+                        piTaskToDoVO.setPunchInResult(punchInResult);
                         piTaskToDoVO.setCurrentCountTrack(piTaskHistory.getCountTrack());
                         piTaskToDoVO.setCurrentTimeTrack(piTaskHistory.getTimeTrack());
                     }
@@ -406,6 +420,7 @@ public class PunchInManagerImpl implements IPunchInManager {
             tempPiTaskHistory.setTaskUniqueId(piTask.getUniqueId());
             tempPiTaskHistory.setPunchInDate(punchInDate);
             tempPiTaskHistory.setUserId(UserUtils.getCurrentUserId());
+            tempPiTaskHistory.setSettleResult(SettleResultEnum.UNSETTLED);
         } else {
             tempPiTaskHistory.setId(oldPiTaskHistory.getId());
         }
@@ -422,7 +437,11 @@ public class PunchInManagerImpl implements IPunchInManager {
 
         // 打卡类型:计数,需要累加打卡次数
         if (PunchInMethodEnum.COUNT.equals(piTask.getPunchInMethod())) {
-            tempPiTaskHistory.setCountTrack(Optional.ofNullable(oldPiTaskHistory.getCountTrack()).orElse(0) + 1);
+            if (Objects.isNull(oldPiTaskHistory)) {
+                tempPiTaskHistory.setCountTrack(1);
+            } else {
+                tempPiTaskHistory.setCountTrack(Optional.ofNullable(oldPiTaskHistory.getCountTrack()).orElse(0) + 1);
+            }
         }
 
         // 打卡类型:计时,需要记录最新打卡时长
@@ -512,16 +531,27 @@ public class PunchInManagerImpl implements IPunchInManager {
     public PiTaskStatVO queryStat(PiTaskStatQuery query) {
         // 当前用户ID
         Long currentUserId = UserUtils.getCurrentUserId();
+        // 查找打卡任务
+        PiTask piTask = Optional.ofNullable(piTaskService.getById(query.getTaskId())).orElseThrow(() -> BusinessException.fail("无法查询到该打卡任务"));
+
+        // 构造查询条件
+        StatPiTaskQuery statPiTaskQuery = new StatPiTaskQuery();
+        statPiTaskQuery.setUserId(currentUserId);
+        statPiTaskQuery.setTaskUniqueId(piTask.getUniqueId());
+        statPiTaskQuery.setStatTime(query.getStatTime());
+
         // 查询统计数据
         StatPiTask statPiTask = null;
         if (StatPeriodEnum.YEAR.equals(query.getStatPeriod())) {
-            statPiTask = statPiTaskYearService.getByUserIdAndStatTime(currentUserId, query.getStatTime());
+            statPiTask = statPiTaskYearService.queryByCondition(statPiTaskQuery);
         } else if (StatPeriodEnum.MONTH.equals(query.getStatPeriod())) {
-            statPiTask = statPiTaskMonthService.getByUserIdAndStatTime(currentUserId, query.getStatTime());
+            statPiTask = statPiTaskMonthService.queryByCondition(statPiTaskQuery);
         }
 
         if (Objects.isNull(statPiTask)) {
-            return null;
+             PiTaskStatVO piTaskStatVO = new PiTaskStatVO();
+             piTaskStatVO.setPiTaskHistoryStatVOS(List.of());
+             return piTaskStatVO;
         }
 
         // 查询打卡记录
@@ -630,6 +660,7 @@ public class PunchInManagerImpl implements IPunchInManager {
         // 新的打卡任务信息
         PiTask piTask = new PiTask();
         BeanUtils.copyProperties(oldPiTask, piTask);
+        piTask.setId(null);
         piTask.setTaskStatus(VersionStatusEnum.ACTIVE);
         piTask.setTaskVersion(Optional.ofNullable(oldPiTask.getTaskVersion()).orElse(0) + 1);
         return piTask;

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

@@ -24,6 +24,7 @@ import com.punchsettle.server.utiis.UserUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.BeanFactoryUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 
 import com.punchsettle.server.atomic.service.IRewardService;
@@ -67,9 +68,7 @@ public class RewardManagerImpl implements IRewardManager {
 
         return rewards.stream().map(reward -> {
             RewardVO rewardVO = new RewardVO();
-            rewardVO.setId(reward.getId());
-            rewardVO.setRewardName(reward.getRewardName());
-            rewardVO.setExchangePoints(reward.getExchangePoints());
+            BeanUtils.copyProperties(reward, rewardVO);
             return rewardVO;
         }).toList();
     }
@@ -85,6 +84,7 @@ public class RewardManagerImpl implements IRewardManager {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void saveReward(RewardRequest request) {
         Assert.isNullInBusiness(request, "请传入奖励信息");
 
@@ -95,6 +95,7 @@ public class RewardManagerImpl implements IRewardManager {
         // 新增奖励数据
         Reward addReward = new Reward();
         BeanUtils.copyProperties(request, addReward);
+        addReward.setId(null);
         addReward.setUserId(UserUtils.getCurrentUserId());
         addReward.setRewardStatus(VersionStatusEnum.ACTIVE);
         addReward.setRewardVersion(1);