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>