Browse Source

金币产出相关接口更新

xudm 2 months ago
parent
commit
60716abb7f

+ 3 - 1
src/main/java/com/xs/core/common/constant/GoldCoinConstant.java

@@ -16,7 +16,9 @@ public interface GoldCoinConstant {
     /**
      * 金币产出时间,单位秒
      */
-    long GOLD_COIN_PRODUCT_TIME = 120L;
+    long GOLD_COIN_PRODUCT_TIME = 60 * 60 * 12L;
+
+    long BOOST_RATE_RESIDUE_TIMESTAMP = 60 * 60 *12L;
 
 
     /**

+ 11 - 2
src/main/java/com/xs/core/controller/coin/GoldCoinProductController.java

@@ -5,6 +5,8 @@ import com.xs.core.model.coin.entity.CoinSpeedUpgradesRules;
 import com.xs.core.model.coin.entity.GoldCoinProdState;
 import com.xs.core.model.coin.req.CoinSpeedUpgradesRulesReq;
 import com.xs.core.model.coin.req.TemporaryRateReq;
+import com.xs.core.model.coin.resp.BoostResidueTimesResp;
+import com.xs.core.model.coin.resp.CoinSpeedUpgradesRulesResp;
 import com.xs.core.model.coin.resp.GoldCoinProdStateResp;
 import com.xs.core.service.coin.GoldCoinService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -48,8 +50,8 @@ public class GoldCoinProductController {
 
     @PostMapping("/getRateUpgradesRules")
     @Operation(description = "获取金币产出速率升级规则", summary = "获取金币产出速率升级规则")
-    public ResponseResult<List<CoinSpeedUpgradesRules>> getRateUpgradesRules() {
-        List<CoinSpeedUpgradesRules> rules = goldCoinService.getRateUpgradesRulesByUser();
+    public ResponseResult<CoinSpeedUpgradesRulesResp> getRateUpgradesRules() {
+        CoinSpeedUpgradesRulesResp rules = goldCoinService.getRateUpgradesRulesByUser();
         return ResponseResult.success(rules);
     }
 
@@ -66,4 +68,11 @@ public class GoldCoinProductController {
         goldCoinService.collectGoldCoin();
         return ResponseResult.success();
     }
+
+    @Operation(description = "加成剩余时间", summary = "加成剩余时间")
+    @PostMapping("/getBoostResidueTimes")
+    public ResponseResult<BoostResidueTimesResp> getBoostResidueTimes() {
+        BoostResidueTimesResp boostResidueTimesResp = goldCoinService.getBoostResidueTimes();
+        return ResponseResult.success(boostResidueTimesResp);
+    }
 }

+ 5 - 0
src/main/java/com/xs/core/model/coin/dto/GoldRateUpgradesState.java

@@ -34,4 +34,9 @@ public class GoldRateUpgradesState implements Serializable {
      * 判断当前生产批次内是否有临时速率 如过进行过临时速率升级 则不升级
      */
     private boolean hasTemporaryRate;
+
+    /**
+     * 处理临时速率的标志 0 未处理 1 已处理
+     */
+    private int boostRateFLag = 0;
 }

+ 4 - 1
src/main/java/com/xs/core/model/coin/entity/CoinSpeedUpgradesRules.java

