zyy
2025-07-15 dfd95b8354429de9b14087cb96cba0ba0cd7265a
src/main/java/com/nq/service/impl/StockAiServiceImpl.java
@@ -75,11 +75,12 @@
     * @return
     */
    @Override
    @Transactional
    public ServerResponse buyStockAi(Long id, BigDecimal buyNum, HttpServletRequest request) {
        try {
            User user = iUserService.getCurrentUser(request);
            if (user == null ){
                return ServerResponse.createBySuccessMsg("请先登录");
                return ServerResponse.createByErrorCodeMsg(401,"请先登录");
            }
            Object lock = locks.computeIfAbsent(Long.valueOf(user.getId()), k -> new Object());
            synchronized (lock){
@@ -104,7 +105,7 @@
                }
                //获取用户账户
                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), user.getId());
                BigDecimal finalBuyNum = buyNum;    //购买金额
                /*BigDecimal finalBuyNum = buyNum;    //购买金额
                //如果不是墨西哥币需要转换金额
                if (!stockAI.getStockType().equals(EStockType.MX.getCode())) {
                    EStockType stockType = EStockType.getEStockTypeByCode(stockAI.getStockType());
@@ -116,7 +117,7 @@
                    }
                    //转换为墨西哥币
                    buyNum = iUserAssetsServices.exchangeAmountByRate(buyNum, exchangeRate.getRata());
                }
                }*/
                if(buyNum.compareTo(userAssets.getAvailableBalance()) > 0){
                    return ServerResponse.createByErrorMsg("可用余额不足" + userAssets.getAvailableBalance());
                }
@@ -125,16 +126,19 @@
                    return ServerResponse.createByErrorMsg("请先缴清待补资金");
                }
                Boolean flag = iUserAssetsServices.aiAvailableBalanceChange(stockAI.getStockType(), user.getId(), EUserAssets.BUY_AI, buyNum, null);
                if (!flag)  {
                    return ServerResponse.createByErrorMsg("扣款失败,无法转换货币");
                }
                StockAIOrder stockAIOrder = new StockAIOrder();
                stockAIOrder.setUserId(user.getId());
                stockAIOrder.setStockAiId(id);
                stockAIOrder.setBuyDate(new Date());
                stockAIOrder.setBuyAmount(finalBuyNum);
                stockAIOrder.setRemainAmount(finalBuyNum);
                stockAIOrder.setBuyAmount(buyNum);
                stockAIOrder.setRemainAmount(buyNum);
                stockAIOrder.setRealEarning(BigDecimal.valueOf(0));
                stockAIOrder.setStatus(EStockAIOrderStatus.wait.getStatus());   //等待审核
                stockAiOrderMapper.insert(stockAIOrder);
                iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI, buyNum);
                return ServerResponse.createBySuccessMsg("下单成功");
            }
        } catch (Exception e) {
@@ -156,7 +160,7 @@
        try {
            User user = iUserService.getCurrentUser(request);
            if (user == null ){
                return ServerResponse.createBySuccessMsg("请先登录");
                return ServerResponse.createByErrorCodeMsg(401,"请先登录");
            }
            PageHelper.startPage(pageNum, pageSize);
            List<StockAiOrderTypeVO> stockAIOrders = stockAiOrderMapper.getStockAiOrderList(user.getId(), status);
@@ -289,12 +293,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,12 +331,10 @@
                        return ServerResponse.createByErrorMsg("只能拒绝待审核订单");
                    }
                    //拒绝TODO 归还买入金额
                    //获取用户账户
                    UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), stockAIOrder.getUserId());
                    StockAI stockAI = stockAiMapper.selectById(stockAIOrder.getStockAiId());
                    //买入金额
                    BigDecimal buyNum =  stockAIOrder.getBuyAmount();
                    //如果不是墨西哥币需要转换金额
                    /*//如果不是墨西哥币需要转换金额
                    if (!stockAI.getStockType().equals(EStockType.MX.getCode())) {
                        EStockType stockType = EStockType.getEStockTypeByCode(stockAI.getStockType());
                        ExchangeRate exchangeRate = exchangeRateRepository.findExchangeRateByCurrencyAndConversionCurrency(stockType.getSymbol(), EStockType.MX.getSymbol())
@@ -340,14 +344,17 @@
                        }
                        //转换为墨西哥币
                        buyNum = iUserAssetsServices.exchangeAmountByRate(buyNum, exchangeRate.getRata());
                    }*/
                    Boolean flag = iUserAssetsServices.aiAvailableBalanceChange(stockAI.getStockType(), stockAIOrder.getUserId(), EUserAssets.BUY_AI_REJECT, buyNum, null);
                    if (!flag)  {
                        return ServerResponse.createByErrorMsg("扣款失败,无法转换货币");
                    }
                    iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI_REJECT, buyNum);
                } 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 +367,28 @@
                                .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());
                    }*/
                    Boolean flag = iUserAssetsServices.aiAvailableBalanceChange(stockAI.getStockType(), stockAIOrder.getUserId(), EUserAssets.AI_SETTLEMENT, amount, buyAmount);
                    if (!flag)  {
                        return ServerResponse.createByErrorMsg("扣款失败,无法转换货币");
                    }
                    //获取用户账户
                    UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), stockAIOrder.getUserId());
                    iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.AI_SETTLEMENT, amount);
                }
                stockAIOrder.setStatus(status);
                stockAIOrder.setAuditDate(new Date());