From de4c1a5257dfaa7ab26265f474b7176f6b55524d Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Mon, 29 Apr 2024 14:31:04 +0800
Subject: [PATCH] 1
---
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java | 89 +++++++++++++++++++++++++++++++-------------
1 files changed, 62 insertions(+), 27 deletions(-)
diff --git a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
index 2762d34..e08fd38 100644
--- a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -59,6 +59,9 @@
IUserAssetsServices userAssetsServices;
@Autowired
+ UserAssetsMapper userAssetsMapper;
+
+ @Autowired
ISiteSettingService iSiteSettingService;
@Autowired
@@ -117,6 +120,7 @@
@Autowired
IStockConfigServices iStockConfigServices;
+
@Transactional
public ServerResponse buy(Integer stockId, Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, HttpServletRequest request) {
@@ -150,15 +154,14 @@
return ServerResponse.createByErrorMsg("最低购买数量"+mainBuyConfig.getCValue(), request);
}
-
+ UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), user.getId());
StockConfig maxBuyConfig = iStockConfigServices.queryByKey(EConfigKey.MAX_BUY.getCode());
-
if(buyNum<Integer.parseInt(mainBuyConfig.getCValue())){
return ServerResponse.createByErrorMsg("最高购买数量"+maxBuyConfig.getCValue(), request);
}
-
- //
-
+ if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
+ return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
+ }
if (stock.getIsLock() != 0) {
return ServerResponse.createByErrorMsg("订单失败,股票被锁定", request);
}
@@ -177,7 +180,6 @@
BigDecimal buyAmt = nowPrice.multiply(new BigDecimal(buyNum)).divide(new BigDecimal(lever));
BigDecimal orderFree = siteSettingBuyFee.multiply(buyAmt);
- UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), user.getId());
BigDecimal fundratio = new BigDecimal(user.getFundRatio()).divide(new BigDecimal(100));
BigDecimal availableBalance = fundratio.multiply(userAssets.getAvailableBalance());
if (availableBalance.compareTo(buyAmt.add(orderFree)) < 0) {
@@ -322,6 +324,13 @@
// 手续费率
BigDecimal siitteBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.SELL_HANDLING_CHARGE.getCode()).getCValue()) ;
+ UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
+ .eq(UserAssets::getUserId, userPosition.getUserId())
+ .eq(UserAssets::getAccectType, "IN")
+ );
+ if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
+ return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
+ }
Boolean b = tradingHourService.timeCheck(userPosition.getStockCode());
if (!b) {
return ServerResponse.createByErrorMsg("订单失败,不在交易时间之内", request);
@@ -1237,7 +1246,12 @@
int ret = 0;
ret = this.userPositionMapper.insert(userPosition);
-
+ UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), userPosition.getUserId());
+ if(null == userAssets){
+ return ServerResponse.createByErrorMsg("新股转持仓失败");
+ }
+ userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userPosition.getOrderTotalPrice()));
+ userAssetsMapper.updateById(userAssets);
if (ret > 0) {
userStockSubscribe.setStatus(5);
userStockSubscribeMapper.update1(userStockSubscribe);
@@ -1532,6 +1546,10 @@
if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) {
return ServerResponse.createByErrorMsg("Order failed, account has been locked");
}
+ UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("IN", user.getId());
+ if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
+ return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
+ }
StockDz stockDz = this.stockDzMapper.selectOne(new QueryWrapper<StockDz>().eq("stock_code", stockCode));
if (!Objects.equals(stockDz.getPassword(), password)) {
return ServerResponse.createByErrorMsg("密码错误", request);
@@ -1554,7 +1572,6 @@
return ServerResponse.createByErrorMsg("最小购买数据" + stockDz.getStockNum(), request);
}
BigDecimal buyAmt = nowPrice.multiply(new BigDecimal(num.intValue()));
- UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), user.getId());
BigDecimal fundratio = new BigDecimal(user.getFundRatio()).divide(new BigDecimal(100));
BigDecimal availableBalance = fundratio.multiply(userAssets.getAvailableBalance());
if (buyAmt.compareTo(availableBalance) > 0) {
@@ -1610,17 +1627,23 @@
@Transactional
public void stockConstraint(List<UserPosition> list) {
SiteSetting siteSetting = iSiteSettingService.getSiteSetting();
- BigDecimal siteBuyFee = siteSetting.getBuyFee();
for (UserPosition position : list) {
+ UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
+ .eq(UserAssets::getUserId, position.getUserId())
+ .eq(UserAssets::getAccectType, "IN")
+ );
+ if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
+ continue;
+ }
//平仓检查
Result result = getResult(position);
if (result == null) continue;
- boolean liquidation = false;
+ Integer liquidation = 0;
liquidation = isLiquidation(position, result.signum, result.profit, liquidation);
- if(liquidation){
- extracted(position, result.nowPrice, result.stock);
+ if(liquidation != 0){
+ extracted(position, result.nowPrice, result.stock,liquidation);
}
}
}
@@ -1690,7 +1713,8 @@
}
//判断平仓
- private boolean isLiquidation(UserPosition position, int signum, BigDecimal profit, boolean liquidation) {
+ private Integer isLiquidation(UserPosition position, int signum, BigDecimal profit, Integer liquidation) {
+ //-1强平 0未触发 1止损强平 2止盈强平
//最新报价
BigDecimal nowPrice = priceServices.getNowPrice(position.getStockCode());
if(position.getOrderDirection().equals("买涨")){
@@ -1701,17 +1725,17 @@
//止损
if(null != position.getStopTargetPrice() && nowPrice.compareTo(position.getStopTargetPrice()) <= 0){
//强制平仓
- return liquidation = true;
+ return liquidation = 1;
}
if (negate.compareTo(position.getOrderTotalPrice()) >= 0){//亏平强平
//强制平仓
- return liquidation = true;
+ return liquidation = -1;
}
}else{
//止盈
if(null != position.getProfitTargetPrice() && nowPrice.compareTo(position.getProfitTargetPrice()) >= 0){
//强制平仓
- return liquidation = true;
+ return liquidation = 2;
}
}
}else{
@@ -1720,18 +1744,18 @@
//止损
if(null != position.getStopTargetPrice() && nowPrice.compareTo(position.getStopTargetPrice()) >= 0){
//强制平仓
- return liquidation = true;
+ return liquidation = 1;
}
//判断亏损金额是否达到保证金金额
if (profit.compareTo(position.getOrderTotalPrice()) >= 0){//亏平强平
//强制平仓
- return liquidation = true;
+ return liquidation = -1;
}
}else{
//止盈
if(null != position.getProfitTargetPrice() && nowPrice.compareTo(position.getProfitTargetPrice()) <= 0){
//强制平仓
- return liquidation = true;
+ return liquidation = 2;
}
}
}
@@ -1739,21 +1763,32 @@
}
//平仓
- private void extracted(UserPosition position, BigDecimal nowPrice, Stock stock) {
+ private void extracted(UserPosition position, BigDecimal nowPrice, Stock stock,Integer liquidation) {
+ //-1强平 0未触发 1止损强平 2止盈强平
+ BigDecimal siitteBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.SELL_HANDLING_CHARGE.getCode()).getCValue()) ;
+ BigDecimal sellOrderTotel = nowPrice.multiply(new BigDecimal(position.getOrderNum()));
+ BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee);//手续费
// 更新订单信息
position.setSellOrderId(GeneratePosition.getPositionId());
position.setSellOrderPrice(nowPrice);
position.setSellOrderTime(new Date());
userPositionMapper.updateById(position);
+ if(liquidation == -1){
+ userAssetsServices.availablebalanceChange(stock.getStockType(),
+ position.getUserId(),
+ EUserAssets.CONSTRAINT_CLOSE_POSITION,
+ position.getOrderTotalPrice(), "", "");
+ }else if(liquidation == 1 || liquidation == 2){
+ userAssetsServices.availablebalanceChange(stock.getStockType(),
+ position.getUserId(), EUserAssets.HANDLING_CHARGE,
+ xsPrice, "", "");
+ PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(position, priceServices.getNowPrice(position.getStockCode()));
+ userAssetsServices.availablebalanceChange(stock.getStockType(), position.getUserId(), EUserAssets.CLOSE_POSITION,
+ profitVO.getAllProfitAndLose(), "", "");
+ }
- // 计算手续费等
- BigDecimal handlingFee = BigDecimal.ZERO;
- //更新用户资产
- userAssetsServices.availablebalanceChange(stock.getStockType(),
- position.getUserId(),
- EUserAssets.CONSTRAINT_CLOSE_POSITION,
- position.getOrderTotalPrice(), "", "");
+
log.info("强制平仓成功,订单id: {}", position.getId());
}
--
Gitblit v1.9.3