@@ -30,7 +30,7 @@ public class CoinSpeedUpgradesRules extends Model<CoinSpeedUpgradesRules> {
      * id
      */
     @TableId(value = "id", type = IdType.ASSIGN_ID)
-    private Long id;
+    private String id;
 
     /**
      * 消耗金币数量
@@ -86,6 +86,9 @@ public class CoinSpeedUpgradesRules extends Model<CoinSpeedUpgradesRules> {
     @TableField(exist = false)
     private String numericalValueHour;
 
+    @TableField(exist = false)
+    private String upgradeStatus;
+
 
     public String getNumericalValueHour() {
         BigDecimal bigDecimal = new BigDecimal(numericalValue);

+ 12 - 0
src/main/java/com/xs/core/model/coin/entity/GoldCoinProdState.java

@@ -98,6 +98,18 @@ public class GoldCoinProdState extends Model<GoldCoinProdState> {
     @TableField(exist = false)
     private boolean completed = false;
 
+    /**
+     * 临时加成剩余时间 (秒)
+     */
+    @TableField(exist = false)
+    private Long boostResidueTimestamp;
+
+    /**
+     * 是否有临时加成
+     */
+    @TableField(exist = false)
+    private boolean hasBoost;
+
     @Override
     public Serializable pkVal() {
         return null;

+ 4 - 1
src/main/java/com/xs/core/model/coin/req/CoinSpeedUpgradesRulesReq.java

@@ -9,5 +9,8 @@ import java.io.Serializable;
 @Data
 public class CoinSpeedUpgradesRulesReq implements Serializable {
     @Schema(name = "ruleId", description = "规则id")
-    private Long ruleId;
+    private String ruleId;
+
+    @Schema(name = "upgradeType", description = "升级类型 coin - 金币 currency -货币 ")
+    private String upgradeType;
 }

+ 3 - 1
src/main/java/com/xs/core/model/coin/req/TemporaryRateReq.java

@@ -1,6 +1,7 @@
 package com.xs.core.model.coin.req;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Pattern;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
@@ -10,6 +11,7 @@ import java.io.Serializable;
 @Data
 @Schema(name = "临时速率请求参数")
 public class TemporaryRateReq implements Serializable {
-    @Schema(name = "rate", description = "临时速率")
+    @Schema(name = "rate", description = "临时速率 整数")
+    @Pattern(regexp = "^(5|10|15|6|11|16|7|12|17)$", message = "Number must be 5, 10, 15, 6, 11, 16, 7, 12, or 17")
     private String rate;
 }

+ 21 - 0
src/main/java/com/xs/core/model/coin/resp/BoostResidueTimesResp.java

@@ -0,0 +1,21 @@
+package com.xs.core.model.coin.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@Schema(name = "BoostResidueTimesResp", description = "游戏加成剩余时间")
+public class BoostResidueTimesResp implements Serializable {
+    
+    @Schema(description = "当前速率")
+    private String currentRate;
+
+    @Schema(description = "临时速率")
+    private String temporaryRate;
+
+    @Schema(description = "临时加成剩余时间 (秒)")
+    private Long boostResidueTimestamp;
+}

+ 17 - 0
src/main/java/com/xs/core/model/coin/resp/CoinSpeedUpgradesRulesResp.java

@@ -0,0 +1,17 @@
+package com.xs.core.model.coin.resp;
+
+import com.xs.core.model.coin.entity.CoinSpeedUpgradesRules;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@Schema(name = "CoinSpeedUpgradesRulesResp", description = "金币产出速率升级规则")
+public class CoinSpeedUpgradesRulesResp implements Serializable {
+    @Schema(name = "status", description = "规则状态 0 未达成 1 已满级")
+    private int status;
+    @Schema(name = "list", description = "规则列表")
+    private List<CoinSpeedUpgradesRules> list;
+}

+ 6 - 1
src/main/java/com/xs/core/mq/consumer/GoldCoinProductMessageConsumer.java

@@ -148,6 +148,11 @@ public class GoldCoinProductMessageConsumer {
             goldCoinProdState.setDurableRate(upgradesState.getDurableRate());
             goldCoinProdState.setTemporaryRate(upgradesState.getTemporaryRate());
             upgradesState.setRateUpdateFlag(2);
+            //处理临时速率的状态
+            if (upgradesState.getBoostRateFLag() == 0 && upgradesState.isHasTemporaryRate()) {
+                upgradesState.setBoostRateFLag(1);
+                goldCoinProdState.setBoostResidueTimestamp(GoldCoinConstant.BOOST_RATE_RESIDUE_TIMESTAMP);
+            }
             redisService.set(rateUpgradesKey, upgradesState);
         } else {
             // 使用当前速率计算
@@ -158,7 +163,7 @@ public class GoldCoinProductMessageConsumer {
         goldCoinProdState.setLastTimestamp(isCompleted ? endTimestamp : currentTimestamp);
         goldCoinProdState.setCurrentValue(newValue);
         goldCoinProdState.setResidueTimestamp(Math.max(0, goldCoinProdState.getResidueTimestamp() - timeDifference));
-
+        goldCoinProdState.setBoostResidueTimestamp(Math.max(0, (ObjUtil.isNotNull(goldCoinProdState.getBoostResidueTimestamp()) ? goldCoinProdState.getBoostResidueTimestamp() : 0L) - timeDifference));
         // 如果达到或超过结束时间,设置相应的标志
         if (isCompleted) {
             goldCoinProdState.setCompleted(true);

+ 40 - 7
src/main/java/com/xs/core/service/Impl/coin/GoldCoinServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xs.core.service.Impl.coin;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import com.xs.core.common.constant.GoldCoinConstant;
@@ -16,6 +17,8 @@ import com.xs.core.model.coin.entity.GoldCoinProdState;
 import com.xs.core.model.coin.entity.UserCoinSpeedUpgradesRecord;
 import com.xs.core.model.coin.req.CoinSpeedUpgradesRulesReq;
 import com.xs.core.model.coin.req.TemporaryRateReq;
+import com.xs.core.model.coin.resp.BoostResidueTimesResp;
+import com.xs.core.model.coin.resp.CoinSpeedUpgradesRulesResp;
 import com.xs.core.model.coin.resp.GoldCoinProdStateResp;
 import com.xs.core.model.user.entity.TgUser;
 import com.xs.core.mq.producer.GoldCoinMessageProducer;
@@ -29,6 +32,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.util.List;
@@ -54,6 +58,7 @@ public class GoldCoinServiceImpl implements GoldCoinService {
     @Autowired
     private GoldCoinMessageProducer messageProducer;
 
+    @Autowired
     private ICoinSpeedUpgradesRulesService speedRulesService;
 
     @Override
@@ -177,10 +182,12 @@ public class GoldCoinServiceImpl implements GoldCoinService {
     }
 
     @Override
+    @Transactional
     public void permanentBoostProductGoldCoinRate(CoinSpeedUpgradesRulesReq req) {
         UserContext context = UserContextHolder.getContext();
         //获取金币升级速率
         CoinSpeedUpgradesRules rules = speedRulesService.getById(req.getRuleId());
+        CheckUtils.throwIfNull(rules, "金币产出速率升级规则不存在");
         TgUser user = userService.getById(context.getId());
         BigDecimal goldCoinAmount = user.getGoldCoinAmount();
         Integer consumeGoldCoin = rules.getConsumeGoldCoin();
@@ -206,7 +213,7 @@ public class GoldCoinServiceImpl implements GoldCoinService {
                 GoldRateUpgradesState upgradesState = redisService.get(rateKey, GoldRateUpgradesState.class);
                 String temporaryRateStr = goldCoinProdState.getTemporaryRate();
 
-                BigDecimal temporaryRate = new BigDecimal(temporaryRateStr);
+                BigDecimal temporaryRate = StrUtil.isNotBlank(temporaryRateStr) ? new BigDecimal(temporaryRateStr) : BigDecimal.ZERO;
                 BigDecimal numericalValueDec = new BigDecimal(numericalValue);
                 BigDecimal currentRate = temporaryRate.add(numericalValueDec);
 
@@ -235,6 +242,7 @@ public class GoldCoinServiceImpl implements GoldCoinService {
     @Override
     public void temporaryBoostProductGoldCoinRate(TemporaryRateReq temporaryRateReq) {
         String rate = temporaryRateReq.getRate();
+        BigDecimal rateNum = new BigDecimal(rate).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
         UserContext context = UserContextHolder.getContext();
         CheckUtils.throwIfNull(context, "用户未登录或用户信息为空");
         //获取用户的金币产出状态
@@ -251,9 +259,10 @@ public class GoldCoinServiceImpl implements GoldCoinService {
             upgradesState.setHasTemporaryRate(true);
             String currentRateStr = upgradesState.getCurrentRate();
             BigDecimal currentRate = new BigDecimal(currentRateStr);
-            BigDecimal added = currentRate.add(new BigDecimal(rate));
+            //计算当前速率加上临时速率
+            BigDecimal added = currentRate.add(rateNum);
             upgradesState.setCurrentRate(added.toPlainString());
-            upgradesState.setTemporaryRate(rate);
+            upgradesState.setTemporaryRate(rateNum.toPlainString());
             upgradesState.setRateUpdateFlag(1);
             upgradesState.setUpdateTimestamp(epochSecond);
             //设置用户的临时速率
@@ -266,10 +275,10 @@ public class GoldCoinServiceImpl implements GoldCoinService {
             CheckUtils.throwIfNull(coinProdState, "用户未开启金币产出");
             String currentRateStr = coinProdState.getCurrentRate();
             BigDecimal currentRate = new BigDecimal(currentRateStr);
-            BigDecimal added = currentRate.add(new BigDecimal(rate));
+            BigDecimal added = currentRate.add(rateNum);
             upgradesState.setCurrentRate(added.toPlainString());
             upgradesState.setUpdateTimestamp(epochSecond);
-            upgradesState.setTemporaryRate(rate);
+            upgradesState.setTemporaryRate(rateNum.toPlainString());
             upgradesState.setRateUpdateFlag(1);
             redisService.set(rateTemporarilyKey, upgradesState);
         }
@@ -318,8 +327,32 @@ public class GoldCoinServiceImpl implements GoldCoinService {
     }
 
     @Override
-    public List<CoinSpeedUpgradesRules> getRateUpgradesRulesByUser() {
+    public CoinSpeedUpgradesRulesResp getRateUpgradesRulesByUser() {
+        UserContext context = UserContextHolder.getContext();
+        List<CoinSpeedUpgradesRules> rules = speedRulesService.getCoinSpeedUpgradesRulesByUserId(context.getId());
+
+        if (CollUtil.isNotEmpty(rules)) {
+            boolean anyMatch = rules.stream().anyMatch(rule -> rule.getUpgradeStatus().equals("MAX"));
+            CoinSpeedUpgradesRulesResp rulesResp = new CoinSpeedUpgradesRulesResp();
+            rulesResp.setList(rules);
+            if (anyMatch) {
+                rulesResp.setStatus(1);
+            } else {
+                rulesResp.setStatus(0);
+            }
+            return rulesResp;
+        }
+        return null;
+    }
+
+    @Override
+    public BoostResidueTimesResp getBoostResidueTimes() {
         UserContext context = UserContextHolder.getContext();
-        return speedRulesService.getCoinSpeedUpgradesRulesByUserId(context.getId());
+        String key = GoldCoinConstant.GOLD_COIN_STATE_KEY + context.getId();
+        GoldCoinProdState goldCoinProdState = redisService.get(key, GoldCoinProdState.class);
+        CheckUtils.throwIfNull(goldCoinProdState, "金币产出结束或未开启金币产出,加成已失效");
+        BoostResidueTimesResp boostResidueTimesResp = new BoostResidueTimesResp();
+        BeanUtils.copyProperties(goldCoinProdState, boostResidueTimesResp);
+        return boostResidueTimesResp;
     }
 }

+ 6 - 1
src/main/java/com/xs/core/service/coin/GoldCoinService.java

@@ -4,6 +4,8 @@ import com.xs.core.model.coin.entity.CoinSpeedUpgradesRules;
 import com.xs.core.model.coin.entity.GoldCoinProdState;
 import com.xs.core.model.coin.req.CoinSpeedUpgradesRulesReq;
 import com.xs.core.model.coin.req.TemporaryRateReq;
+import com.xs.core.model.coin.resp.BoostResidueTimesResp;
+import com.xs.core.model.coin.resp.CoinSpeedUpgradesRulesResp;
 import com.xs.core.model.coin.resp.GoldCoinProdStateResp;
 
 import java.util.List;
@@ -43,5 +45,8 @@ public interface GoldCoinService {
      */
     void completedGoldCoinSettlement(GoldCoinProdState coinProdState);
 
-    List<CoinSpeedUpgradesRules> getRateUpgradesRulesByUser();
+    CoinSpeedUpgradesRulesResp getRateUpgradesRulesByUser();
+
+    BoostResidueTimesResp getBoostResidueTimes();
+
 }

+ 8 - 3
src/main/resources/mapper/CoinSpeedUpgradesRulesMapper.xml

@@ -12,6 +12,7 @@
         <result column="created_time" property="createdTime"/>
         <result column="updated_by" property="updatedBy"/>
         <result column="updated_time" property="updatedTime"/>
+        <result column="upgrade_status" property="upgradeStatus"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -20,13 +21,17 @@
     </sql>
 
     <select id="getCoinSpeedUpgradesRulesByUserId" resultMap="BaseResultMap">
-        SELECT bcsur.*
+        SELECT bcsur.*,
+               CASE
+                   WHEN user_level.max_level = (SELECT MAX(level) FROM b_coin_speed_upgrades_rules) THEN 'MAX'
+                   ELSE 'UPGRADE'
+                   END AS upgrade_status
         FROM b_coin_speed_upgrades_rules bcsur
                  JOIN (SELECT COALESCE(MAX(speed_level), 0) AS max_level
                        FROM b_user_coin_speed_upgrades_record
                        WHERE user_id = #{userId}) AS user_level
         WHERE bcsur.level >= user_level.max_level
-        order by bcsur.level
-        limit 2;
+        ORDER BY bcsur.level
+        LIMIT 2;
     </select>
 </mapper>