소스 검색

完成任务回调接口,增加任务完成数达到阈值自动关闭

xudm 2 달 전
부모
커밋
73d3d5caf3

+ 4 - 0
src/main/java/com/xs/core/common/constant/GoldCoinConstant.java

@@ -17,6 +17,10 @@ public interface GoldCoinConstant {
      * 金币产出计算已处理的消息key
      */
     String GOLD_COIN_CALCULATE_PROCESSED_MESSAGE = "gold:coin:calculate:processed:message:";
+    /**
+     * 任务回调分布式锁
+     */
+    String TASK_CALLBACK_LOCK_KEY = "task:callback:lock:key:";
     /**
      * 金币产出时间,单位秒
      */

+ 10 - 4
src/main/java/com/xs/core/model/task/entity/TaskInfo.java

@@ -110,11 +110,17 @@ public class TaskInfo extends Model<TaskInfo> {
     private String taskLink;
 
     /**
-     * 任务接受接口链接
+     * 任务开始接口链接
      */
     @TableField("task_accept_api_link")
     private String taskAcceptApiLink;
 
+    /**
+     * 自动关闭阈值
+     */
+    @TableField("auto_close_threshold")
+    private Integer autoCloseThreshold;
+
     /**
      * 任务分类编码
      */
@@ -122,7 +128,7 @@ public class TaskInfo extends Model<TaskInfo> {
     private String categoryCode;
 
     /**
-     * 1开启0关闭
+     * 1开启0关闭 2 自动关闭
      */
     @TableField("status")
     private Integer status;
@@ -142,8 +148,8 @@ public class TaskInfo extends Model<TaskInfo> {
     /**
      * 逻辑删除 0 未删除 1 已删除
      */
-    @TableField("is_deleted")
-    private Integer isDeleted;
+    @TableField("del_flag")
+    private Integer delFlag;
 
     /**
      * 创建人

+ 37 - 18
src/main/java/com/xs/core/service/Impl/task/TaskCallbackServiceImpl.java

@@ -2,6 +2,7 @@ package com.xs.core.service.Impl.task;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
+import com.xs.core.common.constant.GoldCoinConstant;
 import com.xs.core.common.enums.CoinTransactionCategoryEnum;
 import com.xs.core.common.enums.CoinTransactionTypeEnum;
 import com.xs.core.common.enums.TaskCallbackLogTypeEnum;
@@ -15,6 +16,7 @@ import com.xs.core.service.task.IUserTaskRecordService;
 import com.xs.core.service.task.TaskCallbackService;
 import com.xs.core.service.user.IUserService;
 import com.xs.core.service.wallet.IUserWalletService;
+import com.xs.core.utils.redis.RedissonLockUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -50,25 +52,42 @@ public class TaskCallbackServiceImpl implements TaskCallbackService {
         CheckUtils.throwIfNull(taskInfo, "error.task.handle.not.exist");
         boolean exist = userService.checkUserExist(Long.valueOf(userId));
         CheckUtils.throwIf(!exist, "error.user.not.exist");
-        //查询任务完成情况
-        UserTaskRecord record = taskRecordService.getByTaskId(taskId, Long.valueOf(userId));
-        if (record != null) {
-            //说明任务已经开始 根据任务状态进行处理
-            Integer status = record.getStatus();
-            if (status == 1) {
-                //说明任务已经已经开始 进入下一步
-                record.setStatus(2);
-                record.setCallbackNum(1);
-                record.setUpdateTime(LocalDateTime.now());
-                record.setCompleteTime(LocalDateTime.now());
-                taskRecordService.updateById(record);
-                //领取奖励
-                walletService.coinTransaction(CoinTransactionTypeEnum.ADD, CoinTransactionCategoryEnum.TASK_REWARDS, "任务奖励", "任务奖励", new BigDecimal(record.getRewardAmount()), Long.valueOf(userId));
-                CompletableFuture.runAsync(() -> {
-                    // 保存回调日志
-                    taskCallbackLogService.saveCallbackLog(taskId, Long.valueOf(userId), taskInfo.getTaskAcceptApiLink(), jsonObject.toJSONString(), JSON.toJSONString(ResponseResult.success()), TaskCallbackLogTypeEnum.CALLBACK);
-                });
+        String key = GoldCoinConstant.TASK_CALLBACK_LOCK_KEY + taskId + "_" + userId;
+        try {
+            RedissonLockUtil.tryLock(key);
+            //查询任务完成情况
+            UserTaskRecord record = taskRecordService.getByTaskId(taskId, Long.valueOf(userId));
+            if (record != null) {
+                //说明任务已经开始 根据任务状态进行处理
+                Integer status = record.getStatus();
+                if (status == 1) {
+                    //说明任务已经已经开始 进入下一步
+                    record.setStatus(2);
+                    record.setCallbackNum(1);
+                    record.setUpdateTime(LocalDateTime.now());
+                    record.setCompleteTime(LocalDateTime.now());
+                    taskRecordService.updateById(record);
+                    //领取奖励
+                    walletService.coinTransaction(CoinTransactionTypeEnum.ADD, CoinTransactionCategoryEnum.TASK_REWARDS, "任务奖励", "任务奖励", new BigDecimal(record.getRewardAmount()), Long.valueOf(userId));
+                    CompletableFuture.runAsync(() -> {
+                        // 保存回调日志
+                        taskCallbackLogService.saveCallbackLog(taskId, Long.valueOf(userId), taskInfo.getTaskAcceptApiLink(), jsonObject.toJSONString(), JSON.toJSONString(ResponseResult.success()), TaskCallbackLogTypeEnum.CALLBACK);
+                    });
+                    CompletableFuture.runAsync(() -> {
+                        //判断任务完成量是否已经达到阈值
+                        long count = taskRecordService.statisticsTaskDoneCount(taskId);
+                        if (count >= taskInfo.getAutoCloseThreshold()) {
+                            //修改任务状态
+                            taskInfo.setStatus(2);
+                            taskInfoService.updateById(taskInfo);
+                        }
+                    });
+                }
             }
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        } finally {
+            RedissonLockUtil.unLock(key);
         }
     }
 }

+ 8 - 0
src/main/java/com/xs/core/service/Impl/task/UserTaskRecordServiceImpl.java

@@ -25,4 +25,12 @@ public class UserTaskRecordServiceImpl extends ServiceImpl<UserTaskRecordMapper,
         queryWrapper.eq(UserTaskRecord::getUserId, userId);
         return getOne(queryWrapper);
     }
+
+    @Override
+    public Long statisticsTaskDoneCount(String taskId) {
+        LambdaQueryWrapper<UserTaskRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserTaskRecord::getTaskId, taskId);
+        queryWrapper.eq(UserTaskRecord::getStatus, 1);
+        return count(queryWrapper);
+    }
 }

+ 8 - 0
src/main/java/com/xs/core/service/task/IUserTaskRecordService.java

@@ -21,4 +21,12 @@ public interface IUserTaskRecordService extends IService<UserTaskRecord> {
      * @return
      */
     UserTaskRecord getByTaskId(String taskId, Long userId);
+
+    /**
+     * 统计任务完成数量
+     *
+     * @param taskId
+     * @return
+     */
+    Long statisticsTaskDoneCount(String taskId);
 }

+ 7 - 6
src/main/resources/mapper/TaskInfoMapper.xml

@@ -17,12 +17,13 @@
         <result column="instruction" property="instruction"/>
         <result column="task_icon" property="taskIcon"/>
         <result column="task_link" property="taskLink"/>
+        <result column="auto_close_threshold" property="autoCloseThreshold"/>
         <result column="task_accept_api_link" property="taskAcceptApiLink"/>
         <result column="category_code" property="categoryCode"/>
         <result column="status" property="status"/>
         <result column="gold_coin" property="goldCoin"/>
         <result column="sort_num" property="sortNum"/>
-        <result column="is_deleted" property="isDeleted"/>
+        <result column="del_flag" property="delFlag"/>
         <result column="create_by" property="createBy"/>
         <result column="update_by" property="updateBy"/>
         <result column="create_time" property="createTime"/>
@@ -88,11 +89,11 @@
         b_task_info ti
         LEFT JOIN
         b_user_task_record utr ON ti.id = utr.task_id AND utr.user_id = #{userId}
-        <where>
-            <if test="categoryCode != null and categoryCode != ''">
-                AND ti.category_code = #{categoryCode}
-            </if>
-        </where>
+        <!-- 只查询未删除的任务 以及未关闭的任务   -->
+        where ti.del_flag = 0 and ti.status = 1
+        <if test="categoryCode != null and categoryCode != ''">
+            AND ti.category_code = #{categoryCode}
+        </if>
         ORDER BY ti.sort_num
     </select>
 </mapper>