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