Browse Source

模块4:自然灾害与防护包功能模块

xst 4 năm trước cách đây
mục cha
commit
ffa9fdf117

+ 5 - 3
src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java

@@ -441,11 +441,13 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
 
 
     /**
-     * 灾难
+     * 获得某个用个 灾难情况
+     * @param userId
+     * @return
      */
-    @GetMapping("getAttack")
+    @GetMapping("getDisasterHistory")
     @Transactional(rollbackFor = Exception.class)
-    public Result<List<ComPlayerDisasterLog>> getAttack(@RequestParam(value = "userId") String userId) {
+    public Result<List<ComPlayerDisasterLog>> getDisasterHistory(@RequestParam(value = "userId") String userId) {
         List<ComPlayerDisasterLog> history = comPlayerDisasterLogService.getHistory(userId);
         return Result.of(history);
     }

+ 14 - 0
src/main/java/com/td/boss/game/complayerland/scheduled/ComPlayerDisasterDayTask.java

@@ -1,13 +1,17 @@
 package com.td.boss.game.complayerland.scheduled;
 
+import cn.hutool.core.date.DateUtil;
 import com.td.boss.game.complayerland.pojo.ComPlayerDisasterLog;
 import com.td.boss.game.complayerland.service.ComPlayerDisasterLogService;
+import com.td.boss.util.RedisData;
+import com.td.boss.util.RedisLock;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.JobExecutionContext;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.quartz.QuartzJobBean;
 
+import java.util.Date;
 import java.util.List;
 
 @Slf4j
@@ -16,10 +20,19 @@ public class ComPlayerDisasterDayTask extends QuartzJobBean {
 
     @Autowired
     private ComPlayerDisasterLogService comPlayerDisasterLogService;
+    @Autowired
+    private RedisLock redisLock;
 
     @Override
     protected void executeInternal(JobExecutionContext jobExecutionContext) {
         log.info("触发灾难周期任务开始");
+        long time = System.currentTimeMillis() + RedisData.getDisastersDayTimeout();
+        String _redisKey = "LOCK:COM_PLAYER_DISASTER:DAY:" + DateUtil.format(new Date(), "yyyyMMd");
+
+        if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+            log.info("触发每天灾难任务加锁失败!");
+            return;
+        }
         //把今天灾难的明细取出来。按照用户编号计算是否有防护。
         List<ComPlayerDisasterLog> disasterLogList = comPlayerDisasterLogService.getTodayDisasterUnEnabledList();
         log.info("触发每天灾难任务:{}个", disasterLogList.size());
@@ -30,6 +43,7 @@ public class ComPlayerDisasterDayTask extends QuartzJobBean {
                 log.error("触发灾难周期任务异常(天):" + e.getMessage());
             }
         }
+        redisLock.unlock(_redisKey, String.valueOf(time));
         log.info("触发灾难周期任务结束");
     }
 }

+ 21 - 8
src/main/java/com/td/boss/game/complayerland/scheduled/ComPlayerDisasterWeekTask.java

@@ -1,14 +1,17 @@
 package com.td.boss.game.complayerland.scheduled;
 
+import cn.hutool.core.date.DateUtil;
 import com.td.boss.game.complayerland.service.ComPlayerDisasterLogService;
 import com.td.boss.game.complayers.service.ComPlayersService;
+import com.td.boss.util.RedisData;
+import com.td.boss.util.RedisLock;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.JobExecutionContext;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.quartz.QuartzJobBean;
 
-import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 @Slf4j
@@ -16,25 +19,35 @@ import java.util.List;
 public class ComPlayerDisasterWeekTask extends QuartzJobBean {
 
     @Autowired
-    private ComPlayerDisasterLogService comPlayerDisasterLogService;
+    private ComPlayerDisasterLogService disasterLogService;
     @Autowired
     private ComPlayersService comPlayersService;
+    @Autowired
+    private RedisLock redisLock;
 
     @Override
     protected void executeInternal(JobExecutionContext jobExecutionContext) {
         log.info("每周拉取灾难数据周期任务开始");
-        List<String> userIds = new ArrayList<>();
-        userIds.add("1002");
-        //todo 测试后 改回去
-        //List<String> userIds = comPlayersService.findUserIds();
+
+        long time = System.currentTimeMillis() + RedisData.getDisastersWeekTimeout();
+        String _redisKey = "LOCK:COM_PLAYER_DISASTER:WEEK:" + DateUtil.format(new Date(), "yyyyMMd");
+
+        if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+            log.info("每周拉取灾难数据周期任务加锁失败!");
+            return;
+        }
+
+        List<String> userIds = comPlayersService.findUserIds();
         log.info("拉取灾难接口数据周期任务数量:{}个", userIds.size());
         for (String userId : userIds) {
             try {
-                comPlayerDisasterLogService.asyncDisaster(userId);
+                disasterLogService.asyncDisaster(userId);
             } catch (Exception e) {
                 log.error("触发灾难周期任务异常(周):" + e.getMessage());
             }
         }
-        log.info("每周拉取灾难数据周期任务开始");
+
+        redisLock.unlock(_redisKey, String.valueOf(time));
+        log.info("每周拉取灾难数据周期任务结束");
     }
 }

+ 2 - 1
src/main/java/com/td/boss/game/complayerland/service/ComPlayerDisasterLogService.java

