Bläddra i källkod

新加模块7 8牧场养殖

xst 3 år sedan
förälder
incheckning
faaa89113a
22 ändrade filer med 539 tillägg och 424 borttagningar
  1. 6 0
      src/main/java/com/td/boss/config/enums/ResultEnum.java
  2. 5 0
      src/main/java/com/td/boss/game/comconfigland/vo/ComConfigLandVo.java
  3. 5 0
      src/main/java/com/td/boss/game/comexplainland/pojo/ComExplainLand.java
  4. 5 0
      src/main/java/com/td/boss/game/comexplainland/vo/ComExplainLandVo.java
  5. 9 173
      src/main/java/com/td/boss/game/complayercultivate/controller/ComPlayerCultivateController.java
  6. 35 20
      src/main/java/com/td/boss/game/complayercultivate/pojo/ComPlayerCultivate.java
  7. 0 45
      src/main/java/com/td/boss/game/complayercultivate/pojo/ComPlayerCultivateDetail.java
  8. 0 12
      src/main/java/com/td/boss/game/complayercultivate/repository/ComPlayerCultivateDetailRepository.java
  9. 4 6
      src/main/java/com/td/boss/game/complayercultivate/repository/ComPlayerCultivateRepository.java
  10. 26 3
      src/main/java/com/td/boss/game/complayercultivate/serivce/ComPlayerCultivateSerivce.java
  11. 188 75
      src/main/java/com/td/boss/game/complayercultivate/serivce/ComPlayerCultivateSerivceImpl.java
  12. 0 42
      src/main/java/com/td/boss/game/complayercultivate/vo/ComPlayerCultivateDetailVo.java
  13. 10 0
      src/main/java/com/td/boss/game/complayercultivate/vo/ComPlayerCultivateSeedVo.java
  14. 37 18
      src/main/java/com/td/boss/game/complayercultivate/vo/ComPlayerCultivateVo.java
  15. 11 1
      src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java
  16. 5 2
      src/main/java/com/td/boss/game/complayergoods/pojo/ComPlayerGoods.java
  17. 7 2
      src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsVo.java
  18. 62 11
      src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java
  19. 5 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandAndPlantVo.java
  20. 5 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandVo.java
  21. 3 10
      src/main/java/com/td/boss/util/RedisData.java
  22. 111 4
      src/test/java/com/td/boss/ComPlayerCultivateTests.java

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

