Quellcode durchsuchen

1.修改上线版本

slambb vor 4 Jahren
Ursprung
Commit
6ca85497c2
59 geänderte Dateien mit 2418 neuen und 127 gelöschten Zeilen
  1. 24 8
      src/main/java/com/td/boss/config/enums/ResultEnum.java
  2. 5 2
      src/main/java/com/td/boss/filter/gameFilter.java
  3. 15 0
      src/main/java/com/td/boss/game/comcntorder/controller/ComCntOrderController.java
  4. 33 0
      src/main/java/com/td/boss/game/comcntorder/pojo/ComCntOrder.java
  5. 14 0
      src/main/java/com/td/boss/game/comcntorder/repository/ComCntOrderRepository.java
  6. 12 0
      src/main/java/com/td/boss/game/comcntorder/service/ComCntOrderService.java
  7. 34 0
      src/main/java/com/td/boss/game/comcntorder/service/ComCntOrderServiceImpl.java
  8. 28 0
      src/main/java/com/td/boss/game/comcntorder/vo/ComCntOrderVo.java
  9. 31 0
      src/main/java/com/td/boss/game/comconfigland/controller/ComConfigLandController.java
  10. 48 0
      src/main/java/com/td/boss/game/comconfigland/pojo/ComConfigLand.java
  11. 9 0
      src/main/java/com/td/boss/game/comconfigland/repository/ComConfigLandRepository.java
  12. 9 0
      src/main/java/com/td/boss/game/comconfigland/service/ComConfigLandService.java
  13. 27 0
      src/main/java/com/td/boss/game/comconfigland/service/ComConfigLandServiceImpl.java
  14. 43 0
      src/main/java/com/td/boss/game/comconfigland/vo/ComConfigLandVo.java
  15. 15 0
      src/main/java/com/td/boss/game/comfruit/controller/ComFruitController.java
  16. 30 0
      src/main/java/com/td/boss/game/comfruit/pojo/ComFruit.java
  17. 9 0
      src/main/java/com/td/boss/game/comfruit/repository/ComFruitRepository.java
  18. 9 0
      src/main/java/com/td/boss/game/comfruit/service/ComFruitService.java
  19. 33 0
      src/main/java/com/td/boss/game/comfruit/service/ComFruitServiceImpl.java
  20. 28 0
      src/main/java/com/td/boss/game/comfruit/vo/ComFruitAmountVo.java
  21. 25 0
      src/main/java/com/td/boss/game/comfruit/vo/ComFruitVo.java
  22. 96 0
      src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java
  23. 50 0
      src/main/java/com/td/boss/game/commallseed/pojo/ComMallSeed.java
  24. 9 0
      src/main/java/com/td/boss/game/commallseed/repository/ComMallSeedRepository.java
  25. 10 0
      src/main/java/com/td/boss/game/commallseed/service/ComMallSeedService.java
  26. 35 0
      src/main/java/com/td/boss/game/commallseed/service/ComMallSeedServiceImpl.java
  27. 45 0
      src/main/java/com/td/boss/game/commallseed/vo/ComMallSeedVo.java
  28. 328 0
      src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java
  29. 27 0
      src/main/java/com/td/boss/game/complayergoods/pojo/ComPlayerGoods.java
  30. 18 0
      src/main/java/com/td/boss/game/complayergoods/repository/ComPlayerGoodsRepository.java
  31. 22 0
      src/main/java/com/td/boss/game/complayergoods/service/ComPlayerGoodsService.java
  32. 37 0
      src/main/java/com/td/boss/game/complayergoods/service/ComPlayerGoodsServiceImpl.java
  33. 24 0
      src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsSimpleVo.java
  34. 23 0
      src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsVo.java
  35. 152 0
      src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java
  36. 46 0
      src/main/java/com/td/boss/game/complayerland/pojo/ComPlayerLand.java
  37. 20 0
      src/main/java/com/td/boss/game/complayerland/repository/ComPlayerLandRepository.java
  38. 22 0
      src/main/java/com/td/boss/game/complayerland/service/ComPlayerLandService.java
  39. 56 0
      src/main/java/com/td/boss/game/complayerland/service/ComPlayerLandServiceImpl.java
  40. 45 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandAndPlantVo.java
  41. 43 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandSimpleVo.java
  42. 43 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandVo.java
  43. 415 0
      src/main/java/com/td/boss/game/comsnbfreeze/controller/ComSnbFreezeController.java
  44. 29 0
      src/main/java/com/td/boss/game/comsnbfreeze/pojo/ComSnbFreeze.java
  45. 16 0
      src/main/java/com/td/boss/game/comsnbfreeze/repository/ComSnbFreezeRepository.java
  46. 22 0
      src/main/java/com/td/boss/game/comsnbfreeze/service/ComSnbFreezeService.java
  47. 53 0
      src/main/java/com/td/boss/game/comsnbfreeze/service/ComSnbFreezeServiceImpl.java
  48. 26 0
      src/main/java/com/td/boss/game/comsnbfreeze/vo/ComSnbFreezeSimpleVo.java
  49. 27 0
      src/main/java/com/td/boss/game/comsnbfreeze/vo/ComSnbFreezeVo.java
  50. 105 110
      src/main/java/com/td/boss/game/comusers/controller/ComUsersController.java
  51. 1 1
      src/main/java/com/td/boss/game/comusers/pojo/ComUsers.java
  52. 2 1
      src/main/java/com/td/boss/game/comusers/repository/ComUsersRepository.java
  53. 3 0
      src/main/java/com/td/boss/game/comusers/service/ComUsersService.java
  54. 11 0
      src/main/java/com/td/boss/game/comusers/service/ComUsersServiceImpl.java
  55. 20 0
      src/main/java/com/td/boss/game/comusers/vo/ComUsersSimpleVo.java
  56. 2 0
      src/main/java/com/td/boss/game/comusers/vo/ComUsersVo.java
  57. 6 5
      src/main/java/com/td/boss/util/CodeDOM.java
  58. 17 0
      src/main/java/com/td/boss/util/DateUtil.java
  59. 31 0
      src/main/java/com/td/boss/util/MD5Util.java

+ 24 - 8
src/main/java/com/td/boss/config/enums/ResultEnum.java