@@ -9,7 +9,8 @@ import java.util.List;
 public interface ComPlayerDisasterLogService extends CommonService<ComPlayerDisasterLogVo, ComPlayerDisasterLog, String> {
 
     /**
-     * 灾难模式周任务:同步每个用户上周收入支出
+     * 定时任务核心方法 同步每个用户上周收入支出
+     * 灾难模式每周统计一次,如果这个期间新用户也需要这个功能。新注册的用户直接调用该方法。
      */
     void asyncDisaster(String userId);
 

+ 10 - 10
src/main/java/com/td/boss/game/complayerland/service/ComPlayerDisasterLogServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateRange;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.EnumUtil;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.json.JSONUtil;
 import com.td.boss.common.service.CommonServiceImpl;
@@ -77,11 +78,11 @@ public class ComPlayerDisasterLogServiceImpl extends CommonServiceImpl<ComPlayer
      *
      * @param userId
      */
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void asyncDisaster(String userId) {
-        //同步“链端接口”上周“收入支出数据”到数据库
-        ComPlayerDisaster comPlayerDisaster = disasterService.save(userId);
+        //获取“收入支出数据”,下一步计算灾难场数
+        ComPlayerDisaster comPlayerDisaster = disasterService.getAndSave(userId);
         //如果从链端接口拉到数据了。那么就计算灾难发生明细
         if (comPlayerDisaster != null) {
             //本周内应该出现的灾难次数
@@ -119,12 +120,12 @@ public class ComPlayerDisasterLogServiceImpl extends CommonServiceImpl<ComPlayer
      * @param pay_amount  支出对应
      * @param swap_amount 收入对应
      */
-    private int getDisasterTimes(Double pay_amount, Double swap_amount) {
-        if (pay_amount > swap_amount * 0.8) {
+    private int getDisasterTimes(double pay_amount, double swap_amount) {
+        if (pay_amount > NumberUtil.mul(swap_amount, 0.8)) {
             return 6;
-        } else if (pay_amount > swap_amount * 0.5) {
+        } else if (pay_amount > NumberUtil.mul(swap_amount, 0.5)) {
             return 4;
-        } else if (pay_amount > swap_amount * 0.3) {
+        } else if (pay_amount > NumberUtil.mul(swap_amount, 0.3)) {
             return 2;
         } else {
             return 1;
@@ -169,7 +170,7 @@ public class ComPlayerDisasterLogServiceImpl extends CommonServiceImpl<ComPlayer
     /**
      * 灾难模式天任务:触发所有用户今日灾难和保护机制
      */
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void ComPlayerDisasterDayTask(ComPlayerDisasterLog disasterLog) {
         Date now = new Date();
@@ -205,13 +206,12 @@ public class ComPlayerDisasterLogServiceImpl extends CommonServiceImpl<ComPlayer
 
         log.info("灾难日志:{}", JSONUtil.toJsonStr(disasterLog));
         comPlayerDisasterLogRepository.save(disasterLog);
-        //todo 应该还有个减产的接口,此处但是先不做
+        //todo 减产接口 减产逻辑
         if (!disasterLog.isProtect()) {
             log.info("灾难结果:减产");
         } else {
             log.info("灾难结果:已防御");
         }
-
     }
 
     /**

+ 2 - 1
src/main/java/com/td/boss/game/complayerland/service/ComPlayerDisasterService.java

@@ -9,9 +9,10 @@ public interface ComPlayerDisasterService extends CommonService<ComPlayerDisaste
 
     /**
      * 同步“链端接口”上周“收入支出数据”到数据库
+     * 本周开始时间为周日到周六,期间获取的不会变化,这周获取的是上周的数据
      *
      * @param userId
      * @return
      */
-    ComPlayerDisaster save(String userId);
+    ComPlayerDisaster getAndSave(String userId);
 }

+ 1 - 1
src/main/java/com/td/boss/game/complayerland/service/ComPlayerDisasterServiceImpl.java

@@ -39,7 +39,7 @@ public class ComPlayerDisasterServiceImpl extends CommonServiceImpl<ComPlayerDis
      * @return
      */
     @Override
-    public ComPlayerDisaster save(String userId) {
+    public ComPlayerDisaster getAndSave(String userId) {
         Date begin = ComPlayerDisasterDateUtil.getBegin();
         Date end = ComPlayerDisasterDateUtil.getEnd();
         log.info("灾难模式周同步数据[{}],begin:{},end:{},now:{}", userId, begin, end, DateUtil.format(new Date(), "yyyy-MM-dd hh:mm:ss"));

+ 16 - 0
src/main/java/com/td/boss/util/RedisData.java

@@ -30,4 +30,20 @@ public class RedisData {
     public static int getPlayerGoodsTimeout() {
         return PLAYER_GOODS_TIMEOUT;
     }
+
+    /**
+     * 1h 灾难模块锁
+     */
+    private static final int PLAYER_DISASTERS_WEEK_TIMEOUT = 60 * 1000*60;
+    public static int getDisastersWeekTimeout() {
+        return PLAYER_DISASTERS_WEEK_TIMEOUT;
+    }
+
+    /**
+     * 1h 灾难模块锁
+     */
+    private static final int PLAYER_DISASTERS_DAY_TIMEOUT = 60 * 1000*60;
+    public static int getDisastersDayTimeout() {
+        return PLAYER_DISASTERS_DAY_TIMEOUT;
+    }
 }