Преглед на файлове

Merge branch 'master' of 450099795/FragrantTown_Server_Local into master

slambb преди 3 години
родител
ревизия
c92c7e1637
променени са 16 файла, в които са добавени 357 реда и са изтрити 29 реда
  1. 22 0
      src/main/java/com/td/boss/common/pojo/CultivateKeys.java
  2. 1 0
      src/main/java/com/td/boss/config/enums/ResultEnum.java
  3. 12 1
      src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java
  4. 13 1
      src/main/java/com/td/boss/game/complayercultivate/controller/ComPlayerCultivateController.java
  5. 41 6
      src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java
  6. 30 10
      src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java
  7. 5 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandAndPlantVo.java
  8. 3 10
      src/main/java/com/td/boss/game/complayerlog/service/ComPlayerLogServiceImpl.java
  9. 37 0
      src/main/java/com/td/boss/game/complayerscore/controller/ComPlayerScoreController.java
  10. 26 0
      src/main/java/com/td/boss/game/complayerscore/pojo/ComPlayerScore.java
  11. 12 0
      src/main/java/com/td/boss/game/complayerscore/repository/ComPlayerScoreRepository.java
  12. 20 0
      src/main/java/com/td/boss/game/complayerscore/service/ComPlayerScoreService.java
  13. 104 0
      src/main/java/com/td/boss/game/complayerscore/service/ComPlayerScoreServiceImpl.java
  14. 21 0
      src/main/java/com/td/boss/game/complayerscore/vo/ComPlayerScoreVo.java
  15. 1 1
      src/test/java/com/td/boss/ComPlayerCultivateTests.java
  16. 9 0
      src/test/java/com/td/boss/ComPlayerLogTests.java

+ 22 - 0
src/main/java/com/td/boss/common/pojo/CultivateKeys.java

@@ -0,0 +1,22 @@
+package com.td.boss.common.pojo;
+
+/**
+ * 牧场养殖渔场需求
+ */
+public class CultivateKeys {
+
+    /**
+     * 1、牧场 2、养殖 3、渔场淡水区 4、渔场海水区
+     */
+    public static final Integer[] mallType = new Integer[]{1, 2, 3, 4};
+    /**
+     * 土堆分别最大种植数量
+     */
+    public static final int[] amountLimit = new int[]{50, 100, 200, 200};
+
+    /**
+     * 超过这个值就枯萎
+     */
+    public static final int witheredDay=10;
+    public static final long dayLong= 1000*60*60*24;
+}

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