@@ -20,6 +20,10 @@ public enum ResultEnum {
     //用户数据
     USER_DOES_NOT_EXIST(400,"不能存在用户信息!"),
     USER_ENERGY_IS_INSUFFICIENT(401,"用户能量不足!"),
+    USER_VERIFICATION_ERROR(402,"签名校验失败"),
+
+    USER_NOT_ADDRESS(403,"用户地址不存在!"),
+
     //角色数据
     PLAYER_DOES_NOT_EXIST(500,"不能存在角色信息!"),
     PLAYER_DOES_NOT_ATTRIBUTES(501,"battle player 数据不存在!"),
@@ -31,16 +35,28 @@ public enum ResultEnum {
     PLAYER_GOODS_NOT_CHEST_TYPE(514,"不是宝箱类型对象"),
     PLAYER_GOODS_WEAR_NUM_ERROR(515,"请输入对应的参数,isWear:0或者1"),
     PLAYER_GOODS_NO_QUIP_REQUIRED(516,"不用获取多余装备"),
-    //boss数据
-    BOSS_DOES_NOT_EXIST(600,"不存在boss信息!"),
-    BOSS_HEALTH_IS_ZERO(601,"boss血量为零!"),
-    BOSS_NOT_ATTRIBUTES(602,"bossId对应的属性不存在!"),
-    BOSS_BATTLE_EXPIRED(605,"boss战斗已到期"),
 
-    BOSS_DESCRIBE_LIST_ZERO(603,"bosses 描述的表格数据不存在!"),
-    BOSS_AND_PLAYERS_IN_BATTLE(604,"其他玩家正在战斗中.."),
-    BOSS_BATTLE_EXPIRE(605,"战斗时间已结束!");
+    PLAYER_GOODS_SEEDS_AMOUNT_ERROR(517,"土地消耗种子数量不足"),
+
+    //钱包数据
+    WALLET_CNT_PLAY_ERROR(601,"钱包CNT支付参数数据错误!"),
+    WALLET_SNB_INSUFFICIENT_QUANTITY(602,"snb不足以支付!"),
+    WALLET_SNB_SUCCESS_NOT_ZERO(603,"snb不可操作"),
+    WALLET_SNB_SIGN_ERROR(604,"钱包SNB参数签名错误!"),
 
+    //土地数据
+    LAND_DATA_ERROR(701,"土地数据不能初始化!"),
+    LAND_NOT_LEASE(702,"土地未租赁!"),
+    LAND_IS_LEASE(703,"土地已租赁!"),
+    LAND_IS_PLANT(704,"土地已种植!"),
+    LAND_NOT_PLANT(705,"土地未种植!"),
+    //种子数据不能存在
+    SEED_DATA_ERROR(801,"种子数据不存在!"),
+    FRUIT_DATA_ERROR(802,"果实数据不存在!"),
+    FRUIT_AMOUNT_ERROR(803,"果实数据出错!"),
+    FRUIT_SEND_SELF(804,"不能赠送给自己!"),
+    SEED_DATE_ERROR(805,"未到成熟时间!"),
+    SEED_AMOUNT_ERROR(806,"背包数量不对!"),
     ;
     private Integer code;
 

+ 5 - 2
src/main/java/com/td/boss/filter/gameFilter.java

@@ -45,7 +45,7 @@ public class gameFilter implements Filter {
         response.setHeader("Access-Control-Max-Age", "3600");
         response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept , Authorization");
 
-        log.info("********进入过滤器********");
+        log.info("********进入GameFilter过滤器********");
         HttpServletRequest req = (HttpServletRequest) servletRequest;
         //String method = req.getMethod();
         //if (method.equals("OPTIONS")) {
@@ -61,7 +61,10 @@ public class gameFilter implements Filter {
                // || path.indexOf("publicKeyAndSys") > -1
                // || path.indexOf("playback")>-1
                 || path.indexOf("game_websocket") > -1 // todo 暂时放行
-
+                //这里三个接口给DApp后台调用
+                || path.indexOf("getSNBAndFreeze") >-1
+                || path.indexOf("setSNBAndUnfreeze") >-1
+                || path.indexOf("cntPlayback") >-1
            ) {
             //登录情况直接放行
             filterChain.doFilter(servletRequest, response);

+ 15 - 0
src/main/java/com/td/boss/game/comcntorder/controller/ComCntOrderController.java

@@ -0,0 +1,15 @@
+package com.td.boss.game.comcntorder.controller;
+
+import com.td.boss.common.controller.*;
+import com.td.boss.game.comcntorder.pojo.ComCntOrder;
+import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
+import com.td.boss.game.comcntorder.service.ComCntOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/game/comCntOrder/")
+public class ComCntOrderController extends CommonController<ComCntOrderVo, ComCntOrder, String> {
+    @Autowired
+    private ComCntOrderService comCntOrderService;
+}

+ 33 - 0
src/main/java/com/td/boss/game/comcntorder/pojo/ComCntOrder.java

@@ -0,0 +1,33 @@
+package com.td.boss.game.comcntorder.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_cnt_order")
+@Data
+public class ComCntOrder implements Serializable {
+    @Id
+    private String id;//
+
+    private String userId;//
+
+    private String address;//
+
+    private Integer payType;//
+
+    private String payAmount;//
+
+    private String itemType;
+
+    private String txHash;//
+
+    private String cntDescribe;
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 14 - 0
src/main/java/com/td/boss/game/comcntorder/repository/ComCntOrderRepository.java

@@ -0,0 +1,14 @@
+package com.td.boss.game.comcntorder.repository;
+
+import com.td.boss.common.repository.*;
+import com.td.boss.game.comcntorder.pojo.ComCntOrder;
+import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface ComCntOrderRepository extends CommonRepository<ComCntOrder, String> {
+
+    Optional<ComCntOrder> findByTxHash(String tx);
+}

+ 12 - 0
src/main/java/com/td/boss/game/comcntorder/service/ComCntOrderService.java

@@ -0,0 +1,12 @@
+package com.td.boss.game.comcntorder.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comcntorder.pojo.ComCntOrder;
+import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
+
+import java.util.Optional;
+
+public interface ComCntOrderService extends CommonService<ComCntOrderVo, ComCntOrder, String> {
+
+    ComCntOrderVo findByTx(String tx);
+}

+ 34 - 0
src/main/java/com/td/boss/game/comcntorder/service/ComCntOrderServiceImpl.java

@@ -0,0 +1,34 @@
+package com.td.boss.game.comcntorder.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comcntorder.pojo.ComCntOrder;
+import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
+import com.td.boss.game.comcntorder.repository.ComCntOrderRepository;
+import com.td.boss.util.CopyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class ComCntOrderServiceImpl extends CommonServiceImpl<ComCntOrderVo, ComCntOrder, String> implements ComCntOrderService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComCntOrderRepository comCntOrderRepository;
+
+
+    @Override
+    public ComCntOrderVo findByTx(String tx) {
+        Optional<ComCntOrder> comCntOrder =  comCntOrderRepository.findByTxHash(tx);
+        if(comCntOrder.orElse(null) == null){
+            return null;
+        }else{
+            return CopyUtil.copy(comCntOrder.get(), ComCntOrderVo.class);
+        }
+    }
+}

+ 28 - 0
src/main/java/com/td/boss/game/comcntorder/vo/ComCntOrderVo.java

@@ -0,0 +1,28 @@
+package com.td.boss.game.comcntorder.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComCntOrderVo extends PageCondition implements Serializable {
+    private String id;//
+
+    private String userId;//
+
+    private String address;//
+
+    private Integer payType;//
+
+    private String payAmount;//
+
+    private String itemType;
+
+    private String txHash;//
+
+    private String cntDescribe;
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+}

+ 31 - 0
src/main/java/com/td/boss/game/comconfigland/controller/ComConfigLandController.java

@@ -0,0 +1,31 @@
+package com.td.boss.game.comconfigland.controller;
+
+import com.td.boss.common.controller.*;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.game.comconfigland.pojo.ComConfigLand;
+import com.td.boss.game.comconfigland.vo.ComConfigLandVo;
+import com.td.boss.game.comconfigland.service.ComConfigLandService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/game/configLand/")
+public class ComConfigLandController extends CommonController<ComConfigLandVo, ComConfigLand, Integer> {
+    @Autowired
+    private ComConfigLandService comConfigLandService;
+
+
+    /**
+     * 获取土地数据
+     * @param userId
+     * @return
+     */
+    @GetMapping("getList")
+    public Result<List<ComConfigLandVo>> getSNBFunction(@RequestParam(value = "userId") String userId) {
+        ComConfigLandVo comConfigLandVo = new ComConfigLandVo();
+        Result result = comConfigLandService.list(comConfigLandVo);
+        return result;
+    }
+}

+ 48 - 0
src/main/java/com/td/boss/game/comconfigland/pojo/ComConfigLand.java

@@ -0,0 +1,48 @@
+package com.td.boss.game.comconfigland.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_config_land")
+@Data
+public class ComConfigLand implements Serializable {
+    @Id
+    @GeneratedValue(strategy= GenerationType.IDENTITY)
+    private Integer id;//
+
+    private String name;//
+
+    private Integer posX;//
+
+    private Integer posY;//
+
+    private Integer sizeX;//
+
+    private Integer sizeY;//
+
+    private Integer isInit;//是否在游戏中初始化租赁等数据
+
+    private Integer initMultiple;//初始化土地的倍数
+
+    private Integer isLease;//是否租凭
+
+    private Date leaseTime;//租凭时间
+
+    private Double leaseMultiple;//租赁的倍数
+
+    private Integer isPlant;//是否种植
+
+    private Date plantStart;//种植开始时间
+
+    private Integer plantMature;//成熟期
+
+    private String landDescribe;//土地描述
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 9 - 0
src/main/java/com/td/boss/game/comconfigland/repository/ComConfigLandRepository.java

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

+ 9 - 0
src/main/java/com/td/boss/game/comconfigland/service/ComConfigLandService.java

@@ -0,0 +1,9 @@
+package com.td.boss.game.comconfigland.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comconfigland.pojo.ComConfigLand;
+import com.td.boss.game.comconfigland.vo.ComConfigLandVo;
+
+public interface ComConfigLandService extends CommonService<ComConfigLandVo, ComConfigLand, Integer> {
+    ComConfigLand findById(Integer id);
+}

+ 27 - 0
src/main/java/com/td/boss/game/comconfigland/service/ComConfigLandServiceImpl.java

@@ -0,0 +1,27 @@
+package com.td.boss.game.comconfigland.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comconfigland.pojo.ComConfigLand;
+import com.td.boss.game.comconfigland.vo.ComConfigLandVo;
+import com.td.boss.game.comconfigland.repository.ComConfigLandRepository;
+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 ComConfigLandServiceImpl extends CommonServiceImpl<ComConfigLandVo, ComConfigLand, Integer> implements ComConfigLandService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComConfigLandRepository comConfigLandRepository;
+
+
+    @Override
+    public ComConfigLand findById(Integer id) {
+        return comConfigLandRepository.findById(id).orElse(null);
+    }
+}

+ 43 - 0
src/main/java/com/td/boss/game/comconfigland/vo/ComConfigLandVo.java

@@ -0,0 +1,43 @@
+package com.td.boss.game.comconfigland.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComConfigLandVo  implements Serializable { //extends PageCondition
+    private Integer id;//
+
+    private String name;//
+
+    private Integer posX;//
+
+    private Integer posY;//
+
+    private Integer sizeX;//
+
+    private Integer sizeY;//
+
+    private Integer isInit;//是否在游戏中初始化租赁等数据
+
+    private Integer initMultiple;//初始化土地的倍数
+
+    private Integer isLease;//是否租凭
+
+    private Date leaseTime;//租凭时间
+
+    private Double leaseMultiple;//租赁的倍数
+
+    private Integer isPlant;//是否种植
+
+    private Date plantStart;//种植开始时间
+
+    private Integer plantMature;//成熟期
+
+    private String landDescribe;//土地描述
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 15 - 0
src/main/java/com/td/boss/game/comfruit/controller/ComFruitController.java

@@ -0,0 +1,15 @@
+package com.td.boss.game.comfruit.controller;
+
+import com.td.boss.common.controller.*;
+import com.td.boss.game.comfruit.pojo.ComFruit;
+import com.td.boss.game.comfruit.vo.ComFruitVo;
+import com.td.boss.game.comfruit.service.ComFruitService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/game/comFruit/")
+public class ComFruitController extends CommonController<ComFruitVo, ComFruit, Integer> {
+    @Autowired
+    private ComFruitService comFruitService;
+}

+ 30 - 0
src/main/java/com/td/boss/game/comfruit/pojo/ComFruit.java

@@ -0,0 +1,30 @@
+package com.td.boss.game.comfruit.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_fruit")
+@Data
+public class ComFruit implements Serializable {
+    @Id
+    @GeneratedValue(strategy= GenerationType.IDENTITY)
+    private Integer id;//
+
+    private String picture;//图片名字,前端存储
+
+    private String name;//
+
+    private Integer priceSnb;//
+
+    private Integer priceCnt;//
+
+    private String fruitDescribe;
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 9 - 0
src/main/java/com/td/boss/game/comfruit/repository/ComFruitRepository.java

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

+ 9 - 0
src/main/java/com/td/boss/game/comfruit/service/ComFruitService.java

@@ -0,0 +1,9 @@
+package com.td.boss.game.comfruit.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comfruit.pojo.ComFruit;
+import com.td.boss.game.comfruit.vo.ComFruitVo;
+
+public interface ComFruitService extends CommonService<ComFruitVo, ComFruit, Integer> {
+    ComFruitVo findById(Integer id);
+}

+ 33 - 0
src/main/java/com/td/boss/game/comfruit/service/ComFruitServiceImpl.java

@@ -0,0 +1,33 @@
+package com.td.boss.game.comfruit.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comfruit.pojo.ComFruit;
+import com.td.boss.game.comfruit.vo.ComFruitVo;
+import com.td.boss.game.comfruit.repository.ComFruitRepository;
+import com.td.boss.util.CopyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class ComFruitServiceImpl extends CommonServiceImpl<ComFruitVo, ComFruit, Integer> implements ComFruitService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComFruitRepository comFruitRepository;
+
+    @Override
+    public ComFruitVo findById(Integer id) {
+        Optional<ComFruit> comMallSeed = comFruitRepository.findById(id);
+        if(comMallSeed.orElse(null) == null){
+            return null;
+        }else{
+            return CopyUtil.copy(comMallSeed.get(), ComFruitVo.class);
+        }
+    }
+}

+ 28 - 0
src/main/java/com/td/boss/game/comfruit/vo/ComFruitAmountVo.java

@@ -0,0 +1,28 @@
+package com.td.boss.game.comfruit.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComFruitAmountVo implements Serializable {
+    private Integer id;//
+
+    private String picture;//图片名字,前端存储
+
+    private String name;//
+
+    private Integer priceSnb;//
+
+    private Integer priceCnt;//
+
+    private String fruitDescribe;
+
+    private Integer amount;//这里添加一个数量,但是数据库是没有的,以背包为主
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 25 - 0
src/main/java/com/td/boss/game/comfruit/vo/ComFruitVo.java

@@ -0,0 +1,25 @@
+package com.td.boss.game.comfruit.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComFruitVo implements Serializable {
+    private Integer id;//
+
+    private String picture;//图片名字,前端存储
+
+    private String name;//
+
+    private Integer priceSnb;//
+
+    private Integer priceCnt;//
+
+    private String fruitDescribe;
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 96 - 0
src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java

@@ -0,0 +1,96 @@
+package com.td.boss.game.commallseed.controller;
+
+import com.td.boss.common.controller.*;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.game.commallseed.pojo.ComMallSeed;
+import com.td.boss.game.commallseed.service.ComMallSeedService;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+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.util.CopyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/game/comMallSeed/")
+public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMallSeed, Integer> {
+    @Autowired
+    private ComMallSeedService comMallSeedService;
+
+    @Autowired
+    private ComPlayerGoodsService comPlayerGoodsService;
+    /**
+     * 获取商城种子
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("getMallSeed")
+    public Result<List<ComMallSeedVo>> getSNBFunction(@RequestParam(value = "userId") String userId) {
+        //log.info(userId);
+        ComMallSeedVo comMallSeedVo = new ComMallSeedVo();
+        Result result = comMallSeedService.list(comMallSeedVo);
+        return result;
+    }
+
+    /**
+     * 神农呗购买种子
+     *
+     * @param userId
+     * @return
+     */
+    @PostMapping("snbBuySeeds")
+    @ResponseBody
+    public Result<Map> snbBuySeedsFunction(
+            @RequestParam(value = "userId") String userId,
+            @RequestParam(value = "payAmount") Integer payAmount,
+            @RequestParam(value = "seedId") Integer seedId
+    ) {
+
+        // 处理itemType,种子id ,获取种子类型,设置种子不同的数据
+        Integer itemType = seedId;
+        ComMallSeedVo seedVo = comMallSeedService.findById(seedId);
+        Map map = new HashMap();
+        if (seedVo == null) {
+
+            map.put("msg", "非法操作:所修改的种子不存在服务器中!");
+            return Result.of(map);
+        }
+
+        if (!seedVo.getPriceCnt().equals(payAmount) || payAmount % seedVo.getPriceCnt() != 0) {
+            //如果价格 不和种子相当,也不是种子的倍数
+            map.put("msg", "订单非法操作,已记录相关信息!");
+            return Result.of(map);
+        }
+        //合法操作记录到仓库中
+        ComPlayerGoods entityVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, itemType, 0);
+
+        //这里计算一个购买种子的数量,用种子除去单价
+        int _paySeedAmount = (int) (payAmount % seedVo.getPriceCnt());
+        if (entityVo == null) {
+            //创建一个新种子
+            entityVo = new ComPlayerGoods();
+            entityVo.setGoodsIndex(itemType);
+            entityVo.setGoodsType(0);
+            entityVo.setAmount(_paySeedAmount);
+            entityVo.setName(seedVo.getName());
+            entityVo.setPictureName(seedVo.getPicture());
+        } else {
+            Integer _amount = entityVo.getAmount() + _paySeedAmount;
+            entityVo.setAmount(_amount);
+        }
+        /** 购买成功后,记录到仓库中*/
+        ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(entityVo, ComPlayerGoodsVo.class);
+        comPlayerGoodsService.save(comPlayerGoodsVo);
+        map.put("seed", CopyUtil.copy(entityVo, ComPlayerGoodsSimpleVo.class));
+        return Result.of(map);
+    }
+
+
+}

+ 50 - 0
src/main/java/com/td/boss/game/commallseed/pojo/ComMallSeed.java

@@ -0,0 +1,50 @@
+package com.td.boss.game.commallseed.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_mall_seed")
+@Data
+public class ComMallSeed implements Serializable {
+    @Id
+    private Integer id;//
+
+    private String mallType;//商城类型,默认是种子0
+
+    private String picture;
+
+    private String name;//
+
+    private Integer maturity;//
+
+    private Integer planting;//
+
+    private Integer harvestId;
+    private Integer harvestQuantity;//
+
+    private Integer harvestCount;//
+
+    private Integer harvest1;//
+    private Integer harvest2;//
+    private Integer harvest3;//
+
+    private String harvestName;//
+
+    private Integer priceSnb;//
+
+    private Integer priceCnt;//
+
+    private Integer amount;
+
+    private String seedDescribe;//
+
+    private Integer withered;//
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 9 - 0
src/main/java/com/td/boss/game/commallseed/repository/ComMallSeedRepository.java

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

+ 10 - 0
src/main/java/com/td/boss/game/commallseed/service/ComMallSeedService.java

@@ -0,0 +1,10 @@
+package com.td.boss.game.commallseed.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.commallseed.pojo.ComMallSeed;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+
+public interface ComMallSeedService extends CommonService<ComMallSeedVo, ComMallSeed, Integer> {
+
+    ComMallSeedVo findById(Integer id);
+}

+ 35 - 0
src/main/java/com/td/boss/game/commallseed/service/ComMallSeedServiceImpl.java

@@ -0,0 +1,35 @@
+package com.td.boss.game.commallseed.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.commallseed.pojo.ComMallSeed;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import com.td.boss.game.commallseed.repository.ComMallSeedRepository;
+import com.td.boss.util.CopyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class ComMallSeedServiceImpl extends CommonServiceImpl<ComMallSeedVo, ComMallSeed, Integer> implements ComMallSeedService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComMallSeedRepository comMallSeedRepository;
+
+
+    @Override
+    public ComMallSeedVo findById(Integer id) {
+
+        Optional<ComMallSeed> comMallSeed = comMallSeedRepository.findById(id);
+        if(comMallSeed.orElse(null) == null){
+            return null;
+        }else{
+            return CopyUtil.copy(comMallSeed.get(), ComMallSeedVo.class);
+        }
+    }
+}

+ 45 - 0
src/main/java/com/td/boss/game/commallseed/vo/ComMallSeedVo.java

@@ -0,0 +1,45 @@
+package com.td.boss.game.commallseed.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComMallSeedVo  implements Serializable {
+    private Integer id;//
+
+    private String mallType;//商城类型,默认是种子0
+
+    private String picture;
+
+    private String name;//
+
+    private Integer maturity;//
+
+    private Integer planting;//
+    private Integer harvestId;
+    private Integer harvestQuantity;//
+
+    private Integer harvestCount;//
+
+    private Integer harvest1;//
+    private Integer harvest2;//
+    private Integer harvest3;//
+
+    private String harvestName;//
+
+    private Integer priceSnb;//
+
+    private Integer priceCnt;//
+
+    private Integer amount;//
+
+    private String seedDescribe;//
+
+    private Integer withered;//
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 328 - 0
src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java

@@ -0,0 +1,328 @@
+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.comfruit.pojo.ComFruit;
+import com.td.boss.game.comfruit.service.ComFruitService;
+import com.td.boss.game.comfruit.vo.ComFruitAmountVo;
+import com.td.boss.game.comfruit.vo.ComFruitVo;
+import com.td.boss.game.commallseed.service.ComMallSeedService;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsSimpleVo;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+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.comusers.service.ComUsersService;
+import com.td.boss.game.comusers.vo.ComUsersVo;
+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.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/game/comPlayerGoods/")
+public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo, ComPlayerGoods, String> {
+    @Autowired
+    private ComPlayerGoodsService comPlayerGoodsService;
+    @Autowired
+    private ComMallSeedService comMallSeedService;
+    @Autowired
+    private ComFruitService comFruitService;
+
+    @Autowired
+    private ComPlayerLandService comPlayerLandService;
+
+    @Autowired
+    private ComUsersService comUsersService;
+
+
+    /**
+     * 获取仓库 全部数据,目前使用goods_type区分种子和果实
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("getSeedAndFruit")
+    public Result<Map> getSeedAndFruitFunction(@RequestParam(value = "userId") String userId) {
+        List<ComPlayerGoods> comPlayerGoodsList = comPlayerGoodsService.findAllByUserId(userId);
+        List<ComMallSeedVo> seedList = new ArrayList<>();
+        List<ComFruitAmountVo> fruitList = new ArrayList<>();
+        comPlayerGoodsList.stream().map(e -> {
+            if (e.getGoodsType().equals(0)) {
+                //种子类型
+                ComMallSeedVo comMallSeedVo = comMallSeedService.findById(e.getGoodsIndex());
+                //数量要用背包的数量
+                comMallSeedVo.setAmount(e.getAmount());
+                seedList.add(comMallSeedVo);
+
+            } else if (e.getGoodsType().equals(1)) {
+                //果实类型
+                //数量要用背包的数量
+                ComFruitVo comFruitVo = comFruitService.findById(e.getGoodsIndex());
+                ComFruitAmountVo comFruitAmountVo = CopyUtil.copy(comFruitVo, ComFruitAmountVo.class);
+                comFruitAmountVo.setAmount(e.getAmount());
+                fruitList.add(comFruitAmountVo);
+            }
+            return e;
+        }).collect(Collectors.toList());
+        Map map = new HashMap();
+        map.put("seed", seedList);
+        map.put("fruit", fruitList);
+        return Result.of(map);
+    }
+
+
+    /**
+     * 获取购买的种子状态,如果webSocket未通,
+     * 使用轮询方法查询更新状态
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("getSeedState")
+    public Result<Map> getSeedStateFunction(
+            @RequestParam(value = "userId") String userId,
+            @RequestParam(value = "seedId") Integer seedId,
+            @RequestParam(value = "currentAmount") Integer currentAmount
+    ) {
+        //查询背包种子存在的数量
+        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){
+            //如果背包数量等于或者小于传进来的,提示轮询未更新
+            return Result.of(null, false, ResultEnum.SEED_AMOUNT_ERROR.getMessage(), ResultEnum.SEED_AMOUNT_ERROR.getCode());
+        } else{
+            Map map = new HashMap();
+            map.put("msg","背包种子更新成功!");
+            map.put("goodsAmount",comPlayerGood.getAmount());
+            map.put("currentAmount",currentAmount);
+            return Result.of(map);
+        }
+
+
+    }
+
+
+    /**
+     * 收获时候,传入土地id和种子id
+     *
+     * @param userId
+     * @param landId
+     * @return
+     */
+    @PostMapping("addFruit")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public Result<Map> addFruitFunction(
+            @RequestParam(value = "userId") String userId,
+            @RequestParam(value = "landId") Integer landId) {
+        //todo 确认下是否多倍收成
+        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(0)) {
+            return Result.of(null, false, ResultEnum.LAND_NOT_PLANT.getMessage(), ResultEnum.LAND_NOT_PLANT.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()){
+            //如果当前时间减去种子的成熟期,还是小于种植日期,则判断未成熟
+            return Result.of(null, false, ResultEnum.SEED_DATE_ERROR.getMessage(), ResultEnum.SEED_DATE_ERROR.getCode());
+        }
+
+        //设置一个未种植状态即可
+        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);
+
+        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);
+        }
+
+        ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoodsSimpleVo, ComPlayerGoodsVo.class);
+        comPlayerGoodsService.save(comPlayerGoodsVo);
+        Map map = new HashMap();
+        map.put("msg", "成功收取果实!");
+        return Result.of(map);
+    }
+
+
+    /**
+     * 出售果实
+     *
+     * @param userId
+     * @param amount
+     * @return
+     */
+    @PostMapping("saleFruit")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public Result<Map> saleFruitFunction(
+            @RequestParam(value = "userId") String userId,
+            @RequestParam(value = "fruitId") Integer fruitId,
+            @RequestParam(value = "amount") Integer amount) {
+
+        //
+        ComFruitVo comFruitVo = comFruitService.findById(fruitId);
+
+        if (comFruitVo == null) {
+            return Result.of(null, false, ResultEnum.FRUIT_DATA_ERROR.getMessage(), ResultEnum.FRUIT_DATA_ERROR.getCode());
+        }
+        //果实
+        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()){
+            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);
+        }
+
+        //添加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);
+    }
+
+
+    /**
+     * 根据用户地址送果实
+     *
+     * @param userId
+     * @param address  目标用户地址
+     * @return
+     */
+    @PostMapping("grantFruit")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public Result<Map> grantFruitFunction(
+            @RequestParam(value = "userId") String userId,
+            @RequestParam(value = "fruitId") Integer fruitId,
+            @RequestParam(value = "amount") Integer amount,
+            @RequestParam(value = "address") String address) {
+
+        //目标用户的背包
+        ComUsersVo _targetUserVo = comUsersService.findByAddress(address);
+        if(_targetUserVo == null){
+            return Result.of(null, false, ResultEnum.USER_NOT_ADDRESS.getMessage(), ResultEnum.USER_NOT_ADDRESS.getCode());
+        }
+
+        if(_targetUserVo.getUserId().equals(userId)){
+            return Result.of(null, false, ResultEnum.FRUIT_SEND_SELF.getMessage(), ResultEnum.FRUIT_SEND_SELF.getCode());
+        }
+
+        ComFruitVo comFruitVo = comFruitService.findById(fruitId);
+
+        if (comFruitVo == null) {
+            return Result.of(null, false, ResultEnum.FRUIT_DATA_ERROR.getMessage(), ResultEnum.FRUIT_DATA_ERROR.getCode());
+        }
+        //果实type =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()){
+            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);
+        }
+
+
+
+        //接受人的背包数据
+        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);
+    }
+}

