From 3bf4837190691b0d735512281340c42f061877b9 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Thu, 10 Oct 2024 18:43:09 +0800
Subject: [PATCH] 1

---
 src/main/java/com/nq/service/impl/UserPositionServiceImpl.java |   86 ++++++++++++++++++++++++++++++++++++++----
 1 files changed, 77 insertions(+), 9 deletions(-)

diff --git a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
index 37e8285..887f287 100644
--- a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -1,6 +1,7 @@
 package com.nq.service.impl;
 
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.nq.dao.*;
@@ -14,6 +15,7 @@
 import com.google.common.collect.Lists;
 import com.nq.common.ServerResponse;
 import com.nq.utils.*;
+import com.nq.utils.redis.RedisKeyUtil;
 import com.nq.utils.stock.BuyAndSellUtils;
 import com.nq.utils.stock.GeneratePosition;
 import com.nq.utils.stock.GetStayDays;
@@ -327,10 +329,13 @@
 
 
     @Transactional
-    public ServerResponse sell(String positionSn, int doType, HttpServletRequest request) {
+    public ServerResponse sell(String positionSn, int doType, Integer number,HttpServletRequest request) {
         UserPosition userPosition = this.userPositionMapper.findPositionBySn(positionSn);
+        if(number <= 0 || number > userPosition.getOrderNum()){
+            return ServerResponse.createByErrorMsg("请输入正确的平仓数", request);
+        }
         // 手续费率
-        BigDecimal siitteBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.SELL_HANDLING_CHARGE.getCode()).getCValue()) ;
+        BigDecimal siitteBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.SELL_HANDLING_CHARGE.getCode()).getCValue());
 
         UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
                 .eq(UserAssets::getUserId, userPosition.getUserId())
@@ -338,6 +343,11 @@
         );
         if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
             return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
+        }
+        StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new LambdaQueryWrapper<StockSubscribe>()
+                .eq(StockSubscribe::getCode, userPosition.getStockCode()));
+        if (null != stockSubscribe && DateUtil.date().before(stockSubscribe.getListDate())) {
+            return ServerResponse.createByErrorMsg("股票未上市,不能平仓", request);
         }
         Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", userPosition.getStockCode()));
         if(null == stock){
@@ -376,12 +386,42 @@
         if (nowPrice.compareTo(new BigDecimal("0")) != 1) {
             return ServerResponse.createByErrorMsg("报价0,平仓失败,请稍后再试", request);
         }
+
+        //部分平仓
+        if(number < userPosition.getOrderNum()){
+            //拆分订单
+            UserPosition position = ConverterUtil.convert(userPosition,UserPosition.class);
+            position.setId(null);
+            position.setPositionSn(KeyUtils.getUniqueKey());
+            position.setOrderNum(number);
+            position.setOrderTotalPrice(position.getBuyOrderPrice().multiply(new BigDecimal(number)));
+            position.setBuyOrderId(GeneratePosition.getPositionId());
+            //修改拆分订单手续费
+            BigDecimal BuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue());
+            BigDecimal buyPrice = position.getBuyOrderPrice().multiply(new BigDecimal(position.getOrderNum()));
+            BigDecimal xsPrice = buyPrice.multiply(BuyFee);
+            position.setOrderFee(xsPrice);
+
+            //修改原订单
+            userPosition.setOrderNum(userPosition.getOrderNum()-number);
+            userPosition.setOrderTotalPrice(userPosition.getBuyOrderPrice().multiply(new BigDecimal(userPosition.getOrderNum())));
+            userPosition.setOrderFee(userPosition.getOrderFee().subtract(position.getOrderFee()));
+            userPositionMapper.insert(position);
+            userPositionMapper.updateById(userPosition);
+
+            return getObjectServerResponse(request, position, nowPrice, siitteBuyFee, stock);
+        }
+        return getObjectServerResponse(request, userPosition, nowPrice, siitteBuyFee, stock);
+    }
+
+    private ServerResponse<Object> getObjectServerResponse(HttpServletRequest request, UserPosition userPosition, BigDecimal nowPrice, BigDecimal siitteBuyFee, Stock stock) {
         userPosition.setSellOrderId(GeneratePosition.getPositionId());
         userPosition.setSellOrderPrice(nowPrice);
         userPosition.setSellOrderTime(new Date());
 
         BigDecimal sellOrderTotel = nowPrice.multiply(new BigDecimal(userPosition.getOrderNum()));
         BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee);
