新版仿ok交易所-后端
zyy
2025-08-21 111f8c32862d84a06b7d4d2cde4a5596ea31a632
后台新币管理
2 files modified
7 files added
388 ■■■■■ changed files
trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java 60 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java 78 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/resources/application.yml 2 ●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/Ico.java 117 ●●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/UserSubscriptionRecord.java 59 ●●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/item/domain/Item.java 17 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/dao/ico/IcoMapper.java 14 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/ico/IcoService.java 34 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/resources/mapper/ico/IcoMapper.xml 7 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java
New file
@@ -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("删除产品成功");
    }
}
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java
New file
@@ -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");
    }
}
trading-order-admin/src/main/resources/application.yml
@@ -1,7 +1,7 @@
spring:
  # 环境 local|dev|test|prod
  profiles:
    active: prod
    active: local
  #文件上传设置
  servlet:
    multipart:
trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/Ico.java
New file
@@ -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;
}
trading-order-bean/src/main/java/com/yami/trading/bean/ico/domain/UserSubscriptionRecord.java
New file
@@ -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;
}
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;
trading-order-service/src/main/java/com/yami/trading/dao/ico/IcoMapper.java
New file
@@ -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> {
}
trading-order-service/src/main/java/com/yami/trading/service/ico/IcoService.java
New file
@@ -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("保存产品成功" );
    }
}
trading-order-service/src/main/resources/mapper/ico/IcoMapper.xml
New file
@@ -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>