zyy
2025-07-19 539f733f62f4a368eb90a07a729b5d948378a705
后台新增建仓列表 新股列表新增购买状态
13 files modified
2 files added
177 ■■■■■ 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 7 ●●●● 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,7 +238,8 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ServerResponse save(UserStockSubscribe model, HttpServletRequest request) throws Exception {
    public ServerResponse save(UserStockSubscribe model, HttpServletRequest request){
        try {
        int ret = 0;
        if( model.getId() != null  ){
            if (model.getStatus() == 3||model.getStatus() == 2) {
@@ -403,7 +404,9 @@
        if(ret>0){
            return ServerResponse.createBySuccessMsg("Successful operation");
        }
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        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>