@@ -108,6 +108,7 @@ public enum ResultEnum {
     LAND_NO_PLANT_ERROR(816,"土地未养殖,喂养失败!"),
     FOOD_NO_ERROR(817,"未找到养料!"),
     FOOD_REPEAT_ERROR(818,"今日已喂养!"),
+    SEED_LAND_WITHERED(819,"果实已枯萎!"),
     //装备相关
     MALL_OTHER_IS_NULL(810,"商城装备不存在!"),
     MALL_OTHER_IS_HAVE(811,"商城装备已经存在!"),

+ 12 - 1
src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java

@@ -178,6 +178,12 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
             comSnbTranService.save(_snbTran);
 
             redisLock.unlock(_redisKey, String.valueOf(time));
+            try {
+                // 计算断电损耗
+                comPlayerLogService.powerLoss(userId);
+            } catch (Exception e) {
+                System.err.println("断电损耗异常:" + e.getMessage());
+            }
             map.put("seed", entityVo.getGoodsIndex());
             map.put("snb", comUsersVo.getSnb());
             return Result.of(map);
@@ -270,7 +276,12 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
         _selfPlayerLog.setLMultiple(0);//收获时候,会有一个倍数
         ComPlayerLogVo _selfPlayerLogVo = CopyUtil.copy(_selfPlayerLog, ComPlayerLogVo.class);
         comPlayerLogService.save(_selfPlayerLogVo);
-
+        try {
+            // 计算断电损耗
+            comPlayerLogService.powerLoss(userId);
+        } catch (Exception e) {
+            System.err.println("断电损耗异常:" + e.getMessage());
+        }
         map.put("seed", entityVo.getGoodsIndex());
         map.put("playerData",player.getData());
         map.put("isExchange",player.getIsExchange());

+ 13 - 1
src/main/java/com/td/boss/game/complayercultivate/controller/ComPlayerCultivateController.java

@@ -40,6 +40,7 @@ public class ComPlayerCultivateController {
 
     /**
      * 解锁某个土地 【牧场养殖渔场】
+     *
      * @param userId
      * @param configLandId
      * @return
@@ -47,7 +48,18 @@ public class ComPlayerCultivateController {
     @PostMapping("payLand")
     @Transactional(rollbackFor = Exception.class)
     public Result<?> payLand(@RequestParam(value = "userId") String userId,
-                                                   @RequestParam(value = "configLandId") Integer configLandId) {
+                             @RequestParam(value = "configLandId") Integer configLandId) {
         return comPlayerCultivateSerivce.payLand(userId, configLandId);
     }
+
+    /**
+     * 获取租赁机会
+     * @param userId
+     * @return
+     */
+    @GetMapping("getTimes")
+    @Transactional(rollbackFor = Exception.class)
+    public Result<?> getTimes(@RequestParam(value = "userId") String userId) {
+        return Result.of(comPlayerCultivateSerivce.getTimes(userId));
+    }
 }

+ 41 - 6
src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java

@@ -1,7 +1,9 @@
 package com.td.boss.game.complayergoods.controller;
 
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ArrayUtil;
 import com.td.boss.common.controller.*;
+import com.td.boss.common.pojo.CultivateKeys;
 import com.td.boss.common.pojo.Result;
 import com.td.boss.common.service.ComConfigService;
 import com.td.boss.config.enums.ResultEnum;
@@ -236,7 +238,7 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
         }
 
         //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
-        if (comPlayerLand.getMallType() > 0) {
+        if (ArrayUtil.contains(CultivateKeys.mallType,comPlayerLand.getMallType())) {
             Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, comPlayerLand.getConfigLandId());
             comMallSeedVo.setMaturity(days);
         }
@@ -246,10 +248,15 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
         // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
         long diff = comPlayerLand.getPlantStart().getTime() - _harvestTime.getTime();
         //if (DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity()).getTime() < comPlayerLand.getPlantStart().getTime())
+        boolean isWithered=false;
         if (diff > 0) {
             //如果当前时间减去种子的成熟期,还是小于种植日期,则判断未成熟
             return Result.of(null, false, ResultEnum.SEED_DATE_ERROR.getMessage(), ResultEnum.SEED_DATE_ERROR.getCode());
         }
+        else {
+            //判断是否枯萎
+            isWithered= diff*-1/CultivateKeys.dayLong>CultivateKeys.witheredDay;
+        }
         //获取数据库相关配置
         ComSettingVo comSettingVo = comSettingService.get("1").getData();
         if (comSettingVo.equals(null)) {
@@ -340,6 +347,12 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             _amount -= _profit;
             //用户收取的对应数量,固定收入+被偷取后剩余的部分 (改成全部影响利润了。没有固定收入)
             _amountPart = _userHarvestPart;// DoubleUtil.add(_residualProfit, _userHarvestPart);
+
+            //todo [枯萎] 没枯萎才有利润
+            if(isWithered) {
+                _amount=0;
+                _amountPart=0d;
+            }
             //果实 Type =1
             ComPlayerGoods comPlayerGoodsSimpleVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, comMallSeedVo.getHarvestId(), 1);
             Integer _beforeAmount = 0;
@@ -370,9 +383,10 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
 
                 _afterProfitPart = comPlayerGoodsSimpleVo.getAmountPart();
             }
-
-            ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
-            comPlayerGoodsService.save(comPlayerGoodsVo);
+            if(isWithered==false) {
+                ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
+                comPlayerGoodsService.save(comPlayerGoodsVo);
+            }
 
             //todo 记录一个收获的操作日志
             ComPlayerLog _playerLog = new ComPlayerLog();
