zyy
2025-07-14 d9d43aec7372dc579ced50eda32d7881265533b9
AI产品交易
5 files modified
51 ■■■■ changed files
src/main/java/com/nq/common/interceptor/ApiAdminAuthorityInterceptor.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/pojo/StockAIOrderPosition.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/IUserAssetsServices.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/StockAiServiceImpl.java 33 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserAssetsServices.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/common/interceptor/ApiAdminAuthorityInterceptor.java
@@ -30,7 +30,7 @@
            return true;
        }
        /*SiteAdmin siteAdmin = null;
        SiteAdmin siteAdmin = null;
        String loginToken = httpServletRequest.getHeader(PropertiesUtil.getProperty("admin.cookie.name"));
        if (StringUtils.isNotEmpty(loginToken)) {
            String adminJsonStr = RedisShardedPoolUtils.get(loginToken);
@@ -60,7 +60,7 @@
            writer.flush();
            writer.close();
            return false;
        }*/
        }
//        194.26.73.150, 172.70.34.195
//        String ip = IpUtils.getIp(httpServletRequest);
src/main/java/com/nq/pojo/StockAIOrderPosition.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
@@ -51,6 +52,7 @@
    /**
     * 平仓时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date coverDate;
    /**
src/main/java/com/nq/service/IUserAssetsServices.java
@@ -54,7 +54,7 @@
     * @param amount
     * @return
     */
    Boolean aiAvailableBalanceChange(UserAssets userAssets, EUserAssets eUserAssets, BigDecimal amount);
    Boolean aiAvailableBalanceChange(UserAssets userAssets, EUserAssets eUserAssets, BigDecimal amount, BigDecimal buyAmount);
    /**
     * 根据汇率转换金额
src/main/java/com/nq/service/impl/StockAiServiceImpl.java
@@ -134,7 +134,7 @@
                stockAIOrder.setRealEarning(BigDecimal.valueOf(0));
                stockAIOrder.setStatus(EStockAIOrderStatus.wait.getStatus());   //等待审核
                stockAiOrderMapper.insert(stockAIOrder);
                iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI, buyNum);
                iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI, buyNum, null);
                return ServerResponse.createBySuccessMsg("下单成功");
            }
        } catch (Exception e) {
@@ -289,12 +289,14 @@
                if (stockAIOrder.getRemainAmount().compareTo(remainAmount) < 0) {
                    return ServerResponse.createByErrorMsg("剩余买入金额不足");
                }
                stockAIOrder.setRemainAmount(stockAIOrder.getBuyAmount().subtract(remainAmount));
                stockAIOrder.setRemainAmount(stockAIOrder.getRemainAmount().subtract(remainAmount));
                //计算收益  (平仓-建仓)*数量
                BigDecimal earnings = model.getCoverPrice().subtract(model.getStockPrice()).multiply(BigDecimal.valueOf(model.getStockNum()));
                model.setCreatDate(new Date());
                model.setEarnings(earnings);
                stockAIOrder.setRealEarning(stockAIOrder.getRealEarning().add(earnings));
                //保存
                stockAiOrderMapper.updateById(stockAIOrder);
                stockAiOrderPositionMapper.insert(model);
@@ -325,8 +327,6 @@
                        return ServerResponse.createByErrorMsg("只能拒绝待审核订单");
                    }
                    //拒绝TODO 归还买入金额
                    //获取用户账户
                    UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), stockAIOrder.getUserId());
                    StockAI stockAI = stockAiMapper.selectById(stockAIOrder.getStockAiId());
                    //买入金额
                    BigDecimal buyNum =  stockAIOrder.getBuyAmount();
@@ -341,13 +341,15 @@
                        //转换为墨西哥币
                        buyNum = iUserAssetsServices.exchangeAmountByRate(buyNum, exchangeRate.getRata());
                    }
                    iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI_REJECT, buyNum);
                    //获取用户账户
                    UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), stockAIOrder.getUserId());
                    iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI_REJECT, buyNum, null);
                } else if (status.equals(EStockAIOrderStatus.finished.getStatus())) {
                    if (!stockAIOrder.getStatus().equals(EStockAIOrderStatus.passed.getStatus())) {
                        return ServerResponse.createByErrorMsg("只能结算申请通过订单");
                    }
                    //结算 TODO结算建仓 计算收益
                    //所有建仓
                    /*//所有建仓
                    List<StockAIOrderPosition> stockAIOrderPositionList = stockAiOrderPositionMapper
                            .selectList(new QueryWrapper<StockAIOrderPosition>()
                                    .eq("stock_ai_order_id", id));
@@ -360,10 +362,27 @@
                                .filter(Objects::nonNull)    // 过滤 null 值
                                .reduce(BigDecimal.ZERO, BigDecimal::add); // 累加
                        amount = amount.add(earningsSUM);
                    }*/
                    StockAI stockAI = stockAiMapper.selectById(stockAIOrder.getStockAiId());
                    //收益
                    BigDecimal amount = stockAIOrder.getBuyAmount().add(stockAIOrder.getRealEarning());
                    //需要解冻金额
                    BigDecimal buyAmount = stockAIOrder.getBuyAmount();
                    //如果不是墨西哥币需要转换金额
                    if (!stockAI.getStockType().equals(EStockType.MX.getCode())) {
                        EStockType stockType = EStockType.getEStockTypeByCode(stockAI.getStockType());
                        ExchangeRate exchangeRate = exchangeRateRepository.findExchangeRateByCurrencyAndConversionCurrency(stockType.getSymbol(), EStockType.MX.getSymbol())
                                .orElse(null);
                        if (exchangeRate == null) {
                            return ServerResponse.createByErrorMsg("请先设置当前货币汇率");
                        }
                        //转换为墨西哥币
                        amount = iUserAssetsServices.exchangeAmountByRate(amount, exchangeRate.getRata());
                        buyAmount = iUserAssetsServices.exchangeAmountByRate(buyAmount, exchangeRate.getRata());
                    }
                    //获取用户账户
                    UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), stockAIOrder.getUserId());
                    iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.AI_SETTLEMENT, amount);
                    iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.AI_SETTLEMENT, amount, buyAmount);
                }
                stockAIOrder.setStatus(status);
                stockAIOrder.setAuditDate(new Date());
src/main/java/com/nq/service/impl/UserAssetsServices.java
@@ -17,6 +17,7 @@
import javax.annotation.Resource;
import javax.validation.constraints.Email;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -293,7 +294,7 @@
    }
    public Boolean aiAvailableBalanceChange(UserAssets userAssets, EUserAssets eUserAssets, BigDecimal amount) {
    public Boolean aiAvailableBalanceChange(UserAssets userAssets, EUserAssets eUserAssets, BigDecimal amount, BigDecimal buyAmount) {
        String before = userAssets.getAvailableBalance().toString();
        if (eUserAssets.getCode().equals(EUserAssets.BUY_AI.getCode())) {
            //冻结金额
@@ -307,8 +308,8 @@
            userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
        } else if (eUserAssets.getCode().equals(EUserAssets.AI_SETTLEMENT.getCode())) {
            //解除冻结金额
            userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount.negate()));
            //归还可用金额 + 收益
            userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(buyAmount.negate()));
            //归还可用金额(买入金额+收益)
            userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
        }
        String after = userAssets.getAvailableBalance().toString();
@@ -328,6 +329,7 @@
    @Override
    public BigDecimal exchangeAmountByRate(BigDecimal amount, BigDecimal rate) {
        return amount.multiply(rate);
        //保留5位小数
        return amount.multiply(rate).setScale(5, RoundingMode.HALF_UP);
    }
}