Browse Source

1.更新添加自动审查

slambb 4 years ago
parent
commit
cd8b01460f
31 changed files with 1007 additions and 62 deletions
  1. 1 1
      pom.xml
  2. 17 0
      src/main/java/com/td/boss/BossApplication.java
  3. 3 0
      src/main/java/com/td/boss/config/enums/ResultEnum.java
  4. 21 13
      src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java
  5. 32 17
      src/main/java/com/td/boss/game/complayerland/service/ComPlayerDisasterLogServiceImpl.java
  6. 12 3
      src/main/java/com/td/boss/game/complayerprofit/service/ComPlayerProfitService.java
  7. 98 21
      src/main/java/com/td/boss/game/complayerprofit/service/ComPlayerProfitServiceImpl.java
  8. 67 0
      src/main/java/com/td/boss/game/comsnbapply/controller/ComSnbApplyController.java
  9. 27 0
      src/main/java/com/td/boss/game/comsnbapply/pojo/ComSnbApply.java
  10. 18 0
      src/main/java/com/td/boss/game/comsnbapply/repository/ComSnbApplyRepository.java
  11. 72 0
      src/main/java/com/td/boss/game/comsnbapply/scheduled/BackService.java
  12. 35 0
      src/main/java/com/td/boss/game/comsnbapply/scheduled/IPCondition.java
  13. 17 0
      src/main/java/com/td/boss/game/comsnbapply/service/ComSnbApplyService.java
  14. 38 0
      src/main/java/com/td/boss/game/comsnbapply/service/ComSnbApplyServiceImpl.java
  15. 25 0
      src/main/java/com/td/boss/game/comsnbapply/vo/ComSnbApplySimpleVo.java
  16. 23 0
      src/main/java/com/td/boss/game/comsnbapply/vo/ComSnbApplyVo.java
  17. 21 1
      src/main/java/com/td/boss/game/comsnbfreeze/controller/ComSnbFreezeController.java
  18. 33 0
      src/main/java/com/td/boss/sys/sysGame/controller/sysGamePropertyController.java
  19. 1 0
      src/main/java/com/td/boss/sys/sysGame/controller/sysGameUsersController.java
  20. 15 0
      src/main/java/com/td/boss/sys/syssettingtask/controller/SysSettingTaskController.java
  21. 21 0
      src/main/java/com/td/boss/sys/syssettingtask/pojo/SysSettingTask.java
  22. 9 0
      src/main/java/com/td/boss/sys/syssettingtask/repository/SysSettingTaskRepository.java
  23. 8 0
      src/main/java/com/td/boss/sys/syssettingtask/service/SysSettingTaskService.java
  24. 36 0
      src/main/java/com/td/boss/sys/syssettingtask/service/SysSettingTaskServiceImpl.java
  25. 17 0
      src/main/java/com/td/boss/sys/syssettingtask/vo/SysSettingTaskVo.java
  26. 7 6
      src/main/java/com/td/boss/util/CodeDOM.java
  27. 9 0
      src/main/java/com/td/boss/util/RedisData.java
  28. 32 0
      src/main/java/com/td/boss/util/SysSettingTaskUtil.java
  29. 22 0
      src/main/resources/static/sys/aComApplySNBToCNT/css/applySNBToCNT.css
  30. 196 0
      src/main/resources/static/sys/aComApplySNBToCNT/js/applySNBToCNT.js
  31. 74 0
      src/main/resources/view/sys/aComApplySNBToCNT/applySNBToCNT.html

+ 1 - 1
pom.xml

@@ -25,7 +25,7 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.3.2</version>
+            <version>5.7.22</version>
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>

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

@@ -4,6 +4,8 @@ import com.td.boss.game.comusers.service.ComUsersService;
 import com.td.boss.sys.sysmenu.vo.SysMenuVo;
 import com.td.boss.sys.syssetting.service.SysSettingService;
 import com.td.boss.sys.syssetting.vo.SysSettingVo;
+import com.td.boss.sys.syssettingtask.service.SysSettingTaskService;
+import com.td.boss.sys.syssettingtask.vo.SysSettingTaskVo;
 import com.td.boss.sys.sysshortcutmenu.service.SysShortcutMenuService;
 import com.td.boss.sys.sysshortcutmenu.vo.SysShortcutMenuVo;
 import com.td.boss.sys.sysuser.service.SysUserService;