+        userPosition.setOrderFee(userPosition.getOrderFee().add(xsPrice));
         userPositionMapper.updateById(userPosition);
         userAssetsServices.availablebalanceChange(stock.getStockType(),
                 userPosition.getUserId(),
@@ -573,7 +613,6 @@
                                                        Integer state, HttpServletRequest request,
                                                        int pageNum, int pageSize, String stockType) {
         User user = this.iUserService.getCurrentUser(request);
-
         PageHelper.startPage(pageNum, pageSize);
         List<UserPosition> userPositions;
 
@@ -588,9 +627,34 @@
         List<UserPositionVO> userPositionVOS = Lists.newArrayList();
         if (userPositions.size() > 0) {
             for (UserPosition position : userPositions) {
-                UserPositionVO userPositionVO = UserPointUtil.assembleUserPositionVO(position, priceServices.getNowPrice(position.getStockCode()));
+                Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code",position.getStockCode()));
+                BigDecimal nowPrice = BigDecimal.ZERO;
+                if(null != stock){
+                    StockRealTimeBean stockRealTimeBean =  RedisKeyUtil.getCacheRealTimeStock(stock);
+                    nowPrice = new BigDecimal(stockRealTimeBean.getLast());
+                }
+//                if(state == 1){
+//                    nowPrice = position.getSellOrderPrice();
+//                }else{
+//                    nowPrice = priceServices.getNowPrice(position.getStockCode());
+//                }
+                UserPositionVO userPositionVO = UserPointUtil.assembleUserPositionVO(position,nowPrice);
                 userPositionVO.setOrderTotalPrice(userPositionVO.getOrderTotalPrice().multiply(new BigDecimal(userPositionVO.getOrderLever())));
-                userPositionVO.setProfitAndLose(userPositionVO.getProfitAndLose().multiply(new BigDecimal(userPositionVO.getOrderLever())));
+
+                StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new LambdaQueryWrapper<StockSubscribe>()
+                        .eq(StockSubscribe::getCode, userPositionVO.getStockCode()));
+                if(position.getSellOrderId() == null){
+                    if (null != stockSubscribe && DateUtil.date().before(stockSubscribe.getListDate())) {
+                        userPositionVO.setProfitAndLose(BigDecimal.ZERO);
+                        userPositionVO.setProfitAndLoseParent("0%");
+                        userPositionVO.setIsListed(false);
+                    }else{
+                        userPositionVO.setIsListed(true);
+                        userPositionVO.setProfitAndLose(userPositionVO.getProfitAndLose().multiply(new BigDecimal(userPositionVO.getOrderLever())));
+                    }
+                }else{
+                    userPositionVO.setProfitAndLose(userPositionVO.getProfitAndLose().multiply(new BigDecimal(userPositionVO.getOrderLever())));
+                }
                 userPositionVOS.add(userPositionVO);
             }
         }
@@ -1264,7 +1328,7 @@
         userPosition.setBuyOrderPrice(userStockSubscribe.getBuyPrice());
         userPosition.setOrderDirection("买涨");
 
-        userPosition.setOrderNum(userStockSubscribe.getApplyNumber()*stockSubscribe.getLever().intValue());
+        userPosition.setOrderNum(userStockSubscribe.getApplyNumber());
 
 
         userPosition.setIsLock(Integer.valueOf(0));
@@ -1282,7 +1346,9 @@
         userPosition.setOrderTotalPrice(userStockSubscribe.getBond());
 
         //            BigDecimal buy_fee_amt = buy_amt.multiply(siteSetting.getBuyFee()).setScale(2, 4);
-        BigDecimal buy_fee_amt = new BigDecimal(0);
+        // 手续费率
+        BigDecimal siteSettingBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue()) ;
+        BigDecimal buy_fee_amt = siteSettingBuyFee.multiply(userStockSubscribe.getBond());
         log.info("用户购买手续费(配资后总资金 * 百分比) = {}", buy_fee_amt);
         userPosition.setOrderFee(buy_fee_amt);
 
@@ -1314,9 +1380,8 @@
         if(null == userAssets){
             return ServerResponse.createByErrorMsg("新股转持仓失败");
         }
-//            userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userPosition.getOrderTotalPrice()));
-//            userAssets.setFreezeMoney(userAssets.getFreezeMoney()!=null?userAssets.getFreezeMoney().setScale(2,BigDecimal.ROUND_UP):null);
         userAssetsMapper.updateById(userAssets);
+        iUserAssetsServices.availablebalanceChange("IN", userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", "");
         if (ret > 0) {
             userStockSubscribe.setStatus(5);
             userStockSubscribeMapper.update1(userStockSubscribe);
@@ -1655,7 +1720,10 @@
         // 创建UserPosition对象
         UserPosition userPosition = getUserPosition(dzId,num, user, stockDz, nowPrice, stock, buyAmt);
         userPositionMapper.insert(userPosition);
+        BigDecimal siteSettingBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue()) ;
+        BigDecimal buy_fee_amt = siteSettingBuyFee.multiply(buyAmt);
         userAssetsServices.availablebalanceChange(EStockType.IN.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"","");
+        iUserAssetsServices.availablebalanceChange("IN", userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", "");
         return ServerResponse.createBySuccess("购买成功", request);
     }
 

--
Gitblit v1.9.3