From 30e592bd0975b41e0b4b4140c4b794c2e1e121de Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Mon, 09 Feb 2026 15:21:44 +0800
Subject: [PATCH] 平仓
---
src/main/java/com/nq/service/impl/UserAssetsServices.java | 55 +++++++++++++++++++++++++++
src/main/java/com/nq/service/IUserAssetsServices.java | 11 +++++
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java | 41 +++++++++++---------
3 files changed, 89 insertions(+), 18 deletions(-)
diff --git a/src/main/java/com/nq/service/IUserAssetsServices.java b/src/main/java/com/nq/service/IUserAssetsServices.java
index ae7475a..29278bc 100644
--- a/src/main/java/com/nq/service/IUserAssetsServices.java
+++ b/src/main/java/com/nq/service/IUserAssetsServices.java
@@ -48,4 +48,15 @@
Boolean availablebalanceChange(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount, String desc, String descType);
+ /**
+ * 平仓返回保证金
+ * @param accetType
+ * @param userId
+ * @param eUserAssets
+ * @param amount
+ * @param fzAmount 解冻资金
+ * @return
+ */
+ Boolean availablebalanceSell(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount, BigDecimal fzAmount);
+
}
diff --git a/src/main/java/com/nq/service/impl/UserAssetsServices.java b/src/main/java/com/nq/service/impl/UserAssetsServices.java
index 49ad7ca..254029f 100644
--- a/src/main/java/com/nq/service/impl/UserAssetsServices.java
+++ b/src/main/java/com/nq/service/impl/UserAssetsServices.java
@@ -184,10 +184,15 @@
BigDecimal availableBalance = amount.subtract(userAssets.getAmountToBeCovered());
availableBalance = availableBalance.subtract(userAssets.getHandlingChargeWritten());
if(availableBalance.compareTo(BigDecimal.ZERO) >= 0){
+ //冻结 扣除的已补金额
+ userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAmountToBeCovered()));
+
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
userAssets.setAmountToBeCovered(BigDecimal.ZERO);
userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
}else{
+ userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount));
+
BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(amount);
userAssets.setAmountToBeCovered(amountToBeCovered);
}
@@ -265,6 +270,56 @@
return userAssetsMapper.updateById(userAssets)>1;
}
+ //平仓返回保证金
+ @Override
+ public Boolean availablebalanceSell(String accetType, Integer userId, EUserAssets eUserAssets, BigDecimal amount, BigDecimal fzAmount) {
+
+ UserAssets userAssets = assetsByTypeAndUserId(accetType,userId);
+ UserPosition userPosition = userPositionMapper.selectOne(new LambdaQueryWrapper<UserPosition>().gt(UserPosition::getAmountToBeCovered, BigDecimal.ZERO).eq(UserPosition::getUserId,userAssets.getUserId()));
+ String before = userAssets.getAvailableBalance().toString();
+ String accectType = userAssets.getAccectType();
+ if(Objects.equals(eUserAssets.getCode(), EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT.getCode())){
+ userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(fzAmount));
+ if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
+ BigDecimal availableBalance = amount.subtract(userAssets.getAmountToBeCovered());
+ availableBalance = availableBalance.subtract(userAssets.getHandlingChargeWritten());
+ if(availableBalance.compareTo(BigDecimal.ZERO) >= 0){
+ //冻结 扣除的已补金额
+ userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userAssets.getAmountToBeCovered()));
+
+ userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(availableBalance));
+ userAssets.setAmountToBeCovered(BigDecimal.ZERO);
+ userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
+ }else{
+ userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount));
+
+ BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(amount);
+ userAssets.setAmountToBeCovered(amountToBeCovered);
+ }
+ }else{
+ userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
+ }
+ }
+
+ if(null != userPosition){
+ userPosition.setAmountToBeCovered(userAssets.getAmountToBeCovered().add(userAssets.getHandlingChargeWritten()));
+ userPositionMapper.updateById(userPosition);
+ }
+ String after = userAssets.getAvailableBalance().toString();
+ MoneyLog moneyLog = new MoneyLog();
+ moneyLog.setDescs(eUserAssets.getDesc());
+ moneyLog.setBeFore(before);
+ moneyLog.setAfter(after);
+ moneyLog.setAmount(amount.toString());
+ moneyLog.setAccectType(accectType);
+ moneyLog.setType(eUserAssets.getCode());
+ moneyLog.setUserId(userId+"");
+ moneyLog.setSymbol(EStockType.getEStockTypeByCode(accetType).getSymbol());
+ moneyLog.setCreateTime(new Date());
+ moneyLogMapper.insert(moneyLog);
+ return userAssetsMapper.updateById(userAssets)>1;
+ }
+
//只要涉及到cumulativeProfitAndLoss变动重新设置状态
private static void extracted(UserAssets userAssets) {
if(userAssets.getCumulativeProfitAndLoss().compareTo(BigDecimal.ZERO) >= 0){
diff --git a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
index 5c9e9d9..1f635c4 100644
--- a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -306,9 +306,9 @@
.eq(UserAssets::getUserId, userPosition.getUserId())
.eq(UserAssets::getAccectType, "JP")
);
- if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
+ /*if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
return ServerResponse.createByErrorMsg("用户待补资金未补齐,禁止平仓");
- }
+ }*/
if (userPosition.getSellOrderId() != null) {
return ServerResponse.createByErrorMsg("平仓失败, 订单已平仓");
}
@@ -327,16 +327,21 @@
BigDecimal sellOrderTotel = nowPrice.multiply(new BigDecimal(userPosition.getOrderNum()));
BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee);
userPositionMapper.updateById(userPosition);
- userAssetsServices.availablebalanceChange(stock.getStockType(),
+
+ PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition, priceServices.getNowPrice(userPosition.getStockCode()));
+ /*userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION,
+ profitVO.getAllProfitAndLose(), "", "");*/
+
+ //从保证金里计算盈亏
+ BigDecimal returnAmt = userPosition.getOrderTotalPrice().add(profitVO.getAllProfitAndLose());
+
+ userAssetsServices.availablebalanceSell(stock.getStockType(),
userPosition.getUserId(), EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT,
- userPosition.getOrderTotalPrice(), "", "");
+ returnAmt, userPosition.getOrderTotalPrice());
userAssetsServices.availablebalanceChange(stock.getStockType(),
userPosition.getUserId(), EUserAssets.HANDLING_CHARGE,
xsPrice, "", "");
- PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition, priceServices.getNowPrice(userPosition.getStockCode()));
- userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION,
- profitVO.getAllProfitAndLose(), "", "");
return ServerResponse.createBySuccessMsg("平仓成功!");
}
@@ -360,9 +365,9 @@
.eq(UserAssets::getUserId, userPosition.getUserId())
.eq(UserAssets::getAccectType, "JP")
);
- if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
+ /*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())) {
@@ -444,20 +449,20 @@
BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee);
userPosition.setOrderFee(userPosition.getOrderFee().add(xsPrice));
userPositionMapper.updateById(userPosition);
- userAssetsServices.availablebalanceChange(stock.getStockType(),
+ PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition, priceServices.getNowPrice(userPosition.getStockCode()));
+ /*userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION,
+ profitVO.getAllProfitAndLose(), "", "");*/
+
+ //从保证金里计算盈亏
+ BigDecimal returnAmt = userPosition.getOrderTotalPrice().add(profitVO.getAllProfitAndLose());
+
+ userAssetsServices.availablebalanceSell(stock.getStockType(),
userPosition.getUserId(),
EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT,
- userPosition.getOrderTotalPrice(), "", "");
+ returnAmt, userPosition.getOrderTotalPrice());
userAssetsServices.availablebalanceChange(stock.getStockType(),
userPosition.getUserId(), EUserAssets.HANDLING_CHARGE,
xsPrice, "", "");
-
- PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition,
- priceServices.getNowPrice(userPosition.getStockCode()));
-
- userAssetsServices.availablebalanceChange(stock.getStockType(),
- userPosition.getUserId(), EUserAssets.CLOSE_POSITION,
- profitVO.getAllProfitAndLose(), "", "");
return ServerResponse.createBySuccessMsg("平仓成功!", request);
}
--
Gitblit v1.9.3