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 +++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 79 insertions(+), 32 deletions(-)

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());

--
Gitblit v1.9.3