zyy
2025-07-19 539f733f62f4a368eb90a07a729b5d948378a705
后台新增建仓列表 新股列表新增购买状态
13 files modified
2 files added
405 ■■■■■ changed files
src/main/java/com/nq/controller/backend/AdminStockAiController.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/dao/StockAiOrderPositionMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/dao/StockSubscribeMapper.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/IStockAiService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/StockAiServiceImpl.java 23 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/StockSubscribeServiceImpl.java 13 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserAssetsServices.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java 7 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java 235 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/UserPointUtil.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/vo/position/UserPositionVO.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/vo/stock/ai/StockAIOrderPositionVO.java 66 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/vo/subscribe/StockSubscribeVO.java 12 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/StockAiOrderPositionMapper.xml 8 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/StockSubscribeMapper.xml 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/backend/AdminStockAiController.java
@@ -114,4 +114,16 @@
                                               @RequestParam(value = "keyWords", required = false) String keyWords) {
         return stockService.getStocksByKeyWords(pageNum, pageSize, keyWords);
     }
     //建仓列表页
     @PostMapping({"getPositionList.do"})
     @ResponseBody
     public ServerResponse getPositionList(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                           @RequestParam(value = "pageSize", defaultValue = "5") int pageSize,
                                           @RequestParam(value = "id", required = false) Integer stockAiOrderId) {
         if (stockAiOrderId == null) {
             return ServerResponse.createByErrorMsg("id is null");
         }
         return stockAiService.getPositionList(pageNum, pageSize, stockAiOrderId);
     }
 }
