slambb пре 4 година
родитељ
комит
29cddcae8b
28 измењених фајлова са 1051 додато и 156 уклоњено
  1. 4 0
      src/main/java/com/td/boss/config/enums/ResultEnum.java
  2. 15 0
      src/main/java/com/td/boss/game/comexplainland/controller/ComExplainLandController.java
  3. 47 0
      src/main/java/com/td/boss/game/comexplainland/pojo/ComExplainLand.java
  4. 9 0
      src/main/java/com/td/boss/game/comexplainland/repository/ComExplainLandRepository.java
  5. 8 0
      src/main/java/com/td/boss/game/comexplainland/service/ComExplainLandService.java
  6. 21 0
      src/main/java/com/td/boss/game/comexplainland/service/ComExplainLandServiceImpl.java
  7. 43 0
      src/main/java/com/td/boss/game/comexplainland/vo/ComExplainLandVo.java
  8. 58 8
      src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java
  9. 237 89
      src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java
  10. 200 57
      src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java
  11. 8 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandAndPlantVo.java
  12. 8 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandSimpleVo.java
  13. 15 0
      src/main/java/com/td/boss/game/complayerlog/controller/ComPlayerLogController.java
  14. 36 0
      src/main/java/com/td/boss/game/complayerlog/pojo/ComPlayerLog.java
  15. 9 0
      src/main/java/com/td/boss/game/complayerlog/repository/ComPlayerLogRepository.java
  16. 8 0
      src/main/java/com/td/boss/game/complayerlog/service/ComPlayerLogService.java
  17. 21 0
      src/main/java/com/td/boss/game/complayerlog/service/ComPlayerLogServiceImpl.java
  18. 33 0
      src/main/java/com/td/boss/game/complayerlog/vo/ComPlayerLogVo.java
  19. 47 0
      src/main/java/com/td/boss/game/comsnbfreeze/controller/ComSnbFreezeController.java
  20. 51 0
      src/main/java/com/td/boss/game/comsnbtran/controller/ComSnbTranController.java
  21. 43 0
      src/main/java/com/td/boss/game/comsnbtran/pojo/ComSnbTran.java
  22. 14 0
      src/main/java/com/td/boss/game/comsnbtran/repository/ComSnbTranRepository.java
  23. 12 0
      src/main/java/com/td/boss/game/comsnbtran/service/ComSnbTranService.java
  24. 30 0
      src/main/java/com/td/boss/game/comsnbtran/service/ComSnbTranServiceImpl.java
  25. 38 0
      src/main/java/com/td/boss/game/comsnbtran/vo/ComSnbTranVo.java
  26. 17 0
      src/main/java/com/td/boss/game/comusers/controller/ComUsersController.java
  27. 3 2
      src/main/java/com/td/boss/util/CodeDOM.java
  28. 16 0
      src/main/java/com/td/boss/util/DateUtil.java

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

