Explorar o código

模块3 工具功能模块

xst %!s(int64=4) %!d(string=hai) anos
pai
achega
f84e4eec8a
Modificáronse 24 ficheiros con 699 adicións e 253 borrados
  1. 16 0
      src/main/java/com/td/boss/common/pojo/ComConfig.java
  2. 14 0
      src/main/java/com/td/boss/common/repository/ComConfigRepository.java
  3. 5 0
      src/main/java/com/td/boss/common/service/ComConfigService.java
  4. 40 0
      src/main/java/com/td/boss/common/service/ComConfigServiceImpl.java
  5. 4 0
      src/main/java/com/td/boss/config/enums/ResultEnum.java
  6. 57 22
      src/main/java/com/td/boss/game/complayersattri/controller/ComPlayersLuckyController.java
  7. 2 3
      src/main/java/com/td/boss/game/complayersattri/enums/ComPlayerLuckyLogEnum.java
  8. 60 0
      src/main/java/com/td/boss/game/complayersattri/pojo/ComPlayersLucky.java
  9. 0 31
      src/main/java/com/td/boss/game/complayersattri/pojo/ComPlayersLuckyLog.java
  10. 0 38
      src/main/java/com/td/boss/game/complayersattri/pojo/ComPlayersLuckyTools.java
  11. 0 16
      src/main/java/com/td/boss/game/complayersattri/repository/ComPlayersLuckyLogRepository.java
  12. 12 0
      src/main/java/com/td/boss/game/complayersattri/repository/ComPlayersLuckyRepository.java
  13. 0 10
      src/main/java/com/td/boss/game/complayersattri/repository/ComPlayersLuckyToolsRepository.java
  14. 0 12
      src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyLogService.java
  15. 0 95
      src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyLogServiceImpl.java
  16. 55 0
      src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyService.java
  17. 327 0
      src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyServiceImpl.java
  18. 0 10
      src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyToolsService.java
  19. 0 9
      src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyToolsServiceImpl.java
  20. 24 0
      src/main/java/com/td/boss/game/complayersattri/vo/ComPlayersLuckyLandLevelUpVo.java
  21. 3 5
      src/main/java/com/td/boss/game/complayersattri/vo/ComPlayersLuckyToolsVo.java
  22. 13 2
      src/main/java/com/td/boss/game/complayersattri/vo/ComPlayersLuckyVo.java
  23. 16 0
      src/main/java/com/td/boss/util/RedisData.java
  24. 51 0
      src/test/java/com/td/boss/ComPlayerLuckyTests.java

+ 16 - 0
src/main/java/com/td/boss/common/pojo/ComConfig.java

@@ -0,0 +1,16 @@
+package com.td.boss.common.pojo;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Data
+@Table(name = "com_players_lucky_tools")
+public class ComConfig implements Serializable {
+     @Id
+     @GeneratedValue(strategy = GenerationType.AUTO)
+     private String configKey;
+     private String configValue;
+}

+ 14 - 0
src/main/java/com/td/boss/common/repository/ComConfigRepository.java

@@ -0,0 +1,14 @@
+package com.td.boss.common.repository;
+
+import com.td.boss.common.pojo.ComConfig;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ComConfigRepository extends CommonRepository<ComConfig, Integer> {
+
+    @Query(value = "select * from com_config", nativeQuery = true)
+    public List<ComConfig> list();
+}

+ 5 - 0
src/main/java/com/td/boss/common/service/ComConfigService.java

@@ -0,0 +1,5 @@
+package com.td.boss.common.service;
+
+public interface ComConfigService  {
+    String selectByKey(String key);
+}

+ 40 - 0
src/main/java/com/td/boss/common/service/ComConfigServiceImpl.java

@@ -0,0 +1,40 @@
+package com.td.boss.common.service;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.td.boss.common.pojo.ComConfig;
+import com.td.boss.common.repository.ComConfigRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ComConfigServiceImpl implements ComConfigService {
+
+    private String redisKey = "data:com:config";
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Autowired
+    private ComConfigRepository repository;
+
+    private List<ComConfig> list() {
+        List<ComConfig> list = null;
+        String s = redisTemplate.opsForValue().get(redisKey);
+        if (StrUtil.isBlank(s)) {
+            list = repository.list();
+            redisTemplate.opsForValue().set(redisKey, JSONUtil.toJsonStr(list));
+        } else {
+            list = JSONUtil.toList(s, ComConfig.class);
+        }
+        return list;
+    }
+
+    @Override
+    public String selectByKey(String key) {
+        List<ComConfig> list = list();
+        return list.stream().filter(a -> a.getConfigKey().equals(key)).map(a -> a.getConfigValue()).findFirst().orElse("");
+    }
+}

+ 4 - 0
src/main/java/com/td/boss/config/enums/ResultEnum.java