@@ -395,6 +409,13 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
 
             //对应的,存在plantFlag则解锁
             redisLock.unlock(_redisKey, String.valueOf(landTime));
+            try {
+                // 计算断电损耗
+                comPlayerLogService.powerLoss(userId);
+            } catch (Exception e) {
+                System.err.println("断电损耗异常:" + e.getMessage());
+            }
+            map.put("msg",isWithered?"果实已枯萎": "成功收取果实!");
             //redisLock.unlock(_disasterKey, String.valueOf(_disasterTime));
         } catch (Exception e) {
             //对应的,存在plantFlag则解锁
@@ -402,7 +423,6 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             //redisLock.unlock(_disasterKey, String.valueOf(_disasterTime));
             throw new RuntimeException(e.getMessage());
         }
-        map.put("msg", "成功收取果实!");
         return Result.of(map);
     }
 
@@ -548,6 +568,10 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             //如果当前时间减去种子的成熟期,还是小于种植日期,则判断未成熟
             return Result.of(null, false, ResultEnum.SEED_DATE_ERROR.getMessage(), ResultEnum.SEED_DATE_ERROR.getCode());
         }
+        //todo [枯萎] 超过一定时间不收取 就枯萎
+        else if(diff <0&&diff*-1/CultivateKeys.dayLong>CultivateKeys.witheredDay) {
+            return Result.of(null, false, ResultEnum.SEED_LAND_WITHERED.getMessage(), ResultEnum.SEED_LAND_WITHERED.getCode());
+        }
 
         //snb 的key
         String _redisSNBKey = "SNB_SAVE_" + userId;
@@ -717,7 +741,12 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             }
             ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoods, ComPlayerGoodsVo.class);
             comPlayerGoodsService.save(comPlayerGoodsVo);
-
+            try {
+                // 计算断电损耗
+                comPlayerLogService.powerLoss(userId);
+            } catch (Exception e) {
+                System.err.println("断电损耗异常:" + e.getMessage());
+            }
             //todo 偷窃损失,处理目标用户收取果实时候,减扣一部分被偷取的数量
             ComPlayerProfit comPlayerProfit = new ComPlayerProfit();
             comPlayerProfit.setUserId(userId);
@@ -1157,6 +1186,12 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
         if (amount <= 0) {
             return Result.of(null, false, ResultEnum.FRUIT_AMOUNT_ERROR.getMessage(), ResultEnum.FRUIT_AMOUNT_ERROR.getCode());
         }
+        try {
+            // 计算断电损耗
+            comPlayerLogService.powerLoss(userId);
+        } catch (Exception e) {
+            System.err.println("断电损耗异常:" + e.getMessage());
+        }
         //
         ComFruitVo comFruitVo = comFruitService.findById(fruitId);
 

+ 30 - 10
src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java

@@ -2,9 +2,11 @@ package com.td.boss.game.complayerland.controller;
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateField;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.json.JSONUtil;
 import com.td.boss.common.controller.*;
+import com.td.boss.common.pojo.CultivateKeys;
 import com.td.boss.common.pojo.Result;
 import com.td.boss.config.enums.ResultEnum;
 import com.td.boss.game.comexplainland.service.ComExplainLandService;
@@ -139,7 +141,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                     Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
 
                     //todo [牧场养殖渔场需求] 如果是养殖类的,成熟期需要单独计算
