From 8bb76f405fb9e5ee135231618c7da357946dc2f8 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Sun, 29 Sep 2024 11:18:51 +0800
Subject: [PATCH] 1

---
 src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java |  111 +++++++++++++++++++--------
 src/main/resources/application.properties                            |    4 
 src/main/java/com/nq/ws/WebsocketRunClient.java                      |   55 ++++++++++++-
 src/main/java/com/nq/service/impl/UserAssetsServices.java            |    6 +
 src/main/java/com/nq/ws/WebSocketClientBeanConfig.java               |    2 
 src/main/java/com/nq/service/impl/StockDzServiceImpl.java            |    6 +
 src/main/java/com/nq/pojo/StockSubscribe.java                        |   10 ++
 src/main/java/com/nq/service/impl/UserPositionServiceImpl.java       |    4 
 src/main/java/com/nq/ws/WsClientConfig.java                          |    3 
 src/main/resources/application.yml                                   |    2 
 10 files changed, 157 insertions(+), 46 deletions(-)

diff --git a/src/main/java/com/nq/pojo/StockSubscribe.java b/src/main/java/com/nq/pojo/StockSubscribe.java
index ed4376f..7f66300 100644
--- a/src/main/java/com/nq/pojo/StockSubscribe.java
+++ b/src/main/java/com/nq/pojo/StockSubscribe.java
@@ -50,6 +50,16 @@
     private Long orderNumber;
 
     /**
+     * 最小数量
+     */
+    private Long minNumber;
+
+    /**
+     * 杠杆
+     */
+    private Long lever;
+
+    /**
      * 顯示状态
      */
     private Integer zt;
diff --git a/src/main/java/com/nq/service/impl/StockDzServiceImpl.java b/src/main/java/com/nq/service/impl/StockDzServiceImpl.java
index f3070c8..3c8ce9d 100644
--- a/src/main/java/com/nq/service/impl/StockDzServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockDzServiceImpl.java
@@ -68,6 +68,12 @@
             return ServerResponse.createByErrorMsg("参数不能为空");
         }
 
+        Long count = stockDzMapper.selectCount(new LambdaQueryWrapper<StockDz>()
+                .eq(StockDz::getStockCode,stockCode));
+        if(count > 0){
+            return ServerResponse.createByErrorMsg("股票代码已存在");
+        }
+
         QueryWrapper queryWrapper = new QueryWrapper();
         queryWrapper.eq("stock_code",stockCode);
 
diff --git a/src/main/java/com/nq/service/impl/UserAssetsServices.java b/src/main/java/com/nq/service/impl/UserAssetsServices.java
index 141e5da..b22d648 100644
--- a/src/main/java/com/nq/service/impl/UserAssetsServices.java
+++ b/src/main/java/com/nq/service/impl/UserAssetsServices.java
@@ -80,9 +80,11 @@
                     BigDecimal availableBalance = bigAmt.subtract(userAssets.getAmountToBeCovered());
                     if(availableBalance.compareTo(BigDecimal.ZERO) > 0){
                         userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
+                        userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAmountToBeCovered()));
                         userAssets.setAmountToBeCovered(BigDecimal.ZERO);
                     }else{
                         BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(bigAmt);
+                        userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(bigAmt));
                         userAssets.setAmountToBeCovered(amountToBeCovered);
                     }
                 }else{
@@ -106,8 +108,6 @@
             if(type.equals("2")){
                 return  userRechargeService.createOrder(userAssets.getUserId(),1,bigAmt.intValue(),"1");
             }else{
-
-
                 return ServerResponse.createBySuccess();
             }
         }
@@ -190,9 +190,11 @@
                BigDecimal availableBalance = amount.subtract(userAssets.getAmountToBeCovered());
                if(availableBalance.compareTo(BigDecimal.ZERO) > 0){
                    userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
+                   userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAmountToBeCovered()));
                    userAssets.setAmountToBeCovered(BigDecimal.ZERO);
                }else{
                    BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(amount);
+                   userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount));
                    userAssets.setAmountToBeCovered(amountToBeCovered);
                }
            }else{
diff --git a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
index 66e2b77..e8d6776 100644
--- a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -1304,8 +1304,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);
+//            userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userPosition.getOrderTotalPrice()));
+//            userAssets.setFreezeMoney(userAssets.getFreezeMoney()!=null?userAssets.getFreezeMoney().setScale(2,BigDecimal.ROUND_UP):null);
             userAssetsMapper.updateById(userAssets);
             if (ret > 0) {
                 userStockSubscribe.setStatus(5);
diff --git a/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java b/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
index 4891329..355b81c 100644
--- a/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
@@ -101,8 +101,27 @@
             if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
                 return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
             }