@@ -68,6 +68,10 @@ public enum ResultEnum {
     LAND_CAN_STEAL_IS_NULL(712,"没有可收取果实的土地!"),
 
     LAND_CAN_STEAL_IS_MAX(713,"已无多余利润!"),//达到最大值
+    LAND_USE_TOOL(714,"该土地正在使用工具中!"),
+    LAND_LAND_LEVELUPPING(715,"该土地正在升级中!"),
+
+
     //种子数据不能存在
     SEED_DATA_ERROR(801,"种子数据不存在!"),
     FRUIT_DATA_ERROR(802,"果实数据不存在!"),

+ 57 - 22
src/main/java/com/td/boss/game/complayersattri/controller/ComPlayersLuckyController.java

@@ -1,50 +1,85 @@
 package com.td.boss.game.complayersattri.controller;
 
 import com.td.boss.common.pojo.Result;
-import com.td.boss.game.complayersattri.service.ComPlayersLuckyLogService;
-import com.td.boss.game.complayersattri.service.ComPlayersLuckyToolsService;
+import com.td.boss.game.complayersattri.service.ComPlayersLuckyService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * 工具功能模块
  */
-@RequestMapping("/game/")
+@RequestMapping("/game/land")
 @RestController
 public class ComPlayersLuckyController {
 
+    //todo 土地升级还差一个 计算收益
     @Autowired
-    private ComPlayersLuckyToolsService luckyToolService;
-
-    @Autowired
-    private ComPlayersLuckyLogService luckyLogService;
+    private ComPlayersLuckyService service;
 
     /**
-     * 获取所有工具
+     * 获取所有工具列表,方便用户选择使用哪种工具来获取幸运值
      *
      * @return
      */
-    @GetMapping("/comPlayersTools")
+    @GetMapping("/tools")
     public Result<?> getLandTools() {
-        return luckyToolService.list(null);
+        return Result.of(service.getLandTools(), true, "查询成功");
+    }
+
+    /**
+     * 获取土地升级列表
+     *
+     * @return
+     */
+    @GetMapping("/level")
+    public Result<?> getLandLevelUp() {
+        return Result.of(service.getLandLevelUp(), true, "查询成功");
     }
 
     /**
      * 使用某个工具 获得幸运值
      *
-     * @param id
+     * @param userId
+     * @param toolId
+     * @param landId
      * @return
      */
-    @GetMapping("/useLuckTools")
+    @PostMapping("/tools")
+    @Transactional(rollbackFor = Exception.class)
     public Result<?> useLuckyTools(@RequestParam(value = "userId") String userId,
-                                   @RequestParam(value = "id") Integer id) {
-        return luckyLogService.useLuckyTools(userId, id);
+                                   @RequestParam(value = "toolId") Integer toolId,
+                                   @RequestParam(value = "landId") Integer landId) {
+        return service.useLuckyTools(userId, toolId, landId);
+    }
+
+    /**
+     * 土地升级
+     *
+     * @param userId
+     * @param level
+     * @param landId
+     * @return
+     */
+    @PostMapping("/level")
+    @Transactional(rollbackFor = Exception.class)
+    public Result<?> landLevelUp(@RequestParam(value = "userId") String userId,
+                                 @RequestParam(value = "level") Integer level,
+                                 @RequestParam(value = "landId") Integer landId) {
+        return service.landLevelUp(userId, level, landId);
+    }
+
+    /**
+     * 兑换snb
+     *
+     * @param userId
+     * @param luckNum
+     * @return
+     */
+    @GetMapping("/snb")
+    @Transactional(rollbackFor = Exception.class)
+    public Result<?> toSNB(@RequestParam(value = "userId") String userId,
+                           @RequestParam(value = "luckNum") Integer luckNum) {
+        return service.toSNB(userId, luckNum);
     }
 }

+ 2 - 3
src/main/java/com/td/boss/game/complayersattri/enums/ComPlayerLuckyLogEnum.java

@@ -5,9 +5,8 @@ import lombok.Getter;
 @Getter
 public enum ComPlayerLuckyLogEnum {
     tool(0, "工具"),
-    huangjinland(10, "黄金土地"),
-    heijinland(11, "黑金土地"),
-    cnb(100, "兑换CNB");
+    level(1, "升级土地"),
+    cnb(2, "兑换CNB");
 
     ComPlayerLuckyLogEnum(Integer code, String msg) {
         this.code = code;

+ 60 - 0
src/main/java/com/td/boss/game/complayersattri/pojo/ComPlayersLucky.java

@@ -0,0 +1,60 @@
+package com.td.boss.game.complayersattri.pojo;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Data
+@Table(name = "com_players_lucky")
+public class ComPlayersLucky implements Serializable {
+    /**
+     * 主键id
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int id;
+    /**
+     * 用户id
+     */
+    private String userId;
+    /**
+     * 操作数量
+     */
+    private int amount;
+    /**
+     *操作名称
+     */
+    private String luckyName;
+    /**
+     * 幸运值来源类型
+     */
+    private int luckyType;
+    /**
+     * 操作前
+     */
+    private int beforeLucky;
+    /**
+     * 操作后
+     */
+    private int afterLucky;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 工具id
+     */
+    private Integer toolsId;
+    /**
+     * 土地id
+     */
+    private Integer landId;
+    /**
+     * 级别id
+     */
+    private Integer levelId;
+
+}

+ 0 - 31
src/main/java/com/td/boss/game/complayersattri/pojo/ComPlayersLuckyLog.java

@@ -1,31 +0,0 @@
-package com.td.boss.game.complayersattri.pojo;
-
-import lombok.Data;
-
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.io.Serializable;
-import java.util.Date;
-
-@Data
-@Table(name="com_players_lucky_log")
-public class ComPlayersLuckyLog implements Serializable {
-    /** 主键id */
-    @Id
-    @GeneratedValue
-    private int id ;
-    /** 用户id */
-    private String userId ;
-    /** 操作数量 */
-    private int amount ;
-    /** 幸运值来源类型 */
-    private int luckyType ;
-    /** 操作前 */
-    private int beforeLucky ;
-    /** 操作后 */
-    private int afterLucky ;
-    /** 创建时间 */
-    private Date createTime ;
-    private Integer toolsId ;
-}

+ 0 - 38
src/main/java/com/td/boss/game/complayersattri/pojo/ComPlayersLuckyTools.java

@@ -1,38 +0,0 @@
-package com.td.boss.game.complayersattri.pojo;
-
-import lombok.Data;
-
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.io.Serializable;
-import java.util.Date;
-
-
-@Data
-@Table(name = "com_players_lucky_tools")
-public class ComPlayersLuckyTools implements Serializable {
-    /**
-     * 主键id
-     */
-    @Id
-    @GeneratedValue
-    private int id;
-    /**
-     * 工具名称
-     */
-    private String toolName;
-    /**
-     * 工具使用间隔
-     */
-    private int toolTime;
-    /**
-     * 幸运值
-     */
-    private int toolLucky;
-    /**
-     * 创建时间
-     */
-    private Date createTime;
-
-}

+ 0 - 16
src/main/java/com/td/boss/game/complayersattri/repository/ComPlayersLuckyLogRepository.java

@@ -1,16 +0,0 @@
-package com.td.boss.game.complayersattri.repository;
-
-import com.td.boss.common.repository.CommonRepository;
-import com.td.boss.game.complayersattri.pojo.ComPlayersAttri;
-import com.td.boss.game.complayersattri.pojo.ComPlayersLuckyLog;
-import org.springframework.stereotype.Repository;
-
-import java.util.Optional;
-
-@Repository
-public interface ComPlayersLuckyLogRepository extends CommonRepository<ComPlayersLuckyLog, Integer> {
-
-    Optional<ComPlayersLuckyLog> findByUserId(String userId);
-    Optional<ComPlayersLuckyLog> findByUserIdOrderByCreateTimeDesc(String userId);
-
-}

+ 12 - 0
src/main/java/com/td/boss/game/complayersattri/repository/ComPlayersLuckyRepository.java

@@ -0,0 +1,12 @@
+package com.td.boss.game.complayersattri.repository;
+
+import com.td.boss.common.repository.CommonRepository;
+import com.td.boss.game.complayersattri.pojo.ComPlayersLucky;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface ComPlayersLuckyRepository extends CommonRepository<ComPlayersLucky, Integer> {
+    Optional<ComPlayersLucky> findFirstByUserIdOrderByCreateTimeDesc(String userId);
+}

+ 0 - 10
src/main/java/com/td/boss/game/complayersattri/repository/ComPlayersLuckyToolsRepository.java

@@ -1,10 +0,0 @@
-package com.td.boss.game.complayersattri.repository;
-
-import com.td.boss.common.repository.CommonRepository;
-import com.td.boss.game.complayersattri.pojo.ComPlayersLuckyTools;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface ComPlayersLuckyToolsRepository  extends CommonRepository<ComPlayersLuckyTools, Integer> {
-
-}

+ 0 - 12
src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyLogService.java

@@ -1,12 +0,0 @@
-package com.td.boss.game.complayersattri.service;
-
-import com.td.boss.common.pojo.Result;
-import com.td.boss.common.service.CommonService;
-import com.td.boss.game.complayersattri.pojo.ComPlayersLuckyLog;
-import com.td.boss.game.complayersattri.vo.ComPlayersLuckyLogVo;
-
-public interface ComPlayersLuckyLogService extends CommonService<ComPlayersLuckyLogVo, ComPlayersLuckyLog, Integer> {
-    ComPlayersLuckyLogVo findByUserId(String userId);
-
-    Result useLuckyTools(String userId,Integer id);
-}

+ 0 - 95
src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyLogServiceImpl.java

@@ -1,95 +0,0 @@
-package com.td.boss.game.complayersattri.service;
-
-import cn.hutool.core.date.DateField;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
-import com.td.boss.common.pojo.Result;
-import com.td.boss.common.service.CommonServiceImpl;
-import com.td.boss.game.complayersattri.enums.ComPlayerLuckyLogEnum;
-import com.td.boss.game.complayersattri.pojo.ComPlayersAttri;
-import com.td.boss.game.complayersattri.pojo.ComPlayersLuckyLog;
-import com.td.boss.game.complayersattri.pojo.ComPlayersLuckyTools;
-import com.td.boss.game.complayersattri.repository.ComPlayersAttriRepository;
-import com.td.boss.game.complayersattri.repository.ComPlayersLuckyLogRepository;
-import com.td.boss.game.complayersattri.repository.ComPlayersLuckyToolsRepository;
-import com.td.boss.game.complayersattri.vo.ComPlayersLuckyLogVo;
-import com.td.boss.game.complayersattri.vo.ComPlayersLuckyToolsVo;
-import com.td.boss.util.CopyUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import java.util.Date;
-import java.util.Optional;
-
-@Service
-@Transactional
-public class ComPlayersLuckyLogServiceImpl extends CommonServiceImpl<ComPlayersLuckyLogVo, ComPlayersLuckyLog, Integer> implements ComPlayersLuckyLogService {
-
-    @PersistenceContext
-    private EntityManager em;
-    @Autowired
-    private ComPlayersLuckyLogRepository repository;
-
-    @Autowired
-    private ComPlayersLuckyToolsRepository luckyToolsRepository;
-
-    @Autowired
-    private ComPlayersAttriRepository comPlayersAttriRepository;
-
-    @Override
-    public ComPlayersLuckyLogVo findByUserId(String userId) {
-        ComPlayersLuckyLog comPlayersLuckyLog = repository.findByUserId(userId).orElse(null);
-        return comPlayersLuckyLog == null ? null : CopyUtil.copy(comPlayersLuckyLog, ComPlayersLuckyLogVo.class);
-    }
-
-    /**
-     * 使用的工具 获得幸运值,12小时获取一次
-     *
-     * @param userId
-     * @param id
-     * @return
-     */
-    @Override
-    public Result useLuckyTools(String userId, Integer id) {
-        //需要记录 对那块地使用了工具
-        //明细中应该记录当时工具名称
-        //工具应该加一个状态字段。标记是否启用该工具
-        if (id == null || id.equals(0)) {
-            Result.of(null, false, "无效工具");
-        }
-        ComPlayersLuckyTools tools = luckyToolsRepository.findById(id).orElse(null);
-        if (tools == null) {
-            Result.of(null, false, "无效工具");
-        }
-        ComPlayersAttri playersAttri = comPlayersAttriRepository.findByUserId(userId).orElse(null);
-        if (playersAttri == null) {
-            Result.of(null, false, "无效领取");
-        }
-        //验证工具是否可用:每隔一段时间才可使用
-        Optional<ComPlayersLuckyLog> lastComPlayersLuckyLog = repository.findByUserIdOrderByCreateTimeDesc(userId);
-        if (lastComPlayersLuckyLog.isPresent()) {
-            DateTime nextTime = DateUtil.offset(lastComPlayersLuckyLog.get().getCreateTime(), DateField.HOUR_OF_DAY, tools.getToolTime());
-            if (nextTime.isAfter(new Date())) {
-                Result.of(null, false, "请在" + nextTime.toDateStr() + "后使用工具");
-            }
-        }
-        //写入使用工具明细
-        ComPlayersLuckyLog comPlayersLuckyLog = new ComPlayersLuckyLog();
-        comPlayersLuckyLog.setAfterLucky(playersAttri.getLucky() + tools.getToolLucky());
-        comPlayersLuckyLog.setBeforeLucky(playersAttri.getLucky());
-        comPlayersLuckyLog.setAmount(tools.getToolLucky());
-        comPlayersLuckyLog.setLuckyType(ComPlayerLuckyLogEnum.tool.getCode());
-        comPlayersLuckyLog.setToolsId(id);
-        comPlayersLuckyLog.setUserId(userId);
-        repository.save(comPlayersLuckyLog);
-
-        //更新幸运值
-        playersAttri.setLucky(playersAttri.getLucky() + tools.getToolLucky());
-        comPlayersAttriRepository.save(playersAttri);
-        return Result.of(null, true, "使用工具成功");
-    }
-
-}

+ 55 - 0
src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyService.java

@@ -0,0 +1,55 @@
+package com.td.boss.game.complayersattri.service;
+
+import com.td.boss.common.pojo.Result;
+import com.td.boss.common.service.CommonService;
+import com.td.boss.game.complayersattri.pojo.ComPlayersLucky;
+import com.td.boss.game.complayersattri.vo.ComPlayersLuckyLandLevelUpVo;
+import com.td.boss.game.complayersattri.vo.ComPlayersLuckyToolsVo;
+import com.td.boss.game.complayersattri.vo.ComPlayersLuckyVo;
+import java.util.List;
+
+public interface ComPlayersLuckyService extends CommonService<ComPlayersLuckyVo, ComPlayersLucky, Integer> {
+
+    /**
+     * 使用某个工具 获得幸运值
+     *
+     * @param userId
+     * @param id
+     * @param landId
+     * @return
+     */
+    Result useLuckyTools(String userId, Integer id, Integer landId);
+
+    /**
+     * 土地升级
+     *
+     * @param userId
+     * @param levelId
+     * @param landId
+     * @return
+     */
+    Result<?> landLevelUp(String userId, Integer levelId, Integer landId);
+
+    /**
+     * 兑换snb
+     *
+     * @param userId
+     * @param luckNum
+     * @return
+     */
+    Result<?> toSNB(String userId, Integer luckNum);
+
+    /**
+     * 获取所有工具列表,方便用户选择使用哪种工具来获取幸运值
+     *
+     * @return
+     */
+    List<ComPlayersLuckyToolsVo> getLandTools();
+
+    /**
+     * 获取土地升级列表
+     *
+     * @return
+     */
+    List<ComPlayersLuckyLandLevelUpVo> getLandLevelUp();
+}

+ 327 - 0
src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyServiceImpl.java

@@ -0,0 +1,327 @@
+package com.td.boss.game.complayersattri.service;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.common.service.ComConfigService;
+import com.td.boss.common.service.CommonServiceImpl;
+import com.td.boss.config.enums.ResultEnum;
+import com.td.boss.game.complayerland.pojo.ComPlayerLand;
+import com.td.boss.game.complayerland.repository.ComPlayerLandRepository;
+import com.td.boss.game.complayersattri.enums.ComPlayerLuckyLogEnum;
+import com.td.boss.game.complayersattri.pojo.ComPlayersAttri;
+import com.td.boss.game.complayersattri.pojo.ComPlayersLucky;
+import com.td.boss.game.complayersattri.repository.ComPlayersAttriRepository;
+import com.td.boss.game.complayersattri.repository.ComPlayersLuckyRepository;
+import com.td.boss.game.complayersattri.vo.ComPlayersLuckyLandLevelUpVo;
+import com.td.boss.game.complayersattri.vo.ComPlayersLuckyToolsVo;
+import com.td.boss.game.complayersattri.vo.ComPlayersLuckyVo;
+import com.td.boss.game.comsnbtran.service.ComSnbTranService;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
+import com.td.boss.game.comusers.service.ComUsersService;
+import com.td.boss.game.comusers.vo.ComUsersVo;
+import com.td.boss.util.RedisData;
+import com.td.boss.util.RedisLock;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+@Slf4j
+@Service
+@Transactional
+public class ComPlayersLuckyServiceImpl extends CommonServiceImpl<ComPlayersLuckyVo, ComPlayersLucky, Integer> implements ComPlayersLuckyService {
+
+    private String toolskey = "land_tools";
+    private String levelUp = "land_level";
+    @PersistenceContext
+    private EntityManager em;
+
+    @Autowired
+    private ComConfigService comConfigService;
+    @Autowired
+    private ComPlayersLuckyRepository repository;
+    @Autowired
+    private ComPlayersAttriRepository comPlayersAttriRepository;
+    @Autowired
+    private ComPlayerLandRepository comPlayerLandRepository;
+    @Autowired
+    private ComUsersService comUsersService;
+    @Autowired
+    private ComSnbTranService comSnbTranService;
+    @Autowired
+    private RedisLock redisLock;
+
+    /**
+     * 获取所有工具列表,方便用户选择使用哪种工具来获取幸运值
+     *
+     * @return
+     */
+    @Override
+    public List<ComPlayersLuckyToolsVo> getLandTools() {
+        String land_tools = comConfigService.selectByKey(toolskey);
+        return JSONUtil.toList(land_tools, ComPlayersLuckyToolsVo.class);
+    }
+
+    /**
+     * 获取土地升级列表
+     *
+     * @return
+     */
+    @Override
+    public List<ComPlayersLuckyLandLevelUpVo> getLandLevelUp() {
+        String land_tools = comConfigService.selectByKey(levelUp);
+        return JSONUtil.toList(land_tools, ComPlayersLuckyLandLevelUpVo.class);
+    }
+
+    /**
+     * 使用的工具 获得幸运值,12小时获取一次
+     *
+     * @param userId
+     * @param toolId
+     * @return
+     */
+    @Override
+    public Result useLuckyTools(String userId, Integer toolId, Integer landId) {
+        if (toolId == null || toolId.equals(0)) {
+            return Result.of(null, false, "无效工具");
+        }
+        ComPlayersLuckyToolsVo tools = getLandTools().stream().filter(a -> a.getId().equals(toolId)).findFirst().orElse(null);
+        if (tools == null || tools.isEnable() == false) {
+            return Result.of(null, false, "无效工具");
+        }
+
+        long time = System.currentTimeMillis() + RedisData.getPlayerLandToolTimeout();
+        String _redisKey = "LOCK:COM_PLAYER_LAND_TOOL:" + userId;
+        if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+            return Result.of(null, false, ResultEnum.LAND_USE_TOOL.getMessage(), ResultEnum.LAND_USE_TOOL.getCode());
+        }
+
+        ComPlayersAttri playersAttri = comPlayersAttriRepository.findByUserId(userId).orElse(null);
+        if (playersAttri == null) {
+            return Result.of(null, false, "无效用户");
+        }
+        //验证工具是否可用:每隔一段时间才可使用
+        Optional<ComPlayersLucky> lastComPlayersLuckyLog = repository.findFirstByUserIdOrderByCreateTimeDesc(userId);
+        if (lastComPlayersLuckyLog.isPresent()) {
+            DateTime nextTime = DateUtil.offset(lastComPlayersLuckyLog.get().getCreateTime(), DateField.HOUR_OF_DAY, tools.getUseHour());
+            if (nextTime.isAfter(new Date())) {
+                return Result.of(null, false, "请在" + nextTime.toDateStr() + "后使用工具");
+            }
+        }
+        //写入使用工具明细
+        ComPlayersLucky comPlayersLucky = new ComPlayersLucky();
+        comPlayersLucky.setAfterLucky(playersAttri.getLucky() + tools.getToolLucky());
+        comPlayersLucky.setBeforeLucky(playersAttri.getLucky());
+        comPlayersLucky.setAmount(tools.getToolLucky());
+        comPlayersLucky.setLuckyType(ComPlayerLuckyLogEnum.tool.getCode());
+        comPlayersLucky.setToolsId(toolId);
+        comPlayersLucky.setUserId(userId);
+        comPlayersLucky.setLevelId(0);
+        comPlayersLucky.setLandId(landId);
+        comPlayersLucky.setLuckyName(tools.getToolName());
+        comPlayersLucky.setCreateTime(new Date());
+        repository.save(comPlayersLucky);
+
+        //更新幸运值
+        playersAttri.setLucky(playersAttri.getLucky() + tools.getToolLucky());
+        comPlayersAttriRepository.save(playersAttri);
+        return Result.of(null, true, "使用工具成功");
+    }
+
+    /**
+     * 土地升级
+     *
+     * @param userId
+     * @param levelId
+     * @param landId
+     * @return
+     */
+    @Override
+    public Result<?> landLevelUp(String userId, Integer levelId, Integer landId) {
+
+        ComPlayersAttri playersAttri = comPlayersAttriRepository.findByUserId(userId).orElse(null);
+        if (playersAttri == null) {
+            return Result.of(null, false, "无效领取");
+        }
+        Optional<ComPlayersLuckyLandLevelUpVo> levelLand = getLandLevelUp().stream().filter(a -> a.getId().equals(levelId)).findFirst();
+        if (levelLand.isPresent() == false) {
+            return Result.of(null, false, "升级失败,无效升级!");
+        }
+        ComPlayerLand land = comPlayerLandRepository.findByUserIdAndConfigLandId(userId, landId).orElse(null);
+        if (land == null) {
+            return Result.of(null, false, "升级失败,无效土地!");
+        }
+        if (land.getLandLevel() >= levelId) {
+            return Result.of(null, false, "升级失败,无效级别!");
+        }
+        //土地租赁到期了,不能升级
+        if (getEndTime(land.getLeaseTime(), land.getLeaseDate()).before(new Date())) {
+            return Result.of(null, false, "升级失败,土地已到期!");
+        }
+        //剩余幸运值
+        int sub = Convert.toInt(NumberUtil.sub(playersAttri.getLucky(), levelLand.get().getCostLucky()));
+        if (sub < 0) {
+            return Result.of(null, false, "升级失败,幸运值不足!");
+        }
+        long time = System.currentTimeMillis() + RedisData.getPlayerLandLevelupTimeout();
+        String _redisKey = "LOCK:COM_PLAYER_LAND_LEVELUP:" + userId;
+
+        if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+            return Result.of(null, false, ResultEnum.LAND_LAND_LEVELUPPING.getMessage(), ResultEnum.LAND_LAND_LEVELUPPING.getCode());
+        }
+        //写入使用工具明细
+        ComPlayersLucky comPlayersLucky = new ComPlayersLucky();
+        comPlayersLucky.setAfterLucky(sub);
+        comPlayersLucky.setBeforeLucky(playersAttri.getLucky());
+        comPlayersLucky.setAmount(levelLand.get().getCostLucky());
+        comPlayersLucky.setLuckyType(ComPlayerLuckyLogEnum.level.getCode());
+        comPlayersLucky.setLuckyName(levelLand.get().getName());
+        comPlayersLucky.setLevelId(levelId);
+        comPlayersLucky.setLandId(landId);
+        comPlayersLucky.setUserId(userId);
+        comPlayersLucky.setCreateTime(new Date());
+        repository.save(comPlayersLucky);
+
+        //更新用户剩余幸运值
+        playersAttri.setLucky(sub);
+        comPlayersAttriRepository.save(playersAttri);
+
+        //更新土地级别
+        land.setLandLevel(levelId);
+        comPlayerLandRepository.save(land);
+        return Result.of(null, true, "升级成功");
+    }
+
+    /**
+     * 兑换snb
+     *
+     * @param userId
+     * @param luckNum 消耗幸运值数量
+     * @return
+     */
+    @Override
+    public Result<?> toSNB(String userId, Integer luckNum) {
+        //兑换snb倍数
+        int snb = Convert.toInt(comConfigService.selectByKey("land_luck_tosnb"), 0);
+        if (luckNum < 1000) {
+            return Result.of(null, false, "幸运值满1000才能兑换SNB");
+        }
+        if (luckNum > 100000) {
+            return Result.of(null, false, "幸运值最多不能大于100000");
+        }
+        if (luckNum % snb != 0) {
+            return Result.of(null, false, StrUtil.format("幸运值必须为{}的倍数", snb));
+        }
+        ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
+        if (comUsersVo == null || StrUtil.isBlank(comUsersVo.getAddress())) {
+            return Result.of(null, false, "未找到用户或钱包地址");
+        }
+        long time = System.currentTimeMillis() + RedisData.getSnbTimeout();
+        String redisKey = StrUtil.format("SNB_SAVE_{}", userId);
+        // redis锁
+        if (!redisLock.lock(redisKey, String.valueOf(time))) {
+            return Result.of(null, false, ResultEnum.SEED_SALE_SAVE_LOCK.getMessage(), ResultEnum.SEED_SALE_SAVE_LOCK.getCode());
+        }
+        //获得snb用户对象
+        ComUsersVo player = comUsersService.findByUserId(userId);
+        //获得幸运值用户对象
+        ComPlayersAttri playersAttri = comPlayersAttriRepository.findByUserId(userId).orElse(null);
+        if (playersAttri == null || player == null) {
+            return Result.of(null, false, "无效用户");
+        }
+        //剩余幸运值
+        int num = playersAttri.getLucky() - luckNum;
+        if (num < 0) {
+            return Result.of(null, false, "幸运值不足!");
+        }
+        //兑换snb数量
+        int snbNum = luckNum / snb;
+        //插入明细
+        mingxi(userId, luckNum, playersAttri.getLucky(), player.getSnb(), snbNum);
+
+        //更新用户snb
+        player.setSnb(player.getSnb() + snbNum);
+        comUsersService.save(player);
+
+        //更新用户幸运值
+        playersAttri.setLucky(num);
+        comPlayersAttriRepository.save(playersAttri);
+        return Result.of(null, true, StrUtil.format("成功兑换{}个snb,消耗{}个幸运值", snbNum, luckNum));
+    }
+
+    /**
+     * @param userId
+     * @param luckNum    消耗的幸运值
+     * @param beforeLuck 兑换前的幸运值
+     * @param beforeSNB  兑换前的snb数量
+     * @param snbNum     兑换snb的数量
+     */
+    private void mingxi(String userId, int luckNum, int beforeLuck, int beforeSNB, int snbNum) {
+        //记录幸运值明细
+        ComPlayersLucky comPlayersLucky = new ComPlayersLucky();
+        comPlayersLucky.setAfterLucky(beforeLuck - luckNum);
+        comPlayersLucky.setBeforeLucky(beforeLuck);
+        comPlayersLucky.setAmount(luckNum);
+        comPlayersLucky.setLuckyType(ComPlayerLuckyLogEnum.cnb.getCode());
+        comPlayersLucky.setLuckyName(ComPlayerLuckyLogEnum.cnb.getMsg());
+        comPlayersLucky.setLevelId(0);
+        comPlayersLucky.setLandId(0);
+        comPlayersLucky.setToolsId(0);
+        comPlayersLucky.setUserId(userId);
+        comPlayersLucky.setCreateTime(new Date());
+        comPlayersLucky = repository.save(comPlayersLucky);
+
+
+        //记录snb明细
+        ComSnbTranVo snbTran = new ComSnbTranVo();
+        //记录兑换id
+        snbTran.setTranId(Convert.toStr(comPlayersLucky.getId()));
+        snbTran.setUserId(userId);
+        snbTran.setTranName("兑换SNB");
+        snbTran.setTranType(9);
+        snbTran.setTranAmount(snbNum);
+        snbTran.setTranDescribe(StrUtil.format("user幸运值兑换SNB、本次兑换:{},消耗:{}幸运值", snbNum, luckNum));
+        snbTran.setIsAdd(1);
+        snbTran.setBeforeSnb(beforeSNB);
+        snbTran.setTranSnb(snbNum);
+        snbTran.setAfterSnb(beforeSNB + snbNum);
+        snbTran.setCreateTime(new Date());
+        snbTran.setTranSnbPart(0d);
+        snbTran.setAfterSnbPart(0d);
+        snbTran.setBeforeSnbPart(0d);
+        snbTran.setTranAmountPart(0d);
+        snbTran.setTranPrice(0);
+        comSnbTranService.save(snbTran);
+    }
+
+    /**
+     * 获取土地到期时间
+     *
+     * @param beginTime 租赁时间
+     * @param type      //租赁的日期,1是3个月,2是1年,3是5年
+     * @return
+     */
+    private Date getEndTime(Date beginTime, int type) {
+        if (type == 1) {
+            return DateUtil.date(beginTime).offset(DateField.MONTH, 3);
+        } else if (type == 2) {
+            return DateUtil.date(beginTime).offset(DateField.YEAR, 1);
+        } else if (type == 3) {
+            return DateUtil.date(beginTime).offset(DateField.YEAR, 5);
+        } else {
+            return beginTime;
+        }
+    }
+}

+ 0 - 10
src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyToolsService.java

@@ -1,10 +0,0 @@
-package com.td.boss.game.complayersattri.service;
-
-import com.td.boss.common.service.CommonService;
-import com.td.boss.game.complayersattri.pojo.ComPlayersLuckyLog;
-import com.td.boss.game.complayersattri.pojo.ComPlayersLuckyTools;
-import com.td.boss.game.complayersattri.vo.ComPlayersLuckyLogVo;
-import com.td.boss.game.complayersattri.vo.ComPlayersLuckyToolsVo;
-
-public interface ComPlayersLuckyToolsService extends CommonService<ComPlayersLuckyToolsVo, ComPlayersLuckyTools, Integer> {
-}

+ 0 - 9
src/main/java/com/td/boss/game/complayersattri/service/ComPlayersLuckyToolsServiceImpl.java

@@ -1,9 +0,0 @@
-package com.td.boss.game.complayersattri.service;
-
-import com.td.boss.common.service.CommonServiceImpl;
-import com.td.boss.game.complayersattri.pojo.ComPlayersLuckyTools;
-import com.td.boss.game.complayersattri.vo.ComPlayersLuckyToolsVo;
-
-public class ComPlayersLuckyToolsServiceImpl extends CommonServiceImpl<ComPlayersLuckyToolsVo, ComPlayersLuckyTools
-        , Integer> implements ComPlayersLuckyToolsService {
-}

+ 24 - 0
src/main/java/com/td/boss/game/complayersattri/vo/ComPlayersLuckyLandLevelUpVo.java

@@ -0,0 +1,24 @@
+package com.td.boss.game.complayersattri.vo;
+
+import lombok.Data;
+
+@Data
+public class ComPlayersLuckyLandLevelUpVo {
+    /**
+     * id
+     */
+    private Integer id;
+    /**
+     * 级别名称
+     */
+    private String name;
+    /**
+     * 收益产出百分比
+     */
+    private Integer product;
+
+    /**
+     * 消耗多少幸运值
+     */
+    private Integer costLucky;
+}

+ 3 - 5
src/main/java/com/td/boss/game/complayersattri/vo/ComPlayersLuckyToolsVo.java

@@ -2,14 +2,11 @@ package com.td.boss.game.complayersattri.vo;
 
 import lombok.Data;
 
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
 import java.util.Date;
 
 @Data
 public class ComPlayersLuckyToolsVo {
-
-    private int id;
+    private Integer id;
     /**
      * 工具名称
      */
@@ -17,7 +14,7 @@ public class ComPlayersLuckyToolsVo {
     /**
      * 工具使用间隔
      */
-    private int toolTime;
+    private int useHour;
     /**
      * 幸运值
      */
@@ -26,4 +23,5 @@ public class ComPlayersLuckyToolsVo {
      * 创建时间
      */
     private Date createTime;
+    private boolean isEnable;
 }

+ 13 - 2
src/main/java/com/td/boss/game/complayersattri/vo/ComPlayersLuckyLogVo.java → src/main/java/com/td/boss/game/complayersattri/vo/ComPlayersLuckyVo.java

@@ -5,7 +5,7 @@ import java.io.Serializable;
 import java.util.Date;
 
 @Data
-public class ComPlayersLuckyLogVo implements Serializable {
+public class ComPlayersLuckyVo implements Serializable {
     private int id ;
     /** 用户id */
     private String userId ;
@@ -19,5 +19,16 @@ public class ComPlayersLuckyLogVo implements Serializable {
     private int afterLucky ;
     /** 创建时间 */
     private Date createTime ;
-    private Integer toolsId ;
+    /**
+     * 工具id
+     */
+    private Integer toolsId;
+    /**
+     * 土地id
+     */
+    private Integer landId;
+    /**
+     *操作名称
+     */
+    private String luckyName;
 }

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

@@ -46,4 +46,20 @@ public class RedisData {
     public static int getDisastersDayTimeout() {
         return PLAYER_DISASTERS_DAY_TIMEOUT;
     }
+
+    /**
+     * 5s 工具模块锁
+     */
+    private static final int PLAYER_LAND_TOOL_TIMEOUT = 5 * 1000; //超时时间 10s
+    public static int getPlayerLandToolTimeout() {
+        return PLAYER_LAND_TOOL_TIMEOUT;
+    }
+
+    /**
+     * 5s 工具模块锁
+     */
+    private static final int PLAYER_LAND_LEVELUP_TIMEOUT = 5 * 1000; //超时时间 10s
+    public static int getPlayerLandLevelupTimeout() {
+        return PLAYER_LAND_LEVELUP_TIMEOUT;
+    }
 }

+ 51 - 0
src/test/java/com/td/boss/ComPlayerLuckyTests.java

@@ -0,0 +1,51 @@
+package com.td.boss;
+
+import cn.hutool.json.JSONUtil;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.game.complayersattri.controller.ComPlayersLuckyController;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class ComPlayerLuckyTests {
+    private String userId = "1002";
+    private int landId = 1;
+    private int levelId = 2;
+
+    @Autowired
+    ComPlayersLuckyController comPlayersLuckyController;
+
+    @Test
+    public void getLandTools() {
+        Result<?> landTools = comPlayersLuckyController.getLandTools();
+        System.out.println(JSONUtil.toJsonStr(landTools));
+    }
+
+    @Test
+    public void getLandLevelUp() {
+        Result<?> landLevelUp = comPlayersLuckyController.getLandLevelUp();
+        System.out.println(JSONUtil.toJsonStr(landLevelUp));
+    }
+
+    @Test
+    public void useLuckyTools() {
+        Result<?> landLevelUp = comPlayersLuckyController.useLuckyTools(userId, 1, landId);
+        System.out.println(JSONUtil.toJsonStr(landLevelUp));
+    }
+
+    @Test
+    public void landLevelUp() {
+        Result<?> landLevelUp = comPlayersLuckyController.landLevelUp(userId, levelId, landId);
+        System.out.println(JSONUtil.toJsonStr(landLevelUp));
+    }
+
+    @Test
+    public void toSNB() {
+        Result<?> result = comPlayersLuckyController.toSNB(userId, 50 * 20);
+        System.out.println(JSONUtil.toJsonStr(result));
+    }
+}