+ 27 - 0
src/main/java/com/td/boss/game/complayergoods/pojo/ComPlayerGoods.java

@@ -0,0 +1,27 @@
+package com.td.boss.game.complayergoods.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_player_goods")
+@Data
+public class ComPlayerGoods implements Serializable {
+    @Id
+    private String goodsId;//仓库物品id,字符串
+
+    private Integer goodsIndex;//仓库物品下标, 根据类型区分。比如种子type=0,index=种子id,
+
+    private Integer goodsType;//对应类型(0:种子,1:果实)
+
+    private String userId;//用户id
+
+    private String name;//名字
+
+    private String pictureName;//图片名字,走前端读取吧
+
+    private Integer amount;//数量
+
+}

+ 18 - 0
src/main/java/com/td/boss/game/complayergoods/repository/ComPlayerGoodsRepository.java

@@ -0,0 +1,18 @@
+package com.td.boss.game.complayergoods.repository;
+
+import com.td.boss.common.repository.*;
+import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface ComPlayerGoodsRepository extends CommonRepository<ComPlayerGoods, String> {
+
+    Optional<ComPlayerGoods> findByUserIdAndGoodsIndexAndGoodsType(String userId, Integer index , Integer type);
+
+
+    List<ComPlayerGoods> findAllByUserId(String userId);
+}