src/main/java/com/nq/dao/StockAiOrderPositionMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nq.pojo.StockAIOrderPosition;
import com.nq.vo.position.UserPositionVO;
import com.nq.vo.stock.ai.StockAIOrderPositionVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -15,4 +16,5 @@
    List<UserPositionVO> getAiPositionList(@Param("userId") Integer userId, @Param("status") Integer status);
    List<StockAIOrderPositionVO> getPositionListByOrderId(@Param("stockAiOrderId") Integer stockAiOrderId);
}
src/main/java/com/nq/dao/StockSubscribeMapper.java
@@ -2,6 +2,7 @@
import com.nq.pojo.StockSubscribe;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nq.vo.subscribe.StockSubscribeVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -16,6 +17,10 @@
public interface StockSubscribeMapper extends BaseMapper<StockSubscribe> {
    List<StockSubscribeVO> selectStockSubscribeVO(@Param("zt") Integer zt,
                                                  @Param("type") Integer type,
                                                  @Param("userId") Integer userId);
}
src/main/java/com/nq/service/IStockAiService.java
@@ -25,4 +25,7 @@
  ServerResponse openPosition(StockAIOrderPosition model);
  ServerResponse orderOperation(Long id, String status);
  ServerResponse getPositionList(Integer pageNum, Integer pageSize, Integer stockAiOrderId);
}
src/main/java/com/nq/service/impl/StockAiServiceImpl.java
@@ -3,7 +3,6 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nq.Repository.ExchangeRateRepository;
import com.nq.common.ResponseCode;
import com.nq.common.ServerResponse;
import com.nq.dao.StockAiMapper;
@@ -12,6 +11,7 @@
import com.nq.enums.*;
import com.nq.pojo.*;
import com.nq.service.*;
import com.nq.vo.stock.ai.StockAIOrderPositionVO;
import com.nq.vo.stock.ai.StockAiOrderTypeVO;
import com.nq.vo.stock.ai.StockAiOrderVO;
import com.nq.vo.stock.ai.StockAiVO;
@@ -368,4 +368,25 @@
        }
        return ServerResponse.createByError();
    }
    /**
     * 建仓列表
     * 建仓列表
     * @param pageNum
     * @param pageSize
     * @param stockAiOrderId
     * @return
     */
    @Override
    public ServerResponse getPositionList(Integer pageNum, Integer pageSize, Integer stockAiOrderId) {
        try {
            PageHelper.startPage(pageNum, pageSize);
            List<StockAIOrderPositionVO> positionVOList = stockAiOrderPositionMapper.getPositionListByOrderId(stockAiOrderId);
            PageInfo<StockAIOrderPositionVO> pageInfo = new PageInfo<>(positionVOList);
            return ServerResponse.createBySuccess(pageInfo);
        } catch (Exception e) {
            log.error("StockAiService getPositionList error", e);
        }
        return ServerResponse.createByError();
    }
}
src/main/java/com/nq/service/impl/StockSubscribeServiceImpl.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nq.common.ResponseCode;
import com.nq.common.ServerResponse;
import com.nq.dao.StockMapper;
import com.nq.dao.UserPositionMapper;
@@ -15,6 +16,7 @@
import com.nq.dao.StockSubscribeMapper;
import com.nq.service.IUserService;
import com.nq.vo.stock.ai.StockAiOrderTypeVO;
import com.nq.vo.subscribe.StockSubscribeVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -195,7 +197,7 @@
    @Override
    public ServerResponse listPageInfo(int pageNum, int pageSize, HttpServletRequest request) {
        try {
            QueryWrapper<StockSubscribe> queryWrapper = new QueryWrapper();
            /*QueryWrapper<StockSubscribe> queryWrapper = new QueryWrapper();
            //显示 0
            queryWrapper.eq("zt", 0);
            queryWrapper.eq("type", 1);
@@ -204,7 +206,14 @@
            PageHelper.startPage(pageNum, pageSize);
            List<StockSubscribe> stockSubscribeList = this.stockSubscribeMapper.selectList(queryWrapper);
            // 获取分页信息
            PageInfo<StockSubscribe> pageInfo = new PageInfo<>(stockSubscribeList);
            PageInfo<StockSubscribe> pageInfo = new PageInfo<>(stockSubscribeList);*/
            User user = this.iUserService.getCurrentRefreshUser(request);
            if (user == null) {
                return ServerResponse.createByErrorCodeMsg(ResponseCode.NEED_LOGIN.getCode(),"请先登录", request);
            }
            PageHelper.startPage(pageNum, pageSize);
            List<StockSubscribeVO> subscribeVOs = stockSubscribeMapper.selectStockSubscribeVO(0 ,1 ,user.getId());
            PageInfo<StockSubscribeVO> pageInfo = new PageInfo<>(subscribeVOs);
            Date newDate = new Date();
            pageInfo.getList().forEach(stockSubscribe -> {
src/main/java/com/nq/service/impl/UserAssetsServices.java
@@ -349,7 +349,7 @@
        moneyLog.setAmount(amount.toString());
        moneyLog.setAccectType(userAssets.getAccectType());
        moneyLog.setType(eUserAssets.getCode());
        moneyLog.setUserId(userAssets.getId()+"");
        moneyLog.setUserId(userAssets.getUserId()+"");
        moneyLog.setSymbol(EStockType.getEStockTypeByCode(userAssets.getAccectType()).getSymbol());
        moneyLog.setCreateTime(new Date());
        moneyLogMapper.insert(moneyLog);
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -736,10 +736,12 @@
                    } else {
                        //ai交易 计算收益率 收益/本金*100
                        BigDecimal profitAndLose = userPositionVO.getProfitAndLose()
                                .divide(userPositionVO.getOrderTotalPrice())
                                .divide(userPositionVO.getOrderTotalPrice(), RoundingMode.HALF_UP)
                                .multiply(new BigDecimal(100))
                                .setScale(2, BigDecimal.ROUND_DOWN);
                                .setScale(2, RoundingMode.DOWN);
                        userPositionVO.setNow_price(String.valueOf(userPositionVO.getSellOrderPrice().setScale(2, RoundingMode.HALF_UP)));
                        userPositionVO.setProfitAndLoseParent(profitAndLose + "%");
                        userPositionVO.setSellOrderTotalPrice(userPositionVO.getSellOrderPrice().multiply(BigDecimal.valueOf(userPositionVO.getOrderNum())));
                    }
                    resultUserPositions.add(userPositionVO);
                }
@@ -747,6 +749,7 @@
            pageInfo.setList(resultUserPositions);
            return ServerResponse.createBySuccess(pageInfo);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("IUserPositionService findMyPositionByParam  {}", e.getMessage());
        }
        return ServerResponse.createByError();
src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
@@ -238,96 +238,97 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ServerResponse save(UserStockSubscribe model, HttpServletRequest request) throws Exception {
        int ret = 0;
        if( model.getId() != null  ){
            if (model.getStatus() == 3||model.getStatus() == 2) {
                model.setEndTime(DateTimeUtil.getCurrentDate());
            }
            UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.load(model.getId());
            if (userStockSubscribe.getStatus() == 5) {
                return ServerResponse.createByErrorMsg("It's been converted");
            }
            if(userStockSubscribe.getStatus() == 3){
                return ServerResponse.createByErrorMsg("不能更改申购状态");
            }
            StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<>(new StockSubscribe())
                    .eq("newlist_id", userStockSubscribe.getNewStockId()));
            if((model.getStatus() == 3 && model.getApplyNumber() == null) || (model.getStatus() == 3 && model.getApplyNumber() == 0) ){
                return ServerResponse.createByErrorMsg("中签数量不能小于0");
            }
            if(model.getStatus() == 3 && model.getApplyNumber()>userStockSubscribe.getApplyNums()){
                return  ServerResponse.createByErrorMsg("配置中签数量不能超过申请数量",request);
            }
            //客户中签直接扣除客户账户可用资金
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stockSubscribe.getStockType(), userStockSubscribe.getUserId());
            if (model.getStatus() == 3 && model.getApplyNumber() != null){
                if(stockSubscribe.getType() == 1){
                    model.setBond((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNumber())));
                    model.setDbMoney(model.getDbMoney());
                    if(null == userAssets){
                        return ServerResponse.createByErrorMsg("客户资金账户不存在");
                    }
                    int applyNumber = userStockSubscribe.getApplyNums() - model.getApplyNumber();
                    if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) <= 0){
                        if(applyNumber > 0){
                            //需要退回的资金
                            BigDecimal refundPrice = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(applyNumber));
                            //如果不是墨西哥币需要转换金额
                            if (!stockSubscribe.getStockType().equals(EStockType.MX.getCode())) {
                                refundPrice = iUserAssetsServices.exchangeAmountByRate(stockSubscribe.getStockType(), refundPrice);
                            }
                            userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(refundPrice));
                            userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(refundPrice));
                        }
                    }else{
                        if(applyNumber > 0){
                            BigDecimal refundPrice = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(applyNumber));
                            //如果不是墨西哥币需要转换金额
                            if (!stockSubscribe.getStockType().equals(EStockType.MX.getCode())) {
                                refundPrice = iUserAssetsServices.exchangeAmountByRate(stockSubscribe.getStockType(), refundPrice);
                            }
                            BigDecimal subtract = refundPrice.subtract(userAssets.getAmountToBeCovered());
                            if(subtract.compareTo(BigDecimal.ZERO) <= 0){//如果退回的资金不足补足待补则直接减
                                userAssets.setAmountToBeCovered(userAssets.getAmountToBeCovered().subtract(refundPrice));
                            }else{//如果退回的资金足够填补待补资金还有剩余,则返回余额
                                userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(refundPrice).add(userAssets.getAmountToBeCovered()));
                                userAssets.setAmountToBeCovered(BigDecimal.ZERO);
                                userAssets.setAvailableBalance(subtract);
                            }
                        }
                    }
                    ret = userStockSubscribeMapper.update1(model);
                    userAssetsMapper.updateById(userAssets);
                    iUserPositionService.newStockToPosition(model.getId(),userAssets.getAmountToBeCovered());//转持仓
                    model.setStatus(5);
                }else{
                    if(model.getApplyNumber()>model.getApplyNums()){
                        return  ServerResponse.createByErrorMsg("配置中签数量不能超过申请数量",request);
                    }
                    BigDecimal cCount = new BigDecimal(model.getApplyNums()-model.getApplyNumber());
                    BigDecimal tMoney = ((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice())).multiply(cCount);
                    iUserAssetsServices.availablebalanceChange(stockSubscribe.getStockType(),userStockSubscribe.getUserId(),
                            EUserAssets.TOP_UP,tMoney,"","");
                    model.setBond((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNumber())));
                    model.setDbMoney(BigDecimal.ZERO);
                    model.setStatus(4);
                    ret = userStockSubscribeMapper.update1(model);
    public ServerResponse save(UserStockSubscribe model, HttpServletRequest request){
        try {
            int ret = 0;
            if( model.getId() != null){
                if (model.getStatus() == 3||model.getStatus() == 2) {
                    model.setEndTime(DateTimeUtil.getCurrentDate());
                }
            }else if (model.getStatus() == 2){
                BigDecimal bond = (stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNums()));
                BigDecimal subtractMoney = bond.subtract(userAssets.getAmountToBeCovered());//需要退回的钱
                userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(subtractMoney.abs()));
                userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(subtractMoney));
                userAssets.setAmountToBeCovered(BigDecimal.ZERO);
                userAssetsMapper.updateById(userAssets);
                ret = userStockSubscribeMapper.update1(model);
            }else if (model.getStatus() == 5){
                UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.load(model.getId());
                if (userStockSubscribe.getStatus() == 5) {
                    return ServerResponse.createByErrorMsg("It's been converted");
                }
                if(userStockSubscribe.getStatus() == 3){
                    return ServerResponse.createByErrorMsg("不能更改申购状态");
                }
                StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<>(new StockSubscribe())
                        .eq("newlist_id", userStockSubscribe.getNewStockId()));
                if((model.getStatus() == 3 && model.getApplyNumber() == null) || (model.getStatus() == 3 && model.getApplyNumber() == 0) ){
                    return ServerResponse.createByErrorMsg("中签数量不能小于0");
                }
                if(model.getStatus() == 3 && model.getApplyNumber()>userStockSubscribe.getApplyNums()){
                    return  ServerResponse.createByErrorMsg("配置中签数量不能超过申请数量",request);
                }
                //客户中签直接扣除客户账户可用资金
                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stockSubscribe.getStockType(), userStockSubscribe.getUserId());
                if (model.getStatus() == 3 && model.getApplyNumber() != null){
                    if(stockSubscribe.getType() == 1){
                        model.setBond((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNumber())));
                        model.setDbMoney(model.getDbMoney());
                        if(null == userAssets){
                            return ServerResponse.createByErrorMsg("客户资金账户不存在");
                        }
                        int applyNumber = userStockSubscribe.getApplyNums() - model.getApplyNumber();
                        if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) <= 0){
                            if(applyNumber > 0){
                                //需要退回的资金
                                BigDecimal refundPrice = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(applyNumber));
                                //如果不是墨西哥币需要转换金额
                                if (!stockSubscribe.getStockType().equals(EStockType.MX.getCode())) {
                                    refundPrice = iUserAssetsServices.exchangeAmountByRate(stockSubscribe.getStockType(), refundPrice);
                                }
                                userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(refundPrice));
                                userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(refundPrice));
                            }
                        }else{
                            if(applyNumber > 0){
                                BigDecimal refundPrice = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(applyNumber));
                                //如果不是墨西哥币需要转换金额
                                if (!stockSubscribe.getStockType().equals(EStockType.MX.getCode())) {
                                    refundPrice = iUserAssetsServices.exchangeAmountByRate(stockSubscribe.getStockType(), refundPrice);
                                }
                                BigDecimal subtract = refundPrice.subtract(userAssets.getAmountToBeCovered());
                                if(subtract.compareTo(BigDecimal.ZERO) <= 0){//如果退回的资金不足补足待补则直接减
                                    userAssets.setAmountToBeCovered(userAssets.getAmountToBeCovered().subtract(refundPrice));
                                }else{//如果退回的资金足够填补待补资金还有剩余,则返回余额
                                    userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(refundPrice).add(userAssets.getAmountToBeCovered()));
                                    userAssets.setAmountToBeCovered(BigDecimal.ZERO);
                                    userAssets.setAvailableBalance(subtract);
                                }
                            }
                        }
                        ret = userStockSubscribeMapper.update1(model);
                        userAssetsMapper.updateById(userAssets);
                        iUserPositionService.newStockToPosition(model.getId(),userAssets.getAmountToBeCovered());//转持仓
                        model.setStatus(5);
                    }else{
                        if(model.getApplyNumber()>model.getApplyNums()){
                            return  ServerResponse.createByErrorMsg("配置中签数量不能超过申请数量",request);
                        }
                        BigDecimal cCount = new BigDecimal(model.getApplyNums()-model.getApplyNumber());
                        BigDecimal tMoney = ((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice())).multiply(cCount);
                        iUserAssetsServices.availablebalanceChange(stockSubscribe.getStockType(),userStockSubscribe.getUserId(),
                                EUserAssets.TOP_UP,tMoney,"","");
                        model.setBond((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNumber())));
                        model.setDbMoney(BigDecimal.ZERO);
                        model.setStatus(4);
                        ret = userStockSubscribeMapper.update1(model);
                    }
                }else if (model.getStatus() == 2){
                    BigDecimal bond = (stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNums()));
                    BigDecimal subtractMoney = bond.subtract(userAssets.getAmountToBeCovered());//需要退回的钱
                    userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(subtractMoney.abs()));
                    userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(subtractMoney));
                    userAssets.setAmountToBeCovered(BigDecimal.ZERO);
                    userAssetsMapper.updateById(userAssets);
                    ret = userStockSubscribeMapper.update1(model);
                }else if (model.getStatus() == 5){
                    return iUserPositionService.newStockToPosition(model.getId(),BigDecimal.ZERO);
            }
                }
                if(ret>0 && model.getStatus() == 3 ){
                    //给用户推送消息
                    SiteMessage siteMessage = new SiteMessage();
@@ -371,39 +372,41 @@
                    }
                }
        } else{
            if(model.getPhone() != null&&model.getId()==null) {
                User user = userMapper.findByPhone(model.getPhone());
                if (user == null) {
                    return ServerResponse.createByErrorMsg("User does not exist");
                }
                model.setRealName(user.getRealName());
                model.setUserId(user.getId());
                model.setAgentId(user.getAgentId());
                model.setAgentName(user.getAgentName());
                StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<>(new StockSubscribe())
                        .eq("newlist_id", model.getNewStockId()));
                if (stockSubscribe == null) {
                    return ServerResponse.createByErrorMsg("Failed. Ipo information does not exist");
                }
            } else{
                if(model.getPhone() != null&&model.getId()==null) {
                    User user = userMapper.findByPhone(model.getPhone());
                    if (user == null) {
                        return ServerResponse.createByErrorMsg("User does not exist");
                    }
                    model.setRealName(user.getRealName());
                    model.setUserId(user.getId());
                    model.setAgentId(user.getAgentId());
                    model.setAgentName(user.getAgentName());
                    StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<>(new StockSubscribe())
                            .eq("newlist_id", model.getNewStockId()));
                    if (stockSubscribe == null) {
                        return ServerResponse.createByErrorMsg("Failed. Ipo information does not exist");
                    }
                model.setNewName(stockSubscribe.getName());
                model.setBuyPrice(stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice());
                if (model.getApplyNums() > stockSubscribe.getOrderNumber() || model.getApplyNumber() > stockSubscribe.getOrderNumber()) {
                    return ServerResponse.createByErrorMsg("The number of applications or the number of wins is the maximum" + stockSubscribe.getOrderNumber());
                    model.setNewName(stockSubscribe.getName());
                    model.setBuyPrice(stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice());
                    if (model.getApplyNums() > stockSubscribe.getOrderNumber() || model.getApplyNumber() > stockSubscribe.getOrderNumber()) {
                        return ServerResponse.createByErrorMsg("The number of applications or the number of wins is the maximum" + stockSubscribe.getOrderNumber());
                    }
                    model.setBond(model.getBuyPrice().multiply(BigDecimal.valueOf(model.getApplyNumber())));
                    model.setAddTime(DateTimeUtil.getCurrentDate());
                    model.setOrderNo(KeyUtils.getUniqueKey());
                    model.setType(stockSubscribe.getType());
                    UserStockSubscribeAddIn convert = Convert.convert(UserStockSubscribeAddIn.class, model);
                    return insert(convert,request);
                }
                model.setBond(model.getBuyPrice().multiply(BigDecimal.valueOf(model.getApplyNumber())));
                model.setAddTime(DateTimeUtil.getCurrentDate());
                model.setOrderNo(KeyUtils.getUniqueKey());
                model.setType(stockSubscribe.getType());
                UserStockSubscribeAddIn convert = Convert.convert(UserStockSubscribeAddIn.class, model);
                return insert(convert,request);
            }
            if(ret>0){
                return ServerResponse.createBySuccessMsg("Successful operation");
            }
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        if(ret>0){
            return ServerResponse.createBySuccessMsg("Successful operation");
        }
        return ServerResponse.createByErrorMsg("Operation failure");
    }
    /**
src/main/java/com/nq/utils/UserPointUtil.java
@@ -7,6 +7,7 @@
import com.nq.vo.position.UserPositionVO;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
 * 仓位计算工具类
@@ -72,9 +73,9 @@
     * */
    public  static  UserPositionVO assembleUserPositionVO2(UserPositionVO userPositionVO,BigDecimal nowPrice) {
        PositionProfitVO positionProfitVO = getPositionProfitVO2(userPositionVO, nowPrice);
        BigDecimal ss =  positionProfitVO.getProfitAndLose().divide(userPositionVO.getOrderTotalPrice(),BigDecimal.ROUND_CEILING)
        BigDecimal ss =  positionProfitVO.getProfitAndLose().divide(userPositionVO.getOrderTotalPrice(), RoundingMode.CEILING)
                .multiply(new BigDecimal(100));
        ss = ss.setScale(2, BigDecimal.ROUND_DOWN);
        ss = ss.setScale(2, RoundingMode.DOWN);
        userPositionVO.setProfitAndLoseParent(ss+"%");
        userPositionVO.setProfitAndLoseParent2(ss);
        userPositionVO.setProfitAndLose(positionProfitVO.getProfitAndLose());
src/main/java/com/nq/vo/position/UserPositionVO.java
@@ -35,6 +35,7 @@
    private Date sellOrderTime;
    private BigDecimal sellOrderPrice;
    private BigDecimal sellOrderTotalPrice;
    private BigDecimal profitTargetPrice;
    private BigDecimal stopTargetPrice;
    private String orderDirection;
src/main/java/com/nq/vo/stock/ai/StockAIOrderPositionVO.java
New file
@@ -0,0 +1,66 @@
package com.nq.vo.stock.ai;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class StockAIOrderPositionVO {
    private Integer id;
    //ai交易产品订单id
    private Integer stockAiOrderId;
    //建仓股票id
    private Integer stockId;
    /**
     * 建仓股票数量
     */
    private Long stockNum;
    /**
     * 建仓股票单价
     */
    private BigDecimal stockPrice;
    /**
     * 建仓时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date creatDate;
    /**
     * 平仓单价
     */
    private BigDecimal coverPrice;
    /**
     * 平仓时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date coverDate;
    /**
     * 收益 (平仓单价-建仓股票单价)*建仓股票数量
     */
    private BigDecimal earnings;
    /**
     * 建仓状态 0持仓   1已平仓
     */
    private Integer status;
    //股票名称
    private String stockName;
    //code
    private String stockCode;
    //股票名称缩写
    private String stockSpell;
    //类型
    private String stockType;
}
src/main/java/com/nq/vo/subscribe/StockSubscribeVO.java
New file
@@ -0,0 +1,12 @@
package com.nq.vo.subscribe;
import com.nq.pojo.StockSubscribe;
import lombok.Data;
@Data
public class StockSubscribeVO  extends StockSubscribe {
    //是否已购买 0未购买 1已购买
    private Integer isBuy;
}
src/main/resources/mapper/StockAiOrderPositionMapper.xml
@@ -19,4 +19,12 @@
        ORDER BY creat_date DESC
    </select>
    <select id="getPositionListByOrderId" resultType="com.nq.vo.stock.ai.StockAIOrderPositionVO">
        SELECT p.*,s.stock_name,s.stock_code,s.stock_spell,s.stock_type
        FROM stock_ai_order_position p
        LEFT JOIN stock s ON s.id = p.stock_id
        WHERE p.stock_ai_order_id = #{stockAiOrderId}
        ORDER BY p.creat_date DESC
    </select>
</mapper>
src/main/resources/mapper/StockSubscribeMapper.xml
@@ -43,4 +43,15 @@
<!--    </select>-->
    <select id="selectStockSubscribeVO" resultType="com.nq.vo.subscribe.StockSubscribeVO">
        SELECT s.*,
            IF((SELECT COUNT(1) FROM user_stock_subscribe
                                WHERE new_stock_id = s.newlist_id AND type=#{type} AND user_id =#{userId}) > 0,1,0) isbuy
        FROM stock_subscribe s
        WHERE s.zt= #{zt} AND s.type=#{type}
        ORDER BY s.list_date DESC
    </select>
</mapper>