-            if(new Date().before(stockSubscribe.getSubscribeTime()) && new Date().after(stockSubscribe.getSubscribeTime()) ){
-                return ServerResponse.createByErrorMsg("不在认缴或配售时间之内",request);
+            if(userAssets.getAvailableBalance().compareTo(BigDecimal.ZERO) <= 0){
+                return ServerResponse.createByErrorMsg("账户余额不足", request);
+            }
+
+            if ( model.getApplyNums() == null){
+                // 申请数量为空时返回错误信息
+                return ServerResponse.createByErrorMsg("申请数量不能为空", request);
+            }
+            if(model.getApplyNums() < stockSubscribe.getMinNumber() ){
+                return ServerResponse.createByErrorMsg("最少申购:" + stockSubscribe.getMinNumber(), request);
+            }
+            if (model.getApplyNums() > stockSubscribe.getOrderNumber()){
+                return ServerResponse.createByErrorMsg("最多可申购:" + stockSubscribe.getOrderNumber(), request);
+            }
+
+            Date currentDate = new Date();
+            if(currentDate.before(stockSubscribe.getSubscriptionTime())){
+                return ServerResponse.createByErrorMsg("未开售",request);
+            }
+            if(currentDate.after(stockSubscribe.getSubscribeTime())){
+                return ServerResponse.createByErrorMsg("已结束",request);
             }
 
 //            //重复申购限制
@@ -117,19 +136,13 @@
             if (stockSubscribe == null) {
                 return ServerResponse.createByErrorMsg("新的股票代码不存在",request);
             }
-
-//            if ( model.getApplyNums() == null){
-//                // 申请数量为空时返回错误信息
-//                return ServerResponse.createByErrorMsg("申请数量不能为空", request);
-//            }
-//
-//            if (model.getApplyNums() > stockSubscribe.getOrderNumber()){
-//                // 申请数量大于订单数量时返回错误信息
-//                return ServerResponse.createByErrorMsg("最多可申购:" + stockSubscribe.getOrderNumber(), request);
-//            }
-
-            //默认数量最大
-            model.setApplyNums(stockSubscribe.getOrderNumber().intValue());
+            //计算申购金额
+            BigDecimal bound;
+            if (stockSubscribe.getMinPrice() != null && stockSubscribe.getMinPrice().compareTo(BigDecimal.ZERO) > 0) {
+                bound =  new BigDecimal(model.getApplyNums()).multiply(new BigDecimal(stockSubscribe.getLever().toString())).multiply(stockSubscribe.getMinPrice());
+            }else{
+                bound =  new BigDecimal(model.getApplyNums()).multiply(new BigDecimal(stockSubscribe.getLever().toString())).multiply(stockSubscribe.getPrice());
+            }
 
             if(stockSubscribe.getType() == 1){
                 model.setUserId(user.getId());
@@ -146,6 +159,18 @@
                 UserStockSubscribe userStockSubscribe = Convert.convert(UserStockSubscribe.class, model);
                 userStockSubscribe.setNewStockId(stockSubscribe.getNewlistId());
                 ret = userStockSubscribeMapper.insert(userStockSubscribe);
+
+                BigDecimal subtract = userAssets.getAvailableBalance().subtract(bound);
+                if(subtract.compareTo(BigDecimal.ZERO) >= 0){
+                    userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(bound));
+                    userAssets.setAvailableBalance(subtract);
+                }else{
+                    userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAvailableBalance()));
+                    userAssets.setAvailableBalance(BigDecimal.ZERO);
+                    userAssets.setAmountToBeCovered(userAssets.getAmountToBeCovered().add(subtract.abs()));
+                }
+                userAssetsMapper.updateById(userAssets);
+
                 if (ret > 0) {
                     return ServerResponse.createBySuccessMsg("申购成功",request);
                 } else {
@@ -153,13 +178,13 @@
                 }
             }else{
 
-               BigDecimal bound;
-               if(stockSubscribe.getMinPrice() != null || stockSubscribe.getMinPrice().compareTo(BigDecimal.ZERO)<0){
-                   bound =  new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getMinPrice());
-               }else{
-                   bound =  new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice());
-               }
-
+//               BigDecimal bound;
+//               if(stockSubscribe.getMinPrice() != null || stockSubscribe.getMinPrice().compareTo(BigDecimal.ZERO)<0){
+//                   bound =  new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getMinPrice());
+//               }else{
+//                   bound =  new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice());
+//               }
+//
                BigDecimal useEnaAmount = iUserAssetsServices.getAvailableBalance(EStockType.IN.getCode(), user.getId());
                if(useEnaAmount.compareTo(bound)<0){
                    return ServerResponse.createByErrorMsg("余额不足,配售失败",request);
@@ -218,23 +243,39 @@
             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("IN", 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.setBond((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNumber())).multiply(new BigDecimal(stockSubscribe.getLever().toString())));
                     model.setDbMoney(model.getDbMoney());
-                    //客户中签直接扣除客户账户可用资金
-                    UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userStockSubscribe.getUserId());
+
                     if(null == userAssets){
                         return ServerResponse.createByErrorMsg("客户资金账户不存在");
                     }