+ 22 - 0
src/main/java/com/td/boss/game/complayergoods/service/ComPlayerGoodsService.java

@@ -0,0 +1,22 @@
+package com.td.boss.game.complayergoods.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsSimpleVo;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+
+import java.util.List;
+
+public interface ComPlayerGoodsService extends CommonService<ComPlayerGoodsVo, ComPlayerGoods, String> {
+
+    /**
+     * 这里需要保证唯一
+     * @param userId
+     * @param index
+     * @param type
+     * @return
+     */
+    ComPlayerGoods findByUserIdAndIndexAndType(String userId,Integer index, Integer type);
+
+    List<ComPlayerGoods> findAllByUserId(String userId);
+}

+ 37 - 0
src/main/java/com/td/boss/game/complayergoods/service/ComPlayerGoodsServiceImpl.java

@@ -0,0 +1,37 @@
+package com.td.boss.game.complayergoods.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsSimpleVo;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+import com.td.boss.game.complayergoods.repository.ComPlayerGoodsRepository;
+import com.td.boss.util.CopyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class ComPlayerGoodsServiceImpl extends CommonServiceImpl<ComPlayerGoodsVo, ComPlayerGoods, String> implements ComPlayerGoodsService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComPlayerGoodsRepository comPlayerGoodsRepository;
+
+
+    @Override
+    public ComPlayerGoods findByUserIdAndIndexAndType(String userId,Integer index, Integer type) {
+        Optional<ComPlayerGoods>  comPlayerGoods = comPlayerGoodsRepository.findByUserIdAndGoodsIndexAndGoodsType(userId,index,type);
+        return comPlayerGoods.orElse(null);
+    }
+
+    @Override
+    public List<ComPlayerGoods> findAllByUserId(String userId) {
+        return comPlayerGoodsRepository.findAllByUserId(userId);
+    }
+}

+ 24 - 0
src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsSimpleVo.java

@@ -0,0 +1,24 @@
+package com.td.boss.game.complayergoods.vo;
+
+import com.td.boss.common.pojo.PageCondition;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ComPlayerGoodsSimpleVo implements Serializable {
+    private String goodsId;//仓库物品id,字符串
+
+    private Integer goodsIndex;//仓库物品下标, 根据类型区分。比如种子type=0,index=种子id,
+
+    private Integer goodsType;//对应类型(0:种子,1:果实)
+
+    private String userId;//玩家角色id
+
+    private String name;//名字
+
+    private String pictureName;//图片名字,走前端读取吧
+
+    private Integer amount;//数量
+
+}

+ 23 - 0
src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsVo.java

@@ -0,0 +1,23 @@
+package com.td.boss.game.complayergoods.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComPlayerGoodsVo extends PageCondition implements Serializable {
+    private String goodsId;//仓库物品id,字符串
+
+    private Integer goodsIndex;//仓库物品下标, 根据类型区分。比如种子type=0,index=种子id,
+
+    private Integer goodsType;//对应类型(0:种子,1:果实)
+
+    private String userId;//玩家id
+
+    private String name;//名字
+
+    private String pictureName;//图片名字,走前端读取吧
+
+    private Integer amount;//数量
+
+}

+ 152 - 0
src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java

