From 111f8c32862d84a06b7d4d2cde4a5596ea31a632 Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Thu, 21 Aug 2025 18:40:18 +0800
Subject: [PATCH] 后台新币管理

---
 trading-order-admin/src/main/resources/application.yml                                          |    2 
 trading-order-service/src/main/java/com/yami/trading/service/ico/IcoService.java                |   34 ++++
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java         |   78 +++++++++++
 trading-order-service/src/main/resources/mapper/ico/IcoMapper.xml                               |    7 +
 trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/Ico.java                      |  117 ++++++++++++++++
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java |   60 ++++++++
 trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/UserSubscriptionRecord.java   |   59 ++++++++
 trading-order-bean/src/main/java/com/yami/trading/bean/item/domain/Item.java                    |   17 ++
 trading-order-service/src/main/java/com/yami/trading/dao/ico/IcoMapper.java                     |   14 ++
 9 files changed, 386 insertions(+), 2 deletions(-)

diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java
new file mode 100644
index 0000000..263527d
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java
@@ -0,0 +1,60 @@
+package com.yami.trading.admin.controller.ico;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.Lists;
+import com.yami.trading.bean.ico.domain.Ico;
+import com.yami.trading.bean.item.query.ItemQuery;
+import com.yami.trading.common.domain.Result;
+import com.yami.trading.common.query.QueryWrapperGenerator;
+import com.yami.trading.service.ico.IcoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+
+@Api(tags ="新币管理")
+@RestController
+@RequestMapping(value = "normal/adminIcoAction!")
+public class AdminIcoController {
+
+	@Autowired
+	private IcoService icoService;
+
+	/**
+	 * 产品列表数据
+	 */
+	@ApiOperation(value = "新币列表,配置列表")
+	@GetMapping("list")
+	public Result<Page<Ico>> list(ItemQuery itemQuery, Page<Ico> page) throws Exception {
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (itemQuery, ItemQuery.class);
+		Page<Ico> result = icoService.page(page, queryWrapper);
+		return Result.ok(result);
+	}
+
+	/**
+	 * 保存产品
+	 */
+	@ApiOperation(value = "保存新币")
+	@PostMapping("save")
+	public  Result <String> save(@Valid @RequestBody Ico ico) {
+		//新增或编辑表单保存
+		icoService.saveOrUpdate(ico);
+        return Result.ok ( "保存产品成功" );
+	}
+
+	/**
+	 * 删除产品
+	 */
+	@ApiOperation(value = "删除新币")
+	@DeleteMapping("delete")
+	public Result <String> delete(String ids) {
+		String idArray[] = ids.split(",");
+		icoService.removeByIds ( Lists.newArrayList ( idArray ) );
+		return Result.ok("删除产品成功");
+	}
+
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java
new file mode 100644
index 0000000..12e87a4
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java
@@ -0,0 +1,78 @@
+package com.yami.trading.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.trading.api.dto.OpenAction;
+import com.yami.trading.bean.ico.domain.Ico;
+import com.yami.trading.bean.ico.domain.UserSubscriptionRecord;
+import com.yami.trading.bean.item.query.ItemQuery;
+import com.yami.trading.common.domain.Result;
+import com.yami.trading.common.exception.YamiShopBindException;
+import com.yami.trading.common.query.QueryWrapperGenerator;
+import com.yami.trading.security.common.util.SecurityUtils;
+import com.yami.trading.service.ico.IcoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+@RequestMapping("api/ico")
+@Api(tags = "新币申购")
+@Slf4j
+public class ApiIcoController {
+
+    @Autowired
+    IcoService icoService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @ApiOperation(value = "新币列表,配置列表")
+    @GetMapping("list")
+    public Result<Page<Ico>> list(ItemQuery itemQuery, Page<Ico> page) throws Exception {
+        QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (itemQuery, ItemQuery.class);
+        Page<Ico> result = icoService.page(page, queryWrapper);
+        return Result.ok(result);
+    }
+
+    @ApiOperation(value = "新币申购")
+    @PostMapping("subscribe")
+    @ResponseBody
+    public Result<String> subscribe(@Valid UserSubscriptionRecord model) throws IOException, InterruptedException {
+        String partyId = SecurityUtils.getUser().getUserId();
+        RLock rLock = redissonClient.getLock("subscribe" + partyId);
+        boolean lockAcquired = false;
+        try {
+            // 尝试获取锁,最多等待5秒
+            lockAcquired = rLock.tryLock(5, TimeUnit.SECONDS);
+            if (!lockAcquired) {
+                log.warn("无法获取锁: subscribe{}", partyId);
+                throw new YamiShopBindException("请稍后再试");
+            }
+            subscribe(model);
+        } catch (YamiShopBindException e) {
+            log.error("错误信息: {}", e.getMessage(), e);
+            throw e; // 重新抛出自定义异常
+        } catch (Exception e) {
+            log.error("系统异常: {}", e.getMessage(), e);
+            throw new YamiShopBindException("操作失败,请稍后再试");
+        } finally {
+            // 确保释放锁
+            if (lockAcquired && rLock.isHeldByCurrentThread()) {
+                rLock.unlock();
+            }
+        }
+        return Result.succeed(null, "ok");
+    }
+
+}
diff --git a/trading-order-admin/src/main/resources/application.yml b/trading-order-admin/src/main/resources/application.yml
index 2edbc6b..5649604 100644
--- a/trading-order-admin/src/main/resources/application.yml
+++ b/trading-order-admin/src/main/resources/application.yml
@@ -1,7 +1,7 @@
 spring:
   # 环境 local|dev|test|prod
   profiles:
-    active: prod
+    active: local
   #文件上传设置
   servlet:
     multipart:
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/Ico.java b/trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/Ico.java
new file mode 100644
index 0000000..456d261
--- /dev/null
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/Ico.java
@@ -0,0 +1,117 @@
+package com.yami.trading.bean.ico.domain;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yami.trading.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 产品Entity
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_ico_project")
+public class Ico {
+
+    @TableId(type = IdType.AUTO,value = "id")
+    private Integer id;
+
+    @ApiModelProperty("币种名称")
+    private String name;
+
+    @NotBlank
+    @ApiModelProperty("代币符号 ( BTC, ETH)")
+    private String symbol;
+
+    @ApiModelProperty("数据源编码")
+    private String symbolData;
+
+    @ApiModelProperty("最小浮动(对应引用币种的小数点)")
+    private BigDecimal pips;
+
+    @ApiModelProperty("最小浮动金额(以交易金额计算)")
+    private BigDecimal pipsAmount;
+
+    @ApiModelProperty("调整值 默认0")
+    private BigDecimal adjustmentValue;
+    /**
+     * 每张金额  合约下单一张等于=开仓价格*面值/杠杆
+     */
+    @ApiModelProperty("每张金额")
+    private BigDecimal unitAmount;
+
+    @ApiModelProperty("每张手续费")
+    private BigDecimal unitFee;
+
+    @ApiModelProperty("小数位精度(小数位)")
+    private Integer decimals;
+
+    @ApiModelProperty("交易量倍数")
+    private BigDecimal multiple;
+
+    @ApiModelProperty("借贷利率")
+    private BigDecimal borrowingRate;
+
+    @ApiModelProperty("发行价")
+    private String issuePrice;
+
+    @ApiModelProperty("接受的支付货币")
+    private  String currency;
+
+    @ApiModelProperty("最低投资额")
+    private BigDecimal minContribution;
+
+    @ApiModelProperty("最高投资额")
+    private BigDecimal maxContribution;
+
+    @ApiModelProperty("项目描述")
+    private String description;
+
+    @ApiModelProperty("官方网站")
+    private String websiteUrl;
+
+    @ApiModelProperty("白皮书链接")
+    private String whitepaperUrl;
+
+    @ApiModelProperty("申购开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date startDate;
+
+    @ApiModelProperty("申购结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date endDate;
+
+    @ApiModelProperty("上市开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date marketDate;
+
+    @ApiModelProperty("货币图片地址")
+    private String imgUrl;
+
+    @ApiModelProperty("是否开放合约交易 0:否 1 :是")
+    private Integer isContractTrading;
+
+    @ApiModelProperty("创建时间")
+    private String createdAt;
+
+    @ApiModelProperty("修改时间")
+    private String updatedAt;
+
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer delFlag;
+    /**
+     * 面值:固定0.01  合约下单一张等于=开仓价格*面值/杠杆
+     */
+    private double faceValue = 0.01;
+
+}
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/UserSubscriptionRecord.java b/trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/UserSubscriptionRecord.java
new file mode 100644
index 0000000..084e928
--- /dev/null
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/UserSubscriptionRecord.java
@@ -0,0 +1,59 @@
+package com.yami.trading.bean.ico.domain;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+
+/**
+ * 新币申购记录Entity
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("user_subscription_record")
+public class UserSubscriptionRecord {
+
+    @TableId(type = IdType.AUTO,value = "id")
+    private Integer id;
+
+    @ApiModelProperty("新币id")
+    private Integer icoProjectId;
+
+    @ApiModelProperty("用户id")
+    private Integer userId;
+
+    @ApiModelProperty("申购数量")
+    private Integer subscribeNums;
+
+
+    @ApiModelProperty("中签数量")
+    private Integer ballotNumber;
+
+
+    @ApiModelProperty("状态:1、已认购,2、未中签,3、已中签,4、已缴纳 5.已分发")
+    private Integer status;
+
+    @ApiModelProperty("1.申购(自主申购) 2.配售(后台配售)")
+    private Integer subscriptionType;
+
+
+    @ApiModelProperty("中签时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date endTime;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+    @ApiModelProperty("创建时间")
+    private String createdAt;
+
+    @ApiModelProperty("修改时间")
+    private String updatedAt;
+
+}
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/item/domain/Item.java b/trading-order-bean/src/main/java/com/yami/trading/bean/item/domain/Item.java
index b916445..e5e06ec 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/item/domain/Item.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/item/domain/Item.java
@@ -83,7 +83,6 @@
      */
     public final static String CATEGORY_ENERGY = "energy";
 
-
     private static final long serialVersionUID = 1L;
 
 
@@ -155,6 +154,22 @@
     private String openCloseType;
     private String fake;
 
+    /**
+     * 币类型 0.主流币 1.新币
+     */
+    private Integer currencyType = 0;
+
+    /**
+     * 状态(新币) 0.停牌 1.复牌
+     */
+    private Integer status;
+
+    /**
+     * 杠杆交易,合约交易状态
+     */
+    private String tradeType;
+
+
     public BigDecimal getAdjustmentValue() {
         if (adjustmentValue == null) {
             return BigDecimal.ZERO;
diff --git a/trading-order-service/src/main/java/com/yami/trading/dao/ico/IcoMapper.java b/trading-order-service/src/main/java/com/yami/trading/dao/ico/IcoMapper.java
new file mode 100644
index 0000000..273d918
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/dao/ico/IcoMapper.java
@@ -0,0 +1,14 @@
+package com.yami.trading.dao.ico;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.trading.bean.ico.domain.Ico;
+
+/**
+ * 新币MAPPER接口
+
+ */
+public interface IcoMapper extends BaseMapper<Ico> {
+
+
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/ico/IcoService.java b/trading-order-service/src/main/java/com/yami/trading/service/ico/IcoService.java
new file mode 100644
index 0000000..f589961
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/ico/IcoService.java
@@ -0,0 +1,34 @@
+package com.yami.trading.service.ico;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yami.trading.bean.ico.domain.Ico;
+import com.yami.trading.bean.ico.domain.UserSubscriptionRecord;
+import com.yami.trading.common.domain.Result;
+import com.yami.trading.dao.ico.IcoMapper;
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 新币Service
+
+ */
+@Service
+@Transactional
+@Slf4j
+public class IcoService extends ServiceImpl<IcoMapper, Ico> {
+
+    /**
+     * 申购
+     * @param model
+     * @return
+     */
+    public Result<String> subscribe(UserSubscriptionRecord model) {
+
+        return Result.ok("保存产品成功" );
+    }
+
+
+}
diff --git a/trading-order-service/src/main/resources/mapper/ico/IcoMapper.xml b/trading-order-service/src/main/resources/mapper/ico/IcoMapper.xml
new file mode 100644
index 0000000..eee3212
--- /dev/null
+++ b/trading-order-service/src/main/resources/mapper/ico/IcoMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yami.trading.dao.ico.IcoMapper">
+
+
+
+</mapper>

--
Gitblit v1.9.3