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

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

ChenYL 10 месяцев назад
Родитель
Сommit
582c12a6f1

+ 2 - 0
doc/sql/update-v3.sql

@@ -792,3 +792,5 @@ ALTER TABLE punch_settle.settle_task_rela_history MODIFY COLUMN pi_task_history_
 ALTER TABLE punch_settle.account_transfer_history MODIFY COLUMN sender_account_id bigint NULL COMMENT '转出账户id';
 ALTER TABLE punch_settle.account_transfer_history MODIFY COLUMN sa_points_before_transfer int NULL COMMENT '转出账户转出前积分';
 ALTER TABLE punch_settle.account_transfer_history MODIFY COLUMN sa_points_after_transfer int NULL COMMENT '转出账户转出后积分';
+
+ALTER TABLE punch_settle.reward MODIFY COLUMN reward_unique_id bigint NULL COMMENT '奖励唯一id';

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

@@ -3,6 +3,7 @@ package com.punchsettle.server.atomic.mapper;
 import com.punchsettle.server.atomic.entity.PiTaskHistory;
 import tk.mybatis.mapper.additional.update.batch.BatchUpdateSelectiveMapper;
 import tk.mybatis.mapper.common.Mapper;
+import tk.mybatis.mapper.common.special.InsertListMapper;
 
 /**
  * @author tyuio
@@ -10,6 +11,6 @@ import tk.mybatis.mapper.common.Mapper;
  * @description 打卡任务记录表 Mapper
  * @date 2025/04/08 10:30
  */
-public interface PiTaskHistoryMapper extends Mapper<PiTaskHistory>, BatchUpdateSelectiveMapper<PiTaskHistory> {
+public interface PiTaskHistoryMapper extends Mapper<PiTaskHistory>, BatchUpdateSelectiveMapper<PiTaskHistory>, InsertListMapper<PiTaskHistory> {
 
 }

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

@@ -2,6 +2,7 @@ package com.punchsettle.server.atomic.mapper;
 
 import com.punchsettle.server.atomic.entity.RewardExchangeHistory;
 import tk.mybatis.mapper.common.Mapper;
+import tk.mybatis.mapper.common.special.InsertListMapper;
 
 /**
  * @author tyuio
@@ -9,6 +10,6 @@ import tk.mybatis.mapper.common.Mapper;
  * @description 奖励兑换记录 Mapper
  * @date 2025/04/08 10:30
  */
-public interface RewardExchangeHistoryMapper extends Mapper<RewardExchangeHistory> {
+public interface RewardExchangeHistoryMapper extends Mapper<RewardExchangeHistory>, InsertListMapper<RewardExchangeHistory> {
 
 }

+ 5 - 0
src/main/java/com/punchsettle/server/atomic/service/IRewardExchangeHistoryService.java

@@ -25,4 +25,9 @@ public interface IRewardExchangeHistoryService {
      * @return
      */
     List<RewardExchangeHistory> queryRewardExchangeHistory(Long userId, String exchangeMonth);
+
+    /**
+     * 批量新增
+     */
+    void batchAdd(List<RewardExchangeHistory> rewardExchangeHistories);
 }

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

@@ -82,4 +82,10 @@ public class PiTaskHistoryServiceImpl implements IPiTaskHistoryService {
         Assert.isNull(piTaskHistory);
         piTaskHistoryMapper.insertSelective(piTaskHistory);
     }
+
+    @Override
+    public void batchAdd(List<PiTaskHistory> piTaskHistories) {
+        Assert.notEmpty(piTaskHistories);
+        piTaskHistoryMapper.insertList(piTaskHistories);
+    }
 }

+ 6 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/RewardExchangeHistoryServiceImpl.java

@@ -40,4 +40,10 @@ public class RewardExchangeHistoryServiceImpl implements IRewardExchangeHistoryS
         criteria.andLike(RewardExchangeHistory::getCreationTime, String.format("%s%%", exchangeMonth));
         return rewardExchangeHistoryMapper.selectByExample(weekend);
     }
+
+    @Override
+    public void batchAdd(List<RewardExchangeHistory> rewardExchangeHistories) {
+        Assert.notEmpty(rewardExchangeHistories);
+        rewardExchangeHistoryMapper.insertList(rewardExchangeHistories);
+    }
 }

+ 0 - 11
src/main/java/com/punchsettle/server/service/manager/IOpManager.java

@@ -18,15 +18,4 @@ public interface IOpManager {
      * 清除所有缓存
      */
     void clearAllCache();
-
-    /**
-     * 调用日历定时任务
-     */
-    void invokeCalendarTask();
-
-    /**
-     * 根据公历日期刷新指定日历数据
-     * @param gregorianDate
-     */
-    void refreshCalendar(String gregorianDate);
 }

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