@@ -0,0 +1,152 @@
+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.commallseed.service.ComMallSeedService;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
+import com.td.boss.game.complayergoods.service.ComPlayerGoodsService;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+import com.td.boss.game.complayerland.pojo.ComPlayerLand;
+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.comusers.vo.ComUsersSimpleVo;
+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.*;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/game/comPlayerLand/")
+public class ComPlayerLandController extends CommonController<ComPlayerLandVo, ComPlayerLand, Integer> {
+
+    @Autowired
+    private ComPlayerLandService comPlayerLandService;
+
+    @Autowired
+    private ComMallSeedService comMallSeedService;
+
+    @Autowired
+    private ComPlayerGoodsService comPlayerGoodsService;
+
+
+    /**
+     * 获取用户土地
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("getList")
+    public Result<List<ComPlayerLandAndPlantVo>> getLandFunction(@RequestParam(value = "userId") String userId) {
+        List<ComPlayerLand> comPlayerLands = comPlayerLandService.findAllByUserId(userId);
+        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());
+        return Result.of(_list);
+    }
+
+
+    /**
+     * 获取租赁土地状态,如果webSocket未通,
+     * 使用轮询方法查询更新租赁状态
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("getState")
+    public Result<ComPlayerLandSimpleVo> getStateFunction(
+            @RequestParam(value = "userId") String userId,
+            @RequestParam(value = "landId") Integer landId
+    ) {
+
+        ComPlayerLand comPlayerLand = comPlayerLandService.findByLandId(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));
+    }
+
+
+    /**
+     * 种植土地,要先有土地才能种植
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("plant")
+    @Transactional(rollbackFor = Exception.class)
+    public Result<ComPlayerLandAndPlantVo> plantFunction(
+            @RequestParam(value = "userId") String userId,
+            @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());
+        }
+        //
+
+        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);
+        }
+
+
+        //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);
+    }
+}

+ 46 - 0
src/main/java/com/td/boss/game/complayerland/pojo/ComPlayerLand.java

@@ -0,0 +1,46 @@
+package com.td.boss.game.complayerland.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_player_land")
+@Data
+public class ComPlayerLand implements Serializable {
+
+    @Id
+    @GeneratedValue(strategy= GenerationType.IDENTITY)
+    private Integer id;
+
+    private Integer configLandId;
+
+    private String userId;
+
+    private String name;//名字
+
+    private Integer isLease;//是否租赁
+
+    private Date leaseTime;//租赁时间
+
+    private Integer leaseMultiple;//租赁的倍数
+
+    private Integer leaseDate;//租赁的日期,1是3个月,2是1年,3是5年
+
+    private Integer isPlant;//是否种植
+
+    private Integer plantId;//种植植物的id
+
+    private Date plantStart;//种植开始时间
+
+    private Integer plantMature;//成熟期
+
+    private String landDescribe;//土地描述
+
+    private Double rentalExpenses;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

+ 20 - 0
src/main/java/com/td/boss/game/complayerland/repository/ComPlayerLandRepository.java

@@ -0,0 +1,20 @@
+package com.td.boss.game.complayerland.repository;
+
+import com.td.boss.common.repository.*;
+import com.td.boss.game.comconfigland.pojo.ComConfigLand;
+import com.td.boss.game.complayerland.pojo.ComPlayerLand;
+import com.td.boss.game.complayerland.vo.ComPlayerLandVo;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface ComPlayerLandRepository extends CommonRepository<ComPlayerLand, Integer> {
+
+    List<ComPlayerLand>  findAllByUserId(String userId);
+
+    Optional<ComPlayerLand> findByUserIdAndConfigLandId(String userId,Integer landId);
+
+    Optional<ComPlayerLand> findByConfigLandId(Integer landId);
+}

+ 22 - 0
src/main/java/com/td/boss/game/complayerland/service/ComPlayerLandService.java

@@ -0,0 +1,22 @@
+package com.td.boss.game.complayerland.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+import com.td.boss.game.complayerland.pojo.ComPlayerLand;
+import com.td.boss.game.complayerland.vo.ComPlayerLandVo;
+
+import java.util.List;
+
+public interface ComPlayerLandService extends CommonService<ComPlayerLandVo, ComPlayerLand, Integer> {
+
+    List<ComPlayerLand> findAllByUserId(String userId);
+
+    ComPlayerLand findById(Integer id);
+
+    ComPlayerLand findByLandId(Integer id);
+
+    ComPlayerLand findByUserIdAndLandId(String userId,Integer id);
+
+    ComPlayerLand AddComPlayerLand(ComPlayerLand comPlayerLand);
+
+}

+ 56 - 0
src/main/java/com/td/boss/game/complayerland/service/ComPlayerLandServiceImpl.java

@@ -0,0 +1,56 @@
+package com.td.boss.game.complayerland.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+import com.td.boss.game.complayerland.pojo.ComPlayerLand;
+import com.td.boss.game.complayerland.vo.ComPlayerLandVo;
+import com.td.boss.game.complayerland.repository.ComPlayerLandRepository;
+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.List;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class ComPlayerLandServiceImpl extends CommonServiceImpl<ComPlayerLandVo, ComPlayerLand, Integer> implements ComPlayerLandService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComPlayerLandRepository comPlayerLandRepository;
+
+
+    @Override
+    public List<ComPlayerLand> findAllByUserId(String userId) {
+        return comPlayerLandRepository.findAllByUserId(userId);
+    }
+
+
+    @Override
+    public ComPlayerLand findById(Integer id) {
+        Optional<ComPlayerLand> comPlayerLand = comPlayerLandRepository.findById(id);
+
+        return comPlayerLand.orElse(null);
+    }
+
+    @Override
+    public ComPlayerLand findByLandId(Integer id) {
+        Optional<ComPlayerLand> comPlayerLand = comPlayerLandRepository.findByConfigLandId(id);
+
+        return comPlayerLand.orElse(null);
+    }
+
+
+    @Override
+    public ComPlayerLand findByUserIdAndLandId(String userId, Integer id) {
+        return comPlayerLandRepository.findByUserIdAndConfigLandId(userId,id).orElse(null);
+    }
+
+    @Override
+    public ComPlayerLand AddComPlayerLand(ComPlayerLand comPlayerLand) {
+        return comPlayerLandRepository.save(comPlayerLand);
+    }
+}

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

@@ -0,0 +1,45 @@
+package com.td.boss.game.complayerland.vo;
+
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComPlayerLandAndPlantVo implements Serializable {
+
+    private Integer id;
+
+    private Integer configLandId;
+
+    private String userId;
+
+    private String name;//名字
+
+    private Integer isLease;//是否租凭
+
+    private Date leaseTime;//租凭时间
+
+    private Integer leaseMultiple;//租赁的倍数
+
+    private Integer leaseDate;//租赁的日期,1是3个月,2是1年,3是5年
+
+    private Integer isPlant;//是否种植
+
+    private Integer plantId;//种植植物的id
+
+    private ComMallSeedVo seedInfo;//返回一个种子信息
+
+    private Date plantStart;//种植开始时间
+
+    private Integer plantMature;//成熟期
+
+    private String landDescribe;//土地描述
+
+    private Double rentalExpenses;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

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

@@ -0,0 +1,43 @@
+package com.td.boss.game.complayerland.vo;
+
+import com.td.boss.common.pojo.PageCondition;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComPlayerLandSimpleVo implements Serializable {
+
+    private Integer id;
+
+    private Integer configLandId;
+
+    private String userId;
+
+    private String name;//名字
+
+    private Integer isLease;//是否租凭
+
+    private Date leaseTime;//租凭时间
+
+    private Integer leaseMultiple;//租赁的倍数
+
+    private Integer leaseDate;//租赁的日期,1是3个月,2是1年,3是5年
+
+    private Integer isPlant;//是否种植
+
+    private Integer plantId;//种植植物的id
+
+    private Date plantStart;//种植开始时间
+
+    private Integer plantMature;//成熟期
+
+    private String landDescribe;//土地描述
+
+    private Double rentalExpenses;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

+ 43 - 0
src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandVo.java

@@ -0,0 +1,43 @@
+package com.td.boss.game.complayerland.vo;
+
+import com.td.boss.common.pojo.PageCondition;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComPlayerLandVo extends PageCondition implements Serializable {
+
+    private Integer id;
+
+    private Integer configLandId;
+
+    private String userId;
+
+    private String name;//名字
+
+    private Integer isLease;//是否租凭
+
+    private Date leaseTime;//租凭时间
+
+    private Integer leaseMultiple;//租赁的倍数
+
+    private Integer leaseDate;//租赁的日期,1是3个月,2是1年,3是5年
+
+    private Integer isPlant;//是否种植
+
+    private Integer plantId;//种植植物的id
+
+    private Date plantStart;//种植开始时间
+
+    private Integer plantMature;//成熟期
+
+    private String landDescribe;//土地描述
+
+    private Double rentalExpenses;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

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

@@ -0,0 +1,415 @@
+package com.td.boss.game.comsnbfreeze.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.comcntorder.service.ComCntOrderService;
+import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
+import com.td.boss.game.comconfigland.pojo.ComConfigLand;
+import com.td.boss.game.comconfigland.service.ComConfigLandService;
+import com.td.boss.game.comconfigland.vo.ComConfigLandVo;
+import com.td.boss.game.commallseed.pojo.ComMallSeed;
+import com.td.boss.game.commallseed.service.ComMallSeedService;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+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.complayerland.pojo.ComPlayerLand;
+import com.td.boss.game.complayerland.service.ComPlayerLandService;
+import com.td.boss.game.complayerland.vo.ComPlayerLandSimpleVo;
+import com.td.boss.game.complayerland.vo.ComPlayerLandVo;
+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.comusers.service.ComUsersService;
+import com.td.boss.game.comusers.vo.ComUsersVo;
+import com.td.boss.util.CopyUtil;
+import com.td.boss.util.DateUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+import static com.td.boss.util.MD5Util.createSign;
+
+@RestController
+@RequestMapping("/game/wallet/")
+@Slf4j
+public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, ComSnbFreeze, String> {
+
+    @Autowired
+    private ComUsersService comUsersService;
+
+    @Autowired
+    private ComSnbFreezeService comSnbFreezeService;
+
+    @Autowired
+    private ComCntOrderService comCntOrderService;
+
+    @Autowired
+    private ComPlayerGoodsService comPlayerGoodsService;
+
+    @Autowired
+    private ComMallSeedService comMallSeedService;
+
+    @Autowired
+    private ComPlayerLandService comPlayerLandService;
+
+    @Autowired
+    private ComConfigLandService comConfigLandService;
+
+
+    /**
+     * 获取用户神农呗 snb,前端用户调用
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("getSNB")
+    public Result<Map> getSNBFunction(@RequestParam(value = "userId") String userId) {
+        //log.info(userId);
+        ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
+        Map map = new HashMap();
+        map.put("SNB", comUsersVo.getSnb());
+        return Result.of(map);
+    }
+
+    /**
+     * 这里获取游戏的SNB和冻结用户钱包
+     *
+     * @param id 账户ID
+     * @return
+     */
+    @PostMapping("getSNBAndFreeze")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public Result<Map> getSNBAndFreezeFunction(
+            @RequestParam(value = "id") Integer id,
+            @RequestParam(value = "snbAmount") Integer snbAmount,
+            @RequestParam(value = "sign") String sign
+    ) {
+        Map map = new HashMap();
+        SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
+        parameters.put("id", id);
+        parameters.put("snbAmount", snbAmount);
+        String _sign = createSign(parameters);
+
+        log.info("getSNBAndFreezeFunction:" + parameters.toString());
+
+        if (!_sign.equals(sign)) {
+            map.put("msg", "签名参数错误");
+            //return Result.of(map, false, ResultEnum.WALLET_SNB_SIGN_ERROR.getMessage(), ResultEnum.WALLET_SNB_SIGN_ERROR.getCode());
+            return Result.of(map);
+        }
+
+        //拿出用户对应的数据
+        ComUsersVo comUsersVo = comUsersService.findByUserId(id.toString());
+        if (comUsersVo.getSnb() < snbAmount) {
+            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());
+            return Result.of(map);
+        }
+        //如果数量够,写入修改对应操作
+        Integer _snb = comUsersVo.getSnb() - snbAmount;
+        comUsersVo.setSnb(_snb);
+        comUsersService.save(comUsersVo);
+        //记录操作的snb,
+        ComSnbFreezeVo entityVo = new ComSnbFreezeVo();
+        entityVo.setUserId(id.toString());
+        entityVo.setSnb(snbAmount);
+        entityVo.setFreeze(1);
+        entityVo.setIsSuccess(0);//0默认交易不成功
+        entityVo.setSnbDescribe("SNB兑换CNT时候添加的冻结数据");
+        Result<ComSnbFreezeVo> result = comSnbFreezeService.save(entityVo);
+        map.put("snbFreeze", CopyUtil.copy(result.getData(), ComSnbFreezeSimpleVo.class));
+        return Result.of(map);
+    }
+
+    /**
+     * 解除冻结用户钱包
+     *
+     * @param snbId
+     * @return
+     */
+    @PostMapping("setSNBAndUnfreeze")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public Result<Map> setSNBAndUnfreezeFunction(
+            @RequestParam(value = "snbId") String snbId,
+            @RequestParam(value = "isSuccess") Integer isSuccess,
+            @RequestParam(value = "sign") String sign) {
+        Map map = new HashMap();
+        SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
+        parameters.put("snbId", snbId);
+        parameters.put("isSuccess", isSuccess);
+        String _sign = createSign(parameters);
+
+        log.info("setSNBAndUnfreezeFunction:" + parameters.toString());
+        if (!_sign.equals(sign)) {
+            map.put("msg", "签名参数错误");
+            //return Result.of(map, false, ResultEnum.WALLET_SNB_SIGN_ERROR.getMessage(), ResultEnum.WALLET_SNB_SIGN_ERROR.getCode());
+            return Result.of(map);
+        }
+
+        ComSnbFreezeVo comSnbFreezeVo = comSnbFreezeService.findById(snbId);
+        if (!comSnbFreezeVo.getIsSuccess().equals(0)) {
+            //交易状态是0才可以进行下一步操作
+            //WALLET_SNB_SUCCESS_NOT_ZERO(603,"snb不可操作"),
+            map.put("isSuccess", comSnbFreezeVo.getIsSuccess());
+            map.put("msg", "交易状态不为0");
+            //return Result.of(map, false, ResultEnum.WALLET_SNB_SUCCESS_NOT_ZERO.getMessage(), ResultEnum.WALLET_SNB_SUCCESS_NOT_ZERO.getCode());
+            return Result.of(map);
+        }
+
+        if (isSuccess.equals(1)) {
+            //1 成功,解冻
+            comSnbFreezeVo.setIsSuccess(1);
+            comSnbFreezeVo.setFreeze(0);
+            map.put("msg", "交易成功");
+            comSnbFreezeService.save(comSnbFreezeVo);
+        } else {
+            //交易失败,返回snb给用户
+            ComUsersVo comUsersVo = comUsersService.findByUserId(comSnbFreezeVo.getUserId());
+            Integer _snb = comUsersVo.getSnb() + comSnbFreezeVo.getSnb();
+            comUsersVo.setSnb(_snb);
+            comUsersService.save(comUsersVo);
+            map.put("SNB", comUsersVo.getSnb());
+            //记录交易转态
+            comSnbFreezeVo.setIsSuccess(2);
+            map.put("msg", "交易失败,返回SNB给用户成功");
+            comSnbFreezeService.save(comSnbFreezeVo);
+        }
+        map.put("isSuccess", comSnbFreezeVo.getIsSuccess());
+        map.put("freeze", comSnbFreezeVo.getFreeze());
+        return Result.of(map);
+    }
+
+
+    /**
+     * "id": 1, // 用户ID
+     * "address": "TDw6xsVnDJWsdRBLkWAwXbv4hE2X2JQs5z", // 用户地址
+     * "pay_type": 1, // 支付类型,1土地租凭
+     * "pay_amount": "100.00", // 支付数额
+     * "tx_hash": "15200dd5a3f32c7046e2d5b9e346f2e200d311c85463af77bbeb7ff632d69230", // 交易hash,需要唯一校验,防止重复计算
+     * "sign": "4609A6B4998E5B44C5F6AA30DBFEDD37" // 参数签名,需要校验防止参数被篡改
+     *
+     * @return
+     */
+    @PostMapping("cntPlayback")
+    @ResponseBody
+    public Result<Map> onCNTPlayBack(@RequestParam(value = "id") Integer id,
+                                     @RequestParam(value = "address") String address,
+                                     @RequestParam(value = "pay_type") Integer pay_type,
+                                     @RequestParam(value = "pay_amount") String pay_amount,
+                                     @RequestParam(value = "tx_hash") String tx_hash,
+                                     @RequestParam(value = "item_type") String item_type,
+                                     @RequestParam(value = "sign") String sign) {
+        Map<String, Object> result = new HashMap<>();
+
+        SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
+        parameters.put("id", id);
+        parameters.put("address", address);
+        parameters.put("pay_type", pay_type);
+        parameters.put("pay_amount", pay_amount);
+        parameters.put("tx_hash", tx_hash);
+        parameters.put("item_type", item_type);
+        String _sign = createSign(parameters);
+
+        log.info("onCNTPlayBack:" + parameters.toString());
+
+        if (_sign.equals(sign)) {
+
+            ComCntOrderVo comCntOrderVo = comCntOrderService.findByTx(tx_hash);
+            //记录CNT 订单
+            if (comCntOrderVo == null) {
+                comCntOrderVo = new ComCntOrderVo();
+            }
+            comCntOrderVo.setAddress(address);
+            comCntOrderVo.setUserId(id.toString());
+            comCntOrderVo.setPayAmount(pay_amount);
+            comCntOrderVo.setItemType(item_type);
+            comCntOrderVo.setPayType(pay_type);
+            comCntOrderVo.setTxHash(tx_hash);
+            if (comCntOrderVo.getPayType().equals(1) //3个月
+            ) {
+                comCntOrderVo.setCntDescribe("购买土地租凭");
+
+                // 处理租赁,下面要走校验,防止修改数据
+                //  目前是根据CNT走设置
+                //todo 土地操作修改 比如倍数+id = 1or12 2or12 3or12
+                String[] itemArray = item_type.split("or");
+                Integer playCycle = Integer.parseInt(itemArray[0]); //土地周期,比如3个月,1年,5年等
+                Integer configLandId = Integer.parseInt(itemArray[1]); //itemType
+
+                //根据土地config id查找,对应ConfigLandId ,
+                ComConfigLand comConfigLand = comConfigLandService.findById(configLandId);
+
+                //如果土地等于不能初始化,或者已经种植,不能进行购买
+                if (comConfigLand.getIsInit().equals(0) || comConfigLand.getIsPlant().equals(1)) {
+                    comCntOrderVo.setCntDescribe("非法操作:" + ResultEnum.LAND_DATA_ERROR.getMessage());
+                    comCntOrderService.save(comCntOrderVo);
+                    result.put("msg", "非法操作:" + ResultEnum.LAND_DATA_ERROR.getMessage());
+                    //return Result.of(result, false, ResultEnum.LAND_DATA_ERROR.getMessage(), ResultEnum.LAND_DATA_ERROR.getCode());
+                    return Result.of(result);
+                }
+                //能通过交易的都是未租赁的
+                ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(id.toString(), configLandId);
+                Boolean isNewPlant = false;
+                if (comPlayerLand == null) {
+                    //创建新土地
+                    comPlayerLand = new ComPlayerLand();
+                    comPlayerLand.setConfigLandId(comConfigLand.getId());
+                    comPlayerLand.setUserId(id.toString());
+                    comPlayerLand.setName(comConfigLand.getName());
+                    isNewPlant = true;
+                }
+                //todo 可能续租
+                //else {
+
+                //土地已经租赁,非法操作
+                //if (comPlayerLand.getIsLease().equals(1)) {
+                //    comCntOrderVo.setCntDescribe("非法操作:" + ResultEnum.LAND_IS_LEASE.getMessage());
+                //    comCntOrderService.save(comCntOrderVo);
+                //    result.put("msg", "非法操作:" + ResultEnum.LAND_IS_LEASE.getMessage());
+                //    //return Result.of(result, false, ResultEnum.LAND_IS_LEASE.getMessage(), ResultEnum.LAND_IS_LEASE.getCode());
+                //    return Result.of(result);
+                //}
+                //}
+                // 假如返回的是 三个月700CNT,一年2500CNT,5年5000CNT
+                Double _backCNT = Double.parseDouble(pay_amount);
+
+                //用约定来处理 土地类型和倍数  1000 A 12 ,组合的就是 1000A12
+
+
+                if (playCycle.equals(1)) {//_backCNT % 700 == 0
+                    int multiple = (int) Math.floor(_backCNT / 700);
+                    comPlayerLand.setLandDescribe("当前租赁三个月,消耗" + _backCNT + "CNT,倍数为:" + multiple);
+                    comPlayerLand.setLeaseMultiple(multiple);
+                    comPlayerLand.setLeaseDate(1);
+                    //设置租赁日期
+                    if (isNewPlant) {
+                        comPlayerLand.setLeaseTime(DateUtil.getNowDateAddMonth(3));
+                    } else {
+                        comPlayerLand.setLeaseTime(DateUtil.getOldDateAddMonth(comPlayerLand.getLeaseTime(), 3));
+                    }
+
+
+                } else if (playCycle.equals(2)) {//_backCNT % 2500 == 0
+                    int multiple = (int) Math.floor(_backCNT / 2500);
+                    comPlayerLand.setLandDescribe("当前租赁一年,消耗" + _backCNT + "CNT,倍数为:" + multiple);
+                    comPlayerLand.setLeaseMultiple(multiple);
+                    comPlayerLand.setLeaseDate(2);
+                    //设置租赁日期
+                    if (isNewPlant) {
+                        comPlayerLand.setLeaseTime(DateUtil.getNowDateAddYear(1));
+                    } else {
+                        comPlayerLand.setLeaseTime(DateUtil.getOldDateAddYear(comPlayerLand.getLeaseTime(), 1));
+                    }
+
+                } else if (playCycle.equals(3)) { //_backCNT % 5000 == 0
+                    int multiple = (int) Math.floor(_backCNT / 5000);
+                    comPlayerLand.setLandDescribe("当前租赁5年,消耗" + _backCNT + "CNT,倍数为:" + multiple);
+                    comPlayerLand.setLeaseMultiple(multiple);
+                    comPlayerLand.setLeaseDate(3);
+                    //设置租赁日期
+                    //comPlayerLand.setLeaseTime(DateUtil.getNowDateAddYear(5));
+                    if (isNewPlant) {
+                        comPlayerLand.setLeaseTime(DateUtil.getNowDateAddYear(5));
+                    } else {
+                        comPlayerLand.setLeaseTime(DateUtil.getOldDateAddYear(comPlayerLand.getLeaseTime(), 5));
+                    }
+
+                } else {
+                    //不存在此CNT交易数值
+                    comCntOrderVo.setCntDescribe("非法操作:购买土地的playCycle:" + playCycle);
+                    comCntOrderService.save(comCntOrderVo);
+                    result.put("msg", "非法操作:CNT交易数值不是设定的数据!");
+                    return Result.of(result);
+                }
+                //租赁土地
+                comPlayerLand.setIsLease(1);
+
+                //初始化一下未种植参数
+                comPlayerLand.setIsPlant(0);
+                comPlayerLand.setCreateTime(new Date());
+                comPlayerLand.setUpdateTime(new Date());
+
+                //记录一下租赁费用
+                comPlayerLand.setRentalExpenses(_backCNT);
+
+                //ComPlayerLandVo comPlayerLandVo = CopyUtil.copy(comPlayerLand, ComPlayerLandVo.class);
+                comPlayerLandService.AddComPlayerLand(comPlayerLand);
+                //返回土地对象
+                //前端轮询或者通过webSocket 发送通知
+                result.put("leaseLand", CopyUtil.copy(comPlayerLand, ComPlayerLandSimpleVo.class));
+
+            } else if (comCntOrderVo.getPayType().equals(2)) {
+                comCntOrderVo.setCntDescribe("自然灾害防护");
+            } else if (comCntOrderVo.getPayType().equals(3)) {
+                comCntOrderVo.setCntDescribe("野兽防护");
+            } else if (comCntOrderVo.getPayType().equals(4)) {
+
+                // 验证种子价格是否和服务器一样,不一样判定非法操作
+                //     假如拿到的 支付 _backCNT = 99; 然后 种子 price = 99.00
+                Double _backCNT = Double.parseDouble(pay_amount);
+                // 处理itemType,种子id ,获取种子类型,设置种子不同的数据
+                // todo 直接处理种子id
+                Integer itemType =  Integer.parseInt(item_type);
+                ComMallSeedVo seedVo = comMallSeedService.findById(itemType);
+                if (seedVo == null) {
+                    comCntOrderVo.setCntDescribe("非法操作:所修改的种子不存在服务器中!当前购买种子id:" + itemType);
+                    comCntOrderService.save(comCntOrderVo);
+                    result.put("msg", "非法操作:所修改的种子不存在服务器中!");
+                    return Result.of(result);
+                }
+
+                if (!seedVo.getPriceCnt().equals(_backCNT) && _backCNT % seedVo.getPriceCnt() != 0) {
+                    //如果价格 不和种子相当,也不是种子的倍数
+                    comCntOrderVo.setCntDescribe("非法操作:价格不和种子相当,也不是种子的倍数!当前购买种子的CNT价格:" + _backCNT + ".种子的价格:" + seedVo.getPriceCnt());
+                    comCntOrderService.save(comCntOrderVo);
+                    result.put("msg", "订单非法操作,已记录相关信息!");
+                    return Result.of(result);
+                }
+
+
+                //合法操作记录到仓库中
+                comCntOrderVo.setCntDescribe("购买种子");
+                ComPlayerGoods entityVo = comPlayerGoodsService.findByUserIdAndIndexAndType(id.toString(), itemType, 0);
+
+                //这里计算一个购买种子的数量,用种子除去单价
+
+                int _paySeedAmount = (int) (_backCNT / seedVo.getPriceCnt());
+                if (entityVo == null) {
+                    //创建一个新种子
+                    entityVo = new ComPlayerGoods();
+                    entityVo.setGoodsIndex(itemType);
+                    entityVo.setGoodsType(0);
+                    entityVo.setUserId(id.toString());
+                    entityVo.setAmount(_paySeedAmount);
+                    entityVo.setName(seedVo.getName());
+                    entityVo.setPictureName(seedVo.getPicture());
+                } else {
+                    Integer _amount = entityVo.getAmount() + _paySeedAmount;
+                    entityVo.setAmount(_amount);
+                }
+                /** 购买成功后,记录到仓库中*/
+                ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(entityVo, ComPlayerGoodsVo.class);
+                comPlayerGoodsService.save(comPlayerGoodsVo);
+                result.put("seed", CopyUtil.copy(entityVo, ComPlayerGoodsSimpleVo.class));
+            }
+            comCntOrderService.save(comCntOrderVo);
+            result.put("msg", "保存订单成功!");
+            return Result.of(result);
+        } else {
+            //参数校验错误
+            result.put("msg", "保存订单失败!");
+            return Result.of(result, false, ResultEnum.WALLET_CNT_PLAY_ERROR.getMessage(), ResultEnum.WALLET_CNT_PLAY_ERROR.getCode());
+        }
+
+    }
+}

