Explorar o código

feat(staking): 新增 releasedTotal 字段供释放总量展示

汇总订单已释放数量为原币(如 iBit),wallet-new 与 staking/wallet 返回 releasedTotal,不做 USDT 折算。

Co-authored-by: Cursor <cursoragent@cursor.com>
jean hai 1 mes
pai
achega
44b67e4ac9

+ 9 - 2
doge/contract-swap-api/src/main/java/com/bizzan/bitrade/controller/WalletNewController.java

@@ -55,6 +55,7 @@ import com.bizzan.bitrade.service.MemberTransactionService;
 import com.bizzan.bitrade.service.MemberWalletService;
 import com.bizzan.bitrade.service.RedisLock;
 import com.bizzan.bitrade.service.SpotWalletSnapshotService;
+import com.bizzan.bitrade.service.StakingService;
 import com.bizzan.bitrade.service.SysConfigService;
 import com.bizzan.bitrade.service.UserPurseService;
 import com.bizzan.bitrade.util.DateUtil;
@@ -119,7 +120,9 @@ public class WalletNewController {
 	private RedisTemplate<String, String> redisTemplate;
 	@Autowired
 	private FundAssetService fundAssetService;
-	
+	@Autowired
+	private StakingService stakingService;
+
 	@ApiOperation(value="根据memberId获取合约账户权益", notes="供trade项目等内部调用,返回TradingAccount实体,接收方解析balance+frozenBalance+frozenMargin计算权益")
 	@GetMapping("contract-asset-new")
 	public MessageResult<Map<String, String>> getContractAssetByMemberId(@RequestParam("memberId") Long memberId) {
@@ -272,11 +275,14 @@ public class WalletNewController {
 		List<StakingWallet> stakingWallets = memberWalletService.getStakingWallets(authMember.getId());
 		BigDecimal stakingLocked     = BigDecimal.ZERO;  // 锁定原始数量(多币种累加,仅供展示参考)
 		BigDecimal stakingLockedUsdt = BigDecimal.ZERO;  // 锁定折合 USDT
+		BigDecimal stakingReleased = BigDecimal.ZERO;  // 已释放总量(原币数量,如 iBit,不做 USDT 折算)
 		for (StakingWallet sw : stakingWallets) {
 			BigDecimal locked = sw.getLockedBalance() != null ? sw.getLockedBalance() : BigDecimal.ZERO;
 			stakingLocked = stakingLocked.add(locked);
-			// 按币种折算 USDT:优先用现货行情,无行情时从 Redis ExchangeNew2:latestPrice 取价
 			String swUnit = sw.getCoinUnit();
+			BigDecimal released = stakingService.getUserReleasedAmount(authMember.getId(), swUnit);
+			stakingReleased = stakingReleased.add(released);
+			// 按币种折算 USDT:优先用现货行情,无行情时从 Redis ExchangeNew2:latestPrice 取价(仅用于锁定余额估值)
 			if ("USDT".equalsIgnoreCase(swUnit)) {
 				stakingLockedUsdt = stakingLockedUsdt.add(locked);
 			} else {
@@ -297,6 +303,7 @@ public class WalletNewController {
 		stakingAccountInfo.setBalanceUsdt(BigDecimal.ZERO);
 		stakingAccountInfo.setFrozenBalance(stakingLocked);        // 锁定原始数量
 		stakingAccountInfo.setFrozenBalanceUsdt(stakingLockedUsdt);// 锁定折合 USDT
+		stakingAccountInfo.setReleasedTotal(stakingReleased);      // 已释放总量(iBit 等原币)
 		stakingAccountInfo.setFrozenMargin(BigDecimal.ZERO);
 		stakingAccountInfo.setCurrentCapital(stakingLockedUsdt);   // 权益使用 USDT 估值
 		cashBalance = cashBalance.add(stakingLockedUsdt);          // 总资产用 USDT 估值

+ 4 - 0
doge/contract-swap-core/src/main/java/com/bizzan/bitrade/vo/AccountInfo.java

@@ -37,4 +37,8 @@ public class AccountInfo {
 	/** 账户权益(USDT 估值,= balanceUsdt + frozenBalanceUsdt) */
 	@ApiModelProperty("账户权益(USDT 估值)")
 	private BigDecimal currentCapital;
+
+	/** 已释放总量(与质押币种同单位,如 iBit;质押账户专用) */
+	@ApiModelProperty("已释放总量(与质押币种同单位,如 iBit)")
+	private BigDecimal releasedTotal;
 }

+ 8 - 0
doge/core/src/main/java/com/bizzan/bitrade/dao/StakingOrderDao.java

@@ -69,6 +69,14 @@ public interface StakingOrderDao extends BaseDao<StakingOrder> {
     BigDecimal sumActiveAmountByMemberIdAndCoinUnit(@Param("memberId") Long memberId,
                                                     @Param("coinUnit") String coinUnit);
 
+    /**
+     * 统计用户在某币种上历史累计已释放总量
+     */
+    @Query("select coalesce(sum(o.releasedAmount), 0) from StakingOrder o " +
+           "where o.memberId = :memberId and upper(o.coinUnit) = upper(:coinUnit)")
+    BigDecimal sumReleasedAmountByMemberIdAndCoinUnit(@Param("memberId") Long memberId,
+                                                      @Param("coinUnit") String coinUnit);
+
     /**
      * 统计平台某币种当前总活跃质押量(供按比例空投计算分母)
      *

+ 11 - 0
doge/core/src/main/java/com/bizzan/bitrade/service/StakingService.java

@@ -378,6 +378,17 @@ public class StakingService extends BaseService {
         return stakingOrderDao.sumActiveAmountByMemberIdAndCoinUnit(memberId, coinUnit);
     }
 
+    /**
+     * 查询用户在某币种上累计已释放总量(供资产页「释放总量」展示)
+     */
+    @Transactional(readOnly = true)
+    public BigDecimal getUserReleasedAmount(Long memberId, String coinUnit) {
+        if (memberId == null || coinUnit == null || coinUnit.trim().isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+        return stakingOrderDao.sumReleasedAmountByMemberIdAndCoinUnit(memberId, coinUnit.trim());
+    }
+
     /**
      * 查询平台某币种当前总活跃质押量(供按比例空投计算)
      *

+ 4 - 2
doge/ucenter-api/src/main/java/com/bizzan/bitrade/controller/StakingController.java

@@ -100,7 +100,7 @@ public class StakingController {
         java.math.BigDecimal price = getSpotPriceUsdt(coinUnit.trim());
 
         // 3. 构建响应 VO
-        StakingWalletVo vo = buildStakingWalletVo(wallet, coinUnit.trim(), price);
+        StakingWalletVo vo = buildStakingWalletVo(member.getId(), wallet, coinUnit.trim(), price);
         return MessageResult.success("success", vo);
     }
 
@@ -135,8 +135,9 @@ public class StakingController {
      * @param price    当前 coinUnit/USDT 价格,无价格传 ZERO
      * @return StakingWalletVo
      */
-    private StakingWalletVo buildStakingWalletVo(StakingWallet wallet, String coinUnit, java.math.BigDecimal price) {
+    private StakingWalletVo buildStakingWalletVo(Long memberId, StakingWallet wallet, String coinUnit, java.math.BigDecimal price) {
         java.math.BigDecimal locked = wallet.getLockedBalance() != null ? wallet.getLockedBalance() : java.math.BigDecimal.ZERO;
+        java.math.BigDecimal released = stakingService.getUserReleasedAmount(memberId, coinUnit);
 
         // 有行情则折算 USDT,否则为 0
         java.math.BigDecimal lockedUsdt = price.compareTo(java.math.BigDecimal.ZERO) > 0 ? locked.multiply(price) : java.math.BigDecimal.ZERO;
@@ -145,6 +146,7 @@ public class StakingController {
         vo.setCoinUnit(coinUnit.toUpperCase());
         vo.setLockedBalance(locked);
         vo.setLockedBalanceUsdt(lockedUsdt);
+        vo.setReleasedTotal(released);
         return vo;
     }
 

+ 4 - 0
doge/ucenter-api/src/main/java/com/bizzan/bitrade/vo/StakingWalletVo.java

@@ -27,4 +27,8 @@ public class StakingWalletVo {
     /** 锁定余额折合 USDT */
     @ApiModelProperty("锁定余额折合 USDT")
     private BigDecimal lockedBalanceUsdt;
+
+    /** 历史累计已释放总量(与 coinUnit 同单位,如 iBit;各订单 releasedAmount 之和) */
+    @ApiModelProperty("已释放总量(与质押币种同单位,如 iBit)")
+    private BigDecimal releasedTotal;
 }