From 3ce36ef27a225cb00b0381c777fd38b0bc74e757 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Mon, 21 Oct 2024 21:36:56 +0800
Subject: [PATCH] 1
---
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java | 89 ++++++++++++++++++++++++++++++++++++++++----
1 files changed, 80 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 e940eed..9b143eb 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(null == number || 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()));
+ BigDecimal nowPrice = BigDecimal.ZERO;
+ if(state == 0){
+ nowPrice = priceServices.getNowPrice(position.getStockCode());
+ }else{
+ nowPrice = position.getSellOrderPrice();
+ }
+//// 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);
}
}
@@ -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);
@@ -1636,10 +1701,14 @@
if (stockDz.getStockNum() > num) {
return ServerResponse.createByErrorMsg("最小购买数据" + stockDz.getStockNum(), request);
}
+
+ BigDecimal siteSettingBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue()) ;
+
BigDecimal buyAmt = nowPrice.multiply(new BigDecimal(num.intValue()));
+ BigDecimal orderFree = siteSettingBuyFee.multiply(buyAmt);
BigDecimal fundratio = new BigDecimal(user.getFundRatio()).divide(new BigDecimal(100));
BigDecimal availableBalance = fundratio.multiply(userAssets.getAvailableBalance());
- if (buyAmt.compareTo(availableBalance) > 0) {
+ if (availableBalance.compareTo(buyAmt.add(orderFree)) < 0) {
return ServerResponse.createByErrorMsg("订单失败,配资不足", request);
}
@@ -1655,7 +1724,9 @@
// 创建UserPosition对象
UserPosition userPosition = getUserPosition(dzId,num, user, stockDz, nowPrice, stock, buyAmt);
userPositionMapper.insert(userPosition);
+ 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