+ 29 - 0
src/main/java/com/td/boss/game/comsnbfreeze/pojo/ComSnbFreeze.java

@@ -0,0 +1,29 @@
+package com.td.boss.game.comsnbfreeze.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_snb_freeze")
+@Data
+public class ComSnbFreeze implements Serializable {
+    @Id
+    private String id;//
+
+    private String userId;//
+
+    private Integer snb;//游戏的snb
+
+    private Integer freeze;//是否冻结
+
+    private Integer isSuccess;//是否交易成功
+
+    private String snbDescribe;
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 16 - 0
src/main/java/com/td/boss/game/comsnbfreeze/repository/ComSnbFreezeRepository.java

@@ -0,0 +1,16 @@
+package com.td.boss.game.comsnbfreeze.repository;
+
+import com.td.boss.common.repository.*;
+import com.td.boss.game.comsnbfreeze.pojo.ComSnbFreeze;
+import com.td.boss.game.comsnbfreeze.vo.ComSnbFreezeVo;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+import java.util.Optional;
+
+@Repository
+public interface ComSnbFreezeRepository extends CommonRepository<ComSnbFreeze, String> {
+    Optional<ComSnbFreezeVo> findByUserId(String userId);
+}

+ 22 - 0
src/main/java/com/td/boss/game/comsnbfreeze/service/ComSnbFreezeService.java

@@ -0,0 +1,22 @@
+package com.td.boss.game.comsnbfreeze.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comsnbfreeze.pojo.ComSnbFreeze;
+import com.td.boss.game.comsnbfreeze.vo.ComSnbFreezeVo;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.persistence.LockModeType;
+
+public interface ComSnbFreezeService extends CommonService<ComSnbFreezeVo, ComSnbFreeze, String> {
+    /**
+     * 获取游戏用户钱包数据
+     * @param userId
+     * @return
+     */
+    ComSnbFreezeVo findByUserId(String userId);
+
+    ComSnbFreezeVo findById(String id);
+
+    ComSnbFreeze AddByUserId(ComSnbFreeze comSnbFreeze);
+}

+ 53 - 0
src/main/java/com/td/boss/game/comsnbfreeze/service/ComSnbFreezeServiceImpl.java

@@ -0,0 +1,53 @@
+package com.td.boss.game.comsnbfreeze.service;
+
+import com.td.boss.common.pojo.Result;
+import com.td.boss.common.service.*;
+import com.td.boss.game.comsnbfreeze.pojo.ComSnbFreeze;
+import com.td.boss.game.comsnbfreeze.vo.ComSnbFreezeVo;
+import com.td.boss.game.comsnbfreeze.repository.ComSnbFreezeRepository;
+import com.td.boss.util.CopyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class ComSnbFreezeServiceImpl extends CommonServiceImpl<ComSnbFreezeVo, ComSnbFreeze, String> implements ComSnbFreezeService {
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComSnbFreezeRepository comSnbFreezeRepository;
+
+
+    @Override
+    public ComSnbFreezeVo findByUserId(String userId) {
+        Optional<ComSnbFreezeVo> comSnbFreezeVo =  comSnbFreezeRepository.findByUserId(userId);
+        if(comSnbFreezeVo.orElse(null) == null){
+            return null;
+        }else{
+            return CopyUtil.copy(comSnbFreezeVo.get(), ComSnbFreezeVo.class);
+        }
+    }
+
+
+    @Override
+    public ComSnbFreezeVo findById(String id) {
+        Optional<ComSnbFreeze> comSnbFreeze =  comSnbFreezeRepository.findById(id);
+        if(comSnbFreeze.orElse(null) == null){
+            return null;
+        }else{
+            return CopyUtil.copy(comSnbFreeze.get(), ComSnbFreezeVo.class);
+        }
+    }
+
+    @Override
+    public ComSnbFreeze AddByUserId(ComSnbFreeze comSnbFreeze) {
+        ComSnbFreeze _comSnbFreeze =  comSnbFreezeRepository.saveAndFlush(comSnbFreeze);
+        return _comSnbFreeze;
+    }
+
+}

+ 26 - 0
src/main/java/com/td/boss/game/comsnbfreeze/vo/ComSnbFreezeSimpleVo.java

@@ -0,0 +1,26 @@
+package com.td.boss.game.comsnbfreeze.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComSnbFreezeSimpleVo implements Serializable {
+    private String id;//
+
+    private String userId;//
+
+    private Integer snb;//游戏的snb
+
+    private Integer freeze;//是否冻结
+
+    private Integer isSuccess;//是否交易成功
+
+    private String snbDescribe;
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 27 - 0
src/main/java/com/td/boss/game/comsnbfreeze/vo/ComSnbFreezeVo.java

@@ -0,0 +1,27 @@
+package com.td.boss.game.comsnbfreeze.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+
+import javax.persistence.Id;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComSnbFreezeVo extends PageCondition implements Serializable {
+    private String id;//
+
+    private String userId;//
+
+    private Integer snb;//游戏的snb
+
+    private Integer freeze;//是否冻结
+
+    private Integer isSuccess;//是否交易成功
+
+    private String snbDescribe;
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 105 - 110
src/main/java/com/td/boss/game/comusers/controller/ComUsersController.java

@@ -1,17 +1,16 @@
 package com.td.boss.game.comusers.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.td.boss.common.controller.*;
 import com.td.boss.common.pojo.Result;
+import com.td.boss.game.comusers.vo.ComUsersSimpleVo;
 import com.td.boss.game.dappWs.DappWSServer;
 import com.td.boss.config.enums.ResultEnum;
 import com.td.boss.game.comusers.pojo.ComUsers;
 import com.td.boss.game.comusers.vo.ComUsersVo;
 import com.td.boss.game.comusers.service.ComUsersService;
 import com.td.boss.sys.syssetting.vo.SysSettingVo;
-import com.td.boss.util.JwtTokenUtil;
-import com.td.boss.util.MD5Util;
-import com.td.boss.util.RsaUtil;
-import com.td.boss.util.SysSettingUtil;
+import com.td.boss.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -30,6 +29,8 @@ import javax.script.ScriptException;
 import java.io.IOException;
 import java.util.*;
 
+import static com.td.boss.util.MD5Util.createSign;
+
 @Slf4j
 @RestController
 @RequestMapping("/game/comUsers/")
@@ -41,7 +42,6 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
     private JwtTokenUtil jwtTokenUtil;
 
 
-    private static String Key = "DH08hdf2n9df9hg2e";
 
     @Value("${spring.profiles.active}")
     private String active;
@@ -50,8 +50,10 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
     private Resource dappPluginFile;
     @Value(value = "classpath:static/dapp/dapp.js")
     private Resource dappFile;
+
     /**
      * 接口需要token放行
+     *
      * @return
      */
     @GetMapping("publicKeyAndSys")
@@ -65,44 +67,45 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
         //RunScript rs = new RunScript("D:\\CocosProject\\2.1.4\\FragrantTown_Server\\src\\main\\resources\\static\\dapp\\dapp.js");
         //rs.start();
 
-        log.info("login active:"+active);
+        log.info("login active:" + active);
         //todo 正常流程下,需要获取验证登录过的信息来处理token,这里暂时走测试信息流程
-        String userId ;
+        String userId;
         //系统信息
         SysSettingVo sys = SysSettingUtil.getSysSetting();
         //后端公钥
         String publicKey = RsaUtil.getPublicKey();
         //final String token = jwtTokenUtil.generateToken(userId);
         Map map = new HashMap();
-        map.put("publicKey",publicKey);
+        map.put("publicKey", publicKey);
         map.put("sysApiEncrypt", sys.getSysApiEncrypt());
         return Result.of(map);
     }
 
     /**
      * 该方法已废弃,后续使用 loginTokenAndVerification 来代替
+     *
      * @param loginId
      * @return
      */
     @Deprecated
     @GetMapping("loginToken")
-    public Result<Map> userLogin(@RequestParam(value = "loginId",required = false)String loginId) {
-        log.info("login active:"+active);
-        String userId ;
-        if(active.equals("dev")){
+    public Result<Map> userLogin(@RequestParam(value = "loginId", required = false) String loginId) {
+        log.info("login active:" + active);
+        String userId;
+        if (active.equals("dev")) {
             //if(loginId == null || !loginId.equals("1")){
             //    return Result.of(null,false,"请输入参数 loginId = '1' ",ResultEnum.NO_PARAMETERS_CARRIED.getCode());
             //}
             //如果测试环境中,提供测试账号
             userId = loginId;
-        }else{
+        } else {
             // 正式环境
             userId = loginId;
         }
 
         ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
 
-        if(comUsersVo == null){
+        if (comUsersVo == null) {
             //如果没有用户信息
             comUsersVo = new ComUsersVo();
             comUsersVo.setUserId(userId);
@@ -116,50 +119,62 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
         //生成token
         final String token = jwtTokenUtil.generateToken(comUsersVo.getUserId());
         Map map = new HashMap();
-        map.put("active",active);
-        map.put("token",token);
+        map.put("active", active);
+        map.put("token", token);
         return Result.of(map);
     }
 
-    //    {
-    //        "address": "TDw6xsVnDJWsdRBLkWAwXbv4hE2X2JQs5z", // 签名地址
-    //        "id": 1, // 所属账户ID
-    //        "signature": "0x09fda37fcad4a9bb7b72f652323881a33847be3a44e4403c7a576b3383df30ec6e5e256f28fbdbac5eb0642f304f331783f36d70b5e6fd576818bc42e14624191c", // 用户私钥签名文本
-    //        "timestamp": 1641279989, // 签名时间戳,需要在1分钟内完成验签,否则本次签名失效
-    //        "sign": "794DA326066EAAC0F9E0D3E94E306B38" // 微信参数签名
-    //    }
-    //    {
-    //        "address": "TDw6xsVnDJWsdRBLkWAwXbv4hE2X2JQs5z", // 签名地址
-    //        "id": 1, // 所属账户ID
-    //        "signature": "0x09fda37fcad4a9bb7b72f652323881a33847be3a44e4403c7a576b3383df30ec6e5e256f28fbdbac5eb0642f304f331783f36d70b5e6fd576818bc42e14624191c", // 签名文本
-    //        "timestamp": 1641279989 // 签名时间戳,需要在1分钟内完成验签,否则本次签名失效
-    //    }
+
+    /**
+     * {
+     * "address": "TDw6xsVnDJWsdRBLkWAwXbv4hE2X2JQs5z", // 签名地址
+     * "id": 1, // 所属账户ID
+     * "signature": "0x09fda37fcad4a9bb7b72f652323881a33847be3a44e4403c7a576b3383df30ec6e5e256f28fbdbac5eb0642f304f331783f36d70b5e6fd576818bc42e14624191c", // 用户私钥签名文本
+     * "timestamp": 1641279989, // 签名时间戳,需要在1分钟内完成验签,否则本次签名失效
+     * "sign": "794DA326066EAAC0F9E0D3E94E306B38" // 微信参数签名
+     * }
+     * {
+     * "address": "TDw6xsVnDJWsdRBLkWAwXbv4hE2X2JQs5z", // 签名地址
+     * "id": 1, // 所属账户ID
+     * "signature": "0x09fda37fcad4a9bb7b72f652323881a33847be3a44e4403c7a576b3383df30ec6e5e256f28fbdbac5eb0642f304f331783f36d70b5e6fd576818bc42e14624191c", // 签名文本
+     * "timestamp": 1641279989 // 签名时间戳,需要在1分钟内完成验签,否则本次签名失效
+     * }
+     *
+     * @param address   签名地址
+     * @param id        所属账户ID
+     * @param signature 签名文本
+     * @param timestamp 签名时间戳,需要在1分钟内完成验签,否则本次签名失效
+     * @return
+     */
     @PostMapping("loginTokenAndVerification")
     public Result<Map> loginTokenAndVerification(
-            @RequestParam(value = "address")String address,
-            @RequestParam(value = "id")String id,
-            @RequestParam(value = "signature")String signature,
-            @RequestParam(value = "timestamp")Integer timestamp) {
+            @RequestParam(value = "address") String address,
+            @RequestParam(value = "id") String id,
+            @RequestParam(value = "signature") String signature,
+            @RequestParam(value = "timestamp") Integer timestamp) {
 
-        log.info("loginTokenAndVerification active:"+active);
-        SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
+        log.info("loginTokenAndVerification active:" + active);
+        SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
         parameters.put("address", address);
         parameters.put("id", id);
         parameters.put("signature", signature);
         parameters.put("timestamp", timestamp);
 
 
-
         String sign = createSign(parameters);
-        log.info("sign:"+sign);
+        //log.info("sign:" + sign);
         MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
         form.add("address", address);
         form.add("id", id);
         form.add("signature", signature);
         form.add("timestamp", timestamp);
-        form.add("sign",sign);
+        form.add("sign", sign);
         //验证地址
-        String DAppUrl = "https://yt.landownership.live/api/account/loginValidate";
+        String DAppOnlineUrl = "https://yt.landownership.live/api/account/loginValidate";
+        String DAppTestUrl = "https://wp.landownership.live/api/account/loginValidate";
+
+        String DAppUrl = active.equals("prod")?DAppOnlineUrl:DAppTestUrl;
+        log.info("DApp登录地址:" + DAppUrl);
         RestTemplate restTemplate = new RestTemplate();
         HttpHeaders headers = new HttpHeaders();
         //设置content-type
@@ -169,74 +184,52 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
         //用HttpEntity封装整个请求报文
         HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
-
+        String response = "";
+        Map map = new HashMap();
         try {
-            String response = restTemplate.postForObject(DAppUrl,files, String.class);
+            response = restTemplate.postForObject(DAppUrl, files, String.class);
             log.info("response={}", response);
-        }catch (HttpClientErrorException e){
+            //如果校验通过,生成用户数据,生成token
+            ComUsersVo comUsersVo = comUsersService.findByUserId(id);
+            if (comUsersVo == null) {
+                //如果没有用户信息
+                comUsersVo = new ComUsersVo();
+                comUsersVo.setUserId(id);
+                comUsersVo.setGold(0);
+                comUsersVo.setDiamond(0);
+                comUsersVo.setCnt(0);
+                comUsersVo.setSnb(0);
+                comUsersVo.setAddress(address);
+                comUsersService.save(comUsersVo);
+            }else{
+                //记录一下用户的Address
+                if(comUsersVo.getAddress() == null){
+                    comUsersVo.setAddress(address);
+                    comUsersService.save(comUsersVo);
+                }
+            }
+            //生成token
+            final String token = jwtTokenUtil.generateToken(comUsersVo.getUserId());
+            map.put("token", token);
+            map.put("active", active);
+            map.put("userInfo", CopyUtil.copy(comUsersVo, ComUsersSimpleVo.class));
+            map.put("response", JSON.parse(response));
+            return Result.of(map);
+        } catch (HttpClientErrorException e) {
             log.error(e.toString());
-        }
+            //返回 402 错误
+            response = e.toString();
+            map.put("active", active);
+            map.put("response", response);
+            return Result.of(map,false,ResultEnum.USER_VERIFICATION_ERROR.getMessage(),ResultEnum.USER_VERIFICATION_ERROR.getCode());
 
-        String userId ;
-        if(active.equals("dev")){
-            //if(loginId == null || !loginId.equals("1")){
-            //    return Result.of(null,false,"请输入参数 loginId = '1' ",ResultEnum.NO_PARAMETERS_CARRIED.getCode());
-            //}
-            //如果测试环境中,提供测试账号
-            userId = id;
-        }else{
-            // 正式环境
-            userId = id;
         }
 
-        ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
-
-        if(comUsersVo == null){
-            //如果没有用户信息
-            comUsersVo = new ComUsersVo();
-            comUsersVo.setUserId(userId);
-            comUsersVo.setGold(0);
-            comUsersVo.setDiamond(0);
-            comUsersVo.setCnt(0);
-            comUsersVo.setSnb(0);
-            comUsersService.save(comUsersVo);
-        }
-
-        //生成token
-        final String token = jwtTokenUtil.generateToken(comUsersVo.getUserId());
-        Map map = new HashMap();
-        map.put("active",active);
-        map.put("token",token);
-        return Result.of(map);
-    }
-
-    /**
-     * 微信支付签名算法sign
-     * @param parameters
-     * @return
-     */
-    @SuppressWarnings("unchecked")
-    public static String createSign(SortedMap<Object,Object> parameters){
-        StringBuffer sb = new StringBuffer();
-        Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
-        Iterator it = es.iterator();
-        while(it.hasNext()) {
-            Map.Entry entry = (Map.Entry)it.next();
-            String k = (String)entry.getKey();
-            Object v = entry.getValue();
-            if(null != v && !"".equals(v)
-                    && !"sign".equals(k) && !"key".equals(k)) {
-                sb.append(k + "=" + v + "&");
-            }
-        }
-        sb.append("key=" + Key);
-        String sign = MD5Util.getMD5(sb.toString()).toUpperCase();
-        return sign;
     }
 
-
     /**
      * 获取用户信息
+     *
      * @param userId
      * @return
      */
@@ -244,13 +237,14 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
     public Result<Map> getUserInfo(@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());
+        if (comUsersVo == null) {
+            return Result.of(null, false, ResultEnum.USER_DOES_NOT_EXIST.getMessage(), ResultEnum.USER_DOES_NOT_EXIST.getCode());
         }
-        map.put("gold",comUsersVo.getGold());
-        map.put("diamond",comUsersVo.getDiamond());
-        map.put("CNT",comUsersVo.getCnt());
-        map.put("SNB",comUsersVo.getSnb());
+        map.put("gold", comUsersVo.getGold());
+        map.put("diamond", comUsersVo.getDiamond());
+        map.put("CNT", comUsersVo.getCnt());
+        map.put("SNB", comUsersVo.getSnb());
+        map.put("address", comUsersVo.getAddress());
         return Result.of(map);
     }
 
@@ -263,8 +257,8 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
                                    @RequestParam(value = "diamond") Integer diamond) {
         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());
+        if (comUsersVo == null) {
+            return Result.of(null, false, ResultEnum.USER_DOES_NOT_EXIST.getMessage(), ResultEnum.USER_DOES_NOT_EXIST.getCode());
         }
 
         comUsersVo.setCnt(cnt);
@@ -272,10 +266,11 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
         comUsersVo.setGold(gold);
         comUsersVo.setDiamond(diamond);
         comUsersService.save(comUsersVo);
-        map.put("gold",comUsersVo.getGold());
-        map.put("diamond",comUsersVo.getDiamond());
-        map.put("CNT",comUsersVo.getCnt());
-        map.put("SNB",comUsersVo.getSnb());
+        map.put("gold", comUsersVo.getGold());
+        map.put("diamond", comUsersVo.getDiamond());
+        map.put("CNT", comUsersVo.getCnt());
+        map.put("SNB", comUsersVo.getSnb());
+        map.put("address", comUsersVo.getAddress());
         return Result.of(map);
     }
 
@@ -284,7 +279,7 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
     @ResponseBody
     @RequestMapping("/playback/{cid}")
     public Result<Map> pushToWeb(@PathVariable String cid, String message) {
-        Map<String,Object> result = new HashMap<>();
+        Map<String, Object> result = new HashMap<>();
         try {
             DappWSServer.sendInfo(message, cid);
             result.put("id", cid);

+ 1 - 1
src/main/java/com/td/boss/game/comusers/pojo/ComUsers.java

@@ -20,5 +20,5 @@ public class ComUsers implements Serializable {
 
     private Integer snb;//
 
-
+    private String address;//记录一个用户钱包地址
 }

+ 2 - 1
src/main/java/com/td/boss/game/comusers/repository/ComUsersRepository.java

@@ -8,6 +8,7 @@ import java.util.Optional;
 
 @Repository
 public interface ComUsersRepository extends CommonRepository<ComUsers, String> {
-
     Optional<ComUsers> findByUserId(String userId);
+
+    Optional<ComUsers> findByAddress(String address);
 }

+ 3 - 0
src/main/java/com/td/boss/game/comusers/service/ComUsersService.java

@@ -12,4 +12,7 @@ public interface ComUsersService extends CommonService<ComUsersVo, ComUsers, Str
      * @return
      */
     ComUsersVo findByUserId(String userId);
+
+
+    ComUsersVo findByAddress(String address);
 }

+ 11 - 0
src/main/java/com/td/boss/game/comusers/service/ComUsersServiceImpl.java

@@ -31,4 +31,15 @@ public class ComUsersServiceImpl extends CommonServiceImpl<ComUsersVo, ComUsers,
             return CopyUtil.copy(comUsers.get(), ComUsersVo.class);
         }
     }
+
+
+    @Override
+    public ComUsersVo findByAddress(String address) {
+        Optional<ComUsers>  comUsers =  comUsersRepository.findByAddress(address);
+        if(comUsers.orElse(null) == null){
+            return null;
+        }else{
+            return CopyUtil.copy(comUsers.get(), ComUsersVo.class);
+        }
+    }
 }

+ 20 - 0
src/main/java/com/td/boss/game/comusers/vo/ComUsersSimpleVo.java

@@ -0,0 +1,20 @@
+package com.td.boss.game.comusers.vo;
+
+import com.td.boss.common.pojo.PageCondition;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ComUsersSimpleVo implements Serializable {
+
+    private Integer gold;//游戏本身金币
+
+    private Integer diamond;//游戏本身钻石
+
+    private Integer cnt;//
+
+    private Integer snb;//
+
+    private String address;//记录一个用户钱包地址
+}

+ 2 - 0
src/main/java/com/td/boss/game/comusers/vo/ComUsersVo.java

@@ -16,4 +16,6 @@ public class ComUsersVo extends PageCondition implements Serializable {
 
     private Integer snb;//
 
+    private String address;//记录一个用户钱包地址
+
 }

+ 6 - 5
src/main/java/com/td/boss/util/CodeDOM.java

@@ -30,9 +30,9 @@ public class CodeDOM {
     /**
      * 数据连接相关
      */
-    private static final String URL = "jdbc:mysql://sh-cdb-5of7rcbk.sql.tencentcdb.com:60412/DairyBeatBoss?serverTimezone=GMT%2B8&characterEncoding=utf-8";
+    private static final String URL = "jdbc:mysql://42.192.165.168:3306/dragon_town?serverTimezone=GMT%2B8&characterEncoding=utf-8";
     private static final String USERNAME = "root";
-    private static final String PASSWORD = "Qwerty9527";
+    private static final String PASSWORD = "9ab8fad748dead93";
     private static final String DRIVER_CLASSNAME = "com.mysql.jdbc.Driver";
     /**
      * 表名
@@ -529,9 +529,10 @@ 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_bosses","com_bosses_battle","com_equip_attributes", "com_equip_chest","com_equip_type","com_equips","com_general_attributes","com_player_goods","com_players","com_users","com_rewards"};
-        String[] tables = {"com_bosses_describe"};
+       // 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"};
         for (String table : tables) {
             String msg = new CodeDOM(table).create();
             System.out.println(msg);

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

@@ -34,6 +34,13 @@ public class DateUtil {
         return cal.getTime();
     }
 
+    public static Date getOldDateAddYear(Date date,Integer n){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.add(Calendar.YEAR,+ n);
+        return cal.getTime();
+    }
+
     /**
      * 获取当前时间 - N个月
      */
@@ -52,6 +59,16 @@ public class DateUtil {
         return cal.getTime();
     }
 
+    /**
+     * 获取当前时间 + N个月
+     */
+    public static Date getOldDateAddMonth(Date date,Integer n){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.add(Calendar.MONTH,+ n);
+        return cal.getTime();
+    }
+
     /**
      * 获取当前时间 - N个周
      */

+ 31 - 0
src/main/java/com/td/boss/util/MD5Util.java

@@ -4,12 +4,17 @@ import lombok.extern.slf4j.Slf4j;
 
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
 
 /**
  * MD5 工具类
  */
 @Slf4j
 public class MD5Util {
+    private static String Key = "DH08hdf2n9df9hg2e";
 
     /**
      * 生成MD5加密串
@@ -40,4 +45,30 @@ public class MD5Util {
     private static boolean verify(String text,String md5){
         return md5.equals(getMD5(text));
     }
+
+
+    /**
+     * 微信支付签名算法sign
+     *
+     * @param parameters
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static String createSign(SortedMap<Object, Object> parameters) {
+        StringBuffer sb = new StringBuffer();
+        Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
+        Iterator it = es.iterator();
+        while (it.hasNext()) {
+            Map.Entry entry = (Map.Entry) it.next();
+            String k = (String) entry.getKey();
+            Object v = entry.getValue();
+            if (null != v && !"".equals(v)
+                    && !"sign".equals(k) && !"key".equals(k)) {
+                sb.append(k + "=" + v + "&");
+            }
+        }
+        sb.append("key=" + Key);
+        String sign = MD5Util.getMD5(sb.toString()).toUpperCase();
+        return sign;
+    }
 }