-                    if (e.getMallType() > 0) {
+                    if (ArrayUtil.contains(CultivateKeys.mallType,e.getMallType())) {
                         _harvestTime = comPlayerCultivateSerivce.getHarvestTime(userId, e.getConfigLandId());
                     }
 
@@ -152,8 +154,13 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
                         comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
 
+                        //todo [枯萎]
+                        if(diff*-1/CultivateKeys.dayLong>CultivateKeys.witheredDay){
+                            comPlayerLandAndPlantVo.setWithered(true);
+                        }
+
                         //todo [牧场养殖渔场需求]如果不是养殖,是传统种植才会有灾害
-                        if (e.getMallType() == 0) {
+                        if (ArrayUtil.contains(CultivateKeys.mallType,e.getMallType())==false) {
                             //生成第一次受灾 获取用户土地 getList
                             _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
                         }
@@ -221,7 +228,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                     //获取当前时间 - 植物的成熟期 = 收获时间,收获时间 >= 种植时间,即可以收获
                     Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
                     //todo [牧场养殖渔场需求] 如果是养殖类的,成熟期需要单独计算
-                    if (e.getMallType() > 0) {
+                    if (ArrayUtil.contains(CultivateKeys.mallType,e.getMallType())) {
                         _harvestTime = comPlayerCultivateSerivce.getHarvestTime(userId, e.getConfigLandId());
                     }
 
@@ -233,8 +240,12 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                         //说明可以收获了
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
                         comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
+                        //todo [枯萎]
+                        if(diff*-1/CultivateKeys.dayLong>CultivateKeys.witheredDay) {
+                            comPlayerLandAndPlantVo.setWithered(true);
+                        }
                         //todo [牧场养殖渔场需求]如果不是养殖,是传统种植才会有灾害
-                        if (e.getMallType() == 0) {
+                        if (ArrayUtil.contains(CultivateKeys.mallType,e.getMallType())==false) {
                             //生成第一次受灾 获取用户土地 getList
                             _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
                         }
@@ -373,14 +384,13 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                 return Result.of(null, false, ResultEnum.LAND_NOT_LEASE.getMessage(), ResultEnum.LAND_NOT_LEASE.getCode());
             }
             //todo [牧场养殖渔场需求] 特有业务
-            if (comPlayerLand.getMallType() > 0) {
+            if (ArrayUtil.contains(CultivateKeys.mallType,comPlayerLand.getMallType())) {
                 //如果剩余时间不足。不允许放养
                 if (comPlayerLand.getLeaseTime().getTime() - (cn.hutool.core.date.DateUtil.date(DateUtil.getNowDate()).offset(DateField.DAY_OF_YEAR, comMallSeedVo.getMaturity())).getTime() < 0) {
                     return Result.of(null, false, "剩余租赁时间不足!");
                 }
                 //验证该土地最大种植数量
-                int[] amountlimit = new int[]{50, 100, 200, 200};
-                if (amount > amountlimit[comPlayerLand.getMallType() - 1]) {
+                if (amount > CultivateKeys.amountLimit[comPlayerLand.getMallType() - 1]) {
                     return Result.of(null, false, "超出最大养殖数量!");
                 }
                 //lease_multiple租赁倍数 填入实际养殖数量
@@ -446,6 +456,13 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
             _playerLogVo.setAfterPart(0d);
             comPlayerLogService.save(_playerLogVo);
 
+            try {
+                // 计算断电损耗
+                comPlayerLogService.powerLoss(userId);
+            } catch (Exception e) {
+                System.err.println("断电损耗异常:" + e.getMessage());
+            }
+
             ComPlayerLandAndPlantVo comPlayerLandAndPlantVo = CopyUtil.copy(comPlayerLand, ComPlayerLandAndPlantVo.class);
             comPlayerLandAndPlantVo.setSeedInfo(comMallSeedVo);
 
@@ -463,7 +480,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
             comPlayerLandAndPlantVo.setLeaseDaysMill(leaseDaysMill);
 
             //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
-            if (comPlayerLand.getMallType() > 0) {
+            if (ArrayUtil.contains(CultivateKeys.mallType,comPlayerLand.getMallType())) {
                 Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, comPlayerLand.getConfigLandId());
                 comMallSeedVo.setMaturity(days);
             }
@@ -481,12 +498,15 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                 //说明可以收获了
                 comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
                 comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
+                //todo [枯萎]
+                if(diff*-1/CultivateKeys.dayLong>CultivateKeys.witheredDay) {
+                    comPlayerLandAndPlantVo.setWithered(true);
+                }
                 //todo [牧场养殖渔场需求]如果不是养殖,是传统种植才会有灾害
-                if (comPlayerLand.getMallType() > 0) {
+                if (ArrayUtil.contains(CultivateKeys.mallType,comPlayerLand.getMallType())==false) {
                     //生成第一次受灾 plant
                     _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
                 }
-
             } else {
                 comPlayerLandAndPlantVo.setPlantDaysRemaining(DateUtil.getDays(diff).intValue());
                 comPlayerLandAndPlantVo.setPlantHoursRemaining(DateUtil.getHours(diff).intValue());

+ 5 - 0
src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandAndPlantVo.java

@@ -67,4 +67,9 @@ public class ComPlayerLandAndPlantVo implements Serializable {
      * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
      */
     private Integer mallType;
+
+    /**
+     * 新加是否枯萎
+     */
+    private boolean isWithered=false;
 }

+ 3 - 10
src/main/java/com/td/boss/game/complayerlog/service/ComPlayerLogServiceImpl.java

@@ -1,34 +1,27 @@
 package com.td.boss.game.complayerlog.service;
 
-import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.date.format.AbstractDateBasic;
-import cn.hutool.core.math.MathUtil;
 import cn.hutool.core.util.NumberUtil;
-import com.td.boss.common.service.*;
+import com.td.boss.common.service.CommonServiceImpl;
 import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
 import com.td.boss.game.complayergoods.repository.ComPlayerGoodsRepository;
 import com.td.boss.game.complayerlog.pojo.ComPlayerLog;
-import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
 import com.td.boss.game.complayerlog.repository.ComPlayerLogRepository;
-import com.td.boss.util.CopyUtil;
+import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
 import com.td.boss.util.DoubleUtil;
 import com.td.boss.util.UUIDUtil;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.jdbc.metadata.OracleUcpDataSourcePoolMetadata;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
 @Service
-@Transactional
 public class ComPlayerLogServiceImpl extends CommonServiceImpl<ComPlayerLogVo, ComPlayerLog, Integer> implements ComPlayerLogService {
 
     @PersistenceContext
@@ -108,7 +101,7 @@ public class ComPlayerLogServiceImpl extends CommonServiceImpl<ComPlayerLogVo, C
             playerLog.setTPart(0d);
             playerLog.setTAmount(0);
             // 1=果实
-            playerLog.setTType(1);
+            playerLog.setTType(0);
             playerLog.setBeforeAmount(goodsBeforeAmount);
             playerLog.setBeforePart(goodsBeforePart);
             // 交易后的数据

+ 37 - 0
src/main/java/com/td/boss/game/complayerscore/controller/ComPlayerScoreController.java

@@ -0,0 +1,37 @@
+package com.td.boss.game.complayerscore.controller;
+
+import com.td.boss.common.controller.*;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.game.complayerscore.pojo.ComPlayerScore;
+import com.td.boss.game.complayerscore.vo.ComPlayerScoreVo;
+import com.td.boss.game.complayerscore.service.ComPlayerScoreService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/game/comPlayerScore/")
+public class ComPlayerScoreController extends CommonController<ComPlayerScoreVo, ComPlayerScore, Integer> {
+    @Autowired
+    private ComPlayerScoreService comPlayerScoreService;
+
+    /**
+     * 积分兑换种子
+     *
+     * @param userId 用户ID
+     * @param amount 本次兑换数量
+     * @param seedId 种子id
+     * @return {@link Result}<{@link String}>
+     */
+    @PostMapping("exchange")
+    @ResponseBody
+    public Result<String> exchange(
+            @RequestParam(value = "userId") String userId,
+            @RequestParam(value = "amount") Integer amount,
+            @RequestParam(value = "seedId") Integer seedId
+    ) {
+        return comPlayerScoreService.exchange(userId, amount, seedId);
+    }
+}

+ 26 - 0
src/main/java/com/td/boss/game/complayerscore/pojo/ComPlayerScore.java

@@ -0,0 +1,26 @@
+package com.td.boss.game.complayerscore.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_player_score")
+@Data
+public class ComPlayerScore implements Serializable {
+    @Id
+    @GeneratedValue(strategy= GenerationType.IDENTITY)
+    private Integer id;//编号
+
+    private String userId;//用户id
+
+    private Integer totalCnt;//花费CNT总数
+
+    private Integer amount;//兑换数量
+
+    private Integer priceCnt;//单价
+
+    private Date createTime;//兑换时间
+
+}

+ 12 - 0
src/main/java/com/td/boss/game/complayerscore/repository/ComPlayerScoreRepository.java

@@ -0,0 +1,12 @@
+package com.td.boss.game.complayerscore.repository;
+
+import com.td.boss.common.repository.CommonRepository;
+import com.td.boss.game.complayerscore.pojo.ComPlayerScore;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ComPlayerScoreRepository extends CommonRepository<ComPlayerScore, Integer> {
+    List<ComPlayerScore> findAllByUserId(String userId);
+}

+ 20 - 0
src/main/java/com/td/boss/game/complayerscore/service/ComPlayerScoreService.java

@@ -0,0 +1,20 @@
+package com.td.boss.game.complayerscore.service;
+
+import com.td.boss.common.pojo.Result;
+import com.td.boss.common.service.*;
+import com.td.boss.game.complayerscore.pojo.ComPlayerScore;
+import com.td.boss.game.complayerscore.vo.ComPlayerScoreVo;
+
+public interface ComPlayerScoreService extends CommonService<ComPlayerScoreVo, ComPlayerScore, Integer> {
+
+    /**
+     * 积分兑换种子
+     *
+     * @param userId 用户ID
+     * @param amount 本次兑换数量
+     * @param seedId 种子id
+     * @return {@link Result}<{@link String}>
+     */
+    Result<String> exchange(String userId, Integer amount, Integer seedId);
+
+}

+ 104 - 0
src/main/java/com/td/boss/game/complayerscore/service/ComPlayerScoreServiceImpl.java

@@ -0,0 +1,104 @@
+package com.td.boss.game.complayerscore.service;
+
+import com.td.boss.common.pojo.Result;
+import com.td.boss.common.service.CommonServiceImpl;
+import com.td.boss.game.commallseed.service.ComMallSeedService;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import com.td.boss.game.complayergoods.service.ComPlayerGoodsService;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+import com.td.boss.game.complayerscore.pojo.ComPlayerScore;
+import com.td.boss.game.complayerscore.repository.ComPlayerScoreRepository;
+import com.td.boss.game.complayerscore.vo.ComPlayerScoreVo;
+import com.td.boss.game.comusers.service.ComUsersService;
+import com.td.boss.game.comusers.vo.ComUsersVo;
+import com.td.boss.util.DappUtil;
+import com.td.boss.util.UUIDUtil;
+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;
+
+@Service
+public class ComPlayerScoreServiceImpl extends CommonServiceImpl<ComPlayerScoreVo, ComPlayerScore, Integer> implements ComPlayerScoreService {
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComPlayerScoreRepository comPlayerScoreRepository;
+    @Autowired
+    private ComUsersService comUsersService;
+    @Autowired
+    private ComMallSeedService comMallSeedService;
+    @Autowired
+    private ComPlayerGoodsService comPlayerGoodsService;
+
+    /**
+     * 积分兑换种子
+     *
+     * @param userId 用户ID
+     * @param amount 本次兑换数量
+     * @param seedId 种子id
+     * @return {@link Result}<{@link String}>
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result<String> exchange(String userId,
+                                   Integer amount,
+                                   Integer seedId) {
+        ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
+        if (comUsersVo == null) {
+            return Result.of(null, false, "用户不存在");
+        }
+        // 链端获取cnt总数
+        Integer totalCount = DappUtil.getChildrenBuyLandAmount(userId);
+        if (totalCount <= 0) {
+            return Result.of(null, false, "消费土地的总cnt不足");
+        }
+        ComMallSeedVo mallSeed = comMallSeedService.findById(seedId);
+        // 5 = 固定积分兑换种子
+        if (mallSeed == null || mallSeed.getAmount().equals(0) || !"5".equals(mallSeed.getMallType())) {
+            return Result.of(null, false, "种子不存在或已被下架");
+        }
+        // 本次总消费
+        int totalCnt = mallSeed.getPriceCnt() * amount;
+        if (totalCnt <= 0) {
+            return Result.of(null, false, "种子数据异常");
+        }
+        if (totalCount < totalCnt) {
+            return Result.of(null, false, "消费土地的总cnt不足");
+        }
+        // 以往兑换消费总cnt
+        Integer oldTotalCnt = comPlayerScoreRepository.findAllByUserId(userId).stream()
+                .map(ComPlayerScore::getTotalCnt).reduce(0, Integer::sum);
+        if (totalCount < oldTotalCnt + totalCnt) {
+            return Result.of(null, false, "消费土地的总cnt不足");
+        }
+
+        // 记录本次兑换信息
+        ComPlayerScore comPlayerScore = new ComPlayerScore();
+        comPlayerScore.setUserId(userId);
+        comPlayerScore.setTotalCnt(totalCnt);
+        comPlayerScore.setAmount(amount);
+        comPlayerScore.setPriceCnt(mallSeed.getPriceCnt());
+        comPlayerScore.setCreateTime(new Date());
+        comPlayerScoreRepository.save(comPlayerScore);
+        // 保存进仓库
+        ComPlayerGoodsVo comPlayerGoods = new ComPlayerGoodsVo();
+        comPlayerGoods.setGoodsId(UUIDUtil.getUUID());
+        comPlayerGoods.setGoodsIndex(seedId);
+        comPlayerGoods.setGoodsType(0);
+        comPlayerGoods.setUserId(userId);
+        comPlayerGoods.setName(mallSeed.getName());
+        comPlayerGoods.setPictureName(mallSeed.getPicture());
+        comPlayerGoods.setAmount(amount);
+        comPlayerGoods.setAmountPart(0d);
+        comPlayerGoods.setCreateTime(new Date());
+        comPlayerGoods.setMallType(0);
+        comPlayerGoodsService.save(comPlayerGoods);
+
+        return Result.of(null, true, "兑换成功");
+    }
+}

+ 21 - 0
src/main/java/com/td/boss/game/complayerscore/vo/ComPlayerScoreVo.java

@@ -0,0 +1,21 @@
+package com.td.boss.game.complayerscore.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComPlayerScoreVo extends PageCondition implements Serializable {
+    private Integer id;//编号
+
+    private String userId;//用户id
+
+    private Double spendCnt;//花费CNT总数
+
+    private Integer amount;//兑换数量
+
+    private Integer priceCnt;//单价
+
+    private Date createTime;//兑换时间
+
+}

+ 1 - 1
src/test/java/com/td/boss/ComPlayerCultivateTests.java

@@ -79,7 +79,7 @@ public class ComPlayerCultivateTests {
     //获取某个人所有土地 【修改完毕】【测试完】,需要查询喂养记录,重新计算成熟日期
     @Test
     public void getLandByUserId() {
-        Result<List<ComPlayerLandAndPlantVo>> landFunction = comPlayerLandController.getLandFunction(userId, null);
+        Result<List<ComPlayerLandAndPlantVo>> landFunction = comPlayerLandController.getLandFunction("1002", "1002");
         print(landFunction);
     }
 

+ 9 - 0
src/test/java/com/td/boss/ComPlayerLogTests.java

@@ -1,6 +1,7 @@
 package com.td.boss;
 
 import com.td.boss.game.complayerlog.service.ComPlayerLogServiceImpl;
+import com.td.boss.game.complayerscore.service.ComPlayerScoreService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,8 +15,16 @@ public class ComPlayerLogTests {
     @Autowired
     private ComPlayerLogServiceImpl comPlayerLogService;
 
+    @Autowired
+    private ComPlayerScoreService comPlayerScoreService;
+
     @Test
     public void powerLoss() {
         comPlayerLogService.powerLoss("1123");
     }
+
+    @Test
+    public void exchange() {
+        comPlayerScoreService.exchange("1123", 2, 24);
+    }
 }