@@ -99,6 +99,12 @@ public enum ResultEnum {
     SEED_SALE_SAVE_LOCK(810,"操作繁忙,出售失败,稍后再试!"),
     SEED_NO_LAND_ERROR(812,"种子土地不匹配!"),
     SEED_LAND_TIME_ERROR(813,"土地租赁时间不足!"),
+
+    LAND_NO_TIMES_ERROR(814,"次数不足,租赁失败!"),
+    FOOD_NO_TYPE_ERROR(815,"粮食和养殖类型不匹配!"),
+    LAND_NO_PLANT_ERROR(816,"土地未养殖,喂养失败!"),
+    FOOD_NO_ERROR(817,"未找到养料!"),
+    FOOD_REPEAT_ERROR(818,"今日已喂养!"),
     //装备相关
     MALL_OTHER_IS_NULL(810,"商城装备不存在!"),
     MALL_OTHER_IS_HAVE(811,"商城装备已经存在!"),

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

@@ -46,4 +46,9 @@ public class ComConfigLandVo  implements Serializable { //extends PageCondition
 
     private Date updateTime;//
 
+    /**
+     * 需求 牧场养殖渔场,新增字段,
+     * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
+     */
+    private Integer mallType;
 }

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

@@ -44,4 +44,9 @@ public class ComExplainLand implements Serializable {
 
     private Date updateTime;//
 
+    /**
+     * 需求 牧场养殖渔场,新增字段,
+     * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
+     */
+    private Integer mallType;
 }

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

@@ -40,4 +40,9 @@ public class ComExplainLandVo extends PageCondition implements Serializable {
 
     private Date updateTime;//
 
+    /**
+     * 需求 牧场养殖渔场,新增字段,
+     * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
+     */
+    private Integer mallType;
 }

+ 9 - 173
src/main/java/com/td/boss/game/complayercultivate/controller/ComPlayerCultivateController.java

@@ -7,29 +7,23 @@ import com.td.boss.game.comexplainland.service.ComExplainLandService;
 import com.td.boss.game.comexplainland.vo.ComExplainLandVo;
 import com.td.boss.game.commallseed.service.ComMallSeedService;
 import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import com.td.boss.game.complayercultivate.serivce.ComPlayerCultivateSerivce;
 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.service.ComPlayerDisasterLogService;
-import com.td.boss.game.complayerland.service.ComPlayerDisasterProtectedService;
 import com.td.boss.game.complayerland.service.ComPlayerLandService;
 import com.td.boss.game.complayerland.vo.ComPlayerLandAndPlantVo;
 import com.td.boss.game.complayerland.vo.ComPlayerLandVo;
 import com.td.boss.game.complayerlog.service.ComPlayerLogService;
 import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
-import com.td.boss.game.complayerprofit.service.ComPlayerProfitService;
 import com.td.boss.util.CopyUtil;
 import com.td.boss.util.DateUtil;
-import com.td.boss.util.RedisLock;
 import com.td.boss.util.UUIDUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
 
@@ -42,176 +36,18 @@ import java.util.Date;
 @RequestMapping("/game/comPlayerCultivate/")
 public class ComPlayerCultivateController {
     @Autowired
-    private ComPlayerLandService comPlayerLandService;
-
-    @Autowired
-    private ComMallSeedService comMallSeedService;
-
-    @Autowired
-    private ComPlayerGoodsService comPlayerGoodsService;
-
-    @Autowired
-    private ComPlayerLogService comPlayerLogService;
-
-    @Autowired
-    private ComExplainLandService comExplainLandService;
+    private ComPlayerCultivateSerivce comPlayerCultivateSerivce;
 
     /**
-     * 种植土地,要先有土地才能种植
-     *
+     * 解锁某个土地 【牧场养殖渔场】
      * @param userId
+     * @param configLandId
      * @return
      */
-    @GetMapping("plant")
+    @PostMapping("payLand")
     @Transactional(rollbackFor = Exception.class)
-    public Result<ComPlayerLandAndPlantVo> plantFunction(
-            @RequestParam(value = "userId") String userId,
-            @RequestParam(value = "landId") Integer landId,
-            @RequestParam(value = "seedId") Integer seedId,
-            @RequestParam(value = "count") Integer count) {
-
-        try {
-            ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, landId);
-            //土地数据不存在
-            if (comPlayerLand == null) {
-                return Result.of(null, false, ResultEnum.LAND_DATA_ERROR.getMessage(), ResultEnum.LAND_DATA_ERROR.getCode());
-            }
-            if (!comPlayerLand.getIsLease().equals(1)) {
-                return Result.of(null, false, ResultEnum.LAND_NOT_LEASE.getMessage(), ResultEnum.LAND_NOT_LEASE.getCode());
-            }
-            //土地已种植
-            if (comPlayerLand.getIsPlant().equals(1)) {
-                return Result.of(null, false, ResultEnum.LAND_IS_PLANT.getMessage(), ResultEnum.LAND_IS_PLANT.getCode());
-            }
-            //todo 用户没刷新时候,土地还存在。判定一下时间是否到期,到期不给收获
-            //租赁的剩余天数 。
-            Long leaseDaysMill = comPlayerLand.getLeaseTime().getTime() - DateUtil.getNowDate().getTime();
-            if (leaseDaysMill <= 0) {
-                //todo 清除记录的数据
-                //    1.土地租赁到期,删除土地租赁数据
-                comPlayerLandService.delete(comPlayerLand.getId());
-                //todo 2.把删除的这个土地的数据记录到com_explain_land中去
-                ComExplainLandVo comExplainLandVo = new ComExplainLandVo();
-                comExplainLandVo = CopyUtil.copy(comPlayerLand, ComExplainLandVo.class);
-                comExplainLandVo.setLandId(comPlayerLand.getConfigLandId());
-                comExplainLandVo.setLandCreate(comPlayerLand.getCreateTime());
-                comExplainLandVo.setExplainType(0);
-                comExplainLandVo.setExplainDescribe("播种种子时:土地租赁过期回收");
-                comExplainLandVo.setCreateTime(new Date());
-                comExplainLandVo.setUpdateTime(new Date());
-                comExplainLandService.save(comExplainLandVo);
-                return Result.of(null, false, ResultEnum.LAND_LEASE_EXPIRED.getMessage(), ResultEnum.LAND_LEASE_EXPIRED.getCode());
-            }
-
-            //获得种子信息
-            ComMallSeedVo comMallSeedVo = comMallSeedService.findById(seedId);
-            if (comMallSeedVo == null) {
-                return Result.of(null, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
-            }
-            //[xst] 如果剩余时间<成熟时间 不允许种子
-            if (Convert.toInt(comMallSeedVo.getMallType()) > 0 && leaseDaysMill < comMallSeedVo.getMaturity()) {
-                return Result.of(null, false, ResultEnum.SEED_LAND_TIME_ERROR.getMessage(), ResultEnum.SEED_LAND_TIME_ERROR.getCode());
-            }
-            //[xst] 需要判断种子和土地类型是否匹配
-            if (comMallSeedVo.getMallType().equals(comPlayerLand.getMallType()) == false) {
-                return Result.of(null, false, ResultEnum.SEED_NO_LAND_ERROR.getMessage(), ResultEnum.SEED_NO_LAND_ERROR.getCode());
-            }
-
-            //todo 背包种子减去 土地当前的倍数,需要多倍播种,即消耗多个种子
-            ComPlayerGoods comPlayerGoodsSimpleVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, comMallSeedVo.getHarvestId(), 0);
-            //先拿到一个 before
-            Integer _beforeAmount = comPlayerGoodsSimpleVo.getAmount();
-            //操作一个种子的倍数
-            if (comPlayerGoodsSimpleVo.getAmount() < count || count > 500 || count < 0) {
-                return Result.of(null, false, ResultEnum.PLAYER_GOODS_SEEDS_AMOUNT_ERROR.getMessage(), ResultEnum.PLAYER_GOODS_SEEDS_AMOUNT_ERROR.getCode());
-
-            } else if (comPlayerGoodsSimpleVo.getAmount().equals(count)) {
-                //数量一样清除背包数据
-                comPlayerGoodsService.delete(comPlayerGoodsSimpleVo.getGoodsId());
-            } else {
-                //_beforeAmount = comPlayerGoodsSimpleVo.getAmount();
-                //否则减去土地倍数
-                comPlayerGoodsSimpleVo.setAmount(comPlayerGoodsSimpleVo.getAmount() - count);
-                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.setPlantFlag(UUIDUtil.getUUID());
-
-            //重新种植后,重新设置一个可以偷的标识
-            comPlayerLand.setPlantSteal(1);
-
-            //comPlayerLand.setLandDescribe();
-            ComPlayerLandVo comPlayerLandVo = CopyUtil.copy(comPlayerLand, ComPlayerLandVo.class);
-            comPlayerLandService.save(comPlayerLandVo);
-
-            //todo 记录一个种植 操作信息
-            ComPlayerLogVo _playerLogVo = new ComPlayerLogVo();
-            _playerLogVo.setUserId(userId);
-            _playerLogVo.setTId(comMallSeedVo.getId());
-            _playerLogVo.setTName(comMallSeedVo.getName());
-            _playerLogVo.setTType(1);//设置一个操作种子的id
-            _playerLogVo.setTAmount(comPlayerLand.getLeaseMultiple());
-            //交易后的数据
-            _playerLogVo.setBeforeAmount(_beforeAmount);
-            Integer _afterAmount = _beforeAmount - comPlayerLand.getLeaseMultiple();
-            _afterAmount = _afterAmount < 0 ? 0 : _afterAmount;
-            _playerLogVo.setAfterAmount(_afterAmount);
-            _playerLogVo.setLMultiple(comPlayerLand.getLeaseMultiple());
-
-            //收取时候信息记录
-            _playerLogVo.setTPart(0d);
-            _playerLogVo.setTLoss(0d); //损失的部分
-            _playerLogVo.setBeforePart(0d);
-            _playerLogVo.setAfterPart(0d);
-            comPlayerLogService.save(_playerLogVo);
-
-            ComPlayerLandAndPlantVo comPlayerLandAndPlantVo = CopyUtil.copy(comPlayerLand, ComPlayerLandAndPlantVo.class);
-            comPlayerLandAndPlantVo.setSeedInfo(comMallSeedVo);
-
-            //todo 返回一个计算的天数和小时,解决跨时区的问题
-            //土地时间
-            //租赁的总时间 = 租赁时间 - 土地数据的创建时间
-            Long leaseAllMill = comPlayerLandAndPlantVo.getLeaseTime().getTime() - comPlayerLandAndPlantVo.getCreateTime().getTime();
-            Integer allDays = DateUtil.getDays(leaseAllMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseAllMill).intValue();
-            comPlayerLandAndPlantVo.setLeaseDays(allDays);
-            //租赁的剩余天数
-            Integer leaseDays = DateUtil.getDays(leaseDaysMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseDaysMill).intValue();
-            comPlayerLandAndPlantVo.setLeaseDaysRemaining(leaseDays);
-
-            //返回一个租赁时间毫秒
-            comPlayerLandAndPlantVo.setLeaseDaysMill(leaseDaysMill);
-
-            //种子时间
-            //当前时间 > 种植时间+成熟期  = 说明可以收获了
-            //获取当前时间 - 植物的成熟期 = 收获时间,收获时间 >= 种植时间,即可以收获
-            Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
-            // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
-            long diff = comPlayerLandAndPlantVo.getPlantStart().getTime() - _harvestTime.getTime();
-            //种植的剩余时间毫秒
-            comPlayerLandAndPlantVo.setPlantDaysMill(diff);
-
-            if (diff <= 0) {
-                //说明可以收获了
-                comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
-                comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
-            } else {
-                comPlayerLandAndPlantVo.setPlantDaysRemaining(DateUtil.getDays(diff).intValue());
-                comPlayerLandAndPlantVo.setPlantHoursRemaining(DateUtil.getHours(diff).intValue());
-            }
-            return Result.of(comPlayerLandAndPlantVo);
-
-        } catch (Exception e) {
-            throw new RuntimeException(e.getMessage());
-        }
+    public Result<?> payLand(@RequestParam(value = "userId") String userId,
+                                                   @RequestParam(value = "configLandId") Integer configLandId) {
+        return comPlayerCultivateSerivce.payLand(userId, configLandId);
     }
 }

+ 35 - 20
src/main/java/com/td/boss/game/complayercultivate/pojo/ComPlayerCultivate.java

@@ -3,10 +3,7 @@ package com.td.boss.game.complayercultivate.pojo;
 
 import lombok.Data;
 
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -15,6 +12,7 @@ import java.util.Date;
  * @date : 2022-3-19
  * @desc : 放牧养殖渔场租赁表
  */
+@Entity
 @Data
 @Table(name="com_player_cultivate")
 public class ComPlayerCultivate implements Serializable{
@@ -22,20 +20,37 @@ public class ComPlayerCultivate implements Serializable{
     @Id
     @GeneratedValue(strategy= GenerationType.IDENTITY)
     private Integer id ;
-    /** 用户id */
-    private String userId ;
-    /** 土地id */
-    private Integer landId ;
-    /** 土地类型 */
-    private Integer landType ;
-    /** 土地名称 */
-    private String landName ;
-    /** 最大养殖数 */
-    private Integer landLimit ;
-    /** 是否正在使用 */
-    private Integer isActivity ;
-    /** 土地租赁创建时间 */
-    private Date createTime ;
-    /** 土地租赁截止日期 */
-    private Date endTime ;
+    /**
+     * 用户id
+     */
+    private String userId;
+    /**
+     * 土地id
+     */
+    private Integer landId;
+    /**
+     * 土地id
+     */
+    private Integer configLandId;
+    /**
+     * 需求 牧场养殖渔场,新增字段,
+     * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
+     */
+    private Integer landType;
+    /**
+     * 土地名称
+     */
+    private Integer amount;
+    /**
+     * 是否正在使用
+     */
+    private Date activtyTime;
+    /**
+     * 土地租赁创建时间
+     */
+    private Date createTime;
+    /**
+     * 土地租赁截止日期
+     */
+    private double snb;
 }

+ 0 - 45
src/main/java/com/td/boss/game/complayercultivate/pojo/ComPlayerCultivateDetail.java

@@ -1,45 +0,0 @@
-package com.td.boss.game.complayercultivate.pojo;
-
-import lombok.Data;
-
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @author :
- * @date : 2022-3-19
- * @desc : 放牧养殖渔场放养记录
- */
-@Data
-@Table(name="com_player_cultivate_detail")
-public class ComPlayerCultivateDetail implements Serializable {
-    /**  */
-    @Id
-    @GeneratedValue(strategy= GenerationType.IDENTITY)
-    private Integer id ;
-    /**  */
-    private Integer logId ;
-    /** 种子id */
-    private Integer seedId ;
-    /** 种子数量 */
-    private Integer seedNum ;
-    /** 种子对象 */
-    private String seed ;
-    /** 放养开始时间 */
-    private Date createTime ;
-    /** 真实果实成熟时间 */
-    private Date maturityTime ;
-    /** 延期日志 */
-    private String delayLog ;
-    /** 真实收入数量 */
-    private double incomeNum ;
-    /** 收入日志 */
-    private String incomeLog ;
-    /** 是否成熟 */
-    private Integer isMaturity ;
-
-}

+ 0 - 12
src/main/java/com/td/boss/game/complayercultivate/repository/ComPlayerCultivateDetailRepository.java

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

+ 4 - 6
src/main/java/com/td/boss/game/complayercultivate/repository/ComPlayerCultivateRepository.java

@@ -4,10 +4,8 @@ import com.td.boss.common.repository.CommonRepository;
 import com.td.boss.game.complayercultivate.pojo.ComPlayerCultivate;
 import org.springframework.stereotype.Repository;
 
-import java.util.Optional;
+@Repository
+public interface ComPlayerCultivateRepository extends CommonRepository<ComPlayerCultivate, Integer> {
 
-//@Repository
-//public interface ComPlayerCultivateRepository extends CommonRepository<ComPlayerCultivate, Integer> {
-//
-//    ComPlayerCultivate findByUserId(String userId);
-//}
+    long countComPlayerCultivateByUserIdAndLandTypeAndConfigLandId(String userId,Integer landType,Integer configLandId);
+}

+ 26 - 3
src/main/java/com/td/boss/game/complayercultivate/serivce/ComPlayerCultivateSerivce.java

@@ -1,13 +1,18 @@
 package com.td.boss.game.complayercultivate.serivce;
 
 import com.td.boss.common.pojo.Result;
-
-import java.util.List;
+import java.util.Date;
 
 public interface ComPlayerCultivateSerivce {
 
+    /**
+     * 解锁某个土地 【牧场养殖渔场】
+     * @param userId
+     * @param configLandId
+     * @return
+     */
+    Result<?> payLand(String userId, Integer configLandId);
 
-    Result<?> zulin(String userId, Integer configLandId);
     /**
      * 获取租赁机会
      *
@@ -15,4 +20,22 @@ public interface ComPlayerCultivateSerivce {
      * @return
      */
     Integer getTimes(String userId);
+
+    /**
+     * 养殖 喂粮,一天不喂延迟2天
+     * @param userId
+     * @param configLandId
+     * @return
+     */
+    Result<?> buyFood(String userId, Integer configLandId);
+
+    /**
+     * 获得养殖类种子实际成熟日期:正常成熟天数+延期天数(一次不喂延迟2天)
+     * 成熟时间的具体值 (取时间差(今天-种植当天)-喂的次数)*2
+     *
+     * @return 延期后的成熟期
+     */
+    Date getHarvestTime(String userId, Integer configLandId);
+
+    Integer getHarvestDays(String userId, Integer configLandId);
 }

+ 188 - 75
src/main/java/com/td/boss/game/complayercultivate/serivce/ComPlayerCultivateSerivceImpl.java

@@ -4,20 +4,40 @@ import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateUtil;
 import com.td.boss.common.pojo.Result;
+import com.td.boss.common.service.ComConfigService;
 import com.td.boss.config.enums.ResultEnum;
 import com.td.boss.game.comconfigland.pojo.ComConfigLand;
 import com.td.boss.game.comconfigland.service.ComConfigLandService;
+import com.td.boss.game.comexplainland.service.ComExplainLandService;
+import com.td.boss.game.comexplainland.vo.ComExplainLandVo;
+import com.td.boss.game.complayercultivate.pojo.ComPlayerCultivate;
+import com.td.boss.game.complayercultivate.repository.ComPlayerCultivateRepository;
+import com.td.boss.game.complayercultivate.vo.ComPlayerCultivateSeedVo;
+import com.td.boss.game.complayercultivate.vo.ComPlayerCultivateVo;
+import com.td.boss.game.complayerland.pojo.ComPlayerDisaster;
 import com.td.boss.game.complayerland.pojo.ComPlayerLand;
 import com.td.boss.game.complayerland.service.ComPlayerLandService;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
+import com.td.boss.game.comusers.service.ComUsersService;
+import com.td.boss.game.comusers.vo.ComUsersVo;
 import com.td.boss.util.DappUtil;
+import com.td.boss.util.DoubleUtil;
 import com.td.boss.util.RedisData;
 import com.td.boss.util.RedisLock;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 @Service
 @Slf4j
@@ -27,36 +47,49 @@ public class ComPlayerCultivateSerivceImpl implements ComPlayerCultivateSerivce
     @Autowired
     private ComPlayerLandService comPlayerLandService;
     @Autowired
+    private ComExplainLandService comExplainLandService;
+    @Autowired
     private ComConfigLandService comConfigLandService;
-//    @Autowired
-//    private ComPlayerCultivateRepository cultivateRepository;
-//    @Autowired
-//    private ComPlayerCultivateDetailRepository cultivateDetailRepository;
-
+    @Autowired
+    private ComPlayerCultivateRepository cultivateRepository;
+    @Autowired
+    private ComConfigService comConfigService;
+    @Autowired
+    private ComUsersService comUsersService;
     @Autowired
     private RedisLock redisLock;
 
+    /**
+     * 解锁某个土地 【牧场养殖渔场】
+     * @param userId
+     * @param configLandId
+     * @return
+     */
     @Transactional
     @Override
-    public Result<?> zulin(String userId, Integer configLandId) {
-        long time = System.currentTimeMillis() + RedisData.getPlayerCultivateZuLinTimeout();
-        String _redisKey = "LOCK:COM_PLAYER_CULTIVATE_ZULIN:" + userId;
-        if (redisLock.lock(_redisKey, String.valueOf(time))) {
+    public Result<?> payLand(String userId, Integer configLandId) {
+        //根据土地config id查找,对应ConfigLandId ,
+        ComConfigLand comConfigLand = comConfigLandService.findById(configLandId);
+        //如果土地等于不能初始化,或者已经种植,不能进行购买
+        if (comConfigLand == null || comConfigLand.getIsInit().equals(0) || comConfigLand.getIsPlant().equals(1)) {
+            return Result.of(null, false, ResultEnum.LAND_DATA_ERROR.getMessage(), ResultEnum.LAND_DATA_ERROR.getCode());
+        }
+        ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, configLandId);
+
+        String _redisKey = comPlayerLand.getPlantFlag();
+        if (!StringUtils.hasText(_redisKey)) {
+            //return Result.of(null, false, ResultEnum.LAND_PLANT_FLAG_IS_NULL.getMessage(), ResultEnum.LAND_PLANT_FLAG_IS_NULL.getCode());
+            _redisKey = comPlayerLand.getUserId() + "or" + comPlayerLand.getConfigLandId();
+        }
+        long landTime = System.currentTimeMillis() + RedisData.getLandTimeout();
+        if (!redisLock.lock(_redisKey, String.valueOf(landTime))) {
             log.info("锁住key:" + _redisKey);
             return ErrorResult("操作频繁!");
         }
         try {
-            //根据土地config id查找,对应ConfigLandId ,
-            ComConfigLand comConfigLand = comConfigLandService.findById(configLandId);
-            //如果土地等于不能初始化,或者已经种植,不能进行购买
-            if (comConfigLand == null || comConfigLand.getIsInit().equals(0) || comConfigLand.getIsPlant().equals(1)) {
-                return Result.of(null, false, ResultEnum.LAND_DATA_ERROR.getMessage(), ResultEnum.LAND_DATA_ERROR.getCode());
-            }
             if (getTimes(userId) <= 0) {
-                return ErrorResult("次数不足!");
+                return Result.of(null, false, ResultEnum.LAND_NO_TIMES_ERROR.getMessage(), ResultEnum.LAND_NO_TIMES_ERROR.getCode());
             }
-            ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, configLandId);
-
             if (comPlayerLand == null) {
                 //创建新土地
                 comPlayerLand = new ComPlayerLand();
@@ -82,64 +115,14 @@ public class ComPlayerCultivateSerivceImpl implements ComPlayerCultivateSerivce
                 comPlayerLand.setRentalExpenses(1.0d);
                 comPlayerLandService.AddComPlayerLand(comPlayerLand);
             }
-            return Result.of(null, true, "租赁成功");
+            return Result.of(comPlayerLand, true, "租赁成功");
         } catch (Exception e) {
         } finally {
-            redisLock.unlock(_redisKey, String.valueOf(time));
+            redisLock.unlock(_redisKey, String.valueOf(landTime));
         }
         return ErrorResult("租赁失败!");
     }
 
-//    @Transactional
-//    @Override
-//    public Result<?> toufang(String userId, String landId, String seedId, Integer seedNum) {
-//        long time = System.currentTimeMillis() + RedisData.getPlayerCultivateTouFangTimeout();
-//        String _redisKey = "LOCK:COM_PLAYER_CULTIVATE_TOUFANG:" + userId;
-//        if (redisLock.lock(_redisKey, String.valueOf(time))) {
-//            return ErrorResult("操作频繁!");
-//        }
-//        try {
-//            ComPlayerCultivate comPlayerCultivate = cultivateRepository.findByUserId(userId);
-//            if (comPlayerCultivate == null) {
-//                return ErrorResult("该土地未被租赁!");
-//            }
-//            ComPlayerCultivateSeedVo seedVo = getSeedById(seedId);
-//            if (seedVo == null) {
-//                return ErrorResult("幼崽不存在!");
-//            }
-//            if (comPlayerCultivate != null && Integer.getInteger("1").equals(comPlayerCultivate.getIsActivity())) {
-//                return ErrorResult("该土地正在使用中!");
-//            }
-//            //计算一下成熟的时间
-//            DateTime maturityTime = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, seedVo.getMaturity());
-//            if (maturityTime.after(comPlayerCultivate.getEndTime())) {
-//                return ErrorResult("土地租赁时间不足!");
-//            }
-//            //判断一下种植最大数量
-//            if (comPlayerCultivate.getLandLimit() > seedNum) {
-//                return ErrorResult("最多可投放" + comPlayerCultivate.getLandLimit() + "!");
-//            }
-//            comPlayerCultivate.setIsActivity(1);
-//            cultivateRepository.save(comPlayerCultivate);
-//
-//            ComPlayerCultivateDetail comPlayerCultivateDetailVo = new ComPlayerCultivateDetail();
-//            comPlayerCultivateDetailVo.setCreateTime(new Date());
-//            comPlayerCultivateDetailVo.setSeed(JSONUtil.toJsonStr(seedVo));
-//            comPlayerCultivateDetailVo.setSeedId(seedVo.getSeedId());
-//            comPlayerCultivateDetailVo.setSeedNum(seedNum);
-//            comPlayerCultivateDetailVo.setIsMaturity(0);
-//            comPlayerCultivateDetailVo.setMaturityTime(maturityTime);
-//            comPlayerCultivateDetailVo.setIncomeNum(seedVo.getHarvest() * seedNum);
-//            cultivateDetailRepository.save(comPlayerCultivateDetailVo);
-//            return Result.of(null, true, "投放成功!");
-//
-//        } catch (Exception e) {
-//        } finally {
-//            redisLock.unlock(_redisKey, String.valueOf(time));
-//        }
-//        return ErrorResult("投放失败!");
-//    }
-
     /**
      * 获取租赁机会
      *
@@ -149,13 +132,143 @@ public class ComPlayerCultivateSerivceImpl implements ComPlayerCultivateSerivce
     @Override
     public Integer getTimes(String userId) {
         Integer totalcount = DappUtil.getChildrenBuyLandAmount(userId);
-        long hascount = comPlayerLandService.findAllByUserId(userId).stream()
-                .filter(a -> a.getMallType() > 0)
-                .map(a -> a.getLeaseDate())
-                .reduce(0, Integer::sum);
-        return totalcount - Convert.toInt(hascount);
+        long nowcount = comPlayerLandService.findAllByUserId(userId).stream()
+                .filter(a -> a.getMallType() != null && a.getMallType() > 0).count();
+        ComExplainLandVo comExplainLandVo = new ComExplainLandVo();
+        comExplainLandVo.setUserId(userId);
+        Result<List<ComExplainLandVo>> list = comExplainLandService.list(comExplainLandVo);
+        long historycount = list.getData().stream().filter(a -> a.getMallType() != null && a.getMallType() > 0).count();
+        return totalcount - Convert.toInt(nowcount) - Convert.toInt(historycount);
     }
 
+    /**
+     * 喂粮
+     *
+     * @param userId
+     * @param configLandId
+     * @return
+     */
+    @Transactional
+    @Override
+    public Result<?> buyFood(String userId, Integer configLandId) {
+        //获得本次喂的数量
+        ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, configLandId);
+        //土地数据不存在
+        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 (Integer.valueOf(0).equals(comPlayerLand.getMallType()) ) {
+            return Result.of(null, false, ResultEnum.FOOD_NO_TYPE_ERROR.getMessage(), ResultEnum.FOOD_NO_TYPE_ERROR.getCode());
+        }
+        Integer buyAmount = comPlayerLand.getLeaseMultiple();
+        //todo 操作snb数量
+        ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
+        if (comUsersVo.getSnb() <= 0) {
+            return Result.of(null, false, ResultEnum.WALLET_SNB_INSUFFICIENT_QUANTITY.getMessage(), ResultEnum.WALLET_SNB_INSUFFICIENT_QUANTITY.getCode());
+        }
+        if (Integer.valueOf(0).equals(comPlayerLand.getIsPlant())) {
+            return Result.of(null, false, ResultEnum.LAND_NO_PLANT_ERROR.getMessage(), ResultEnum.LAND_NO_PLANT_ERROR.getCode());
+        }
+        //通过判断土地类型,获取喂粮饲料
+        List<ComPlayerCultivateSeedVo> SeedList = comConfigService.selectByKey("cultivate_food", ComPlayerCultivateSeedVo.class);
+        ComPlayerCultivateSeedVo seedVo = SeedList.stream().filter(a -> a.getSeedId().equals(comPlayerLand.getMallType())).findFirst().orElse(null);
+        if (seedVo == null) {
+            return Result.of(null, false, ResultEnum.FOOD_NO_ERROR.getMessage(), ResultEnum.FOOD_NO_ERROR.getCode());
+        }
+        //判断今天是否已经喂过
+        Date begin = DateUtil.beginOfDay(new Date());
+        Date end = DateUtil.endOfDay(new Date());
+        if (exists(userId, comPlayerLand.getMallType(), configLandId, begin, end)) {
+            return Result.of(null, false, ResultEnum.FOOD_REPEAT_ERROR.getMessage(), ResultEnum.FOOD_REPEAT_ERROR.getCode());
+        }
+        long time = System.currentTimeMillis() + RedisData.getPlayerCultivateBuyFoodTimeout();
+        String _redisKey = "LOCK:COM_PLAYER_CULTIVATE_BUYFOOD:" + userId;
+        if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+            log.info("锁住key:" + _redisKey);
+            return ErrorResult("操作频繁!");
+        }
+        try {
+            ComSnbTranVo _snbTran = new ComSnbTranVo();
+            _snbTran.setBeforeSnb(comUsersVo.getSnb());
+            _snbTran.setBeforeSnbPart(comUsersVo.getSnbPart());
+            //计算
+            Double _allSnb = DoubleUtil.add(comUsersVo.getSnb().doubleValue(), comUsersVo.getSnbPart());
+            //如果有snb,扣除对应的snb
+            Integer _allSnbMaxInt = (int) Math.floor(_allSnb);
+            //这个价格需要从配置里取
+            double _needPrice = buyAmount * seedVo.getSeedSNB();
+            if (_allSnbMaxInt < _needPrice) {
+                return Result.of(null, false, ResultEnum.WALLET_SNB_INSUFFICIENT_QUANTITY.getMessage(), ResultEnum.WALLET_SNB_INSUFFICIENT_QUANTITY.getCode());
+            }
+            double _tranSnb = _allSnbMaxInt - _needPrice;
+            comUsersVo.setSnb(Convert.toInt(_tranSnb));
+            Double _SnbPart = DoubleUtil.sub(_allSnb, Math.floor(_allSnb));
+            comUsersVo.setSnbPart(_SnbPart);
+            //记录修改的数据
+            comUsersService.save(comUsersVo);
+
+            ComPlayerCultivate comPlayerCultivate = new ComPlayerCultivate();
+            comPlayerCultivate.setLandId(comPlayerLand.getId());
+            comPlayerCultivate.setLandType(comPlayerLand.getMallType());
+            comPlayerCultivate.setUserId(userId);
+            comPlayerCultivate.setCreateTime(new Date());
+            comPlayerCultivate.setConfigLandId(configLandId);
+            comPlayerCultivate.setAmount(buyAmount);
+            comPlayerCultivate.setActivtyTime(new Date());
+            comPlayerCultivate.setSnb(_needPrice);
+            cultivateRepository.save(comPlayerCultivate);
+            return Result.of(null, true, "成功");
+        } catch (Exception e) {
+        } finally {
+            redisLock.unlock(_redisKey, String.valueOf(time));
+        }
+        return ErrorResult("喂养失败!");
+    }
+
+    /**
+     * 获得养殖类种子实际成熟日期:正常成熟天数+延期天数(一次不喂延迟2天)
+     * 成熟时间的具体值 (取时间差(今天-种植当天)-喂的次数)*2
+     *
+     * @return 延期后的成熟期
+     */
+    @Override
+    public Date getHarvestTime(String userId, Integer configLandId) {
+        ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, configLandId);
+        Integer harvestDays = getHarvestDays(userId, configLandId);
+        return DateUtil.offset(comPlayerLand.getPlantStart(), DateField.DAY_OF_YEAR, harvestDays);
+    }
+
+    @Override
+    public Integer getHarvestDays(String userId, Integer configLandId) {
+        ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, configLandId);
+        //实际上一共喂几次
+        long times = cultivateRepository.countComPlayerCultivateByUserIdAndLandTypeAndConfigLandId(userId, comPlayerLand.getMallType(), configLandId);
+        //从当天到现在。一共过了几天
+        long days = DateUtil.betweenDay(new Date(), comPlayerLand.getPlantStart(), true)+1;
+        //延期追加天数
+        long l = (days - times) * 2;
+        //延期后的日期=成熟期+追加天数
+        //当天也算一天。过了0点就是新的一天
+        return Convert.toInt(l, 0) + comPlayerLand.getPlantMature()-1;
+    }
+
+    private boolean exists(String userId, Integer landType, Integer configLandId, Date begin, Date end) {
+        Specification specification = new Specification<ComPlayerDisaster>() {
+            @Override
+            public Predicate toPredicate(Root<ComPlayerDisaster> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(criteriaBuilder.between(root.get("createTime"), begin, end));
+                predicates.add(criteriaBuilder.equal(root.get("userId"), userId));
+                predicates.add(criteriaBuilder.equal(root.get("landType"), landType));
+                predicates.add(criteriaBuilder.equal(root.get("configLandId"), configLandId));
+                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
+            }
+        };
+        return cultivateRepository.count(specification) > 0;
+    }
 
     private Result<?> ErrorResult(String msg) {
         return Result.of(null, false, msg);

+ 0 - 42
src/main/java/com/td/boss/game/complayercultivate/vo/ComPlayerCultivateDetailVo.java

@@ -1,42 +0,0 @@
-package com.td.boss.game.complayercultivate.vo;
-
-import lombok.Data;
-
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @author :
- * @date : 2022-3-19
- * @desc : 放牧养殖渔场放养记录
- */
-@Data
-
-public class ComPlayerCultivateDetailVo implements Serializable {
-
-    private Integer id ;
-    /**  */
-    private Integer logId ;
-    /** 种子id */
-    private Integer seedId ;
-    /** 种子数量 */
-    private Integer seedNum ;
-    /** 种子对象 */
-    private String seed ;
-    /** 放养开始时间 */
-    private Date createTime ;
-    /** 真实果实成熟时间 */
-    private Date maturityTime ;
-    /** 延期日志 */
-    private String delayLog ;
-    /** 真实收入数量 */
-    private double incomeNum ;
-    /** 收入日志 */
-    private String incomeLog ;
-    /** 是否成熟*/
-    private Integer isMaturity ;
-
-}

+ 10 - 0
src/main/java/com/td/boss/game/complayercultivate/vo/ComPlayerCultivateSeedVo.java

@@ -0,0 +1,10 @@
+package com.td.boss.game.complayercultivate.vo;
+
+import lombok.Data;
+
+@Data
+public class ComPlayerCultivateSeedVo {
+    private Integer seedId;
+    private String seedName;
+    private double seedSNB;
+}

+ 37 - 18
src/main/java/com/td/boss/game/complayercultivate/vo/ComPlayerCultivateVo.java

@@ -1,7 +1,7 @@
 package com.td.boss.game.complayercultivate.vo;
 
 
-import javax.persistence.*;
+import lombok.Data;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -10,22 +10,41 @@ import java.util.Date;
  * @date : 2022-3-19
  * @desc : 放牧养殖渔场租赁表
  */
+@Data
+public class ComPlayerCultivateVo implements Serializable {
 
-public class ComPlayerCultivateVo implements Serializable{
-
-    private Integer id ;
-    /** 用户id */
-    private String userId ;
-    /** 土地id */
-    private Integer landId ;
-    /** 土地类型 */
-    private Integer landType ;
-    /** 土地名称 */
-    private String landName ;
-    /** 是否正在使用 */
-    private Integer isActivity ;
-    /** 土地租赁创建时间 */
-    private Date createTime ;
-    /** 土地租赁截止日期 */
-    private Date endTime ;
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private String userId;
+    /**
+     * 土地id
+     */
+    private Integer landId;
+    /**
+     * 土地id
+     */
+    private Integer configLandId;
+    /**
+     * 需求 牧场养殖渔场,新增字段,
+     * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
+     */
+    private Integer landType;
+    /**
+     * 土地名称
+     */
+    private Integer amount;
+    /**
+     * 是否正在使用
+     */
+    private Date activtyTime;
+    /**
+     * 土地租赁创建时间
+     */
+    private Date createTime;
+    /**
+     * 土地租赁截止日期
+     */
+    private double snb;
 }

+ 11 - 1
src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java

@@ -16,6 +16,7 @@ import com.td.boss.game.commallother.service.ComMallOtherService;
 import com.td.boss.game.commallother.vo.ComMallOtherVo;
 import com.td.boss.game.commallseed.service.ComMallSeedService;
 import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import com.td.boss.game.complayercultivate.serivce.ComPlayerCultivateSerivce;
 import com.td.boss.game.complayerdog.pojo.ComPlayerDog;
 import com.td.boss.game.complayerdog.service.ComPlayerDogService;
 import com.td.boss.game.complayerdog.vo.ComPlayerDogVo;
@@ -100,6 +101,9 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
     @Autowired
     private ComMallOtherService comMallOtherService;
 
+    @Autowired
+    private ComPlayerCultivateSerivce comPlayerCultivateSerivce;
+
 
     @Autowired
     private RedisLock redisLock;
@@ -231,6 +235,11 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             return Result.of(null, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
         }
 
+        //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
+        if (comPlayerLand.getMallType() > 0) {
+            Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, comPlayerLand.getConfigLandId());
+            comMallSeedVo.setMaturity(days);
+        }
         // 收获,同时重置土地状态,先判断是否成熟
         //当前时间减去 成熟期,判断是否成熟
         Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
@@ -346,7 +355,8 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
                 comPlayerGoodsSimpleVo.setPictureName(comMallSeedVo.getPicture());
                 comPlayerGoodsSimpleVo.setAmount(_amount);
                 comPlayerGoodsSimpleVo.setAmountPart(_amountPart);
-
+                //todo [牧场养殖渔场需求] 养殖收获果实时保存果实类型
+                comPlayerGoodsSimpleVo.setMallType(Convert.toInt(comMallSeedVo.getMallType()));
                 _beforeAmount = 0;
                 _beforeProfitPart = 0d;
                 _afterProfitPart = comPlayerGoodsSimpleVo.getAmountPart();

+ 5 - 2
src/main/java/com/td/boss/game/complayergoods/pojo/ComPlayerGoods.java

@@ -27,6 +27,9 @@ public class ComPlayerGoods implements Serializable {
     private Double amountPart;//部分数量,处理收取其他用户数据为主
 
     private Date createTime;
-
-    private Integer mallType;//新加类型。0代表原有,其他代表放牧养殖渔场
+    /**
+     * 需求 牧场养殖渔场,新增字段,
+     * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
+     */
+    private Integer mallType;
 }

+ 7 - 2
src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsVo.java

@@ -1,6 +1,7 @@
 package com.td.boss.game.complayergoods.vo;
 
-import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import com.td.boss.common.pojo.PageCondition;
+import lombok.Data;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -23,5 +24,9 @@ public class ComPlayerGoodsVo extends PageCondition implements Serializable {
     private Double amountPart;//部分数量,处理收取其他用户数据为主
 
     private Date createTime;
-
+    /**
+     * 需求 牧场养殖渔场,新增字段,
+     * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
+     */
+    private Integer mallType;
 }

+ 62 - 11
src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java

@@ -1,6 +1,7 @@
 package com.td.boss.game.complayerland.controller;
 
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateField;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.json.JSONUtil;
 import com.td.boss.common.controller.*;
@@ -10,6 +11,7 @@ import com.td.boss.game.comexplainland.service.ComExplainLandService;
 import com.td.boss.game.comexplainland.vo.ComExplainLandVo;
 import com.td.boss.game.commallseed.service.ComMallSeedService;
 import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import com.td.boss.game.complayercultivate.serivce.ComPlayerCultivateSerivce;
 import com.td.boss.game.complayerland.pojo.ComPlayerDisasterLog;
 import com.td.boss.game.complayerland.pojo.ComPlayerDisasterProtected;
 import com.td.boss.game.complayerland.service.ComPlayerDisasterLogService;
@@ -63,8 +65,8 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
 
     @Autowired
     private ComPlayerDisasterProtectedService disasterProtectedService;
-
-
+    @Autowired
+    private ComPlayerCultivateSerivce comPlayerCultivateSerivce;
     @Autowired
     private ComPlayerProfitService comPlayerProfitService;
 
@@ -111,6 +113,8 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                     comExplainLandVo.setExplainDescribe("获取土地列表时:土地租赁过期回收");
                     comExplainLandVo.setCreateTime(new Date());
                     comExplainLandVo.setUpdateTime(new Date());
+                    //todo [牧场养殖渔场需求] 新加土地类型
+                    comExplainLandVo.setMallType(e.getMallType());
                     comExplainLandService.save(comExplainLandVo);
                     //过期了不做后续操作
                     return null;
@@ -133,6 +137,12 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                     //当前时间 > 种植时间+成熟期  = 说明可以收获了
                     //获取当前时间 - 植物的成熟期 = 收获时间,收获时间 >= 种植时间,即可以收获
                     Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
+
+                    //todo [牧场养殖渔场需求] 如果是养殖类的,成熟期需要单独计算
+                    if (e.getMallType() > 0) {
+                        _harvestTime = comPlayerCultivateSerivce.getHarvestTime(userId, e.getConfigLandId());
+                    }
+
                     // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
                     long diff = comPlayerLandAndPlantVo.getPlantStart().getTime() - _harvestTime.getTime();
                     //种植的剩余时间毫秒
@@ -141,8 +151,13 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                         //说明可以收获了
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
                         comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
-                        //生成第一次受灾 获取用户土地 getList
-                        _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
+
+                        //todo [牧场养殖渔场需求]如果不是养殖,是传统种植才会有灾害
+                        if (e.getMallType() == 0) {
+                            //生成第一次受灾 获取用户土地 getList
+                            _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
+                        }
+
                     } else {
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(DateUtil.getDays(diff).intValue());
                         comPlayerLandAndPlantVo.setPlantHoursRemaining(DateUtil.getHours(diff).intValue());
@@ -205,6 +220,11 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                     //当前时间 > 种植时间+成熟期  = 说明可以收获了
                     //获取当前时间 - 植物的成熟期 = 收获时间,收获时间 >= 种植时间,即可以收获
                     Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
+                    //todo [牧场养殖渔场需求] 如果是养殖类的,成熟期需要单独计算
+                    if (e.getMallType() > 0) {
+                        _harvestTime = comPlayerCultivateSerivce.getHarvestTime(userId, e.getConfigLandId());
+                    }
+
                     // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
                     long diff = comPlayerLandAndPlantVo.getPlantStart().getTime() - _harvestTime.getTime();
                     //种植的剩余时间毫秒
@@ -213,8 +233,11 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                         //说明可以收获了
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
                         comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
-                        //生成第一次受灾 getCanStealDetailList
-                        _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
+                        //todo [牧场养殖渔场需求]如果不是养殖,是传统种植才会有灾害
+                        if (e.getMallType() == 0) {
+                            //生成第一次受灾 获取用户土地 getList
+                            _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
+                        }
 
                     } else {
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(DateUtil.getDays(diff).intValue());
@@ -302,7 +325,8 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
     public Result<ComPlayerLandAndPlantVo> plantFunction(
             @RequestParam(value = "userId") String userId,
             @RequestParam(value = "landId") Integer landId,
-            @RequestParam(value = "seedId") Integer seedId) {
+            @RequestParam(value = "seedId") Integer seedId,
+            @RequestParam(value = "amount", required = false, defaultValue = "1") Integer amount) {
 
         try {
             ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, landId);
@@ -343,6 +367,26 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
             if (comMallSeedVo == null) {
                 return Result.of(null, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
             }
+
+            //todo [牧场养殖渔场需求] 判断种子类型和种子土地是否一样
+            if (comMallSeedVo.getMallType().equals(comPlayerLand.getMallType())) {
+                return Result.of(null, false, ResultEnum.LAND_NOT_LEASE.getMessage(), ResultEnum.LAND_NOT_LEASE.getCode());
+            }
+            //todo [牧场养殖渔场需求] 特有业务
+            if (comPlayerLand.getMallType() > 0) {
+                //如果剩余时间不足。不允许放养
+                if (comPlayerLand.getLeaseTime().getTime() - (cn.hutool.core.date.DateUtil.date(DateUtil.getNowDate()).offset(DateField.DAY_OF_YEAR, comMallSeedVo.getMaturity())).getTime() < 0) {
+                    return Result.of(null, false, "剩余租赁时间不足!");
+                }
+                //验证该土地最大种植数量
+                int[] amountlimit = new int[]{50, 100, 200, 200};
+                if (amount > amountlimit[comPlayerLand.getMallType() - 1]) {
+                    return Result.of(null, false, "超出最大养殖数量!");
+                }
+                //lease_multiple租赁倍数 填入实际养殖数量
+                comPlayerLand.setLeaseMultiple(amount);
+            }
+
             //todo 背包种子减去 土地当前的倍数,需要多倍播种,即消耗多个种子
             ComPlayerGoods comPlayerGoodsSimpleVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, comMallSeedVo.getHarvestId(), 0);
             //先拿到一个 before
@@ -418,10 +462,16 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
             //返回一个租赁时间毫秒
             comPlayerLandAndPlantVo.setLeaseDaysMill(leaseDaysMill);
 
+            //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
+            if (comPlayerLand.getMallType() > 0) {
+                Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, comPlayerLand.getConfigLandId());
+                comMallSeedVo.setMaturity(days);
+            }
             //种子时间
             //当前时间 > 种植时间+成熟期  = 说明可以收获了
             //获取当前时间 - 植物的成熟期 = 收获时间,收获时间 >= 种植时间,即可以收获
             Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
+
             // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
             long diff = comPlayerLandAndPlantVo.getPlantStart().getTime() - _harvestTime.getTime();
             //种植的剩余时间毫秒
@@ -431,10 +481,11 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                 //说明可以收获了
                 comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
                 comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
-
-                //生成第一次受灾 plant
-                _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
-
+                //todo [牧场养殖渔场需求]如果不是养殖,是传统种植才会有灾害
+                if (comPlayerLand.getMallType() > 0) {
+                    //生成第一次受灾 plant
+                    _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
+                }
 
             } else {
                 comPlayerLandAndPlantVo.setPlantDaysRemaining(DateUtil.getDays(diff).intValue());

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

@@ -62,4 +62,9 @@ public class ComPlayerLandAndPlantVo implements Serializable {
     private Integer canSteal; //这个是当前用户的偷取状态
 
     private Integer landLevel;//土地级别
+    /**
+     * 需求 牧场养殖渔场,新增字段,
+     * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
+     */
+    private Integer mallType;
 }

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

@@ -46,4 +46,9 @@ public class ComPlayerLandVo extends PageCondition implements Serializable {
     private Date updateTime;
 
     private Integer landLevel;//土地级别
+    /**
+     * 需求 牧场养殖渔场,新增字段,
+     * 原有需求种地值0 牧场1 养殖2 淡水区3 海水区4
+     */
+    private Integer mallType;
 }

+ 3 - 10
src/main/java/com/td/boss/util/RedisData.java

@@ -103,15 +103,8 @@ public class RedisData {
     /**
      * 5s 养殖模块
      */
-    private static final int PLAYER_CULTIVATE_ZULIN_TIMEOUT = 5 * 1000; //超时时间 5s
-    public static int getPlayerCultivateZuLinTimeout() {
-        return PLAYER_CULTIVATE_ZULIN_TIMEOUT;
-    }
-    /**
-     * 5s 养殖模块
-     */
-    private static final int PLAYER_CULTIVATE_TOUFANG_TIMEOUT = 5 * 1000; //超时时间 5s
-    public static int getPlayerCultivateTouFangTimeout() {
-        return PLAYER_CULTIVATE_TOUFANG_TIMEOUT;
+    private static final int PLAYER_CULTIVATE_BUYFOOD_TIMEOUT = 5 * 1000; //超时时间 5s
+    public static int getPlayerCultivateBuyFoodTimeout() {
+        return PLAYER_CULTIVATE_BUYFOOD_TIMEOUT;
     }
 }

+ 111 - 4
src/test/java/com/td/boss/ComPlayerCultivateTests.java

@@ -1,8 +1,20 @@
 package com.td.boss;
 
 import cn.hutool.json.JSONUtil;
-import com.td.boss.common.service.ComConfigService;
-import com.td.boss.game.complayercultivate.vo.*;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.game.comconfigland.service.ComConfigLandService;
+import com.td.boss.game.comconfigland.vo.ComConfigLandVo;
+import com.td.boss.game.commallfood.controller.ComMallFoodController;
+import com.td.boss.game.commallfood.vo.ComMallFoodSimpleVo;
+import com.td.boss.game.commallseed.controller.ComMallSeedController;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import com.td.boss.game.complayercultivate.controller.ComPlayerCultivateController;
+import com.td.boss.game.complayercultivate.pojo.ComPlayerCultivate;
+import com.td.boss.game.complayercultivate.serivce.ComPlayerCultivateSerivce;
+import com.td.boss.game.complayerdog.controller.ComPlayerDogController;
+import com.td.boss.game.complayergoods.controller.ComPlayerGoodsController;
+import com.td.boss.game.complayerland.controller.ComPlayerLandController;
+import com.td.boss.game.complayerland.vo.ComPlayerLandAndPlantVo;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -10,12 +22,107 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import java.util.List;
+import java.util.Map;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 public class ComPlayerCultivateTests {
-
+    private String userId = "1002";
+    private int configlandid = 25;
+    @Autowired
+    private ComPlayerLandController comPlayerLandController;
+    @Autowired
+    private ComMallSeedController comMallSeedController;
+    @Autowired
+    private ComPlayerGoodsController comPlayerGoodsController;
+    @Autowired
+    private ComConfigLandService comConfigLandService;
     @Autowired
-    private ComConfigService comConfigService;
+    private ComPlayerCultivateController comPlayerCultivateController;
+    @Autowired
+    private ComPlayerCultivateSerivce comPlayerCultivateSerivce;
+
+    //需要测试 多天上线以后情况
+
+    //解锁某个土地 【新增功能】【测试完】
+    @Test
+    public void buyLand() {
+        Result<?> comPlayerLandAndPlantVoResult = comPlayerCultivateController.payLand(userId, 26);
+        print(comPlayerLandAndPlantVoResult);
+    }
+
+    //种种子选择放养数量 【修改完毕】【测试完】
+    @Test
+    public void plantFunction() {
+        //测试重复种植
+//        print(comPlayerLandController.plantFunction(userId, configlandid, 11, 1000));
+        //测试种植数量大于土地最大承受
+//        print(comPlayerLandController.plantFunction(userId, 26, 11, 1000));
+        //测试种植 包里没有的种子
+//        print(comPlayerLandController.plantFunction(userId, 26, 11, 20));
+        //测试种子数量不足
+//        print(comPlayerLandController.plantFunction(userId, 26, 10, 20));
+        print(comPlayerLandController.plantFunction(userId, 26, 10, 2));
+    }
+
+    //喂养就是购买粮食 【修改完毕】【测试完】
+    @Test
+    public void buyFood() {
+        //需要计算一下 有多少只动物。要喂多少天。就算一下一共花多少钱。还得插一个喂养明细。
+//       print( comPlayerDogController.addFoodFunction(userId,6,1));
+//       print( comPlayerCultivateSerivce.buyFood(userId, configlandid));
+//       print( comPlayerCultivateSerivce.buyFood(userId, 26));
+        print(comPlayerCultivateSerivce.buyFood(userId, 26));
+    }
+
+
+    //获取某个人所有土地 【修改完毕】【测试完】,需要查询喂养记录,重新计算成熟日期
+    @Test
+    public void getLandByUserId() {
+        Result<List<ComPlayerLandAndPlantVo>> landFunction = comPlayerLandController.getLandFunction(userId, null);
+        print(landFunction);
+    }
+
+    //偷果实 【修改完毕 待测试】
+    @Test
+    public void stealFruitFunction() {
+        comPlayerGoodsController.stealFruitFunction(userId, userId, configlandid);
+    }
+    //收货,成熟 【修改完毕 测试完】,一天不喂延长2天
+    @Test
+    public void addFruitFunction() {
+        comPlayerGoodsController.addFruitFunction(userId, 26);
+    }
+
+
+    //获取所有土地 【一点没变】【测试完】
+    @Test
+    public void getLands() {
+        Result<List<ComConfigLandVo>> list = comConfigLandService.list(new ComConfigLandVo());
+        print(list);
+    }
+
+    //获取所有种子列表 【一点没变】【测试完】
+    @Test
+    public void getSeed() {
+        Result<List<ComMallSeedVo>> snbFunction = comMallSeedController.getSNBFunction(userId);
+        print(snbFunction);
+    }
+
+    //购买种子【一点没变】【测试完】这块逻辑是只要钱够,种子id对就没问题
+    @Test
+    public void buySeeds() {
+        comMallSeedController.snbBuySeedsFunction(userId, 200, 10);
+    }
+
+    //购买种子,进入仓库【一点没变】【测试完】
+    @Test
+    public void getGood() {
+        Result<Map> seedAndFruitFunction = comPlayerGoodsController.getSeedAndFruitFunction(userId);
+        print(seedAndFruitFunction);
+    }
 
+    private void print(Result result) {
+        System.out.println(JSONUtil.toJsonStr(result.getData()));
+    }
 }