@@ -50,6 +50,7 @@ public enum ResultEnum {
     LAND_IS_LEASE(703,"土地已租赁!"),
     LAND_IS_PLANT(704,"土地已种植!"),
     LAND_NOT_PLANT(705,"土地未种植!"),
+    LAND_LEASE_EXPIRED(706,"土地租赁已过期!"),
     //种子数据不能存在
     SEED_DATA_ERROR(801,"种子数据不存在!"),
     FRUIT_DATA_ERROR(802,"果实数据不存在!"),
@@ -57,6 +58,9 @@ public enum ResultEnum {
     FRUIT_SEND_SELF(804,"不能赠送给自己!"),
     SEED_DATE_ERROR(805,"未到成熟时间!"),
     SEED_AMOUNT_ERROR(806,"背包数量不对!"),
+    SEED_PLAY_ERROR(807,"支付价格不对!"),
+
+    FRUIT_AMOUNT_IS_ZERO_AND_NOT_MULTIPLE(808,"请输入20的倍数出售果实!"),
     ;
     private Integer code;
 

+ 15 - 0
src/main/java/com/td/boss/game/comexplainland/controller/ComExplainLandController.java

@@ -0,0 +1,15 @@
+package com.td.boss.game.comexplainland.controller;
+
+import com.td.boss.common.controller.*;
+import com.td.boss.game.comexplainland.pojo.ComExplainLand;
+import com.td.boss.game.comexplainland.vo.ComExplainLandVo;
+import com.td.boss.game.comexplainland.service.ComExplainLandService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/game/comExplainLand/")
+public class ComExplainLandController extends CommonController<ComExplainLandVo, ComExplainLand, String> {
+    @Autowired
+    private ComExplainLandService comExplainLandService;
+}

+ 47 - 0
src/main/java/com/td/boss/game/comexplainland/pojo/ComExplainLand.java

@@ -0,0 +1,47 @@
+package com.td.boss.game.comexplainland.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_explain_land")
+@Data
+public class ComExplainLand implements Serializable {
+    @Id
+    private String eId;//
+
+    private String userId;//
+
+    private Integer landId;//过期的租赁土地的id
+
+    private Date landCreate;//过期的租赁土地时候土地创建的日期
+
+    private Date leaseTime;//过期的土地租赁的时间
+
+    private Integer leaseMultiple;//过期的土地租赁倍数
+
+    private Integer leaseDate;//过期的土地租赁日期,1是3个月,2是1年,3是5年
+
+    private Integer isPlant;//过期的土地种子状态 是否种植:N:0,Y:1
+
+    private Integer plantId;//过期土地的种植id
+
+    private Date plantStart;//过期土地开始种植的时间
+
+    private Integer plantMature;//过期土地种植成熟期
+
+    private String landDescribe;//过期土地的描述
+
+    private Double rentalExpenses;//过期的土地的租赁费用
+
+    private Integer explainType;//过期类型。0:租赁到期
+
+    private String explainDescribe;//记录描述
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 9 - 0
src/main/java/com/td/boss/game/comexplainland/repository/ComExplainLandRepository.java

@@ -0,0 +1,9 @@
+package com.td.boss.game.comexplainland.repository;
+
+import com.td.boss.common.repository.*;
+import com.td.boss.game.comexplainland.pojo.ComExplainLand;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ComExplainLandRepository extends CommonRepository<ComExplainLand, String> {
+}

+ 8 - 0
src/main/java/com/td/boss/game/comexplainland/service/ComExplainLandService.java

@@ -0,0 +1,8 @@
+package com.td.boss.game.comexplainland.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comexplainland.pojo.ComExplainLand;
+import com.td.boss.game.comexplainland.vo.ComExplainLandVo;
+
+public interface ComExplainLandService extends CommonService<ComExplainLandVo, ComExplainLand, String> {
+}

+ 21 - 0
src/main/java/com/td/boss/game/comexplainland/service/ComExplainLandServiceImpl.java

@@ -0,0 +1,21 @@
+package com.td.boss.game.comexplainland.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comexplainland.pojo.ComExplainLand;
+import com.td.boss.game.comexplainland.vo.ComExplainLandVo;
+import com.td.boss.game.comexplainland.repository.ComExplainLandRepository;
+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;
+
+@Service
+@Transactional
+public class ComExplainLandServiceImpl extends CommonServiceImpl<ComExplainLandVo, ComExplainLand, String> implements ComExplainLandService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComExplainLandRepository comExplainLandRepository;
+}

+ 43 - 0
src/main/java/com/td/boss/game/comexplainland/vo/ComExplainLandVo.java

@@ -0,0 +1,43 @@
+package com.td.boss.game.comexplainland.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComExplainLandVo extends PageCondition implements Serializable {
+    private String eId;//
+
+    private String userId;//
+
+    private Integer landId;//过期的租赁土地的id
+
+    private Date landCreate;//过期的租赁土地时候土地创建的日期
+
+    private Date leaseTime;//过期的土地租赁的时间
+
+    private Integer leaseMultiple;//过期的土地租赁倍数
+
+    private Integer leaseDate;//过期的土地租赁日期,1是3个月,2是1年,3是5年
+
+    private Integer isPlant;//过期的土地种子状态 是否种植:N:0,Y:1
+
+    private Integer plantId;//过期土地的种植id
+
+    private Date plantStart;//过期土地开始种植的时间
+
+    private Integer plantMature;//过期土地种植成熟期
+
+    private String landDescribe;//过期土地的描述
+
+    private Double rentalExpenses;//过期的土地的租赁费用
+
+    private Integer explainType;//过期类型。0:租赁到期
+
+    private String explainDescribe;//记录描述
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 58 - 8
src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java

@@ -2,6 +2,7 @@ package com.td.boss.game.commallseed.controller;
 
 import com.td.boss.common.controller.*;
 import com.td.boss.common.pojo.Result;
+import com.td.boss.config.enums.ResultEnum;
 import com.td.boss.game.commallseed.pojo.ComMallSeed;
 import com.td.boss.game.commallseed.service.ComMallSeedService;
 import com.td.boss.game.commallseed.vo.ComMallSeedVo;
@@ -9,8 +10,13 @@ import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
 import com.td.boss.game.complayergoods.service.ComPlayerGoodsService;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsSimpleVo;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+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.CopyUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
@@ -25,6 +31,13 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
 
     @Autowired
     private ComPlayerGoodsService comPlayerGoodsService;
+
+    @Autowired
+    private ComUsersService comUsersService;
+
+    @Autowired
+    private ComSnbTranService comSnbTranService;
+
     /**
      * 获取商城种子
      *
@@ -47,6 +60,7 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
      */
     @PostMapping("snbBuySeeds")
     @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
     public Result<Map> snbBuySeedsFunction(
             @RequestParam(value = "userId") String userId,
             @RequestParam(value = "payAmount") Integer payAmount,
@@ -60,19 +74,33 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
         if (seedVo == null) {
 
             map.put("msg", "非法操作:所修改的种子不存在服务器中!");
-            return Result.of(map);
+            //return Result.of(map);
+            return Result.of(map, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
         }
-
-        if (!seedVo.getPriceCnt().equals(payAmount) || payAmount % seedVo.getPriceCnt() != 0) {
-            //如果价格 不和种子相当,也不是种子的倍数
+        if (payAmount.equals(0) || payAmount % seedVo.getPriceSnb() != 0) {
+            //支付价格不能为零,如果价格 不和种子相当,也不是种子的倍数,也是不行的
             map.put("msg", "订单非法操作,已记录相关信息!");
-            return Result.of(map);
+            //return Result.of(map);
+            return Result.of(map, false, ResultEnum.SEED_PLAY_ERROR.getMessage(), ResultEnum.SEED_PLAY_ERROR.getCode());
         }
+
+        //todo 操作snb数量
+        ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
+        if (comUsersVo.getSnb() < payAmount) {
+            map.put("msg", "账户snb不足");
+            //WALLET_SNB_INSUFFICIENT_QUANTITY(602,"snb不足以支付!")
+            return Result.of(map, false, ResultEnum.WALLET_SNB_INSUFFICIENT_QUANTITY.getMessage(), ResultEnum.WALLET_SNB_INSUFFICIENT_QUANTITY.getCode());
+        }
+        //如果数量够,写入修改对应操作
+        Integer _oldSnb = comUsersVo.getSnb();
+        Integer _snb = comUsersVo.getSnb() - payAmount;
+        comUsersVo.setSnb(_snb);
+        comUsersService.save(comUsersVo);
+
         //合法操作记录到仓库中
         ComPlayerGoods entityVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, itemType, 0);
-
         //这里计算一个购买种子的数量,用种子除去单价
-        int _paySeedAmount = (int) (payAmount % seedVo.getPriceCnt());
+        int _paySeedAmount = (int) (payAmount / seedVo.getPriceSnb());
         if (entityVo == null) {
             //创建一个新种子
             entityVo = new ComPlayerGoods();
@@ -81,6 +109,7 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
             entityVo.setAmount(_paySeedAmount);
             entityVo.setName(seedVo.getName());
             entityVo.setPictureName(seedVo.getPicture());
+            entityVo.setUserId(userId);
         } else {
             Integer _amount = entityVo.getAmount() + _paySeedAmount;
             entityVo.setAmount(_amount);
@@ -88,7 +117,28 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
         /** 购买成功后,记录到仓库中*/
         ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(entityVo, ComPlayerGoodsVo.class);
         comPlayerGoodsService.save(comPlayerGoodsVo);
-        map.put("seed", CopyUtil.copy(entityVo, ComPlayerGoodsSimpleVo.class));
+
+        /**
+         * todo 购买种子的交易记录
+         */
+        ComSnbTranVo _snbTran = new ComSnbTranVo();
+        //记录兑换id
+        _snbTran.setTranId(itemType.toString());
+        _snbTran.setUserId(userId);
+        _snbTran.setTranName("使用SNB购买种子");
+        _snbTran.setTranType(3);
+        _snbTran.setTranAmount(_paySeedAmount); //此数量会操作背包记录
+        _snbTran.setTranPrice(payAmount);
+        _snbTran.setTranDescribe("SNB购买种子的价格:"+seedVo.getPriceSnb()+",支付金额:"+payAmount);
+        _snbTran.setIsAdd(0);//减少snb
+        _snbTran.setBeforeSnb(_oldSnb);
+        _snbTran.setTranSnb(payAmount);
+        _snbTran.setAfterSnb(_snb);
+        comSnbTranService.save(_snbTran);
+
+
+        map.put("seed", entityVo.getGoodsIndex());
+        map.put("snb",comUsersVo.getSnb());
         return Result.of(map);
     }
 

+ 237 - 89
src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java

@@ -3,6 +3,8 @@ package com.td.boss.game.complayergoods.controller;
 import com.td.boss.common.controller.*;
 import com.td.boss.common.pojo.Result;
 import com.td.boss.config.enums.ResultEnum;
+import com.td.boss.game.comexplainland.service.ComExplainLandService;
+import com.td.boss.game.comexplainland.vo.ComExplainLandVo;
 import com.td.boss.game.comfruit.pojo.ComFruit;
 import com.td.boss.game.comfruit.service.ComFruitService;
 import com.td.boss.game.comfruit.vo.ComFruitAmountVo;
@@ -16,10 +18,17 @@ import com.td.boss.game.complayergoods.service.ComPlayerGoodsService;
 import com.td.boss.game.complayerland.pojo.ComPlayerLand;
 import com.td.boss.game.complayerland.service.ComPlayerLandService;
 import com.td.boss.game.complayerland.vo.ComPlayerLandVo;
+import com.td.boss.game.complayerlog.pojo.ComPlayerLog;
+import com.td.boss.game.complayerlog.service.ComPlayerLogService;
+import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
+import com.td.boss.game.comsnbtran.pojo.ComSnbTran;
+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.CopyUtil;
 import com.td.boss.util.DateUtil;
+import net.bytebuddy.asm.Advice;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -43,6 +52,18 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
     @Autowired
     private ComUsersService comUsersService;
 
+    //交易表service
+    @Autowired
+    private ComSnbTranService comSnbTranService;
+
+    //背包操作日志
+    @Autowired
+    private ComPlayerLogService comPlayerLogService;
+
+    @Autowired
+    private ComExplainLandService comExplainLandService;
+
+
 
     /**
      * 获取仓库 全部数据,目前使用goods_type区分种子和果实
@@ -94,19 +115,19 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             @RequestParam(value = "currentAmount") Integer currentAmount
     ) {
         //查询背包种子存在的数量
-        ComPlayerGoods comPlayerGood = comPlayerGoodsService.findByUserIdAndIndexAndType(userId,seedId,0);
-        if(comPlayerGood == null){
+        ComPlayerGoods comPlayerGood = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, seedId, 0);
+        if (comPlayerGood == null) {
             //如果背包种子是空的,说明还未添加上去
             return Result.of(null, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
         }
-        if(comPlayerGood.getAmount() <= currentAmount){
+        if (comPlayerGood.getAmount() <= currentAmount) {
             //如果背包数量等于或者小于传进来的,提示轮询未更新
             return Result.of(null, false, ResultEnum.SEED_AMOUNT_ERROR.getMessage(), ResultEnum.SEED_AMOUNT_ERROR.getCode());
-        } else{
+        } else {
             Map map = new HashMap();
-            map.put("msg","背包种子更新成功!");
-            map.put("goodsAmount",comPlayerGood.getAmount());
-            map.put("currentAmount",currentAmount);
+            map.put("msg", "背包种子更新成功!");
+            map.put("goodsAmount", comPlayerGood.getAmount());
+            map.put("currentAmount", currentAmount);
             return Result.of(map);
         }
 
@@ -116,6 +137,9 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
 
     /**
      * 收获时候,传入土地id和种子id
+     * <p>
+     * <p>
+     * 收获时候,操作用户snb时候,需要加锁,防止用户收取时候遗漏计算snb
      *
      * @param userId
      * @param landId
@@ -128,7 +152,7 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             @RequestParam(value = "userId") String userId,
             @RequestParam(value = "landId") Integer landId) {
         //todo 确认下是否多倍收成
-        ComPlayerLand comPlayerLand = comPlayerLandService.findById(landId);
+        ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, landId);
         //土地数据不存在
         if (comPlayerLand == null) {
             return Result.of(null, false, ResultEnum.LAND_DATA_ERROR.getMessage(), ResultEnum.LAND_DATA_ERROR.getCode());
@@ -141,53 +165,101 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
         if (comPlayerLand.getIsPlant().equals(0)) {
             return Result.of(null, false, ResultEnum.LAND_NOT_PLANT.getMessage(), ResultEnum.LAND_NOT_PLANT.getCode());
         }
-        //
+        //todo 判断土地租赁是否到期,是到期不给种植
+        //租赁的剩余天数 。
+        Long leaseDaysMill = comPlayerLand.getLeaseTime().getTime() - DateUtil.getNowDate().getTime();
+        if(leaseDaysMill <= 0){
+            //todo 清除记录的数据
+            //todo 清除记录的数据
+            //    1.土地租赁到期,删除土地租赁数据
+            comPlayerLandService.delete(comPlayerLand.getId());
+            //todo 2.把删除的这个土地的数据记录到com_explain_land中去
+            ComExplainLandVo comExplainLandVo = new ComExplainLandVo();
+            comExplainLandVo = CopyUtil.copy(comPlayerLand, ComExplainLandVo.class);
+            comExplainLandVo.setLandId(comPlayerLand.getConfigLandId());
+            comExplainLandVo.setLandCreate(comPlayerLand.getCreateTime());
+            comExplainLandVo.setExplainType(0);
+            comExplainLandVo.setExplainDescribe("收获果实时:土地租赁过期回收");
+            comExplainLandVo.setCreateTime(new Date());
+            comExplainLandVo.setUpdateTime(new Date());
+            comExplainLandService.save(comExplainLandVo);
+            return Result.of(null, false, ResultEnum.LAND_LEASE_EXPIRED.getMessage(), ResultEnum.LAND_LEASE_EXPIRED.getCode());
+        }
 
+        //获取种植的种子
         ComMallSeedVo comMallSeedVo = comMallSeedService.findById(comPlayerLand.getPlantId());
-
         if (comMallSeedVo == null) {
             return Result.of(null, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
         }
+
         // 收获,同时重置土地状态,先判断是否成熟
         //当前时间减去 成熟期,判断是否成熟
-        if(DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity()).getTime()<comPlayerLand.getPlantStart().getTime()){
+        Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
+        // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
+        long diff = comPlayerLand.getPlantStart().getTime() - _harvestTime.getTime();
+        //if (DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity()).getTime() < comPlayerLand.getPlantStart().getTime())
+        if (diff > 0) {
             //如果当前时间减去种子的成熟期,还是小于种植日期,则判断未成熟
             return Result.of(null, false, ResultEnum.SEED_DATE_ERROR.getMessage(), ResultEnum.SEED_DATE_ERROR.getCode());
         }
+        try {
+            //设置一个未种植状态即可
+            comPlayerLand.setIsPlant(0);
+            ComPlayerLandVo comPlayerLandVo = CopyUtil.copy(comPlayerLand, ComPlayerLandVo.class);
+            comPlayerLandService.save(comPlayerLandVo);
+
+            //计算一个收获量, 租赁倍数* 租赁日期下的产量
+            Integer _amount = 0;
+            if (comPlayerLand.getLeaseDate().equals(1)) {
+                _amount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest1();
+            } else if (comPlayerLand.getLeaseDate().equals(2)) {
+                _amount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest2();
+            } else if (comPlayerLand.getLeaseDate().equals(3)) {
+                _amount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest3();
+            }
+            //果实 Type =1
+            //todo 收获果实时候
+            ComPlayerGoods comPlayerGoodsSimpleVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, comMallSeedVo.getHarvestId(), 1);
+
+            Integer _beforeAmount = 0;
+            if (comPlayerGoodsSimpleVo == null) {
+                //背包增加一个果实
+                comPlayerGoodsSimpleVo = new ComPlayerGoods();
+                comPlayerGoodsSimpleVo.setUserId(userId);
+                comPlayerGoodsSimpleVo.setGoodsIndex(comMallSeedVo.getHarvestId());
+                comPlayerGoodsSimpleVo.setGoodsType(1);
+                comPlayerGoodsSimpleVo.setName(comMallSeedVo.getHarvestName());
+                //用种子的picture
+                comPlayerGoodsSimpleVo.setPictureName(comMallSeedVo.getPicture());
+                comPlayerGoodsSimpleVo.setAmount(_amount);
+
+                _beforeAmount = 0;
+            } else {
+                _beforeAmount = comPlayerGoodsSimpleVo.getAmount();
+
+                comPlayerGoodsSimpleVo.setAmount(comPlayerGoodsSimpleVo.getAmount() + _amount);
+            }
 
-        //设置一个未种植状态即可
-        comPlayerLand.setIsPlant(0);
-        ComPlayerLandVo comPlayerLandVo = CopyUtil.copy(comPlayerLand, ComPlayerLandVo.class);
-        comPlayerLandService.save(comPlayerLandVo);
-
-        //计算一个收获量, 租赁倍数* 租赁日期下的产量
-        Integer _amount = 0;
-        if (comPlayerLand.getLeaseDate().equals(1)) {
-            _amount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest1();
-        } else if (comPlayerLand.getLeaseDate().equals(2)) {
-            _amount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest2();
-        } else if (comPlayerLand.getLeaseDate().equals(3)) {
-            _amount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest3();
-        }
-        //果实 Type =1
-        ComPlayerGoods comPlayerGoodsSimpleVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId,comMallSeedVo.getHarvestId(), 1);
+            ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
+            comPlayerGoodsService.save(comPlayerGoodsVo);
 
-        if (comPlayerGoodsSimpleVo == null) {
-            //背包增加一个果实
-            comPlayerGoodsSimpleVo = new ComPlayerGoods();
-            comPlayerGoodsSimpleVo.setUserId(userId);
-            comPlayerGoodsSimpleVo.setGoodsIndex(comMallSeedVo.getHarvestId());
-            comPlayerGoodsSimpleVo.setGoodsType(1);
-            comPlayerGoodsSimpleVo.setName(comMallSeedVo.getHarvestName());
-            //用种子的picture
-            comPlayerGoodsSimpleVo.setPictureName(comMallSeedVo.getPicture());
-            comPlayerGoodsSimpleVo.setAmount(_amount);
-        } else {
-            comPlayerGoodsSimpleVo.setAmount(comPlayerGoodsSimpleVo.getAmount() + _amount);
+            //todo 记录一个收获的操作日志
+            ComPlayerLog _playerLog = new ComPlayerLog();
+            _playerLog.setUserId(userId);
+            _playerLog.setTId(comMallSeedVo.getHarvestId());
+            _playerLog.setTName(comMallSeedVo.getHarvestName());
+            _playerLog.setTType(0);//设置一个默认水果id
+            _playerLog.setTAmount(_amount);
+            _playerLog.setBeforeAmount(_beforeAmount);
+            ////交易后的数据
+            _playerLog.setAfterAmount(comPlayerGoodsSimpleVo.getAmount());
+            _playerLog.setLMultiple(comPlayerLand.getLeaseMultiple());
+            ComPlayerLogVo _playerLogVo = CopyUtil.copy(_playerLog, ComPlayerLogVo.class);
+            comPlayerLogService.save(_playerLogVo);
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
         }
 
-        ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
-        comPlayerGoodsService.save(comPlayerGoodsVo);
         Map map = new HashMap();
         map.put("msg", "成功收取果实!");
         return Result.of(map);
@@ -196,6 +268,8 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
 
     /**
      * 出售果实
+     * <p>
+     * todo 需要记录出售果实的snb操作记录
      *
      * @param userId
      * @param amount
@@ -216,32 +290,66 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             return Result.of(null, false, ResultEnum.FRUIT_DATA_ERROR.getMessage(), ResultEnum.FRUIT_DATA_ERROR.getCode());
         }
         //果实
-        ComPlayerGoods comPlayerGoodsSimpleVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId,fruitId, 1);
+        ComPlayerGoods comPlayerGoodsSimpleVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, fruitId, 1);
 
         //销售果实数量
         if (comPlayerGoodsSimpleVo == null) {
             return Result.of(null, false, ResultEnum.FRUIT_DATA_ERROR.getMessage(), ResultEnum.FRUIT_DATA_ERROR.getCode());
         }
 
-        if(amount>comPlayerGoodsSimpleVo.getAmount()){
+        if (amount > comPlayerGoodsSimpleVo.getAmount()) {
             return Result.of(null, false, ResultEnum.FRUIT_AMOUNT_ERROR.getMessage(), ResultEnum.FRUIT_AMOUNT_ERROR.getCode());
         }
-
-        if(comPlayerGoodsSimpleVo.getAmount().equals(amount)){
-            //如果库存量和出售的果实数量一样,删除
-            comPlayerGoodsService.delete(comPlayerGoodsSimpleVo.getGoodsId());
-        }else{
-            comPlayerGoodsSimpleVo.setAmount(comPlayerGoodsSimpleVo.getAmount() - amount);
-            ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
-            comPlayerGoodsService.save(comPlayerGoodsVo);
+        //todo 销售果实时候,收取5%手续费,最少出售20的倍数
+        //   1.判定销售数量, 如果果实输入是0,或者不是20的倍数,返回提示
+        if (amount.equals(0) || amount % 20 != 0) {
+            return Result.of(null, false, ResultEnum.FRUIT_AMOUNT_IS_ZERO_AND_NOT_MULTIPLE.getMessage(), ResultEnum.FRUIT_AMOUNT_IS_ZERO_AND_NOT_MULTIPLE.getCode());
+        }
+        try {
+            if (comPlayerGoodsSimpleVo.getAmount().equals(amount)) {
+                //如果库存量和出售的果实数量一样,删除
+                comPlayerGoodsService.delete(comPlayerGoodsSimpleVo.getGoodsId());
+            } else {
+                comPlayerGoodsSimpleVo.setAmount(comPlayerGoodsSimpleVo.getAmount() - amount);
+                ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
+                comPlayerGoodsService.save(comPlayerGoodsVo);
+            }
+            //todo 收取手续费之后
+            int _endAmount = (int) (amount * 0.95);
+            //添加SNB
+            ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
+            //交易前的snb数据
+            Integer _beforeSnb = comUsersVo.getSnb();
+            //数量乘以售价
+            int _saleSnb = comFruitVo.getPriceSnb() * _endAmount; //此时的售价数量已经扣除了手续费,相当于减少了几个果实
+            //当前操作的snb
+            Integer _currentSnb = comUsersVo.getSnb() + _saleSnb;
+            comUsersVo.setSnb(_currentSnb);
+            comUsersService.save(comUsersVo);
+            /**
+             * todo 果实出售snb数据记录
+             */
+            ComSnbTranVo _snbTran = new ComSnbTranVo();
+            //记录果实id
+            _snbTran.setTranId(comFruitVo.getId().toString());
+            _snbTran.setUserId(userId);
+            _snbTran.setTranName(comFruitVo.getName());
+            _snbTran.setTranType(0);
+            _snbTran.setTranAmount(amount); //此数量会操作背包记录
+            _snbTran.setTranPrice(comFruitVo.getPriceSnb());
+            //"出售果实价格:" + comFruitVo.getPriceSnb() + ",数量:" + amount
+            _snbTran.setTranDescribe("扣除5%手续费后果实数量为:" + _endAmount + ",销售价格:" + _saleSnb);
+            _snbTran.setIsAdd(1);//增加收入
+            _snbTran.setBeforeSnb(_beforeSnb);
+            _snbTran.setTranSnb(_saleSnb);
+            _snbTran.setAfterSnb(_currentSnb);
+            comSnbTranService.save(_snbTran);
+
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
         }
 
-        //添加SNB
-        ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
-        //数量乘以售价
-        int _saleSnb = comFruitVo.getPriceSnb()*amount;
-        comUsersVo.setSnb(comUsersVo.getSnb()+_saleSnb);
-        comUsersService.save(comUsersVo);
+
         Map map = new HashMap();
         map.put("msg", "成功出售果实!");
         return Result.of(map);
@@ -252,7 +360,7 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
      * 根据用户地址送果实
      *
      * @param userId
-     * @param address  目标用户地址
+     * @param address 目标用户地址
      * @return
      */
     @PostMapping("grantFruit")
@@ -266,11 +374,11 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
 
         //目标用户的背包
         ComUsersVo _targetUserVo = comUsersService.findByAddress(address);
-        if(_targetUserVo == null){
+        if (_targetUserVo == null) {
             return Result.of(null, false, ResultEnum.USER_NOT_ADDRESS.getMessage(), ResultEnum.USER_NOT_ADDRESS.getCode());
         }
 
-        if(_targetUserVo.getUserId().equals(userId)){
+        if (_targetUserVo.getUserId().equals(userId)) {
             return Result.of(null, false, ResultEnum.FRUIT_SEND_SELF.getMessage(), ResultEnum.FRUIT_SEND_SELF.getCode());
         }
 
@@ -287,40 +395,80 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             return Result.of(null, false, ResultEnum.FRUIT_DATA_ERROR.getMessage(), ResultEnum.FRUIT_DATA_ERROR.getCode());
         }
 
-        if(amount>comPlayerGoodsSimpleVo.getAmount()){
+        if (amount > comPlayerGoodsSimpleVo.getAmount()) {
             return Result.of(null, false, ResultEnum.FRUIT_AMOUNT_ERROR.getMessage(), ResultEnum.FRUIT_AMOUNT_ERROR.getCode());
         }
-
-        if(comPlayerGoodsSimpleVo.getAmount().equals(amount)){
-            //如果库存量和出售的果实数量一样,删除
-            comPlayerGoodsService.delete(comPlayerGoodsSimpleVo.getGoodsId());
-        }else{
-            comPlayerGoodsSimpleVo.setAmount(comPlayerGoodsSimpleVo.getAmount() - amount);
-            ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
-            comPlayerGoodsService.save(comPlayerGoodsVo);
+        try {
+            Integer _selfBeforeAmount = 0;
+            Integer _selfAfterAmount = 0;
+            if (comPlayerGoodsSimpleVo.getAmount().equals(amount)) {
+                _selfBeforeAmount = comPlayerGoodsSimpleVo.getAmount();
+                //如果库存量和出售的果实数量一样,删除
+                comPlayerGoodsService.delete(comPlayerGoodsSimpleVo.getGoodsId());
+                _selfAfterAmount = 0;
+            } else {
+                _selfBeforeAmount = comPlayerGoodsSimpleVo.getAmount();
+                comPlayerGoodsSimpleVo.setAmount(comPlayerGoodsSimpleVo.getAmount() - amount);
+                _selfAfterAmount = comPlayerGoodsSimpleVo.getAmount();
+                ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
+                comPlayerGoodsService.save(comPlayerGoodsVo);
+            }
+            //todo 发送果实,记录当前用户的playerLog
+            //当前用户
+            ComPlayerLog _selfPlayerLog = new ComPlayerLog();
+            _selfPlayerLog.setUserId(userId);
+            _selfPlayerLog.setTId(comFruitVo.getId());
+            _selfPlayerLog.setTName(comFruitVo.getName());
+            _selfPlayerLog.setTType(2);//发送水果的类型:2
+            _selfPlayerLog.setTAmount(amount);
+            _selfPlayerLog.setBeforeAmount(_selfBeforeAmount);
+            ////交易后的数据
+            _selfPlayerLog.setAfterAmount(_selfAfterAmount);
+            _selfPlayerLog.setLMultiple(0);//收获时候,会有一个倍数
+            ComPlayerLogVo _selfPlayerLogVo = CopyUtil.copy(_selfPlayerLog, ComPlayerLogVo.class);
+            comPlayerLogService.save(_selfPlayerLogVo);
+
+            //接受人的背包数据
+            ComPlayerGoods _targetGoods = comPlayerGoodsService.findByUserIdAndIndexAndType(_targetUserVo.getUserId(), comFruitVo.getId(), 1);
+            Integer _targetBeforeAmount = 0;
+            Integer _targetAfterAmount = 0;
+            if (_targetGoods == null) {
+                //背包增加一个果实
+                _targetGoods = new ComPlayerGoods();
+                //目标id
+                _targetGoods.setUserId(_targetUserVo.getUserId());
+                _targetGoods.setGoodsIndex(comFruitVo.getId());
+                _targetGoods.setGoodsType(1);
+                _targetGoods.setName(comFruitVo.getName());
+                //用种子的picture
+                _targetGoods.setPictureName(comFruitVo.getPicture());
+                _targetGoods.setAmount(amount);
+                _targetAfterAmount = _targetGoods.getAmount();
+            } else {
+                _targetBeforeAmount = _targetGoods.getAmount();
+                _targetGoods.setAmount(_targetGoods.getAmount() + amount);
+                _targetAfterAmount = _targetGoods.getAmount();
+            }
+            ComPlayerGoodsVo _targetGoodsVo = CopyUtil.copy(_targetGoods, ComPlayerGoodsVo.class);
+            comPlayerGoodsService.save(_targetGoodsVo);
+            //todo 接收果实,记录目标用户的playerLog
+            ComPlayerLog _targetPlayerLog = new ComPlayerLog();
+            _targetPlayerLog.setUserId(_targetUserVo.getUserId());
+            _targetPlayerLog.setTId(comFruitVo.getId());
+            _targetPlayerLog.setTName(comFruitVo.getName());
+            _targetPlayerLog.setTType(3);//接收用户赠送水果,type设置 3
+            _targetPlayerLog.setTAmount(amount);
+            _targetPlayerLog.setBeforeAmount(_targetBeforeAmount);
+            ////交易后的数据
+            _targetPlayerLog.setAfterAmount(_targetAfterAmount);
+            _targetPlayerLog.setLMultiple(0);
+            ComPlayerLogVo _targetPlayerLogVo = CopyUtil.copy(_targetPlayerLog, ComPlayerLogVo.class);
+            comPlayerLogService.save(_targetPlayerLogVo);
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
         }
 
 
-
-        //接受人的背包数据
-        ComPlayerGoods _targetGoods = comPlayerGoodsService.findByUserIdAndIndexAndType(_targetUserVo.getUserId(),comFruitVo.getId(), 1);
-        if (_targetGoods == null) {
-            //背包增加一个果实
-            _targetGoods = new ComPlayerGoods();
-            //目标id
-            _targetGoods.setUserId(_targetUserVo.getUserId());
-            _targetGoods.setGoodsIndex(comFruitVo.getId());
-            _targetGoods.setGoodsType(1);
-            _targetGoods.setName(comFruitVo.getName());
-            //用种子的picture
-            _targetGoods.setPictureName(comFruitVo.getPicture());
-            _targetGoods.setAmount(amount);
-        } else {
-            _targetGoods.setAmount(_targetGoods.getAmount() + amount);
-        }
-        ComPlayerGoodsVo _targetGoodsVo = CopyUtil.copy(_targetGoods, ComPlayerGoodsVo.class);
-        comPlayerGoodsService.save(_targetGoodsVo);
-
         Map map = new HashMap();
         map.put("msg", "成功发送果实!");
         return Result.of(map);

+ 200 - 57
src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java

@@ -3,6 +3,8 @@ package com.td.boss.game.complayerland.controller;
 import com.td.boss.common.controller.*;
 import com.td.boss.common.pojo.Result;
 import com.td.boss.config.enums.ResultEnum;
+import com.td.boss.game.comexplainland.service.ComExplainLandService;
+import com.td.boss.game.comexplainland.vo.ComExplainLandVo;
 import com.td.boss.game.commallseed.service.ComMallSeedService;
 import com.td.boss.game.commallseed.vo.ComMallSeedVo;
 import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
@@ -13,8 +15,12 @@ import com.td.boss.game.complayerland.vo.ComPlayerLandAndPlantVo;
 import com.td.boss.game.complayerland.vo.ComPlayerLandSimpleVo;
 import com.td.boss.game.complayerland.vo.ComPlayerLandVo;
 import com.td.boss.game.complayerland.service.ComPlayerLandService;
+import com.td.boss.game.complayerlog.pojo.ComPlayerLog;
+import com.td.boss.game.complayerlog.service.ComPlayerLogService;
+import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
 import com.td.boss.game.comusers.vo.ComUsersSimpleVo;
 import com.td.boss.util.CopyUtil;
+import com.td.boss.util.DateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -35,6 +41,12 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
     @Autowired
     private ComPlayerGoodsService comPlayerGoodsService;
 
+    @Autowired
+    private ComPlayerLogService comPlayerLogService;
+
+    @Autowired
+    private ComExplainLandService comExplainLandService;
+
 
     /**
      * 获取用户土地
@@ -48,13 +60,67 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
         List<ComPlayerLandAndPlantVo> _simpleVoList = CopyUtil.copyList(comPlayerLands, ComPlayerLandAndPlantVo.class);
         List<ComPlayerLandAndPlantVo> _list = new ArrayList<>();
 
-        _simpleVoList.stream().map(e->{
-            //如果种植了
-            if(e.getIsPlant().equals(1)){
-                e.setSeedInfo(comMallSeedService.findById(e.getPlantId()));
-            }
-            return _list.add(e);
-        }).collect(Collectors.toList());
+        try {
+            _simpleVoList.stream().map(e -> {
+                ComPlayerLandAndPlantVo comPlayerLandAndPlantVo = e;
+                //todo 返回一个计算的天数和小时,解决跨时区的问题
+                //租赁的剩余天数 。 测试:DateUtil.getNowDateAddYear(1).getTime(); DateUtil.getNowDate().getTime()
+                Long leaseDaysMill = comPlayerLandAndPlantVo.getLeaseTime().getTime() - DateUtil.getNowDate().getTime();
+                //精确到毫秒计算判断时间
+                if (leaseDaysMill <= 0) {
+                    //todo 1.土地租赁到期,删除土地租赁数据
+                    comPlayerLandService.delete(e.getId());
+                    //todo 2.把删除的这个土地的数据记录到com_explain_land中去
+                    ComExplainLandVo comExplainLandVo = new ComExplainLandVo();
+                    comExplainLandVo = CopyUtil.copy(e, ComExplainLandVo.class);
+                    comExplainLandVo.setLandId(e.getConfigLandId());
+                    comExplainLandVo.setLandCreate(e.getCreateTime());
+                    comExplainLandVo.setExplainType(0);
+                    comExplainLandVo.setExplainDescribe("获取土地列表时:土地租赁过期回收");
+                    comExplainLandVo.setCreateTime(new Date());
+                    comExplainLandVo.setUpdateTime(new Date());
+                    comExplainLandService.save(comExplainLandVo);
+                    //过期了不做后续操作
+                    return null;
+                }
+                //土地时间
+                //租赁的总时间 = 租赁时间 - 土地数据的创建时间
+                Long leaseAllMill = comPlayerLandAndPlantVo.getLeaseTime().getTime() - comPlayerLandAndPlantVo.getCreateTime().getTime();
+                Integer allDays = DateUtil.getDays(leaseAllMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseAllMill).intValue();
+                comPlayerLandAndPlantVo.setLeaseDays(allDays);
+                Integer leaseDays = DateUtil.getDays(leaseDaysMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseDaysMill).intValue();
+                comPlayerLandAndPlantVo.setLeaseDaysRemaining(leaseDays);
+                // 如果种植了,返回一个种植数据
+                if (comPlayerLandAndPlantVo.getIsPlant().equals(1)) {
+                    ComMallSeedVo comMallSeedVo = comMallSeedService.findById(comPlayerLandAndPlantVo.getPlantId());
+                    comPlayerLandAndPlantVo.setSeedInfo(comMallSeedVo);
+                    //种子时间
+                    //当前时间 > 种植时间+成熟期  = 说明可以收获了
+                    //获取当前时间 - 植物的成熟期 = 收获时间,收获时间 >= 种植时间,即可以收获
+                    Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
+                    // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
+                    long diff = comPlayerLandAndPlantVo.getPlantStart().getTime() - _harvestTime.getTime();
+                    if (diff <= 0) {
+                        //说明可以收获了
+                        comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
+                        comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
+                    } else {
+                        comPlayerLandAndPlantVo.setPlantDaysRemaining(DateUtil.getDays(diff).intValue());
+                        comPlayerLandAndPlantVo.setPlantHoursRemaining(DateUtil.getHours(diff).intValue());
+                    }
+                } else {
+                    //未种植时候,设置为0
+                    comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
+                    comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
+                }
+
+                return _list.add(e);
+            }).collect(Collectors.toList());
+
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
+
         return Result.of(_list);
     }
 
@@ -72,12 +138,24 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
             @RequestParam(value = "landId") Integer landId
     ) {
 
-        ComPlayerLand comPlayerLand = comPlayerLandService.findByLandId(landId);
+        ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, landId);
         //土地数据不存在
         if (comPlayerLand == null) {
             return Result.of(null, false, ResultEnum.LAND_DATA_ERROR.getMessage(), ResultEnum.LAND_DATA_ERROR.getCode());
         }
-        return Result.of(CopyUtil.copy(comPlayerLand, ComPlayerLandSimpleVo.class));
+        ComPlayerLandSimpleVo comPlayerLandSimpleVo = CopyUtil.copy(comPlayerLand, ComPlayerLandSimpleVo.class);
+        //todo 返回一个计算的天数和小时,解决跨时区的问题
+        //土地时间
+        //租赁的总时间 = 租赁时间 - 土地数据的创建时间
+        Long leaseAllMill = comPlayerLandSimpleVo.getLeaseTime().getTime() - comPlayerLandSimpleVo.getCreateTime().getTime();
+        Integer allDays = DateUtil.getDays(leaseAllMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseAllMill).intValue();
+        comPlayerLandSimpleVo.setLeaseDays(allDays);
+        //租赁的剩余天数
+        Long leaseDaysMill = comPlayerLandSimpleVo.getLeaseTime().getTime() - DateUtil.getNowDate().getTime();
+        Integer leaseDays = DateUtil.getDays(leaseDaysMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseDaysMill).intValue();
+        comPlayerLandSimpleVo.setLeaseDaysRemaining(leaseDays);
+
+        return Result.of(comPlayerLandSimpleVo);
     }
 
 
@@ -94,59 +172,124 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
             @RequestParam(value = "landId") Integer landId,
             @RequestParam(value = "seedId") Integer seedId) {
 
-        ComPlayerLand comPlayerLand = comPlayerLandService.findById(landId);
-        //土地数据不存在
-        if (comPlayerLand == null) {
-            return Result.of(null, false, ResultEnum.LAND_DATA_ERROR.getMessage(), ResultEnum.LAND_DATA_ERROR.getCode());
-        }
-        //土地未租赁
-        if (!comPlayerLand.getIsLease().equals(1)) {
-            return Result.of(null, false, ResultEnum.LAND_NOT_LEASE.getMessage(), ResultEnum.LAND_NOT_LEASE.getCode());
-        }
-        //土地已种植
-        if (comPlayerLand.getIsPlant().equals(1)) {
-            return Result.of(null, false, ResultEnum.LAND_IS_PLANT.getMessage(), ResultEnum.LAND_IS_PLANT.getCode());
-        }
-        //
+        try {
+            ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, landId);
+            //土地数据不存在
+            if (comPlayerLand == null) {
+                return Result.of(null, false, ResultEnum.LAND_DATA_ERROR.getMessage(), ResultEnum.LAND_DATA_ERROR.getCode());
+            }
+            if (!comPlayerLand.getIsLease().equals(1)) {
+                return Result.of(null, false, ResultEnum.LAND_NOT_LEASE.getMessage(), ResultEnum.LAND_NOT_LEASE.getCode());
+            }
+            //土地已种植
+            if (comPlayerLand.getIsPlant().equals(1)) {
+                return Result.of(null, false, ResultEnum.LAND_IS_PLANT.getMessage(), ResultEnum.LAND_IS_PLANT.getCode());
+            }
+            //todo 用户没刷新时候,土地还存在。判定一下时间是否到期,到期不给收获
+            //租赁的剩余天数 。
+            Long leaseDaysMill = comPlayerLand.getLeaseTime().getTime() - DateUtil.getNowDate().getTime();
+            if (leaseDaysMill <= 0) {
+                //todo 清除记录的数据
+                //    1.土地租赁到期,删除土地租赁数据
+                comPlayerLandService.delete(comPlayerLand.getId());
+                //todo 2.把删除的这个土地的数据记录到com_explain_land中去
+                ComExplainLandVo comExplainLandVo = new ComExplainLandVo();
+                comExplainLandVo = CopyUtil.copy(comPlayerLand, ComExplainLandVo.class);
+                comExplainLandVo.setLandId(comPlayerLand.getConfigLandId());
+                comExplainLandVo.setLandCreate(comPlayerLand.getCreateTime());
+                comExplainLandVo.setExplainType(0);
+                comExplainLandVo.setExplainDescribe("播种种子时:土地租赁过期回收");
+                comExplainLandVo.setCreateTime(new Date());
+                comExplainLandVo.setUpdateTime(new Date());
+                comExplainLandService.save(comExplainLandVo);
+                return Result.of(null, false, ResultEnum.LAND_LEASE_EXPIRED.getMessage(), ResultEnum.LAND_LEASE_EXPIRED.getCode());
+            }
 
-        ComMallSeedVo comMallSeedVo = comMallSeedService.findById(seedId);
 
-        if(comMallSeedVo == null){
-            return Result.of(null, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
-        }
-        //todo 背包种子减去 土地当前的倍数,需要多倍播种,即消耗多个种子
-        ComPlayerGoods comPlayerGoodsSimpleVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId,comMallSeedVo.getHarvestId(),0);
-
-        //操作一个种子的倍数
-        if(comPlayerGoodsSimpleVo.getAmount() <  comPlayerLand.getLeaseMultiple()){
-            //如果背包种子数量不够土地操作倍数,比如土地5倍,种子应该消耗5个
-            return Result.of(null, false, ResultEnum.PLAYER_GOODS_SEEDS_AMOUNT_ERROR.getMessage(), ResultEnum.PLAYER_GOODS_SEEDS_AMOUNT_ERROR.getCode());
-
-        }else if(comPlayerGoodsSimpleVo.getAmount().equals(comPlayerLand.getLeaseMultiple())){
-            //数量一样清除背包数据
-            comPlayerGoodsService.delete(comPlayerGoodsSimpleVo.getGoodsId());
-        }else{
-            //否则减去土地倍数
-            comPlayerGoodsSimpleVo.setAmount(comPlayerGoodsSimpleVo.getAmount() - comPlayerLand.getLeaseMultiple());
-            ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo,ComPlayerGoodsVo.class);
-            comPlayerGoodsService.save(comPlayerGoodsVo);
-        }
+            ComMallSeedVo comMallSeedVo = comMallSeedService.findById(seedId);
 
+            if (comMallSeedVo == null) {
+                return Result.of(null, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
+            }
+            //todo 背包种子减去 土地当前的倍数,需要多倍播种,即消耗多个种子
+            ComPlayerGoods comPlayerGoodsSimpleVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, comMallSeedVo.getHarvestId(), 0);
+            Integer _beforeAmount = 0;
+            //操作一个种子的倍数
+            if (comPlayerGoodsSimpleVo.getAmount() < comPlayerLand.getLeaseMultiple()) {
+                //如果背包种子数量不够土地操作倍数,比如土地5倍,种子应该消耗5个
+                return Result.of(null, false, ResultEnum.PLAYER_GOODS_SEEDS_AMOUNT_ERROR.getMessage(), ResultEnum.PLAYER_GOODS_SEEDS_AMOUNT_ERROR.getCode());
 
-        //todo 种植
-        comPlayerLand.setIsPlant(1);
-        //记录一个植物的种植id
-        comPlayerLand.setPlantId(seedId);
-        comPlayerLand.setPlantStart(new Date());
-        //种植天数,成熟天数
-        comPlayerLand.setPlantMature(comMallSeedVo.getMaturity());
-        //comPlayerLand.setLandDescribe();
-        ComPlayerLandVo comPlayerLandVo = CopyUtil.copy(comPlayerLand, ComPlayerLandVo.class);
+            } else if (comPlayerGoodsSimpleVo.getAmount().equals(comPlayerLand.getLeaseMultiple())) {
+                //数量一样清除背包数据
+                comPlayerGoodsService.delete(comPlayerGoodsSimpleVo.getGoodsId());
+            } else {
+                _beforeAmount = comPlayerGoodsSimpleVo.getAmount();
+                //否则减去土地倍数
+                comPlayerGoodsSimpleVo.setAmount(comPlayerGoodsSimpleVo.getAmount() - comPlayerLand.getLeaseMultiple());
+                ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
+                comPlayerGoodsService.save(comPlayerGoodsVo);
+            }
 
-        comPlayerLandService.save(comPlayerLandVo);
+            //todo 种植
+            comPlayerLand.setIsPlant(1);
+            //记录一个植物的种植id
+            comPlayerLand.setPlantId(seedId);
+            comPlayerLand.setPlantStart(new Date());
+            //种植天数,成熟天数
+            comPlayerLand.setPlantMature(comMallSeedVo.getMaturity());
+            //comPlayerLand.setLandDescribe();
+            ComPlayerLandVo comPlayerLandVo = CopyUtil.copy(comPlayerLand, ComPlayerLandVo.class);
+            comPlayerLandService.save(comPlayerLandVo);
 
-        ComPlayerLandAndPlantVo comPlayerLandAndPlantVo = CopyUtil.copy(comPlayerLand, ComPlayerLandAndPlantVo.class);
-        comPlayerLandAndPlantVo.setSeedInfo(comMallSeedVo);
-        return Result.of(comPlayerLandAndPlantVo);
+            //todo 记录一个种植 操作信息
+            ComPlayerLogVo _playerLogVo = new ComPlayerLogVo();
+            _playerLogVo.setUserId(userId);
+            _playerLogVo.setTId(comMallSeedVo.getId());
+            _playerLogVo.setTName(comMallSeedVo.getName());
+            _playerLogVo.setTType(1);//设置一个操作种子的id
+            _playerLogVo.setTAmount(comPlayerLand.getLeaseMultiple());
+            //交易后的数据
+            _playerLogVo.setBeforeAmount(_beforeAmount);
+            if (_beforeAmount.equals(0)) {
+                _playerLogVo.setAfterAmount(0);
+            } else {
+                _playerLogVo.setAfterAmount(_beforeAmount - comPlayerLand.getLeaseMultiple());
+            }
+            //_playerLogVo.setBeforeAmount(comPlayerGoodsSimpleVo.getAmount());
+            _playerLogVo.setLMultiple(comPlayerLand.getLeaseMultiple());
+            comPlayerLogService.save(_playerLogVo);
+
+            ComPlayerLandAndPlantVo comPlayerLandAndPlantVo = CopyUtil.copy(comPlayerLand, ComPlayerLandAndPlantVo.class);
+            comPlayerLandAndPlantVo.setSeedInfo(comMallSeedVo);
+
+            //todo 返回一个计算的天数和小时,解决跨时区的问题
+            //土地时间
+            //租赁的总时间 = 租赁时间 - 土地数据的创建时间
+            Long leaseAllMill = comPlayerLandAndPlantVo.getLeaseTime().getTime() - comPlayerLandAndPlantVo.getCreateTime().getTime();
+            Integer allDays = DateUtil.getDays(leaseAllMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseAllMill).intValue();
+            comPlayerLandAndPlantVo.setLeaseDays(allDays);
+            //租赁的剩余天数
+            Integer leaseDays = DateUtil.getDays(leaseDaysMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseDaysMill).intValue();
+            comPlayerLandAndPlantVo.setLeaseDaysRemaining(leaseDays);
+
+            //种子时间
+            //当前时间 > 种植时间+成熟期  = 说明可以收获了
+            //获取当前时间 - 植物的成熟期 = 收获时间,收获时间 >= 种植时间,即可以收获
+            Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
+            // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
+            long diff = comPlayerLandAndPlantVo.getPlantStart().getTime() - _harvestTime.getTime();
+            if (diff <= 0) {
+                //说明可以收获了
+                comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
+                comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
+            } else {
+                comPlayerLandAndPlantVo.setPlantDaysRemaining(DateUtil.getDays(diff).intValue());
+                comPlayerLandAndPlantVo.setPlantHoursRemaining(DateUtil.getHours(diff).intValue());
+            }
+            return Result.of(comPlayerLandAndPlantVo);
+
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
     }
 }

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

@@ -33,6 +33,14 @@ public class ComPlayerLandAndPlantVo implements Serializable {
 
     private Date plantStart;//种植开始时间
 
+    private Integer plantDaysRemaining;//返回一个剩余时间
+
+    private Integer plantHoursRemaining;//返回一个剩余小时时间
+
+    private Integer leaseDaysRemaining;//返回一个租赁的剩余时间
+
+    private Integer leaseDays;//返回一个租赁的全部天数
+
     private Integer plantMature;//成熟期
 
     private String landDescribe;//土地描述

+ 8 - 0
src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandSimpleVo.java

@@ -31,6 +31,14 @@ public class ComPlayerLandSimpleVo implements Serializable {
 
     private Date plantStart;//种植开始时间
 
+    private Integer plantDaysRemaining;//返回一个剩余时间
+
+    private Integer plantHoursRemaining;//返回一个剩余小时时间
+
+    private Integer leaseDaysRemaining;//返回一个租赁的剩余时间
+
+    private Integer leaseDays;//返回一个租赁的全部天数
+
     private Integer plantMature;//成熟期
 
     private String landDescribe;//土地描述

+ 15 - 0
src/main/java/com/td/boss/game/complayerlog/controller/ComPlayerLogController.java

@@ -0,0 +1,15 @@
+package com.td.boss.game.complayerlog.controller;
+
+import com.td.boss.common.controller.*;
+import com.td.boss.game.complayerlog.pojo.ComPlayerLog;
+import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
+import com.td.boss.game.complayerlog.service.ComPlayerLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/game/comPlayerLog/")
+public class ComPlayerLogController extends CommonController<ComPlayerLogVo, ComPlayerLog, Integer> {
+    @Autowired
+    private ComPlayerLogService comPlayerLogService;
+}

+ 36 - 0
src/main/java/com/td/boss/game/complayerlog/pojo/ComPlayerLog.java

@@ -0,0 +1,36 @@
+package com.td.boss.game.complayerlog.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_player_log")
+@Data
+public class ComPlayerLog implements Serializable {
+    @Id
+    //@GeneratedValue(strategy= GenerationType.IDENTITY)
+    private String id;//水果操作信息记录id
+
+    private String userId;//用户id
+
+    private Integer tId;//操作目标id,比如进入背包的是收获时候操作:水果
+
+    private Integer tType;//目标类型,操作对象的类型 0:水果
+
+    private String tName;//对象名字
+
+    private Integer tAmount;//交易数量,单笔交易记录限制百万单位级别
+
+    private Integer beforeAmount;//交易前的数量
+
+    private Integer afterAmount;//交易后的数量
+
+    private Integer lMultiple;//如果是操作土地相关,land 数据,记录一下倍数
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 9 - 0
src/main/java/com/td/boss/game/complayerlog/repository/ComPlayerLogRepository.java

@@ -0,0 +1,9 @@
+package com.td.boss.game.complayerlog.repository;
+
+import com.td.boss.common.repository.*;
+import com.td.boss.game.complayerlog.pojo.ComPlayerLog;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ComPlayerLogRepository extends CommonRepository<ComPlayerLog, Integer> {
+}

+ 8 - 0
src/main/java/com/td/boss/game/complayerlog/service/ComPlayerLogService.java

@@ -0,0 +1,8 @@
+package com.td.boss.game.complayerlog.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.complayerlog.pojo.ComPlayerLog;
+import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
+
+public interface ComPlayerLogService extends CommonService<ComPlayerLogVo, ComPlayerLog, Integer> {
+}

+ 21 - 0
src/main/java/com/td/boss/game/complayerlog/service/ComPlayerLogServiceImpl.java

@@ -0,0 +1,21 @@
+package com.td.boss.game.complayerlog.service;
+
+import com.td.boss.common.service.*;
+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 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;
+
+@Service
+@Transactional
+public class ComPlayerLogServiceImpl extends CommonServiceImpl<ComPlayerLogVo, ComPlayerLog, Integer> implements ComPlayerLogService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComPlayerLogRepository comPlayerLogRepository;
+}

+ 33 - 0
src/main/java/com/td/boss/game/complayerlog/vo/ComPlayerLogVo.java

@@ -0,0 +1,33 @@
+package com.td.boss.game.complayerlog.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComPlayerLogVo extends PageCondition implements Serializable {
+
+    private String id;//水果操作信息记录id
+
+    private String userId;//用户id
+
+
+    private Integer tId;//操作目标id,比如进入背包的是收获时候操作:水果
+
+    private Integer tType;//目标类型,操作对象的类型 0:水果
+
+    private String tName;//对象名字
+
+    private Integer tAmount;//交易数量,单笔交易记录限制百万单位级别
+
+    private Integer beforeAmount;//交易前的数量
+
+    private Integer afterAmount;//交易后的数量
+
+    private Integer lMultiple;//如果是操作土地相关,land 数据,记录一下倍数
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 47 - 0
src/main/java/com/td/boss/game/comsnbfreeze/controller/ComSnbFreezeController.java

@@ -23,6 +23,8 @@ import com.td.boss.game.comsnbfreeze.pojo.ComSnbFreeze;
 import com.td.boss.game.comsnbfreeze.vo.ComSnbFreezeSimpleVo;
 import com.td.boss.game.comsnbfreeze.vo.ComSnbFreezeVo;
 import com.td.boss.game.comsnbfreeze.service.ComSnbFreezeService;
+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.CopyUtil;
@@ -62,6 +64,8 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
     @Autowired
     private ComConfigLandService comConfigLandService;
 
+    @Autowired
+    private ComSnbTranService comSnbTranService;
 
     /**
      * 获取用户神农呗 snb,前端用户调用
@@ -127,6 +131,27 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
         entityVo.setSnbDescribe("SNB兑换CNT时候添加的冻结数据");
         Result<ComSnbFreezeVo> result = comSnbFreezeService.save(entityVo);
         map.put("snbFreeze", CopyUtil.copy(result.getData(), ComSnbFreezeSimpleVo.class));
+
+
+        /**
+         * todo 冻结的snb数据记录
+         */
+        ComSnbTranVo _snbTran = new ComSnbTranVo();
+        //记录兑换id
+        _snbTran.setTranId(entityVo.getId());
+        _snbTran.setUserId(id.toString());
+        _snbTran.setTranName("冻结操作");
+        _snbTran.setTranType(1);
+        _snbTran.setTranAmount(snbAmount); //此数量会操作背包记录
+        _snbTran.setTranPrice(snbAmount);
+        //"出售果实价格:" + comFruitVo.getPriceSnb() + ",数量:" + amount
+        _snbTran.setTranDescribe("兑换cnt时候冻结的用户数据");
+        _snbTran.setIsAdd(0);//减少
+        _snbTran.setBeforeSnb(comUsersVo.getSnb());
+        _snbTran.setTranSnb(snbAmount);
+        _snbTran.setAfterSnb(_snb);
+        comSnbTranService.save(_snbTran);
+
         return Result.of(map);
     }
 
@@ -183,9 +208,31 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
             comSnbFreezeVo.setIsSuccess(2);
             map.put("msg", "交易失败,返回SNB给用户成功");
             comSnbFreezeService.save(comSnbFreezeVo);
+
+
+            /**
+             * todo 解冻交易失败 snb数据记录
+             */
+            ComSnbTranVo _snbTran = new ComSnbTranVo();
+            //记录兑换id
+            _snbTran.setTranId(comSnbFreezeVo.getId());
+            _snbTran.setUserId(comSnbFreezeVo.getUserId());
+            _snbTran.setTranName("解冻操作");
+            _snbTran.setTranType(1);
+            _snbTran.setTranAmount(comSnbFreezeVo.getSnb()); //此数量会操作背包记录
+            _snbTran.setTranPrice(comSnbFreezeVo.getSnb());
+            //"出售果实价格:" + comFruitVo.getPriceSnb() + ",数量:" + amount
+            _snbTran.setTranDescribe("兑换cnt失败时候解冻的用户数据");
+            _snbTran.setIsAdd(1);//增加
+            _snbTran.setBeforeSnb(comUsersVo.getSnb());
+            _snbTran.setTranSnb(comSnbFreezeVo.getSnb());
+            _snbTran.setAfterSnb(_snb);
+            comSnbTranService.save(_snbTran);
         }
+
         map.put("isSuccess", comSnbFreezeVo.getIsSuccess());
         map.put("freeze", comSnbFreezeVo.getFreeze());
+
         return Result.of(map);
     }
 

+ 51 - 0
src/main/java/com/td/boss/game/comsnbtran/controller/ComSnbTranController.java

@@ -0,0 +1,51 @@
+package com.td.boss.game.comsnbtran.controller;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.td.boss.common.controller.*;
+import com.td.boss.common.pojo.PageInfo;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.game.comsnbtran.pojo.ComSnbTran;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
+import com.td.boss.game.comsnbtran.service.ComSnbTranService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/game/comSnbTran/")
+public class ComSnbTranController extends CommonController<ComSnbTranVo, ComSnbTran, String> {
+    @Autowired
+    private ComSnbTranService comSnbTranService;
+
+
+    /**
+     * 获取snb 资产明细
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("getList")
+    public Result<Page<ComSnbTran>> getLandFunction(
+            @RequestParam(value = "userId") String userId,
+            @RequestParam(value = "page") Integer page,
+            @RequestParam(value = "limit") Integer limit
+    ) {
+        //ComSnbTranVo comSnbTranVo = new ComSnbTranVo();
+        //comSnbTranVo.setUserId(userId);
+        //comSnbTranVo.setPage(page);
+        //comSnbTranVo.setRows(limit);
+        PageRequest pageRequest = PageRequest.of(page-1, limit, Sort.by(Sort.Direction.DESC,"createTime"));
+//            进行查询,查询后的对象封装到page里
+        Page<ComSnbTran> backPage = comSnbTranService.findAllByUserId(userId,pageRequest);
+        //return comSnbTranService.page(comSnbTranVo);
+        return Result.of(backPage);
+    }
+
+    private static String translate1(String fieldName){
+        return new PropertyNamingStrategy.SnakeCaseStrategy().translate(fieldName).toLowerCase();
+    }
+}

+ 43 - 0
src/main/java/com/td/boss/game/comsnbtran/pojo/ComSnbTran.java

@@ -0,0 +1,43 @@
+package com.td.boss.game.comsnbtran.pojo;
+
+import com.td.boss.common.pojo.PageCondition;
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_snb_tran")
+@Data
+public class ComSnbTran implements Serializable {
+    @Id
+    //@GeneratedValue(strategy= GenerationType.IDENTITY)
+    private String id;//
+
+    private String userId;//用户id
+
+    private String tranId;//操作对象的id,不唯一
+
+    private String tranName;//交易的类型名字
+
+    private Integer tranType;//交易类型,区分是什么交易。0:是出售果实,
+
+    private Integer tranAmount;//交易数量,上限10个int长度
+
+    private Integer tranPrice;//物品的交易价格,单价
+
+    private String tranDescribe;//交易描述
+
+    private Integer isAdd;//交易是增加还是减少,0:减少,1:是增加
+
+    private Integer beforeSnb;//交易之前的snb
+
+    private Integer tranSnb;//交易的snb
+
+    private Integer afterSnb;//交易完成后的snb
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 14 - 0
src/main/java/com/td/boss/game/comsnbtran/repository/ComSnbTranRepository.java

@@ -0,0 +1,14 @@
+package com.td.boss.game.comsnbtran.repository;
+
+import com.td.boss.common.repository.*;
+import com.td.boss.game.comsnbtran.pojo.ComSnbTran;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ComSnbTranRepository extends CommonRepository<ComSnbTran, String> {
+
+    Page<ComSnbTran> findAllByUserId(String userId, Pageable pageable);
+}

+ 12 - 0
src/main/java/com/td/boss/game/comsnbtran/service/ComSnbTranService.java

@@ -0,0 +1,12 @@
+package com.td.boss.game.comsnbtran.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comsnbtran.pojo.ComSnbTran;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+
+public interface ComSnbTranService extends CommonService<ComSnbTranVo, ComSnbTran, String> {
+    Page<ComSnbTran> findAllByUserId(String userId, Pageable pageable);
+}

+ 30 - 0
src/main/java/com/td/boss/game/comsnbtran/service/ComSnbTranServiceImpl.java

@@ -0,0 +1,30 @@
+package com.td.boss.game.comsnbtran.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comsnbtran.pojo.ComSnbTran;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
+import com.td.boss.game.comsnbtran.repository.ComSnbTranRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+@Service
+@Transactional
+public class ComSnbTranServiceImpl extends CommonServiceImpl<ComSnbTranVo, ComSnbTran, String> implements ComSnbTranService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComSnbTranRepository comSnbTranRepository;
+
+
+    @Override
+    public Page<ComSnbTran> findAllByUserId(String userId, Pageable pageable) {
+        return comSnbTranRepository.findAllByUserId(userId,pageable);
+    }
+}

+ 38 - 0
src/main/java/com/td/boss/game/comsnbtran/vo/ComSnbTranVo.java

@@ -0,0 +1,38 @@
+package com.td.boss.game.comsnbtran.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComSnbTranVo extends PageCondition implements Serializable {
+
+    private String id;//
+
+    private String userId;//用户id
+
+    private String tranId;//操作对象的id,不唯一
+
+    private String tranName;//交易的类型名字
+
+    private Integer tranType;//交易类型,区分是什么交易。0:是出售果实,
+
+    private Integer tranAmount;//交易数量,上限10个int长度
+
+    private Integer tranPrice;//物品的交易价格,单价
+
+    private String tranDescribe;//交易描述
+
+    private Integer isAdd;//交易是增加还是减少,0:减少,1:是增加
+
+    private Integer beforeSnb;//交易之前的snb
+
+    private Integer tranSnb;//交易的snb
+
+    private Integer afterSnb;//交易完成后的snb
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 17 - 0
src/main/java/com/td/boss/game/comusers/controller/ComUsersController.java

@@ -248,6 +248,23 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
         return Result.of(map);
     }
 
+    /**
+     * 获取用户的snb
+     * @param userId
+     * @return
+     */
+    @GetMapping("getUserSnb")
+    public Result<Map> getUserSnbFunction(@RequestParam(value = "userId") String userId) {
+        Map map = new HashMap();
+        ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
+        if (comUsersVo == null) {
+            return Result.of(null, false, ResultEnum.USER_DOES_NOT_EXIST.getMessage(), ResultEnum.USER_DOES_NOT_EXIST.getCode());
+        }
+        map.put("SNB", comUsersVo.getSnb());
+        map.put("address", comUsersVo.getAddress());
+        return Result.of(map);
+    }
+
 
     @PostMapping("setUserInfo")
     public Result<Map> setUserInfo(@RequestParam(value = "userId") String userId,

+ 3 - 2
src/main/java/com/td/boss/util/CodeDOM.java

@@ -531,8 +531,9 @@ public class CodeDOM {
     public static void main(String[] args) {
        // String[] tables = {"sys_user","sys_menu","sys_authority","sys_user_menu","sys_user_authority","sys_shortcut_menu","sys_setting"};
        // String[] tables = {"com_player_goods","com_players","com_users","com_rewards"};
-       // String[] tables = {"com_wallet","com_cnt_order","com_mall_seed","com_player_goods","com_player_land","com_config_land"};
-        String[] tables = {"com_fruit"};
+       // String[] tables = {"com_wallet","com_cnt_order","com_mall_seed","com_player_goods","com_player_land","com_config_land","com_fruit","com_snb_tran"};
+       // "com_player_log"
+        String[] tables = {"com_explain_land"};
         for (String table : tables) {
             String msg = new CodeDOM(table).create();
             System.out.println(msg);

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

@@ -140,4 +140,20 @@ public class DateUtil {
         String mMdd = new SimpleDateFormat("MMdd").format(date);
         return "0101".equals(mMdd) || "0401".equals(mMdd) || "0701".equals(mMdd) || "1001".equals(mMdd);
     }
+
+
+    //long diffSeconds = diff / 1000 % 60;
+    //long diffMinutes = diff / (60 * 1000) % 60;
+    /**
+     * 获取毫秒时间 - 天
+     */
+    public static Long getDays(Long millTime){
+        return millTime / (24 * 60 * 60 * 1000);
+    }
+    /**
+     * 获取毫秒时间 - 时
+     */
+    public static Long getHours(Long millTime){
+        return millTime / (60 * 60 * 1000) % 24;
+    }
 }