@@ -57,11 +57,6 @@ public interface IPunchInManager {
      */
     void doPunchIn(PunchInRequest request);
 
-    /**
-     * 自动打卡
-     */
-    void autoPunchIn(PiTask piTask, String punchInDate);
-
     /**
      * 归档打卡任务
      * @param punchInId

+ 7 - 23
src/main/java/com/punchsettle/server/service/manager/impl/OpManagerImpl.java

@@ -1,18 +1,18 @@
 package com.punchsettle.server.service.manager.impl;
 
-import com.punchsettle.server.common.exception.BusinessException;
-import com.punchsettle.server.service.manager.ICalendarManager;
-import com.punchsettle.server.service.manager.IOpManager;
-import com.punchsettle.server.task.CalendarTask;
-import lombok.extern.slf4j.Slf4j;
+import java.util.Collection;
+import java.util.Objects;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.Cache;
 import org.springframework.cache.CacheManager;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Collection;
-import java.util.Objects;
+import com.punchsettle.server.common.exception.BusinessException;
+import com.punchsettle.server.service.manager.IOpManager;
+
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * @author tyuio
@@ -27,12 +27,6 @@ public class OpManagerImpl implements IOpManager {
     @Autowired
     private CacheManager cacheManager;
 
-    @Autowired
-    private CalendarTask calendarTask;
-
-    @Autowired
-    private ICalendarManager calendarManager;
-
     @Override
     public void clearCache(String cacheName) {
         Cache cache = cacheManager.getCache(cacheName);
@@ -55,14 +49,4 @@ public class OpManagerImpl implements IOpManager {
             }
         });
     }
-
-    @Override
-    public void invokeCalendarTask() {
-        calendarTask.execute();
-    }
-
-    @Override
-    public void refreshCalendar(String gregorianDate) {
-        calendarManager.refreshCalendar(gregorianDate);
-    }
 }

+ 114 - 15
src/main/java/com/punchsettle/server/task/RewardAutoExchangeTask.java

@@ -2,10 +2,16 @@ package com.punchsettle.server.task;
 
 import com.punchsettle.server.atomic.entity.Account;
 import com.punchsettle.server.atomic.entity.Reward;
+import com.punchsettle.server.atomic.entity.RewardExchangeHistory;
+import com.punchsettle.server.atomic.entity.User;
 import com.punchsettle.server.atomic.service.IAccountService;
+import com.punchsettle.server.atomic.service.IRewardExchangeHistoryService;
 import com.punchsettle.server.atomic.service.IRewardService;
+import com.punchsettle.server.atomic.service.IUserService;
 import com.punchsettle.server.common.constant.CommonEnableStatusEnum;
+import com.punchsettle.server.common.exception.BusinessException;
 import com.punchsettle.server.constant.AccountCategoryEnum;
+import com.punchsettle.server.constant.RewardExchangeMethodEnum;
 import com.punchsettle.server.constant.VersionStatusEnum;
 import com.punchsettle.server.pojo.account.AccountQuery;
 import com.punchsettle.server.pojo.reward.RewardExchangeRequest;
@@ -14,10 +20,14 @@ import com.punchsettle.server.service.manager.IRewardManager;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -32,15 +42,19 @@ import java.util.stream.Collectors;
 @Component
 public class RewardAutoExchangeTask {
 
-    @Autowired
-    private IRewardManager rewardManager;
-
     @Autowired
     private IRewardService rewardService;
 
     @Autowired
     private IAccountService accountService;
 
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private IRewardExchangeHistoryService rewardExchangeHistoryService;
+
+    @Transactional(rollbackFor = Exception.class)
     public void execute() {
         log.info("========== 奖励自动兑换定时任务 开始执行 ==========");
 
@@ -54,26 +68,111 @@ public class RewardAutoExchangeTask {
             return;
         }
 
-        // 获取户信息
+        // 获取户信息
         Set<Long> userIds = rewards.stream().map(Reward::getUserId).collect(Collectors.toSet());
+        List<User> users = userService.listByIds(userIds);
+
+
+        // 获取账户信息
         AccountQuery accountQuery = new AccountQuery();
         accountQuery.setUserIds(userIds);
         accountQuery.setAccountCategory(AccountCategoryEnum.BASIC);
         List<Account> accounts = accountService.getAccountByCondition(accountQuery);
+
+        // 用户ID-账户
         Map<Long, Account> accountMap = accounts.stream().collect(Collectors.toMap(Account::getUserId, Function.identity(), (key1, key2) -> key1));
+        // 用户ID-奖励
+        Map<Long, List<Reward>> rewardMap = rewards.stream().collect(Collectors.groupingBy(Reward::getUserId));
+
+        // 转账记录 新增
+        List<RewardExchangeHistory> addRewardExchangeHistories = new ArrayList<>();
+        // 用户信息 更新
+        List<User> updateUsers = new ArrayList<>();
+        // 账户信息 更新
+        List<Account> updateAccounts = new ArrayList<>();
 
-        for (Reward reward : rewards) {
-            try {
-                Account account = accountMap.get(reward.getUserId());
-
-                RewardExchangeRequest rewardExchangeRequest = new RewardExchangeRequest();
-                rewardExchangeRequest.setRewardId(reward.getId());
-                rewardExchangeRequest.setAccountId(account.getId());
-                rewardExchangeRequest.setExchangeCount(reward.getAutoExchangeCount());
-                rewardManager.exchangeReward(rewardExchangeRequest);
-            } catch (Exception e) {
-                log.info("自动兑换异常");
+        for (User user : users) {
+            // 获取账户信息
+            Account account = accountMap.get(user.getId());
+
+            // 如果用户未使用积分小于0(欠债)则停止自动兑换
+            if (Optional.ofNullable(account.getPoints()).orElse(0).compareTo(0) == -1) {
+                log.info("自动兑换:用户:{} 基本账户目前积分:{},已超支,跳过自动兑换", user.getId(), account.getPoints());
+                continue;
             }
+
+            // 获取用户需要自动兑换的奖励
+            List<Reward> tempRewards = rewardMap.get(user.getId());
+
+            // 没有需要自动兑换的则跳过
+            if (CollectionUtils.isEmpty(tempRewards)) {
+                continue;
+            }
+
+            for (Reward reward : tempRewards) {
+                // 兑换所需积分
+                Integer exchangePoints = Optional.ofNullable(reward.getExchangePoints()).orElse(0);
+                // 兑换所需总积分
+                Integer exchangeTotalPoints = exchangePoints * reward.getAutoExchangeCount();
+                // 兑换前账户中的积分
+                Integer accountPointsBeforeExchange = Optional.ofNullable(account.getPoints()).orElse(0);
+                // 兑换后账户中的积分
+                Integer accountPointsAfterExchange = accountPointsBeforeExchange - exchangeTotalPoints;
+                // 兑换前未使用积分
+                Integer unusedPointsBeforeExchange = Optional.ofNullable(user.getUnusedPoints()).orElse(0);
+                // 兑换前已使用积分
+                Integer usedPointsBeforeExchange = Optional.ofNullable(user.getUsedPoints()).orElse(0);
+                // 兑换后未使用积分
+                Integer unusedPointsAfterExchange = unusedPointsBeforeExchange - exchangeTotalPoints;
+                // 兑换后已使用积分
+                Integer usedPointsAfterExchange = usedPointsBeforeExchange + exchangeTotalPoints;
+
+                // 更新用户信息
+                user.setUnusedPoints(unusedPointsAfterExchange);
+                user.setUsedPoints(usedPointsAfterExchange);
+
+                // 更新账户信息
+                account.setPoints(accountPointsAfterExchange);
+
+                // 新增兑换记录
+                RewardExchangeHistory addRewardExchangeHistory = new RewardExchangeHistory();
+                addRewardExchangeHistory.setUserId(user.getId());
+                addRewardExchangeHistory.setRewardId(reward.getId());
+                addRewardExchangeHistory.setExchangeMethod(RewardExchangeMethodEnum.MANUAL);
+                addRewardExchangeHistory.setExchangeCount(reward.getAutoExchangeCount());
+                addRewardExchangeHistory.setExchangeTotalPoints(exchangeTotalPoints);
+                addRewardExchangeHistory.setAccountId(account.getId());
+                addRewardExchangeHistory.setAccountPointsBeforeExchange(accountPointsBeforeExchange);
+                addRewardExchangeHistory.setAccountPointsAfterExchange(accountPointsAfterExchange);
+                addRewardExchangeHistory.setUnusedPointsBeforeExchange(unusedPointsBeforeExchange);
+                addRewardExchangeHistory.setUnusedPointsAfterExchange(unusedPointsAfterExchange);
+                addRewardExchangeHistory.setUsedPointsBeforeExchange(usedPointsBeforeExchange);
+                addRewardExchangeHistory.setUsedPointsAfterExchange(usedPointsAfterExchange);
+                addRewardExchangeHistories.add(addRewardExchangeHistory);
+            }
+
+            User updateUser = new User();
+            updateUser.setId(user.getId());
+            updateUser.setUnusedPoints(user.getUnusedPoints());
+            updateUser.setUsedPoints(user.getUsedPoints());
+            updateUsers.add(updateUser);
+
+            Account updateAccount = new Account();
+            updateAccount.setId(account.getId());
+            updateAccount.setPoints(account.getPoints());
+            updateAccounts.add(updateAccount);
+        }
+
+        if (!CollectionUtils.isEmpty(addRewardExchangeHistories)) {
+            rewardExchangeHistoryService.batchAdd(addRewardExchangeHistories);
+        }
+
+        if (!CollectionUtils.isEmpty(updateAccounts)) {
+            accountService.batchUpdate(updateAccounts);
+        }
+
+        if (!CollectionUtils.isEmpty(updateUsers)) {
+            userService.batchUpdate(updateUsers);
         }
 
         log.info("========== 奖励自动兑换定时任务 结束执行 ==========");