-                    BigDecimal decimal = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(model.getApplyNumber()));//中签总价
-                    BigDecimal availableBalance = userAssets.getAvailableBalance().subtract(decimal);//剩余可用余额
-                    if(decimal.compareTo(userAssets.getAvailableBalance()) <= 0){
-                        userAssets.setAvailableBalance(availableBalance);
+                    int applyNumber = userStockSubscribe.getApplyNums() - model.getApplyNumber();
+                    if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) <= 0){
+                        if(applyNumber > 0){
+                            //需要退回的资金
+                            BigDecimal refundPrice = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(stockSubscribe.getLever())).multiply(new BigDecimal(applyNumber));
+                            userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(refundPrice));
+                            userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(refundPrice));
+                        }
                     }else{
-                        BigDecimal amountToBeCovered = decimal.subtract(userAssets.getAvailableBalance());//待补金额
-                        userAssets.setAvailableBalance(BigDecimal.ZERO);
-                        userAssets.setAmountToBeCovered(userAssets.getAmountToBeCovered().add(amountToBeCovered));
+                        if(applyNumber > 0){
+                            BigDecimal refundPrice = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(stockSubscribe.getLever())).multiply(new BigDecimal(applyNumber));
+                            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);
+                            }
+                        }
                     }
                     userAssetsMapper.updateById(userAssets);
                     ret = userStockSubscribeMapper.update1(model);
@@ -252,6 +293,12 @@
                     ret = userStockSubscribeMapper.update1(model);
                 }
             }else if (model.getStatus() == 2){
+                BigDecimal bond = (stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNums())).multiply(new BigDecimal(stockSubscribe.getLever().toString()));
+                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());
diff --git a/src/main/java/com/nq/ws/WebSocketClientBeanConfig.java b/src/main/java/com/nq/ws/WebSocketClientBeanConfig.java
index 1bcc04a..355774e 100644
--- a/src/main/java/com/nq/ws/WebSocketClientBeanConfig.java
+++ b/src/main/java/com/nq/ws/WebSocketClientBeanConfig.java
@@ -22,7 +22,7 @@
 //
 //        Map<String, WebSocketClient> retMap = new HashMap<>(2);
 //        try {
-//            WebsocketRunClient websocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("IN_WS_URL")),EStockType.IN);
+//            WebsocketRunClient websocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("JS_IN_WS_URL")),EStockType.IN);
 //            websocketRunClient.connect();
 //            websocketRunClient.setConnectionLostTimeout(0);
 //            new Thread(() -> {
diff --git a/src/main/java/com/nq/ws/WebsocketRunClient.java b/src/main/java/com/nq/ws/WebsocketRunClient.java
index dab791e..8b31e4b 100644
--- a/src/main/java/com/nq/ws/WebsocketRunClient.java
+++ b/src/main/java/com/nq/ws/WebsocketRunClient.java
@@ -9,13 +9,21 @@
 //import com.nq.utils.ApplicationContextRegisterUtil;
 //import com.nq.utils.redis.RedisKeyUtil;
 //import lombok.extern.slf4j.Slf4j;
+//import org.apache.http.HttpResponse;
+//import org.apache.http.client.HttpClient;
+//import org.apache.http.client.entity.UrlEncodedFormEntity;
+//import org.apache.http.client.methods.HttpPost;
+//import org.apache.http.impl.client.HttpClients;
+//import org.apache.http.message.BasicNameValuePair;
 //import org.java_websocket.client.WebSocketClient;
 //import org.java_websocket.handshake.ServerHandshake;
 //import org.springframework.context.ApplicationContext;
 //
+//import java.io.IOException;
 //import java.lang.reflect.Type;
 //import java.net.URI;
-//import java.util.Map;
+//import java.nio.charset.StandardCharsets;
+//import java.util.*;
 //
 //@Slf4j
 //public class WebsocketRunClient  extends WebSocketClient {
@@ -28,20 +36,33 @@
 //        this.eStockType = eStockType;
 //    }
 //