@@ -69,6 +71,9 @@ class IndexController {
     @Autowired
     private SysSettingService sysSettingService;
 
+    @Autowired
+    private SysSettingTaskService sysSettingTaskService;
+
     @Autowired
     private SysUserMenuService sysUserMenuService;
 
@@ -99,6 +104,10 @@ class IndexController {
                 SysSettingVo sysSettingVo = sysSettingService.get("1").getData();
                 SysSettingUtil.setSysSettingMap(sysSettingVo);
 
+                //系统启动时获取数据库数据,设置到公用静态集合sysSettingTaskMap
+                SysSettingTaskVo sysSettingTaskVo = sysSettingTaskService.get("1").getData();
+                SysSettingTaskUtil.setSysSettingTaskMap(sysSettingTaskVo);
+
                 //获取本机内网IP
                 log.info("启动成功:" + "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + port + contextPath);
             } catch (UnknownHostException e) {
@@ -118,6 +127,10 @@ class IndexController {
         //系统信息
         modelAndView.addObject("sys", SysSettingUtil.getSysSetting());
 
+        //系统审查信息
+        modelAndView.addObject("sysSettingTask", SysSettingTaskUtil.getSysSettingTask());
+
+
         //后端公钥
         String publicKey = RsaUtil.getPublicKey();
         log.info("login后端公钥:" + publicKey);
@@ -146,6 +159,10 @@ class IndexController {
         //系统信息
         modelAndView.addObject("sys", SysSettingUtil.getSysSetting());
 
+        //系统审查信息
+        modelAndView.addObject("sysSettingTask", SysSettingTaskUtil.getSysSettingTask());
+
+
         //登录用户
         SysUserVo sysUserVo = sysUserService.findByLoginName(SecurityUtil.getLoginUser().getUsername()).getData();
         sysUserVo.setPassword(null);//隐藏部分属性

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

@@ -53,6 +53,9 @@ public enum ResultEnum {
     WALLET_SNB_SUCCESS_NOT_ZERO(603,"snb不可操作"),
     WALLET_SNB_SIGN_ERROR(604,"钱包SNB参数签名错误!"),
 
+    APPLY_SNB_AMOUNT_ERROR(605,"snb参数错误!"),
+    APPLY_SNB_TOO_MUCH(606,"snb申请过多,待审核完成后再申请!"),
+
     //土地数据
     LAND_DATA_ERROR(701,"土地数据不能初始化!"),
     LAND_NOT_LEASE(702,"土地未租赁!"),

+ 21 - 13
src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java

@@ -27,6 +27,7 @@ import com.td.boss.game.complayerlog.service.ComPlayerLogService;
 import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
 import com.td.boss.game.complayerprofit.pojo.ComPlayerProfit;
 import com.td.boss.game.complayerprofit.service.ComPlayerProfitService;
+import com.td.boss.game.complayerprofit.vo.ComPlayerProfitVo;
 import com.td.boss.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -143,7 +144,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
                         comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
                         //生成第一次受灾
-                        _InitFirstDisasterProfit(comPlayerLandAndPlantVo,comMallSeedVo);
+                        _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
                     } else {
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(DateUtil.getDays(diff).intValue());
                         comPlayerLandAndPlantVo.setPlantHoursRemaining(DateUtil.getHours(diff).intValue());
@@ -214,7 +215,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
                         comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
                         //生成第一次受灾
-                        _InitFirstDisasterProfit(comPlayerLandAndPlantVo,comMallSeedVo);
+                        _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
 
                     } else {
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(DateUtil.getDays(diff).intValue());
@@ -435,7 +436,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                 comPlayerLandAndPlantVo.setPlantHoursRemaining(0);
 
                 //生成第一次受灾
-                _InitFirstDisasterProfit(comPlayerLandAndPlantVo,comMallSeedVo);
+                _InitFirstDisasterProfit(comPlayerLandAndPlantVo, comMallSeedVo);
 
 
             } else {
@@ -485,7 +486,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
     }
 
 
-    private void _InitFirstDisasterProfit(ComPlayerLandAndPlantVo comPlayerLandAndPlantVo,ComMallSeedVo comMallSeedVo){
+    private void _InitFirstDisasterProfit(ComPlayerLandAndPlantVo comPlayerLandAndPlantVo, ComMallSeedVo comMallSeedVo) {
         //这里处理一次判断是否发生过第一次灾难
         //todo 添加一个灾难损失,灾难损失的时间点是种植开始到成熟阶段的一个随机时间
         // 加个锁判断,是否在其他地方触发了这次灾难计算(自解锁)
@@ -501,19 +502,22 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
             Date disasterDate = new Date(randomDate);
             //获取损失的数据
             List<ComPlayerProfit> comPlayerProfits = comPlayerProfitService.findByUserIdAndPlantFlagAndLandId(comPlayerLandAndPlantVo.getUserId(), comPlayerLandAndPlantVo.getPlantFlag(), comPlayerLandAndPlantVo.getConfigLandId());
-            boolean isNaturalProfit = false,isBeastProfit = false;
+            //todo 总共受损的数量
+            Double _allLossProfit = 0d;
+            boolean isNaturalProfit = false, isBeastProfit = false;
             for (int j = 0; j < comPlayerProfits.size(); j++) {
                 ComPlayerProfit _profit = comPlayerProfits.get(j);
-                if(_profit.getLossType().equals(2)){
+                _allLossProfit = DoubleUtil.add(_allLossProfit, _profit.getStolen());
+                if (_profit.getLossType().equals(2)) {
                     isNaturalProfit = true;
-                }else if(_profit.getLossType().equals(3)){
+                } else if (_profit.getLossType().equals(3)) {
                     isBeastProfit = true;
                 }
             }
             log.info("用户编号:{},防护历史记录:{}", comPlayerLandAndPlantVo.getUserId(), JSONUtil.toJsonStr(protectList));
             //获得对应灾难类型的防护记录    并得到这个 防护到期时间. 自然灾害类型
             //如果没有防护或者防护到期。则直接发生灾难进行减产
-            if(!isNaturalProfit ){
+            if (!isNaturalProfit) {
                 Date _protectedDate = protectList.stream()
                         .filter(a -> a.getDsasterType().equals(2))
                         .sorted(Comparator.comparing(ComPlayerDisasterProtected::getProtectTime).reversed())
@@ -523,11 +527,13 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                 if (_protectedDate != null && disasterDate.before(_protectedDate)) {
                     //灾难的随机时间比防护包时间后,说明防护包到期
                     //成熟的时候触发第一次自然灾难
-                    comPlayerProfitService.addDisasterAndLoss(CopyUtil.copy(comPlayerLandAndPlantVo, ComPlayerLand.class),
-                            comMallSeedVo, 2);
+                    ComPlayerProfitVo naturalProfitVo = comPlayerProfitService.addFirstDisasterAndLoss(CopyUtil.copy(comPlayerLandAndPlantVo, ComPlayerLand.class),
+                            comMallSeedVo, 2, _allLossProfit);
+                    //多次执行需要加上当前操作的利润
+                    _allLossProfit += naturalProfitVo.getStolen();
                 }
             }
-            if(!isBeastProfit){
+            if (!isBeastProfit) {
                 Date _protectedDate = protectList.stream()
                         .filter(a -> a.getDsasterType().equals(3))
                         .sorted(Comparator.comparing(ComPlayerDisasterProtected::getProtectTime).reversed())
@@ -537,8 +543,10 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                 if (_protectedDate != null && disasterDate.before(_protectedDate)) {
                     //灾难的随机时间比防护包时间后,说明防护包到期
                     //成熟的时候触发第一次自然灾难
-                    comPlayerProfitService.addDisasterAndLoss(CopyUtil.copy(comPlayerLandAndPlantVo, ComPlayerLand.class),
-                            comMallSeedVo, 3);
+                    ComPlayerProfitVo beastProfitVo = comPlayerProfitService.addFirstDisasterAndLoss(CopyUtil.copy(comPlayerLandAndPlantVo, ComPlayerLand.class),
+                            comMallSeedVo, 3, _allLossProfit);
+//                    //多次执行需要加上当前操作的利润
+//                    _allLossProfit += beastProfitVo.getStolen();
                 }
             }
         }

+ 32 - 17
src/main/java/com/td/boss/game/complayerland/service/ComPlayerDisasterLogServiceImpl.java

@@ -31,6 +31,7 @@ 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 javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
@@ -234,7 +235,7 @@ public class ComPlayerDisasterLogServiceImpl extends CommonServiceImpl<ComPlayer
             long time = System.currentTimeMillis() + RedisData.getPlayerDisastersFirstTimeout();
             //查找用户的全部土地
             List<ComPlayerLand> comPlayerLands = comPlayerLandService.findAllByUserIdAndPlantAndMature(disasterLog.getUserId());
-            for (int i=0;i<comPlayerLands.size();i++){
+            for (int i = 0; i < comPlayerLands.size(); i++) {
                 ComPlayerLand _comPlayerLand = comPlayerLands.get(i);
                 ComMallSeedVo comMallSeedVo = comMallSeedService.findById(_comPlayerLand.getPlantId());
 
@@ -243,40 +244,54 @@ public class ComPlayerDisasterLogServiceImpl extends CommonServiceImpl<ComPlayer
                 // 加个锁判断,是否在其他地方触发了这次灾难计算(自解锁)
                 String _disasterKey = RedisData.getPlayerDisastersFirstKey() + _comPlayerLand.getPlantFlag();
                 if (redisLock.lock(_disasterKey, String.valueOf(time))) {
-                   //灾难发生时间
+                    //灾难发生时间
                     Date endDate = com.td.boss.util.DateUtil.getOldDateAddDay(_comPlayerLand.getPlantStart(), _comPlayerLand.getPlantMature());
                     long randomDate = RandomUtil.randomLong(_comPlayerLand.getPlantStart().getTime(), endDate.getTime());
                     Date disasterDate = new Date(randomDate);
                     //获取损失的数据
                     List<ComPlayerProfit> comPlayerProfits = comPlayerProfitService.findByUserIdAndPlantFlagAndLandId(_comPlayerLand.getUserId(), _comPlayerLand.getPlantFlag(), _comPlayerLand.getConfigLandId());
-                    boolean isNaturalProfit = false,isBeastProfit = false;
+                    //todo 总共受损的数量
+                    Double _allLossProfit = 0d;
+                    boolean isNaturalProfit = false, isBeastProfit = false;
+                    Integer _disasterCount = 0;
                     for (int j = 0; j < comPlayerProfits.size(); j++) {
                         ComPlayerProfit _profit = comPlayerProfits.get(j);
-                       if(_profit.getLossType().equals(2)){
-                           isNaturalProfit = true;
-                       }else if(_profit.getLossType().equals(3)){
-                           isBeastProfit = true;
-                       }
+                        _allLossProfit = DoubleUtil.add(_allLossProfit, _profit.getStolen());
+                        if (_profit.getLossType().equals(2)) {
+                            isNaturalProfit = true;
+                            //出现灾难的次数
+                            _disasterCount++;
+                        } else if (_profit.getLossType().equals(3)) {
+                            isBeastProfit = true;
+                            //出现灾难的次数
+                            _disasterCount++;
+                        }
                     }
                     log.info("用户编号:{},防护历史记录:{}", _comPlayerLand.getUserId(), JSONUtil.toJsonStr(protectList));
                     //获得对应灾难类型的防护记录    并得到这个 防护到期时间. 自然灾害类型
                     //如果没有防护或者防护到期。则直接发生灾难进行减产
-                    if(!isNaturalProfit && protectedDate != null && disasterDate.before(protectedDate)){
+                    if (!isNaturalProfit && protectedDate != null && disasterDate.before(protectedDate)) {
                         //灾难的随机时间比防护包时间后,说明防护包到期
                         //成熟的时候触发第一次自然灾难
-                        comPlayerProfitService.addDisasterAndLoss(CopyUtil.copy(_comPlayerLand, ComPlayerLand.class),
-                                comMallSeedVo, 2);
+                        ComPlayerProfitVo naturalProfitVo = comPlayerProfitService.addFirstDisasterAndLoss(CopyUtil.copy(_comPlayerLand, ComPlayerLand.class),
+                                comMallSeedVo, 2, _allLossProfit);
+                        //多次执行需要加上当前操作的利润
+                        _allLossProfit += naturalProfitVo.getStolen();
                     }
-                    if(!isBeastProfit && protectedDate != null && disasterDate.before(protectedDate)){
+                    if (!isBeastProfit && protectedDate != null && disasterDate.before(protectedDate)) {
                         //灾难的随机时间比防护包时间后,说明防护包到期
                         //成熟的时候触发第一次自然灾难
-                        comPlayerProfitService.addDisasterAndLoss(CopyUtil.copy(_comPlayerLand, ComPlayerLand.class),
-                                comMallSeedVo, 3);
+                        ComPlayerProfitVo beastProfitVo =  comPlayerProfitService.addFirstDisasterAndLoss(CopyUtil.copy(_comPlayerLand, ComPlayerLand.class),
+                                comMallSeedVo, 3, _allLossProfit);
+                        //多次执行需要加上当前操作的利润
+                        _allLossProfit += beastProfitVo.getStolen();
                     }
+
+                    //todo 添加一条单独减产的数据 ,对应灾难
+                    comPlayerProfitService.addOtherDisasterAndLoss(CopyUtil.copy(_comPlayerLand, ComPlayerLand.class),
+                            comMallSeedVo, disasterLog.getDsasterType(), _allLossProfit, _disasterCount);
                 }
-                //todo 添加一条单独减产的数据 ,对应灾难
-                comPlayerProfitService.addDisasterAndLoss(CopyUtil.copy(_comPlayerLand, ComPlayerLand.class),
-                        comMallSeedVo, disasterLog.getDsasterType());
+
             }
 
 

+ 12 - 3
src/main/java/com/td/boss/game/complayerprofit/service/ComPlayerProfitService.java

@@ -1,7 +1,6 @@
 package com.td.boss.game.complayerprofit.service;
 
-import com.td.boss.common.service.*;
-import com.td.boss.game.commallseed.pojo.ComMallSeed;
+import com.td.boss.common.service.CommonService;
 import com.td.boss.game.commallseed.vo.ComMallSeedVo;
 import com.td.boss.game.complayerland.pojo.ComPlayerLand;
 import com.td.boss.game.complayerprofit.pojo.ComPlayerProfit;
@@ -38,6 +37,16 @@ public interface ComPlayerProfitService extends CommonService<ComPlayerProfitVo,
 
     Double getStolenSumByOtherUserIdAndPlantFlag(String otherUserId, String plantFlag);
 
+    /**
+     * 必然灾难减扣
+     * @param comPlayerLand
+     * @param comMallSeedVo
+     * @param lossType
+     * @param allLossProfit
+     * @return
+     */
+    ComPlayerProfitVo addFirstDisasterAndLoss(ComPlayerLand comPlayerLand, ComMallSeedVo comMallSeedVo, Integer lossType,Double allLossProfit);
+
+    ComPlayerProfitVo addOtherDisasterAndLoss(ComPlayerLand comPlayerLand, ComMallSeedVo comMallSeedVo, Integer lossType, Double allLossProfit,Integer disasterCount);
 
-    ComPlayerProfitVo addDisasterAndLoss(ComPlayerLand comPlayerLand, ComMallSeedVo comMallSeedVo, Integer lossType);
 }

+ 98 - 21
src/main/java/com/td/boss/game/complayerprofit/service/ComPlayerProfitServiceImpl.java

@@ -8,16 +8,18 @@ import com.td.boss.game.complayerprofit.pojo.ComPlayerProfit;
 import com.td.boss.game.complayerprofit.vo.ComPlayerProfitVo;
 import com.td.boss.game.complayerprofit.repository.ComPlayerProfitRepository;
 import com.td.boss.util.CopyUtil;
+import com.td.boss.util.DoubleUtil;
 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;
 
 @Service
 @Transactional
-public class ComPlayerProfitServiceImpl extends CommonServiceImpl<ComPlayerProfitVo, ComPlayerProfit, String> implements ComPlayerProfitService{
+public class ComPlayerProfitServiceImpl extends CommonServiceImpl<ComPlayerProfitVo, ComPlayerProfit, String> implements ComPlayerProfitService {
 
     @PersistenceContext
     private EntityManager em;
@@ -29,39 +31,43 @@ public class ComPlayerProfitServiceImpl extends CommonServiceImpl<ComPlayerProfi
 
     @Override
     public List<ComPlayerProfit> findByUserIdAndPlantFlagAndLandId(String userId, String plantFlag, Integer landId) {
-        return comPlayerProfitRepository.findByTargetIdAndPlantFlagAndLandId(userId,plantFlag,landId);
+        return comPlayerProfitRepository.findByTargetIdAndPlantFlagAndLandId(userId, plantFlag, landId);
     }
 
     @Override
-    public ComPlayerProfit findByUserIdAndPlantFlag(String userId,String plantFlag) {
-        return comPlayerProfitRepository.findByUserIdAndPlantFlag(userId,plantFlag).orElse(null);
+    public ComPlayerProfit findByUserIdAndPlantFlag(String userId, String plantFlag) {
+        return comPlayerProfitRepository.findByUserIdAndPlantFlag(userId, plantFlag).orElse(null);
     }
+
     @Override
-    public ComPlayerProfit findByUserIdAndOtherUserIdAndPlantFlag(String userId,String otherUserId, String plantFlag) {
-        return comPlayerProfitRepository.findByUserIdAndTargetIdAndPlantFlag(userId,otherUserId,plantFlag).orElse(null);
+    public ComPlayerProfit findByUserIdAndOtherUserIdAndPlantFlag(String userId, String otherUserId, String plantFlag) {
+        return comPlayerProfitRepository.findByUserIdAndTargetIdAndPlantFlag(userId, otherUserId, plantFlag).orElse(null);
     }
 
 
     @Override
-    public ComPlayerProfit findByUserIdAndTargetIdAndLandIdAndPlantFlag(String userId,String targetId, Integer configLandId, String plantFlag) {
-        return comPlayerProfitRepository.findByUserIdAndTargetIdAndLandIdAndPlantFlag(userId,targetId,configLandId,plantFlag).orElse(null);
+    public ComPlayerProfit findByUserIdAndTargetIdAndLandIdAndPlantFlag(String userId, String targetId, Integer configLandId, String plantFlag) {
+        return comPlayerProfitRepository.findByUserIdAndTargetIdAndLandIdAndPlantFlag(userId, targetId, configLandId, plantFlag).orElse(null);
     }
 
     @Override
-    public ComPlayerProfit findByPlantFlagAndLossType(String plantFlag, Integer lossType){
-       return  comPlayerProfitRepository.findByPlantFlagAndLossType(plantFlag, lossType).orElse(null);
+    public ComPlayerProfit findByPlantFlagAndLossType(String plantFlag, Integer lossType) {
+        return comPlayerProfitRepository.findByPlantFlagAndLossType(plantFlag, lossType).orElse(null);
     }
 
     @Override
     public Double getStolenSumByOtherUserIdAndPlantFlag(String otherUserId, String plantFlag) {
-        return comPlayerProfitRepository.getStolenSumByTargetIdAndPlantFlag(otherUserId,plantFlag);
+        return comPlayerProfitRepository.getStolenSumByTargetIdAndPlantFlag(otherUserId, plantFlag);
     }
 
 
     @Override
-    public ComPlayerProfitVo addDisasterAndLoss(ComPlayerLand comPlayerLand, ComMallSeedVo comMallSeedVo,Integer lossType) {
-
+    public ComPlayerProfitVo addFirstDisasterAndLoss(ComPlayerLand comPlayerLand, ComMallSeedVo comMallSeedVo, Integer lossType, Double allLossProfit) {
 
+        //对应土地灾害损失
+        ComPlayerProfit comPlayerProfit = new ComPlayerProfit();
+        //最终减扣的利润
+        Double _endReduceProfit = 0d;
         //计算一个偷取的收获量, 租赁倍数* 租赁日期下的产量
         Integer _otherAmount = 0;
         if (comPlayerLand.getLeaseDate().equals(1)) {
@@ -71,10 +77,80 @@ public class ComPlayerProfitServiceImpl extends CommonServiceImpl<ComPlayerProfi
         } else if (comPlayerLand.getLeaseDate().equals(3)) {
             _otherAmount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest3();
         }
-        //todo 拿出计算利润,收获量减去种子的成本(snb)后的百分之30 ,后面需要后台可调整
+        //todo 拿出全部利润
         Integer _profit = _otherAmount - comPlayerLand.getLeaseMultiple() * comMallSeedVo.getPriceSnb();
+        //todo 计算减产,第一次灾难按利润的 50% 减产,两次就是减到 0 了。
+
+        //必然发生的灾难,减产50%
+        Double _reduceProfit = DoubleUtil.mul(_profit.doubleValue(), 0.5);
+        // 100 - 80 = 20
+        Double _residualProfit = DoubleUtil.sub(_profit.doubleValue(), allLossProfit);
+        //剩余利润减去当前需要减产的利润值
+        Double _tempProfit = DoubleUtil.sub(_residualProfit, _reduceProfit);
+        if (DoubleUtil.compare(_tempProfit, 0.0).equals(1)) {
+            //还有利润,
+            _endReduceProfit = _reduceProfit;
+        }
+
+        comPlayerProfit.setUserId(comPlayerLand.getUserId()); //损失记录的用户id
+        comPlayerProfit.setTargetId(comPlayerLand.getUserId()); //目标是自己
+        comPlayerProfit.setPlantFlag(comPlayerLand.getPlantFlag());
+        comPlayerProfit.setLandId(comPlayerLand.getConfigLandId());
+        comPlayerProfit.setLeaseMultiple(comPlayerLand.getLeaseMultiple());
+        comPlayerProfit.setLeaseDate(comPlayerLand.getLeaseDate());
+        comPlayerProfit.setHarvest(_otherAmount); // todo
+        comPlayerProfit.setProfit(_profit.doubleValue());//todo 目标用户可偷的初始利润值
+        comPlayerProfit.setStolen(_endReduceProfit);//todo 目标用户被灾害减产对应的数量
+        comPlayerProfit.setFinalSteal(_endReduceProfit);//
+        comPlayerProfit.setProfitAfter(DoubleUtil.add(allLossProfit, _endReduceProfit)); //当前损失的利润加上当前扣减的
+
+        //记录相关比例,损失利润的百分之50
+        comPlayerProfit.setProfitRatio(0.5);
+        comPlayerProfit.setStealRatio(0.5);
+        comPlayerProfit.setFinalRatio(1.0);
+        comPlayerProfit.setLossType(lossType);
+        ComPlayerProfitVo comPlayerProfitVo = CopyUtil.copy(comPlayerProfit, ComPlayerProfitVo.class);
+        comPlayerProfitService.save(comPlayerProfitVo);
+
+        return comPlayerProfitVo;
+    }
+
+
+    @Override
+    public ComPlayerProfitVo addOtherDisasterAndLoss(ComPlayerLand comPlayerLand, ComMallSeedVo comMallSeedVo, Integer lossType, Double allLossProfit, Integer disasterCount) {
+
         //对应土地灾害损失
         ComPlayerProfit comPlayerProfit = new ComPlayerProfit();
+        //最终减扣的利润
+        Double _endReduceProfit = 0d;
+        //计算一个偷取的收获量, 租赁倍数* 租赁日期下的产量
+        Integer _otherAmount = 0;
+        if (comPlayerLand.getLeaseDate().equals(1)) {
+            _otherAmount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest1();
+        } else if (comPlayerLand.getLeaseDate().equals(2)) {
+            _otherAmount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest2();
+        } else if (comPlayerLand.getLeaseDate().equals(3)) {
+            _otherAmount = comPlayerLand.getLeaseMultiple() * comMallSeedVo.getHarvest3();
+        }
+        //todo 拿出全部利润
+        Integer _profit = _otherAmount - comPlayerLand.getLeaseMultiple() * comMallSeedVo.getPriceSnb();
+        //todo 计算减产,第一次灾难按利润的 50% 减产,两次就是减到 0 了。
+
+        //额外发生的灾难,按照次数计算减产 50% 发生已经发生1次计算后当次等于 25%,
+        double _startRatio = 1.0;
+        for(int i = disasterCount;i>0;i--){
+            _startRatio =  DoubleUtil.mul(_startRatio,0.5);
+        }
+        Double _reduceProfit = DoubleUtil.mul(_profit.doubleValue(), _startRatio);
+        // 100 - 80 = 20
+        Double _residualProfit = DoubleUtil.sub(_profit.doubleValue(), allLossProfit);
+        //剩余利润减去当前需要减产的利润值
+        Double _tempProfit = DoubleUtil.sub(_residualProfit, _reduceProfit);
+        if (DoubleUtil.compare(_tempProfit, 0.0).equals(1)) {
+            //还有利润,
+            _endReduceProfit = _reduceProfit;
+        }
+
         comPlayerProfit.setUserId(comPlayerLand.getUserId()); //损失记录的用户id
         comPlayerProfit.setTargetId(comPlayerLand.getUserId()); //目标是自己
         comPlayerProfit.setPlantFlag(comPlayerLand.getPlantFlag());
@@ -83,13 +159,14 @@ public class ComPlayerProfitServiceImpl extends CommonServiceImpl<ComPlayerProfi
         comPlayerProfit.setLeaseDate(comPlayerLand.getLeaseDate());
         comPlayerProfit.setHarvest(_otherAmount); // todo
         comPlayerProfit.setProfit(_profit.doubleValue());//todo 目标用户可偷的初始利润值
-        comPlayerProfit.setStolen(0d);//todo 目标用户被灾害减产对应的数量
-        comPlayerProfit.setFinalSteal(0d);//
-        comPlayerProfit.setProfitAfter(0d); //可偷的减去被偷的
-        //记录相关比例
-        comPlayerProfit.setProfitRatio(0d);
-        comPlayerProfit.setStealRatio(0d);
-        comPlayerProfit.setFinalRatio(0d);
+        comPlayerProfit.setStolen(_endReduceProfit);//todo 目标用户被灾害减产对应的数量
+        comPlayerProfit.setFinalSteal(_endReduceProfit);//
+        comPlayerProfit.setProfitAfter(DoubleUtil.add(allLossProfit, _endReduceProfit)); //当前损失的利润加上当前扣减的
+
+        //记录相关比例,损失利润的 _startRatio 相关比例
+        comPlayerProfit.setProfitRatio(_startRatio);
+        comPlayerProfit.setStealRatio(_startRatio);
+        comPlayerProfit.setFinalRatio(1.0);
         comPlayerProfit.setLossType(lossType);
         ComPlayerProfitVo comPlayerProfitVo = CopyUtil.copy(comPlayerProfit, ComPlayerProfitVo.class);
         comPlayerProfitService.save(comPlayerProfitVo);

+ 67 - 0
src/main/java/com/td/boss/game/comsnbapply/controller/ComSnbApplyController.java

@@ -0,0 +1,67 @@
+package com.td.boss.game.comsnbapply.controller;
+
+import com.td.boss.common.controller.*;
+import com.td.boss.common.pojo.PageInfo;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.config.enums.ResultEnum;
+import com.td.boss.game.comsnbapply.pojo.ComSnbApply;
+import com.td.boss.game.comsnbapply.vo.ComSnbApplySimpleVo;
+import com.td.boss.game.comsnbapply.vo.ComSnbApplyVo;
+import com.td.boss.game.comsnbapply.service.ComSnbApplyService;
+import com.td.boss.game.comusers.pojo.ComUsers;
+import com.td.boss.game.comusers.service.ComUsersService;
+import com.td.boss.game.comusers.vo.ComUsersVo;
+import com.td.boss.util.DoubleUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping("/game/comSnbApply/")
+public class ComSnbApplyController extends CommonController<ComSnbApplyVo, ComSnbApply, String> {
+    @Autowired
+    private ComSnbApplyService comSnbApplyService;
+
+    @Autowired
+    private ComUsersService comUsersService;
+
+
+    @GetMapping("getPage")
+    public Result<PageInfo<ComSnbApplyVo>> getPageFunction(@RequestParam(value = "userId") String userId) {
+        ComSnbApplyVo comSnbApplyVo = new ComSnbApplyVo();
+        comSnbApplyVo.setUserId(userId);
+        return comSnbApplyService.page(comSnbApplyVo);
+    }
+
+    @PostMapping("applySnbToCnt")
+    public Result<ComSnbApplyVo> applySnbToCntFunction(@RequestParam(value = "userId") String userId,
+                                                 @RequestParam(value = "applyAmount") Integer applyAmount){
+        //判断输入数量,不能为负数
+        if(applyAmount<=0){
+            return Result.of(null,false, ResultEnum.APPLY_SNB_AMOUNT_ERROR.getMessage(),ResultEnum.APPLY_SNB_AMOUNT_ERROR.getCode());
+        }
+        // 判断当前是否累加超过当前用户的snb
+        List<ComSnbApply> comSnbApplies = comSnbApplyService.findAllByUserIdAndIsState(userId,0);
+        Integer _applySnb = comSnbApplies.stream().mapToInt(ComSnbApply::getSnb).sum();
+        //加上当前的
+        _applySnb += applyAmount;
+
+        ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
+        double _allSnbDouble = DoubleUtil.add(comUsersVo.getSnb().doubleValue(), comUsersVo.getSnbPart());
+        if(DoubleUtil.compare(_allSnbDouble,_applySnb.doubleValue()).equals(-1)){
+            return Result.of(null,false, ResultEnum.APPLY_SNB_TOO_MUCH.getMessage(),ResultEnum.APPLY_SNB_TOO_MUCH.getCode());
+        }
+
+        ComSnbApplyVo comSnbApplyVo = new ComSnbApplyVo();
+        comSnbApplyVo.setUserId(userId);
+        comSnbApplyVo.setSnb(applyAmount);
+        comSnbApplyVo.setSnbDescribe("applySnbToCnt,发起兑换记录snb!");
+        comSnbApplyVo.setIsState(0);
+        comSnbApplyVo.setCreateTime(new Date());
+        comSnbApplyVo.setUpdateTime(new Date());
+        //保存成功之后,刷新列表
+        return comSnbApplyService.save(comSnbApplyVo);
+    }
+}

+ 27 - 0
src/main/java/com/td/boss/game/comsnbapply/pojo/ComSnbApply.java

@@ -0,0 +1,27 @@
+package com.td.boss.game.comsnbapply.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "com_snb_apply")
+@Data
+public class ComSnbApply implements Serializable {
+    @Id
+    private String id;//
+
+    private String userId;//
+
+    private Integer snb;//游戏的snb
+
+    private Integer isState;//0:申请中,1:申请通过,2:申请驳回
+
+    private String snbDescribe;//
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 18 - 0
src/main/java/com/td/boss/game/comsnbapply/repository/ComSnbApplyRepository.java

@@ -0,0 +1,18 @@
+package com.td.boss.game.comsnbapply.repository;
+
+import com.td.boss.common.repository.*;
+import com.td.boss.game.comsnbapply.pojo.ComSnbApply;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface ComSnbApplyRepository extends CommonRepository<ComSnbApply, String> {
+
+    List<ComSnbApply> findAllByUserIdAndIsState(String userId, Integer isState);
+
+    Optional<ComSnbApply> findByUserIdAndSnbAndIsState(String userId,Integer snb,Integer isState);
+
+    List<ComSnbApply> findAllByUserId(String userId);
+}

+ 72 - 0
src/main/java/com/td/boss/game/comsnbapply/scheduled/BackService.java

@@ -0,0 +1,72 @@
+package com.td.boss.game.comsnbapply.scheduled;
+
+import cn.hutool.core.date.DateUtil;
+import com.td.boss.game.comsnbapply.service.ComSnbApplyService;
+import com.td.boss.game.comsnbapply.vo.ComSnbApplyVo;
+import com.td.boss.sys.syssetting.pojo.SysSetting;
+import com.td.boss.sys.syssettingtask.pojo.SysSettingTask;
+import com.td.boss.sys.syssettingtask.service.SysSettingTaskService;
+import com.td.boss.sys.syssettingtask.vo.SysSettingTaskVo;
+import com.td.boss.util.RedisData;
+import com.td.boss.util.RedisLock;
+import com.td.boss.util.SysSettingTaskUtil;
+import com.td.boss.util.SysSettingUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 后台定时任务
+ *
+ * @author:slambb
+ * @date:2022/3/15
+ */
+@Service
+@Slf4j
+@Conditional(IPCondition.class)
+public class BackService {
+
+    @Autowired
+    private ComSnbApplyService comSnbApplyService;
+
+    @Autowired
+    private RedisLock redisLock;
+
+    @PostConstruct
+    public void init(){
+        log.info("apply snb run task...");
+    }
+
+    @Scheduled(cron = "0/10 * * * * *")
+    public void scheduleTask(){
+        //log.info("task running....");
+        //todo 处理是否自动审查
+        if("N".equals(SysSettingTaskUtil.getSysSettingTask().getApplyAutoExamine())){
+            return;
+        }
+        long time = System.currentTimeMillis() + RedisData.getAutoApplyTimeout();
+        String _redisKey = "LOCK:COM_SNB_APPLY:AUTO";
+        if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+            log.info("正在自动审查中..!");
+            return;
+        }
+        //进入自动审核,看看后面是否需要限制数量
+        ComSnbApplyVo getComSnbApplyVo = new ComSnbApplyVo();
+        getComSnbApplyVo.setIsState(0);//查找正在申请中的数据,isState = 0;
+        List<ComSnbApplyVo> comSnbApplyVos = comSnbApplyService.list(getComSnbApplyVo).getData();
+        log.info("审查任务数量:{}个", comSnbApplyVos.size());
+        for (ComSnbApplyVo comSnbApplyVo : comSnbApplyVos) {
+            //全部给通过
+            comSnbApplyVo.setIsState(1);
+            comSnbApplyService.save(comSnbApplyVo);
+        }
+        redisLock.unlock(_redisKey, String.valueOf(time));
+        log.info("正在自动审查中任务结束");
+    }
+}

+ 35 - 0
src/main/java/com/td/boss/game/comsnbapply/scheduled/IPCondition.java

@@ -0,0 +1,35 @@
+package com.td.boss.game.comsnbapply.scheduled;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+import java.net.InetAddress;
+
+/**
+ * 判断是否为本机ip
+ *
+ * @author:slambb
+ * @date:2022/3/15
+ */
+@Slf4j
+public class IPCondition implements Condition {
+
+    @Override
+    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
+        String runTaskIP = conditionContext.getEnvironment().getProperty("applySNB.task.ip");
+        String localIP = this.getLocalIP();
+
+        log.info("local ip: {} , run Task IP: {}" ,localIP , runTaskIP);
+
+        return runTaskIP.equals(localIP);
+    }
+
+    @SneakyThrows
+    public String getLocalIP(){
+        InetAddress address = InetAddress.getLocalHost();
+        return address.getHostAddress();
+    }
+}

+ 17 - 0
src/main/java/com/td/boss/game/comsnbapply/service/ComSnbApplyService.java

@@ -0,0 +1,17 @@
+package com.td.boss.game.comsnbapply.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comsnbapply.pojo.ComSnbApply;
+import com.td.boss.game.comsnbapply.vo.ComSnbApplyVo;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface ComSnbApplyService extends CommonService<ComSnbApplyVo, ComSnbApply, String> {
+
+    List<ComSnbApply> findAllByUserIdAndIsState(String userId,Integer isState);
+
+    ComSnbApply findByUserIdAndSnbAndIsState(String userId,Integer snb,Integer isState);
+
+    List<ComSnbApply> findAllByUserId(String userId);
+}

+ 38 - 0
src/main/java/com/td/boss/game/comsnbapply/service/ComSnbApplyServiceImpl.java

@@ -0,0 +1,38 @@
+package com.td.boss.game.comsnbapply.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.game.comsnbapply.pojo.ComSnbApply;
+import com.td.boss.game.comsnbapply.vo.ComSnbApplyVo;
+import com.td.boss.game.comsnbapply.repository.ComSnbApplyRepository;
+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;
+
+@Service
+@Transactional
+public class ComSnbApplyServiceImpl extends CommonServiceImpl<ComSnbApplyVo, ComSnbApply, String> implements ComSnbApplyService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private ComSnbApplyRepository comSnbApplyRepository;
+
+
+    @Override
+    public List<ComSnbApply> findAllByUserIdAndIsState(String userId, Integer isState) {
+        return comSnbApplyRepository.findAllByUserIdAndIsState(userId, isState);
+    }
+
+    @Override
+    public ComSnbApply findByUserIdAndSnbAndIsState(String userId, Integer snb, Integer isState) {
+        return comSnbApplyRepository.findByUserIdAndSnbAndIsState(userId, snb, isState).orElse(null);
+    }
+
+    @Override
+    public List<ComSnbApply> findAllByUserId(String userId) {
+        return comSnbApplyRepository.findAllByUserId(userId);
+    }
+}

+ 25 - 0
src/main/java/com/td/boss/game/comsnbapply/vo/ComSnbApplySimpleVo.java

@@ -0,0 +1,25 @@
+package com.td.boss.game.comsnbapply.vo;
+
+import com.td.boss.common.pojo.PageCondition;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComSnbApplySimpleVo implements Serializable {
+    private String id;//
+
+    private String userId;//
+
+    private Integer snb;//游戏的snb
+
+    private Integer isState;//0:申请中,1:申请通过,2:申请驳回
+
+    private String snbDescribe;//
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 23 - 0
src/main/java/com/td/boss/game/comsnbapply/vo/ComSnbApplyVo.java

@@ -0,0 +1,23 @@
+package com.td.boss.game.comsnbapply.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ComSnbApplyVo extends PageCondition implements Serializable {
+    private String id;//
+
+    private String userId;//
+
+    private Integer snb;//游戏的snb
+
+    private Integer isState;//0:申请中,1:申请通过,2:申请驳回
+
+    private String snbDescribe;//
+
+    private Date createTime;//
+
+    private Date updateTime;//
+
+}

+ 21 - 1
src/main/java/com/td/boss/game/comsnbfreeze/controller/ComSnbFreezeController.java

@@ -23,6 +23,9 @@ import com.td.boss.game.complayerland.vo.ComPlayerDisasterEnum;
 import com.td.boss.game.complayerland.vo.ComPlayerDisasterProtectedVo;
 import com.td.boss.game.complayerland.vo.ComPlayerLandSimpleVo;
 import com.td.boss.game.complayerland.vo.ComPlayerLandVo;
+import com.td.boss.game.comsnbapply.pojo.ComSnbApply;
+import com.td.boss.game.comsnbapply.service.ComSnbApplyService;
+import com.td.boss.game.comsnbapply.vo.ComSnbApplyVo;
 import com.td.boss.game.comsnbfreeze.pojo.ComSnbFreeze;
 import com.td.boss.game.comsnbfreeze.vo.ComSnbFreezeSimpleVo;
 import com.td.boss.game.comsnbfreeze.vo.ComSnbFreezeVo;
@@ -76,10 +79,14 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
     @Autowired
     private ComPlayerDisasterProtectedService comPlayerDisasterProtectedService;
 
+    @Autowired
+    private ComSnbApplyService comSnbApplyService;
+
     @Autowired
     private RedisLock redisLock;
 
 
+
     /**
      * 获取用户神农呗 snb,前端用户调用
      *
@@ -122,10 +129,20 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
             //return Result.of(map, false, ResultEnum.WALLET_SNB_SIGN_ERROR.getMessage(), ResultEnum.WALLET_SNB_SIGN_ERROR.getCode());
             return Result.of(map);
         }
+        if(snbAmount <= 0){
+            map.put("msg", "snb小于等于0,记录异常!");
+            return Result.of(map);
+        }
+        //todo 新增一个判断当前交易是否存在对应snb通过审核的
+        ComSnbApply comSnbApply = comSnbApplyService.findByUserIdAndSnbAndIsState(id.toString(),snbAmount,1);
+        if(comSnbApply == null){
+            map.put("msg", "此交易未通过审核,返回给用户账户待用户提交审核");
+            return Result.of(map);
+        }
 
         //拿出用户对应的数据
         ComUsersVo comUsersVo = comUsersService.findByUserId(id.toString());
-        if (comUsersVo.getSnb() <= 0 || comUsersVo.getSnb() < snbAmount || snbAmount <= 0) {
+        if (comUsersVo.getSnb() <= 0 || 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());
@@ -151,6 +168,9 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
             map.put("msg", "保存账户数据失败!");
             return Result.of(map);
         }
+        //此操作进入冻结流程,处理申请列表对应的数据状态
+        comSnbApply.setIsState(3);
+        comSnbApplyService.save(CopyUtil.copy(comSnbApply, ComSnbApplyVo.class));
 
         //记录操作的snb,
         ComSnbFreezeVo entityVo = new ComSnbFreezeVo();

+ 33 - 0
src/main/java/com/td/boss/sys/sysGame/controller/sysGamePropertyController.java

@@ -20,12 +20,15 @@ import com.td.boss.game.commallseed.service.ComMallSeedService;
 import com.td.boss.game.commallseed.vo.ComMallSeedVo;
 import com.td.boss.game.complayergoods.service.ComPlayerGoodsService;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsTypeSumVo;
+import com.td.boss.game.comsnbapply.service.ComSnbApplyService;
+import com.td.boss.game.comsnbapply.vo.ComSnbApplyVo;
 import com.td.boss.game.comsnbtran.service.ComSnbTranService;
 import com.td.boss.game.comsnbtran.vo.ComSnbTranDateVo;
 import com.td.boss.game.comsnbtran.vo.ComSnbTranTranTypeSumVo;
 import com.td.boss.game.comusers.pojo.ComUsers;
 import com.td.boss.game.comusers.service.ComUsersService;
 import com.td.boss.game.comusers.vo.ComUsersVo;
+import com.td.boss.util.SysSettingTaskUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -62,6 +65,10 @@ public class sysGamePropertyController extends CommonController<ComUsersVo, ComU
     private ComFruitService comFruitService;
 
 
+    @Autowired
+    private ComSnbApplyService comSnbApplyService;
+
+
     @GetMapping("CNTAndSNB")
     public ModelAndView CNTAndSNB(){
 
@@ -228,4 +235,30 @@ public class sysGamePropertyController extends CommonController<ComUsersVo, ComU
     public Result saveFruitConfig(ComFruitVo comFruitVo){
         return comFruitService.save(comFruitVo);
     }
+
+
+
+
+    @GetMapping("applySnbToCntView")
+    public ModelAndView usersApplySnbToCnt(){
+        return new ModelAndView("sys/aComApplySNBToCNT/applySNBToCNT","sysSettingTask", SysSettingTaskUtil.getSysSettingTask());
+    }
+
+
+    @PostMapping("findApplySnbToCntPage")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComSnbApplyVo>> findUsersApplySnbToCnt(ComSnbApplyVo comSnbApplyVo){
+        return comSnbApplyService.page(comSnbApplyVo);
+    }
+
+
+    @PostMapping("updateApplySnbToCntData")
+    @Decrypt
+    @Encrypt
+    public Result<ComSnbApplyVo> updateApplySnbToCntData(ComSnbApplyVo comSnbApplyVo){
+        return comSnbApplyService.save(comSnbApplyVo);
+    }
+
+
 }

+ 1 - 0
src/main/java/com/td/boss/sys/sysGame/controller/sysGameUsersController.java

@@ -18,6 +18,7 @@ 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.game.complayerprofit.vo.ComPlayerProfitVo;
+import com.td.boss.game.comsnbapply.vo.ComSnbApplyVo;
 import com.td.boss.game.comsnbtran.service.ComSnbTranService;
 import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
 import com.td.boss.game.comusers.pojo.ComUsers;

+ 15 - 0
src/main/java/com/td/boss/sys/syssettingtask/controller/SysSettingTaskController.java

@@ -0,0 +1,15 @@
+package com.td.boss.sys.syssettingtask.controller;
+
+import com.td.boss.common.controller.*;
+import com.td.boss.sys.syssettingtask.pojo.SysSettingTask;
+import com.td.boss.sys.syssettingtask.vo.SysSettingTaskVo;
+import com.td.boss.sys.syssettingtask.service.SysSettingTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/sys/sysSettingTask/")
+public class SysSettingTaskController extends CommonController<SysSettingTaskVo, SysSettingTask, String> {
+    @Autowired
+    private SysSettingTaskService sysSettingTaskService;
+}

+ 21 - 0
src/main/java/com/td/boss/sys/syssettingtask/pojo/SysSettingTask.java

@@ -0,0 +1,21 @@
+package com.td.boss.sys.syssettingtask.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "sys_setting_task")
+@Data
+public class SysSettingTask implements Serializable {
+    @Id
+    private String id;//表id
+
+    private String applyAutoExamine;//是否自动审查 Y/N
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 9 - 0
src/main/java/com/td/boss/sys/syssettingtask/repository/SysSettingTaskRepository.java

@@ -0,0 +1,9 @@
+package com.td.boss.sys.syssettingtask.repository;
+
+import com.td.boss.common.repository.*;
+import com.td.boss.sys.syssettingtask.pojo.SysSettingTask;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SysSettingTaskRepository extends CommonRepository<SysSettingTask, String> {
+}

+ 8 - 0
src/main/java/com/td/boss/sys/syssettingtask/service/SysSettingTaskService.java

@@ -0,0 +1,8 @@
+package com.td.boss.sys.syssettingtask.service;
+
+import com.td.boss.common.service.*;
+import com.td.boss.sys.syssettingtask.pojo.SysSettingTask;
+import com.td.boss.sys.syssettingtask.vo.SysSettingTaskVo;
+
+public interface SysSettingTaskService extends CommonService<SysSettingTaskVo, SysSettingTask, String> {
+}

+ 36 - 0
src/main/java/com/td/boss/sys/syssettingtask/service/SysSettingTaskServiceImpl.java

@@ -0,0 +1,36 @@
+package com.td.boss.sys.syssettingtask.service;
+
+import com.td.boss.common.pojo.Result;
+import com.td.boss.common.service.*;
+import com.td.boss.sys.syssetting.vo.SysSettingVo;
+import com.td.boss.sys.syssettingtask.pojo.SysSettingTask;
+import com.td.boss.sys.syssettingtask.vo.SysSettingTaskVo;
+import com.td.boss.sys.syssettingtask.repository.SysSettingTaskRepository;
+import com.td.boss.util.SysSettingTaskUtil;
+import com.td.boss.util.SysSettingUtil;
+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 SysSettingTaskServiceImpl extends CommonServiceImpl<SysSettingTaskVo, SysSettingTask, String> implements SysSettingTaskService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private SysSettingTaskRepository sysSettingTaskRepository;
+
+    @Override
+    public Result<SysSettingTaskVo> save(SysSettingTaskVo entityVo) {
+        //调用父类
+        Result<SysSettingTaskVo> result = super.save(entityVo);
+
+        //更新系统设置时同步更新公用静态集合sysSettingTaskMap
+         SysSettingTaskUtil.setSysSettingTaskMap(result.getData());
+
+        return result;
+    }
+}

+ 17 - 0
src/main/java/com/td/boss/sys/syssettingtask/vo/SysSettingTaskVo.java

@@ -0,0 +1,17 @@
+package com.td.boss.sys.syssettingtask.vo;
+
+import com.td.boss. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class SysSettingTaskVo extends PageCondition implements Serializable {
+    private String id;//表id
+
+    private String applyAutoExamine;//是否自动审查 Y/N
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

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

@@ -532,11 +532,12 @@ public class CodeDOM {
        // 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","com_fruit","com_snb_tran"};
-       // "com_player_log" ,"com_explain_land","com_player_profit","com_players_attri","com_setting","com_player_dog","com_mall_other"
-       // String[] tables = {"com_mall_food"};
-       // for (String table : tables) {
-       //     String msg = new CodeDOM(table).create();
-       //     System.out.println(msg);
-       // }
+       // "com_player_log" ,"com_explain_land","com_player_profit","com_players_attri","com_setting","com_player_dog","com_mall_other","com_mall_food"
+       // "com_snb_apply"
+        String[] tables = {"sys_setting_task"};
+        for (String table : tables) {
+            String msg = new CodeDOM(table).create();
+            System.out.println(msg);
+        }
     }
 }

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

@@ -60,4 +60,13 @@ public class RedisData {
     public static int getDisastersDayTimeout() {
         return PLAYER_DISASTERS_DAY_TIMEOUT;
     }
+
+
+    /**
+     * 20s 自动审核锁
+     */
+    private static final int AUTO_APPLY_TIMEOUT = 1000*20;
+    public static int getAutoApplyTimeout() {
+        return AUTO_APPLY_TIMEOUT;
+    }
 }

+ 32 - 0
src/main/java/com/td/boss/util/SysSettingTaskUtil.java

@@ -0,0 +1,32 @@
+package com.td.boss.util;
+
+import com.td.boss.sys.syssetting.vo.SysSettingVo;
+import com.td.boss.sys.syssettingtask.pojo.SysSettingTask;
+import com.td.boss.sys.syssettingtask.vo.SysSettingTaskVo;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 系统设置工具类
+ * 系统启动时获取数据库数据,设置到公用静态集合sysSettingMap
+ * 更新系统设置时同步更新公用静态集合sysSettingMap
+ */
+public class SysSettingTaskUtil {
+
+    //使用线程安全的ConcurrentHashMap来存储系统设置
+    private static ConcurrentHashMap<String, SysSettingTaskVo> sysSettingTaskMap = new ConcurrentHashMap<>();
+
+    //从公用静态集合sysSettingTaskMap获取系统设置
+    public static SysSettingTaskVo getSysSettingTask(){
+        return sysSettingTaskMap.get("sysSettingTask");
+    }
+
+    //更新公用静态集合sysSettingTaskMap
+    public static void setSysSettingTaskMap(SysSettingTaskVo sysSettingTaskVo){
+        if(sysSettingTaskMap.isEmpty()){
+            sysSettingTaskMap.put("sysSettingTask",sysSettingTaskVo);
+        }else{
+            sysSettingTaskMap.replace("sysSettingTask",sysSettingTaskVo);
+        }
+    }
+}

+ 22 - 0
src/main/resources/static/sys/aComApplySNBToCNT/css/applySNBToCNT.css

@@ -0,0 +1,22 @@
+body {
+    padding: 20px;
+    background-color: #F2F2F2;
+}
+
+.layui-form-label {
+    width: 120px !important;
+}
+
+.layui-input-block {
+    display: -webkit-box !important;
+}
+
+.layui-table-tool-temp {
+    padding-right: 0;
+}
+
+#queryByLoginName {
+    display: unset;
+    width: 100px;
+    margin-left: 10px;
+}

+ 196 - 0
src/main/resources/static/sys/aComApplySNBToCNT/js/applySNBToCNT.js

@@ -0,0 +1,196 @@
+let tableApplySNBToCNT;
+let tree;
+let startDate = new Date(new Date(new Date().toLocaleDateString()).getTime()),
+    endDate = new Date(new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1);
+let snbStartDate = startDate, snbEndDate = endDate;
+
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], function () {
+    let table = layui.table;
+    let form = layui.form;//select、单选、复选等依赖form
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+    let height = document.documentElement.clientHeight;
+
+    tableApplySNBToCNT = table.render({
+        elem: '#applySnbTable'
+        , url: ctx + "/sys/sysProperty/findApplySnbToCntPage"
+        , method: 'POST'
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        , where: {
+            startTime: commonUtil.parseTime(snbStartDate),
+            endTime: commonUtil.parseTime(snbEndDate)
+        }
+        , response: {
+            statusName: 'flag' //规定数据状态的字段名称,默认:code
+            , statusCode: true //规定成功的状态码,默认:0
+            , msgName: 'msg' //规定状态信息的字段名称,默认:msg
+            , countName: 'records' //规定数据总数的字段名称,默认:count
+            , dataName: 'rows' //规定数据列表的字段名称,默认:data
+        }
+        //响应后数据处理
+        , parseData: function (res) { //res 即为原始返回的数据
+            var data = res.data;
+            console.log("返回的地址数据:", data);
+            //这里应该是反回一个用户,后台做成了页面数据。但是只带一条数据
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#applySnbTableToolbarDemo'
+        , title: 'SNB申请列表'
+        , cols: [
+            [
+                {type: 'checkbox', fixed: 'left'},
+                {
+                    field: 'isState', title: '申请状态', sort: true, templet: function (d) {
+                        if (d.isState == 0) {
+                            return '<span style="color: green">申请中</span>';
+                        } else if (d.isState == 1) {
+                            return '<span style="color: green">申请成功</span>';
+                        } else if (d.isState == 2) {
+                            return '<span style="color: red ">申请驳回</span>';
+                        } else if (d.isState == 3) {
+                            return '<span style="color: red ">进入兑换流程</span>';
+                        } else {
+                            return '待添加:' + d.isState;
+                        }
+                    }
+                }
+                , {field: 'id', title: 'ID'}
+                , {field: 'userId', title: '用户id'}
+                , {field: 'snb', title: '申请的Snb',sort: true}
+                , {field: 'snbDescribe', title: '描述'}
+                , {field: 'createTime', title: '创建时间',sort: true}
+                , {field: 'updateTime', title: '更新时间',sort: true}
+                , {fixed: 'right', title: '操作', toolbar: '#barDemo', width: 150}
+            ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    //radio checkbox
+    $("#sysSettingTaskForm").find("[name='applyAutoExamine'][value='" + $("#applyAutoExamine").val() + "']").attr("checked", true);
+    form.render();
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+        let data = obj.data;
+        switch (obj.event) {
+            case 'applySnbTableReload':
+                searchSNBFromDate();
+                break;
+            case 'getCheckData':
+                let checkStatus1 = table.checkStatus('applySnbTable'),data1 = checkStatus1.data;
+                layer.alert(JSON.stringify(data1));
+                break;
+            case 'getCheckLength':
+                let checkStatus2 = table.checkStatus('applySnbTable'),data2 = checkStatus2.data;
+                layer.msg('选中了:'+ data2.length + ' 个');
+                break;
+            case 'isAll':
+                let checkStatus3 = table.checkStatus('applySnbTable');
+                layer.msg(checkStatus3.isAll ? '全选': '未全选')
+                break;
+        }
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                //编辑
+                console.log("edit");
+                //回显操作表单
+                // $("#comUserForm").form(data);
+                // form.render();
+                break;
+            case 'agree':
+                if (!data.id) {
+                    layer.msg("编辑列表不存在", {icon: 2, time: 1000}, function () {
+                    });
+                    return;
+                }
+                data.isState = 1;   //同意申请 1
+                $.post(ctx + "/sys/sysProperty/updateApplySnbToCntData", data, function (res) {
+                    if (!res.flag) {
+                        layer.msg(res.msg, {icon: 2, time: 2000}, function () {
+                        });
+                        return;
+                    }
+                    obj.update(res.data);
+                });
+                break;
+            case 'reject':
+                if (!data.id) {
+                    layer.msg("编辑列表不存在", {icon: 2, time: 1000}, function () {
+                    });
+                    return;
+                }
+                data.isState = 2;       //驳回申请 2
+                $.post(ctx + "/sys/sysProperty/updateApplySnbToCntData", data, function (res) {
+                    if (!res.flag) {
+                        layer.msg(res.msg, {icon: 2, time: 2000}, function () {
+                        });
+                        return;
+                    }
+                    obj.update(res.data);
+                });
+                break;
+        }
+    });
+
+    laydate.render({
+        elem: '#applySnbTableDate'
+        , type: 'datetime'
+        , value: commonUtil.parseTime(snbStartDate) + ' - ' + commonUtil.parseTime(snbEndDate)
+        , isInitValue: true
+        , range: true
+        , done: function (_value, _date, _endDate) {
+            let _array = _value.split(' - ');
+            snbStartDate = _array[0];
+            snbEndDate = _array[1];
+            searchSNBFromDate();
+        }
+    });
+});
+
+function searchSNBFromDate() {
+    tableApplySNBToCNT.reload({
+        page: false
+        , method: 'POST'
+        , url: ctx + "/sys/sysProperty/findApplySnbToCntPage"
+        , where: {
+            startTime: commonUtil.parseTime(snbStartDate),
+            endTime: commonUtil.parseTime(snbEndDate)
+        }
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            // this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}
+
+/**
+ * 提交保存
+ */
+function sysSettingTaskFormSave() {
+    let serializeObject = $("#sysSettingTaskForm").serializeObject();
+    $.post(ctx + "/sys/sysSettingTask/save", serializeObject, function (data) {
+        layer.msg("修改成功!", {icon: 1, time: 2000}, function () {});
+        $("#sysSettingTaskForm").form(data.data);
+        $("#applyAutoExamine").val(data.data.applyAutoExamine)
+    });
+}

+ 74 - 0
src/main/resources/view/sys/aComApplySNBToCNT/applySNBToCNT.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+    <!-- 游戏数据用户相关样式 -->
+    <link th:href="@{/sys/aComApplySNBToCNT/css/applySNBToCNT.css}" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <div class="layui-col-md12">
+        <div class="layui-card">
+            <div class="layui-card-header">
+                <label class="layui-form-label" >筛选日期:</label>
+                <div class="layui-input-inline" style="width: 300px;">
+                    <input type="text" class="layui-input" id="applySnbTableDate" placeholder=" - ">
+                </div>
+            </div>
+            <div class="layui-card-body">
+                <form id="sysSettingTaskForm" class="layui-form layui-form-pane">
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">是否开启自动审查</label>
+                        <div class="layui-input-block">
+                            <input id="applyAutoExamine" th:value="${sysSettingTask.applyAutoExamine}"  hidden="hidden"/>
+                            <input type="radio" name="applyAutoExamine" value="Y" title="是">
+                            <input type="radio" name="applyAutoExamine" value="N" title="否">
+                        </div>
+                    </div>
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">更新时间</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="updateTime" th:value="${#dates.format(sysSettingTask.updateTime, 'yyyy-MM-dd HH:mm:ss')}" autocomplete="off"
+                                   placeholder="更新时间"
+                                   class="layui-input" readonly="readonly" disabled="disabled">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
+                            <a class="layui-btn" onclick="sysSettingTaskFormSave()">修改</a>
+                        </div>
+                    </div>
+                    <!-- 隐藏域 -->
+                    <input type="text" name="id"  th:value="${sysSettingTask.id}" hidden="hidden"/>
+                    <input type="text" name="createTime"  th:value="${#dates.format(sysSettingTask.createTime, 'yyyy-MM-dd HH:mm:ss')}" hidden="hidden"/>
+                </form>
+            </div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="applySnbTable" lay-filter="test"></table>
+
+                <!-- 模板 -->
+                <script type="text/html" id="applySnbTableToolbarDemo">
+                    <div class="layui-btn-container">
+                        <button class="layui-btn" lay-event="applySnbTableReload">刷新</button>
+                        <button class="layui-btn" lay-event="getCheckData">获取选中行数据</button>
+                        <button class="layui-btn" lay-event="getCheckLength">获取选中数目</button>
+                        <button class="layui-btn" lay-event="isAll">验证是否全选</button>
+                    </div>
+                </script>
+
+                <script type="text/html" id="barDemo">
+                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="agree">同意</a>
+                    <a class="layui-btn layui-btn-xs" lay-event="reject">驳回</a>
+                </script>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<!-- js -->
+<script th:src="@{/sys/aComApplySNBToCNT/js/applySNBToCNT.js}"></script>
+</html>