jean пре 1 месец
родитељ
комит
82eb98fa94

+ 52 - 0
.gitignore

@@ -0,0 +1,52 @@
+# ── Java / Maven(所有子模块通用)────────────────────────────
+target/
+**/target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+
+# 编译产物
+*.class
+**/classes/
+**/generated-sources/
+**/generated-test-sources/
+
+# ── IntelliJ IDEA ───────────────────────────────────────────
+.idea/
+**/.idea/
+*.iml
+*.ipr
+*.iws
+out/
+**/out/
+
+# ── Eclipse / STS ───────────────────────────────────────────
+.classpath
+.project
+.settings/
+**/bin/
+**/gen/
+
+# ── 日志 ────────────────────────────────────────────────────
+logs/
+**/logs/
+log/
+**/log/
+*.log
+*.log.*
+*.gz
+
+# ── 系统与其它 ──────────────────────────────────────────────
+.DS_Store
+Thumbs.db
+*.swp
+*.swo
+*~
+
+# 本地环境(勿提交密钥)
+.env
+.env.*
+!.env.example

+ 1 - 1
doge/admin/src/main/java/com/bizzan/bitrade/service/WithdrawChainConfigService.java

@@ -539,7 +539,7 @@ public class WithdrawChainConfigService {
      * @throws IllegalArgumentException 记录不存在时抛出
      */
     public WithdrawChainConfig updateConfig(WithdrawChainConfig config) {
-        WithdrawChainConfig exist = withdrawChainConfigDao.findOne(config.getId().longValue());
+        WithdrawChainConfig exist = withdrawChainConfigDao.findOne(config.getId());
         if (exist == null) {
             throw new IllegalArgumentException("配置不存在,id=" + config.getId());
         }

+ 34 - 0
doge/core/src/main/java/com/bizzan/bitrade/dao/CoinNetworkConfigDao.java

@@ -1,8 +1,13 @@
 package com.bizzan.bitrade.dao;
 
+import com.bizzan.bitrade.constant.BooleanEnum;
+import com.bizzan.bitrade.constant.CommonStatus;
+import com.bizzan.bitrade.entity.CoinNetwork;
 import com.bizzan.bitrade.entity.CoinNetworkConfig;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -57,4 +62,33 @@ public interface CoinNetworkConfigDao extends JpaRepository<CoinNetworkConfig, L
      * @return 是否存在
      */
     boolean existsByCoinNameAndNetworkId(String coinName, Long networkId);
+
+    /**
+     * 某顶级币种下、在 coin_network_config 中已配置且可充值的主网(去重)
+     */
+    @Query("select distinct n from CoinNetwork n, CoinNetworkConfig cfg, Coin c "
+            + "where cfg.network.id = n.id and cfg.coinName = c.name "
+            + "and c.parentCoinName = :parentCoinName "
+            + "and c.canRecharge = :canRecharge and c.status = :coinStatus "
+            + "and n.status = :networkStatus "
+            + "order by n.sort asc, n.id asc")
+    List<CoinNetwork> findRechargeNetworksForParent(
+            @Param("parentCoinName") String parentCoinName,
+            @Param("canRecharge") BooleanEnum canRecharge,
+            @Param("coinStatus") CommonStatus coinStatus,
+            @Param("networkStatus") CommonStatus networkStatus);
+
+    /**
+     * 某顶级币种下、指定主网 id 在 coin_network_config 中的可充值子币种配置
+     */
+    @Query("select cfg from CoinNetworkConfig cfg join fetch cfg.network n "
+            + "where cfg.network.id = :networkId and cfg.coinName in ("
+            + "select c.name from Coin c where c.parentCoinName = :parentCoinName "
+            + "and c.canRecharge = :canRecharge and c.status = :coinStatus"
+            + ") order by cfg.sort asc, cfg.coinName asc")
+    List<CoinNetworkConfig> findRechargeConfigsByParentAndNetwork(
+            @Param("parentCoinName") String parentCoinName,
+            @Param("networkId") Long networkId,
+            @Param("canRecharge") BooleanEnum canRecharge,
+            @Param("coinStatus") CommonStatus coinStatus);
 }

+ 1 - 1
doge/core/src/main/java/com/bizzan/bitrade/entity/WithdrawChainConfig.java

@@ -13,7 +13,7 @@ public class WithdrawChainConfig {
 
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Integer id;
+    private Long id;
 
     @Column(name = "coin_unit", nullable = false, length = 20)
     private String coinUnit;

+ 50 - 0
doge/core/src/main/java/com/bizzan/bitrade/service/CoinNetworkConfigService.java

@@ -1,5 +1,7 @@
 package com.bizzan.bitrade.service;
 
+import com.bizzan.bitrade.constant.BooleanEnum;
+import com.bizzan.bitrade.constant.CommonStatus;
 import com.bizzan.bitrade.dao.CoinDao;
 import com.bizzan.bitrade.dao.CoinNetworkConfigDao;
 import com.bizzan.bitrade.dao.CoinNetworkDao;
@@ -8,6 +10,7 @@ import com.bizzan.bitrade.entity.CoinNetwork;
 import com.bizzan.bitrade.entity.CoinNetworkConfig;
 import com.bizzan.bitrade.service.Base.BaseService;
 import com.bizzan.bitrade.vo.CoinChildWithNetworkVO;
+import com.bizzan.bitrade.vo.CoinRechargeConfigVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -67,6 +70,53 @@ public class CoinNetworkConfigService extends BaseService {
         return coinNetworkConfigDao.findAllByNetworkId(networkId);
     }
 
+    /**
+     * 充值:某顶级币种下已在 coin_network_config 配置的可选主网
+     */
+    @Transactional(readOnly = true)
+    public List<CoinNetwork> findRechargeNetworksByParent(String parentCoinName) {
+        return coinNetworkConfigDao.findRechargeNetworksForParent(
+                parentCoinName,
+                BooleanEnum.IS_TRUE,
+                CommonStatus.NORMAL,
+                CommonStatus.NORMAL);
+    }
+
+    /**
+     * 充值:按 coin_network.id 从 coin_network_config 查询该主网下可充值的子币种
+     */
+    @Transactional(readOnly = true)
+    public List<CoinRechargeConfigVO> findRechargeConfigsByParentAndNetwork(String parentCoinName, Long networkId) {
+        List<CoinNetworkConfig> configs = coinNetworkConfigDao.findRechargeConfigsByParentAndNetwork(
+                parentCoinName,
+                networkId,
+                BooleanEnum.IS_TRUE,
+                CommonStatus.NORMAL);
+        List<CoinRechargeConfigVO> result = new ArrayList<>();
+        for (CoinNetworkConfig cfg : configs) {
+            CoinNetwork network = cfg.getNetwork();
+            if (network == null || network.getStatus() != CommonStatus.NORMAL) {
+                continue;
+            }
+            Coin coin = coinDao.findOne(cfg.getCoinName());
+            if (coin == null) {
+                continue;
+            }
+            CoinRechargeConfigVO vo = new CoinRechargeConfigVO();
+            vo.setNetworkConfigId(cfg.getId());
+            vo.setCoinName(coin.getName());
+            vo.setCoinNameCn(coin.getNameCn());
+            vo.setNetworkId(network.getId());
+            vo.setNetworkName(network.getName());
+            vo.setProtocol(network.getProtocol());
+            vo.setContractAddress(cfg.getContractAddress());
+            vo.setRechargeAddress(cfg.getRechargeAddress());
+            vo.setSort(cfg.getSort());
+            result.add(vo);
+        }
+        return result;
+    }
+
     /**
      * 查询某币种在某主网下的配置
      *

+ 40 - 0
doge/core/src/main/java/com/bizzan/bitrade/vo/CoinRechargeConfigVO.java

@@ -0,0 +1,40 @@
+package com.bizzan.bitrade.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 充值可选子币种(来自 coin_network_config,按主网筛选)
+ */
+@Data
+@ApiModel("充值子币种主网配置")
+public class CoinRechargeConfigVO {
+
+    @ApiModelProperty("coin_network_config.id")
+    private Long networkConfigId;
+
+    @ApiModelProperty("子币种名称 coin.name")
+    private String coinName;
+
+    @ApiModelProperty("子币种中文名")
+    private String coinNameCn;
+
+    @ApiModelProperty("coin_network.id")
+    private Long networkId;
+
+    @ApiModelProperty("主网名称")
+    private String networkName;
+
+    @ApiModelProperty("协议")
+    private String protocol;
+
+    @ApiModelProperty("合约地址")
+    private String contractAddress;
+
+    @ApiModelProperty("平台收款地址")
+    private String rechargeAddress;
+
+    @ApiModelProperty("排序")
+    private int sort;
+}

+ 47 - 0
doge/ucenter-api/src/main/java/com/bizzan/bitrade/controller/CoinNetworkController.java

@@ -8,6 +8,7 @@ import com.bizzan.bitrade.service.CoinNetworkService;
 import com.bizzan.bitrade.service.CoinService;
 import com.bizzan.bitrade.util.MessageResult;
 import com.bizzan.bitrade.vo.CoinChildWithNetworkVO;
+import com.bizzan.bitrade.vo.CoinRechargeConfigVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -146,6 +147,52 @@ public class CoinNetworkController extends BaseController {
     @ApiImplicitParams({
         @ApiImplicitParam(name = "coinName", value = "顶级币种名称,如 USDT", required = true, dataType = "string", paramType = "query")
     })
+    /**
+     * 充值:查询顶级币种下已在 coin_network_config 配置的可选主网
+     */
+    @ApiOperation(value = "充值可选主网", notes = "按 coin_network_config + coin 表查询,返回该顶级币种下已配置且可充值的主网")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "coinName", value = "顶级币种名称,如 USDT", required = true, dataType = "string", paramType = "query")
+    })
+    @GetMapping("recharge-networks")
+    public MessageResult listRechargeNetworks(@RequestParam("coinName") String coinName) {
+        if (StringUtils.isBlank(coinName)) {
+            return error("币种名称不能为空");
+        }
+        Coin parent = coinService.findOne(coinName);
+        if (parent == null) {
+            return error("币种不存在:" + coinName);
+        }
+        return success(coinNetworkConfigService.findRechargeNetworksByParent(coinName));
+    }
+
+    /**
+     * 充值:按主网 ID 从 coin_network_config 查询子币种列表
+     */
+    @ApiOperation(value = "充值可选子币种", notes = "按 networkId 查询 coin_network_config,仅返回 parentCoinName=coinName 的可充值子币")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "coinName", value = "顶级币种名称,如 USDT", required = true, dataType = "string", paramType = "query"),
+        @ApiImplicitParam(name = "networkId", value = "主网ID coin_network.id", required = true, dataType = "long", paramType = "query")
+    })
+    @GetMapping("recharge-configs")
+    public MessageResult listRechargeConfigs(@RequestParam("coinName") String coinName,
+                                             @RequestParam("networkId") Long networkId) {
+        if (StringUtils.isBlank(coinName) || networkId == null) {
+            return error("参数不能为空");
+        }
+        Coin parent = coinService.findOne(coinName);
+        if (parent == null) {
+            return error("币种不存在:" + coinName);
+        }
+        CoinNetwork network = coinNetworkService.findById(networkId);
+        if (network == null) {
+            return error("主网不存在");
+        }
+        List<CoinRechargeConfigVO> configs =
+                coinNetworkConfigService.findRechargeConfigsByParentAndNetwork(coinName, networkId);
+        return success(configs);
+    }
+
     @GetMapping("children-with-network")
     public MessageResult listChildrenWithNetwork(@RequestParam("coinName") String coinName) {
         if (StringUtils.isBlank(coinName)) {

+ 1 - 1
doge/ucenter-api/src/main/java/com/bizzan/bitrade/controller/CoinRechargeController.java

@@ -51,7 +51,7 @@ public class CoinRechargeController extends BaseController {
      *
      * @param member          当前登录用户
      * @param coinName        子币种名称,如 EUSDT / TUSDT
-     * @param networkConfigId 主网配置ID,来自 /coin-network/children-with-network 接口
+     * @param networkConfigId 主网配置ID,来自 /coin-network/recharge-configs 接口
      * @param amount          充值金额
      * @return 订单信息(含订单号、收款地址)
      */