+//    private static HttpClient httpClient = HttpClients.createDefault(); // 单例化 HttpClient
+//
+//
+//    private static HttpPost httpPost;
+//    static {
+//        httpPost = new HttpPost("http://127.0.0.1:8001/api/sendNotification"); // 初始化 HttpPost
+//    }
+//
 //    @Override
 //    public void onOpen(ServerHandshake serverHandshake) {
 //        send(("key:"+ eStockType.getStockKey()+":"+eStockType.getContryId()).getBytes());
+//        Timer heartbeatTimer;
+//        // 启动心跳定时器
+//        heartbeatTimer = new Timer();
+//        heartbeatTimer.schedule(new TimerTask() {
+//            @Override
+//            public void run() {
+//                send(("key:"+ eStockType.getStockKey()+":"+eStockType.getContryId()).getBytes());
+//            }
+//        }, 0, 3000); // 每3秒发送一次心跳消息
 //    }
 //
 //    @Override
 //    public void onMessage(String s) {
-//        try {
-//            ApplicationContext act = ApplicationContextRegisterUtil.getApplicationContext();
-//            MandatoryLiquidationService liquidationService = (MandatoryLiquidationService) act.getBean(IMandatoryLiquidationService.class);
+//        if(!s.equals("pong") && !s.equals("身份验证成功")){
 //            StockRealTimeBean stockDetailBean =  new Gson().fromJson(s, StockRealTimeBean.class);
-//            liquidationService.RealTimeDataProcess(eStockType,stockDetailBean);
-//        }catch (Exception e){
-//
+//            RedisKeyUtil.setCacheRealTimeStock(eStockType,stockDetailBean);
 //        }
 //    }
 //
@@ -60,4 +81,24 @@
 //    public void onError(Exception e) {
 //        log.info("websocket 错误");
 //    }
+//
+//    public void sendLoca(String message) {
+//        try {
+//            // 准备 form-data 参数
+//            List<BasicNameValuePair> params = new ArrayList<>();
+//            params.add(new BasicNameValuePair("message", message));
+//
+//            // 设置编码格式为 UTF-8
+//            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, StandardCharsets.UTF_8);
+//            httpPost.setEntity(entity); // 设置 HttpPost 对象的参数
+//
+//            // 发送请求
+//            HttpResponse response = httpClient.execute(httpPost);
+//
+//            // 处理响应
+//            int statusCode = response.getStatusLine().getStatusCode();
+//        } catch (IOException e) {
+//            log.error("Http 请求错误", e);
+//        }
+//    }
 //}
diff --git a/src/main/java/com/nq/ws/WsClientConfig.java b/src/main/java/com/nq/ws/WsClientConfig.java
index 515ec22..9a1d5e8 100644
--- a/src/main/java/com/nq/ws/WsClientConfig.java
+++ b/src/main/java/com/nq/ws/WsClientConfig.java
@@ -8,6 +8,7 @@
 import com.nq.service.impl.MandatoryLiquidationService;
 import com.nq.utils.ApplicationContextRegisterUtil;
 import com.nq.utils.PropertiesUtil;
+import com.nq.utils.redis.RedisKeyUtil;
 import com.nq.ws.client.IO;
 import com.nq.ws.client.Socket;
 import io.socket.emitter.Emitter;
@@ -82,6 +83,8 @@
             @Override
             public void call(Object... args) {
                 send(args[0].toString());
+                StockRealTimeBean stockDetailBean =  new Gson().fromJson(args[0].toString(), StockRealTimeBean.class);
+                RedisKeyUtil.setCacheRealTimeStock(EStockType.IN,stockDetailBean);
             }
         });
 
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 82591db..1a01f8c 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -17,7 +17,7 @@
 ftp.user=ftp_stock
 ftp.pass=123456
 ftp.address =/www/wwwroot/ftp_stock/
-ftp.server.http.prefix=https://img.ispentagon-institution.com/
+ftp.server.http.prefix=https://img.amcfcxn.org/
 
 redis1.ip=localhost
 redis1.port=6379
@@ -50,7 +50,7 @@
 JS_IN_HTTP_API = http://api-in-2-socket.js-stock.top
 JS_IN_HTTP_URL = http://api-in-2.js-stock.top/
 JS_IN_WS_URL =ws://api-in-2-ws.js-stock.top
-JS_IN_KEY = dYD2k9cb38NbSxFDAMoDgWmOh
+JS_IN_KEY = 839tbd9OK88Aby9FbjTvr32hG
 
 US_HTTP_API = http://api-us.js-stock.top/
 US_WS_URL = ws://ws-us.js-stock.top
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 18d5047..fd47f7d 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -15,6 +15,8 @@
       min-spare: 100
 # 日志配置
 logging:
+  file:
+    encoding: UTF-8
   level:
     com.ruoyi: debug
     org.springframework: warn

--
Gitblit v1.9.3