|
|
@@ -0,0 +1,291 @@
|
|
|
+package com.td.WaDa.game.commallseed.controller;
|
|
|
+
|
|
|
+import cn.hutool.core.convert.Convert;
|
|
|
+import com.td.WaDa.common.controller.*;
|
|
|
+import com.td.WaDa.common.pojo.Result;
|
|
|
+import com.td.WaDa.config.enums.ResultEnum;
|
|
|
+import com.td.WaDa.game.commallseed.pojo.ComMallSeed;
|
|
|
+import com.td.WaDa.game.commallseed.service.ComMallSeedService;
|
|
|
+import com.td.WaDa.game.commallseed.vo.ComMallSeedVo;
|
|
|
+import com.td.WaDa.game.complayergoods.pojo.ComPlayerGoods;
|
|
|
+import com.td.WaDa.game.complayergoods.service.ComPlayerGoodsService;
|
|
|
+import com.td.WaDa.game.complayergoods.vo.ComPlayerGoodsVo;
|
|
|
+import com.td.WaDa.game.complayerlog.pojo.ComPlayerLog;
|
|
|
+import com.td.WaDa.game.complayerlog.service.ComPlayerLogService;
|
|
|
+import com.td.WaDa.game.complayerlog.vo.ComPlayerLogVo;
|
|
|
+import com.td.WaDa.game.complayers.pojo.ComPlayers;
|
|
|
+import com.td.WaDa.game.complayers.service.ComPlayersService;
|
|
|
+import com.td.WaDa.game.comsnbtran.service.ComSnbTranService;
|
|
|
+import com.td.WaDa.game.comsnbtran.vo.ComSnbTranVo;
|
|
|
+import com.td.WaDa.game.comusers.service.ComUsersService;
|
|
|
+import com.td.WaDa.game.comusers.vo.ComUsersVo;
|
|
|
+import com.td.WaDa.util.CopyUtil;
|
|
|
+import com.td.WaDa.util.DoubleUtil;
|
|
|
+import com.td.WaDa.util.RedisData;
|
|
|
+import com.td.WaDa.util.RedisLock;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+import org.springframework.web.bind.annotation.*;
|
|
|
+
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@RestController
|
|
|
+@RequestMapping("/game/comMallSeed/")
|
|
|
+public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMallSeed, Integer> {
|
|
|
+ @Autowired
|
|
|
+ private ComMallSeedService comMallSeedService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ComPlayerGoodsService comPlayerGoodsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ComUsersService comUsersService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ComSnbTranService comSnbTranService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ComPlayerLogService comPlayerLogService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ComPlayersService comPlayersService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisLock redisLock;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取商城种子
|
|
|
+ *
|
|
|
+ * @param userId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @GetMapping("getMallSeed")
|
|
|
+ public Result<List<ComMallSeedVo>> getSNBFunction(@RequestParam(value = "userId") String userId) {
|
|
|
+ //log.info(userId);
|
|
|
+ ComMallSeedVo comMallSeedVo = new ComMallSeedVo();
|
|
|
+ Result result = comMallSeedService.list(comMallSeedVo);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 神农呗购买种子
|
|
|
+ *
|
|
|
+ * @param userId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @PostMapping("snbBuySeeds")
|
|
|
+ @ResponseBody
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Result<Map> snbBuySeedsFunction(
|
|
|
+ @RequestParam(value = "userId") String userId,
|
|
|
+ @RequestParam(value = "payAmount") Integer payAmount,
|
|
|
+ @RequestParam(value = "seedId") Integer seedId
|
|
|
+ ) {
|
|
|
+ //校验如果前台输入负数
|
|
|
+ Map map = new HashMap();
|
|
|
+ if(payAmount<=0){
|
|
|
+ return Result.of(map, false, ResultEnum.SEED_PLAY_ERROR.getMessage(), ResultEnum.SEED_PLAY_ERROR.getCode());
|
|
|
+ }
|
|
|
+ // 处理itemType,种子id ,获取种子类型,设置种子不同的数据
|
|
|
+ Integer itemType = seedId;
|
|
|
+ ComMallSeedVo seedVo = comMallSeedService.findById(seedId);
|
|
|
+ if (seedVo == null) {
|
|
|
+
|
|
|
+ map.put("msg", "非法操作:所修改的种子不存在服务器中!");
|
|
|
+ //return Result.of(map);
|
|
|
+ return Result.of(map, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
|
|
|
+ }
|
|
|
+ if (!StringUtils.hasText(payAmount.toString())||payAmount.equals(0) || payAmount % seedVo.getPriceSnb() != 0 ) {
|
|
|
+ //支付价格不能为零,如果价格 不和种子相当,也不是种子的倍数,也是不行的
|
|
|
+ map.put("msg", "订单非法操作,已记录相关信息!");
|
|
|
+ //return Result.of(map);
|
|
|
+ return Result.of(map, false, ResultEnum.SEED_PLAY_ERROR.getMessage(), ResultEnum.SEED_PLAY_ERROR.getCode());
|
|
|
+ }
|
|
|
+
|
|
|
+ //todo snb冻结加锁
|
|
|
+ long time = System.currentTimeMillis() + RedisData.getSnbTimeout();
|
|
|
+ String _redisKey = "SNB_SAVE_" + userId;
|
|
|
+
|
|
|
+ try{
|
|
|
+ //todo snb冻结加锁
|
|
|
+ if (!redisLock.lock(_redisKey, String.valueOf(time))) {
|
|
|
+ return Result.of(null, false, ResultEnum.SEED_SALE_SAVE_LOCK.getMessage(), ResultEnum.SEED_SALE_SAVE_LOCK.getCode());
|
|
|
+ }
|
|
|
+
|
|
|
+ //todo 操作snb数量
|
|
|
+ ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
|
|
|
+ if ( comUsersVo.getSnb() < payAmount || comUsersVo.getSnb()<=0) {
|
|
|
+ map.put("msg", "账户snb不足");
|
|
|
+ //WALLET_SNB_INSUFFICIENT_QUANTITY(602,"snb不足以支付!")
|
|
|
+ return Result.of(map, false, ResultEnum.WALLET_SNB_INSUFFICIENT_QUANTITY.getMessage(), ResultEnum.WALLET_SNB_INSUFFICIENT_QUANTITY.getCode());
|
|
|
+ }
|
|
|
+ //如果数量够,写入修改对应操作
|
|
|
+ Integer _oldSnb = comUsersVo.getSnb();
|
|
|
+ Integer _snb = comUsersVo.getSnb() - payAmount;
|
|
|
+ comUsersVo.setSnb(_snb);
|
|
|
+ comUsersService.save( comUsersVo);
|
|
|
+
|
|
|
+ //合法操作记录到仓库中
|
|
|
+ ComPlayerGoods entityVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, itemType, 0);
|
|
|
+ //这里计算一个购买种子的数量,用种子除去单价
|
|
|
+ int _paySeedAmount = (int) (payAmount / seedVo.getPriceSnb());
|
|
|
+ if (entityVo == null) {
|
|
|
+ //创建一个新种子
|
|
|
+ entityVo = new ComPlayerGoods();
|
|
|
+ entityVo.setGoodsIndex(itemType);
|
|
|
+ entityVo.setGoodsType(0);
|
|
|
+ entityVo.setAmount(_paySeedAmount);
|
|
|
+ entityVo.setAmountPart(0d);
|
|
|
+ entityVo.setName(seedVo.getName());
|
|
|
+ entityVo.setPictureName(seedVo.getPicture());
|
|
|
+ entityVo.setUserId(userId);
|
|
|
+ //[xst]此处新增获取种子的类型
|
|
|
+ entityVo.setMallType(Convert.toInt(seedVo.getMallType(),0));
|
|
|
+ } else {
|
|
|
+ Integer _amount = entityVo.getAmount() + _paySeedAmount;
|
|
|
+ entityVo.setAmount(_amount);
|
|
|
+ }
|
|
|
+ /** 购买成功后,记录到仓库中*/
|
|
|
+ ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(entityVo, ComPlayerGoodsVo.class);
|
|
|
+ comPlayerGoodsService.save(comPlayerGoodsVo);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * todo 购买种子的交易记录
|
|
|
+ */
|
|
|
+ ComSnbTranVo _snbTran = new ComSnbTranVo();
|
|
|
+ //记录兑换id
|
|
|
+ _snbTran.setTranId(itemType.toString());
|
|
|
+ _snbTran.setUserId(userId);
|
|
|
+ if(seedVo.getMallType().equals(0)){
|
|
|
+ _snbTran.setTranName("使用SNB购买"+seedVo.getName()+"种子");
|
|
|
+ }else{
|
|
|
+ _snbTran.setTranName("使用SNB购买"+seedVo.getName());
|
|
|
+ }
|
|
|
+ _snbTran.setTranType(3);
|
|
|
+ _snbTran.setTranAmount(_paySeedAmount); //此数量会操作背包记录
|
|
|
+ _snbTran.setTranPrice(payAmount);
|
|
|
+ _snbTran.setTranDescribe("SNB购买种子的价格:"+seedVo.getPriceSnb()+",支付金额:"+payAmount);
|
|
|
+ _snbTran.setIsAdd(0);//减少snb
|
|
|
+ _snbTran.setBeforeSnb(_oldSnb);
|
|
|
+ _snbTran.setTranSnb(payAmount);
|
|
|
+ _snbTran.setAfterSnb(_snb);
|
|
|
+ //不涉及交易的设置为0
|
|
|
+ _snbTran.setTranAmountPart(0d);
|
|
|
+ _snbTran.setTranSnbPart(0d);
|
|
|
+ _snbTran.setBeforeSnbPart( comUsersVo.getSnbPart());
|
|
|
+ _snbTran.setAfterSnbPart( comUsersVo.getSnbPart());
|
|
|
+ comSnbTranService.save(_snbTran);
|
|
|
+
|
|
|
+ redisLock.unlock(_redisKey, String.valueOf(time));
|
|
|
+
|
|
|
+ map.put("seed", entityVo.getGoodsIndex());
|
|
|
+ map.put("snb", comUsersVo.getSnb());
|
|
|
+ return Result.of(map);
|
|
|
+ }catch (Exception e) {
|
|
|
+ redisLock.unlock(_redisKey, String.valueOf(time));
|
|
|
+ throw new RuntimeException(e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 用钻石兑换一份辣椒种子
|
|
|
+ *
|
|
|
+ * @param userId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @PostMapping("exchangeSeeds")
|
|
|
+ @ResponseBody
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Result<Map> exchangeSeedsFunction(
|
|
|
+ @RequestParam(value = "userId") String userId,
|
|
|
+ @RequestParam(value = "diamondAmount") Integer diamondAmount,
|
|
|
+ @RequestParam(value = "seedId") Integer seedId
|
|
|
+ ) {
|
|
|
+ if(diamondAmount< 30000){
|
|
|
+ return Result.of(null, false, ResultEnum.SEED_PLAY_ERROR.getMessage(), ResultEnum.SEED_PLAY_ERROR.getCode());
|
|
|
+ }
|
|
|
+ // 处理itemType,种子id ,获取种子类型,设置种子不同的数据
|
|
|
+ Integer itemType = seedId;
|
|
|
+ ComMallSeedVo seedVo = comMallSeedService.findById(seedId);
|
|
|
+ Map map = new HashMap();
|
|
|
+ if (seedVo == null) {
|
|
|
+ map.put("msg", "非法操作:所修改的种子不存在服务器中!");
|
|
|
+ //return Result.of(map);
|
|
|
+ return Result.of(map, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
|
|
|
+ }
|
|
|
+
|
|
|
+ ComPlayers player = comPlayersService.findByUserId(userId);
|
|
|
+ if(player.getIsExchange().equals(1)){
|
|
|
+ map.put("msg", "非法操作:已兑换过种子!");
|
|
|
+ return Result.of(map, false, ResultEnum.SEED_IS_EXCHANGE.getMessage(), ResultEnum.SEED_IS_EXCHANGE.getCode());
|
|
|
+ }
|
|
|
+
|
|
|
+ //JSONObject jsonObject = JSONObject.parseObject(player.getData());
|
|
|
+ //Integer _diamond = Integer.parseInt(jsonObject.getString("Diamond"));
|
|
|
+ Double _diamond = player.getDiamond();
|
|
|
+ if(DoubleUtil.compare(_diamond,diamondAmount.doubleValue()).equals(-1)){
|
|
|
+ return Result.of(map, false, ResultEnum.SEED_PLAY_DIAMOND_ERROR.getMessage(), ResultEnum.SEED_PLAY_DIAMOND_ERROR.getCode());
|
|
|
+ }
|
|
|
+ //jsonObject.put("Diamond",_diamond - diamondAmount);
|
|
|
+ Double _endDiamond = DoubleUtil.sub(_diamond , diamondAmount.doubleValue());
|
|
|
+ //设置已经兑换的状态
|
|
|
+ player.setIsExchange(1);
|
|
|
+ //更新游戏状态
|
|
|
+ //player.setData(jsonObject.toString());
|
|
|
+ player.setDiamond(_endDiamond);
|
|
|
+ comPlayersService.addComPlayers(player);
|
|
|
+ //合法操作记录到仓库中
|
|
|
+ //todo 添加一个辣椒种子
|
|
|
+ ComPlayerGoods entityVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, itemType, 0);
|
|
|
+ Integer _selfBeforeAmount = 0;
|
|
|
+ if (entityVo == null) {
|
|
|
+ //创建一个新种子
|
|
|
+ entityVo = new ComPlayerGoods();
|
|
|
+ entityVo.setGoodsIndex(itemType);
|
|
|
+ entityVo.setGoodsType(0);
|
|
|
+ entityVo.setAmount(1);
|
|
|
+ entityVo.setAmountPart(0d);
|
|
|
+ entityVo.setName(seedVo.getName());
|
|
|
+ entityVo.setPictureName(seedVo.getPicture());
|
|
|
+ entityVo.setUserId(userId);
|
|
|
+ } else {
|
|
|
+ _selfBeforeAmount = entityVo.getAmount();
|
|
|
+ Integer _amount = entityVo.getAmount() + 1;
|
|
|
+ entityVo.setAmount(_amount);
|
|
|
+ }
|
|
|
+ /** 购买成功后,记录到仓库中*/
|
|
|
+ ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(entityVo, ComPlayerGoodsVo.class);
|
|
|
+ comPlayerGoodsService.save(comPlayerGoodsVo);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * todo 记录 PlayerLog
|
|
|
+ */
|
|
|
+ //当前用户
|
|
|
+ ComPlayerLog _selfPlayerLog = new ComPlayerLog();
|
|
|
+ _selfPlayerLog.setUserId(userId);
|
|
|
+ _selfPlayerLog.setTId(entityVo.getGoodsIndex());
|
|
|
+ _selfPlayerLog.setTName(entityVo.getName());
|
|
|
+ _selfPlayerLog.setTType(4);//兑换种子
|
|
|
+ _selfPlayerLog.setTAmount(1);
|
|
|
+ _selfPlayerLog.setBeforeAmount(_selfBeforeAmount);
|
|
|
+ ////交易后的数据
|
|
|
+ _selfPlayerLog.setAfterAmount(entityVo.getAmount());
|
|
|
+ _selfPlayerLog.setLMultiple(0);//收获时候,会有一个倍数
|
|
|
+ _selfPlayerLog.setWithered(0); //枯萎就设置 1
|
|
|
+ ComPlayerLogVo _selfPlayerLogVo = CopyUtil.copy(_selfPlayerLog, ComPlayerLogVo.class);
|
|
|
+ comPlayerLogService.save(_selfPlayerLogVo);
|
|
|
+
|
|
|
+ map.put("seed", entityVo.getGoodsIndex());
|
|
|
+ map.put("playerData",player.getData());
|
|
|
+ map.put("isExchange",player.getIsExchange());
|
|
|
+
|
|
|
+ return Result.of(map);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|