From d615fc515fc52d6ed970c11d59a017e48de4be32 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Tue, 16 Jun 2026 16:43:58 +0800
Subject: [PATCH] 1
---
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java | 349 +++++++++++++++++++++++++++++++++++----------------------
1 files changed, 214 insertions(+), 135 deletions(-)
diff --git a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
index 180937d..005c265 100644
--- a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -11,6 +11,7 @@
import com.google.common.collect.Lists;
import com.nq.common.ServerResponse;
import com.nq.utils.*;
+import com.nq.utils.StayFeeUtil;
import com.nq.utils.TradeFeeUtil;
import com.nq.utils.redis.JsonUtil;
import com.nq.utils.redis.RedisShardedPoolUtils;
@@ -181,7 +182,7 @@
if (!am_flag && !pm_flag) {
return ServerResponse.createByErrorMsg("下单失败,不在港股股交易时段内");
}
- if (siteProduct.getHolidayDisplay()) {
+ if (TradingDayUtil.shouldBlockTradingToday(siteProduct)) {
return ServerResponse.createByErrorMsg("周末或节假日不能交易!");
}
} else {
@@ -196,7 +197,7 @@
if (!am_flag && !pm_flag) {
return ServerResponse.createByErrorMsg("下单失败,不在交易时段内");
}
- if (siteProduct.getHolidayDisplay()) {
+ if (TradingDayUtil.shouldBlockTradingToday(siteProduct)) {
return ServerResponse.createByErrorMsg("周末或节假日不能交易!");
}
}
@@ -388,7 +389,7 @@
}
- BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(buy_amt_autual);
+ BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(buy_amt_autual, siteSetting.getBuyFee());
BigDecimal buy_debit = TradeFeeUtil.calcBuyDebit(buy_amt_autual, buy_fee_amt);
int compareUserAmtInt = user_enable_amt.compareTo(buy_debit);
log.info("用户可用金额 = {} 下单扣款(保证金+手续费) = {}", user_enable_amt, buy_debit);
@@ -499,9 +500,16 @@
@Override
public ServerResponse fee(Integer buyNum, BigDecimal nowPrice, Integer lever) {
int leverValue = (lever == null || lever <= 0) ? 1 : lever;
+ SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting();
BigDecimal buy_amt = nowPrice.multiply(new BigDecimal(buyNum.intValue()));
- BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFeeByNotional(buy_amt, leverValue).setScale(2, 4);
+ BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFeeByNotional(buy_amt, leverValue,
+ siteSetting != null ? siteSetting.getBuyFee() : null).setScale(2, RoundingMode.HALF_UP);
return ServerResponse.createBySuccess(buy_fee_amt);
+ }
+
+ /** T+0:可用资金变动时同步调整可取资金 */
+ private void applyEnableAndWithdrawChange(User user, BigDecimal enableBefore, BigDecimal enableAfter) {
+ UserFundUtil.applyEnableDelta(user, enableBefore, enableAfter);
}
/** 下单从两融可用资金扣除:保证金 + 买入手续费 */
@@ -651,7 +659,7 @@
if (!am_flag && !pm_flag && siteProduct.getTranWithdrawDisplay()) {
return ServerResponse.createByErrorMsg("挂单失败,不在交易时段内");
}
- if (siteProduct.getHolidayDisplay() && siteProduct.getTranWithdrawDisplay()) {
+ if (siteProduct.getTranWithdrawDisplay() && TradingDayUtil.shouldBlockTradingToday(siteProduct)) {
return ServerResponse.createByErrorMsg("周末或节假日不能交易!");
}
@@ -790,7 +798,7 @@
.getBuyMaxAmtPercent().multiply(new BigDecimal("100")) + "%");
}
- BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(buy_amt_autual);
+ BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(buy_amt_autual, siteSetting.getBuyFee());
BigDecimal buy_debit = TradeFeeUtil.calcBuyDebit(buy_amt_autual, buy_fee_amt);
if (user_enable_amt.compareTo(buy_debit) == -1) {
return ServerResponse.createByErrorMsg("挂单失败,融资可用金额小于" + buy_debit + "元(含保证金及手续费)");
@@ -989,7 +997,7 @@
return ServerResponse.createByErrorMsg("平仓失败,不在交易时段内");
}
SiteProduct siteProduct = iSiteProductService.getProductSetting();
- if (siteProduct != null && siteProduct.getHolidayDisplay()) {
+ if (TradingDayUtil.shouldBlockTradingToday(siteProduct)) {
return ServerResponse.createByErrorMsg("周末或节假日不能交易!");
}
return null;
@@ -1160,9 +1168,9 @@
BigDecimal sell_fee_amt = all_sell_amt.multiply(siteSetting.getSellFee()).setScale(2, 4);
log.info("卖出手续费 = {}", sell_fee_amt);
- // 买入手续费已在下单时扣除,平仓只结算卖出侧费用
- BigDecimal all_fee_amt = sell_fee_amt.add(orderSpread).add(orderStayFee).add(spreadRatePrice);
- log.info("总的手续费费用 = {}", all_fee_amt);
+ // 买入手续费已在下单时扣除;递延费已在持仓期间从余额实时扣除,平仓不再重复扣款
+ BigDecimal close_fee_amt = sell_fee_amt.add(orderSpread).add(spreadRatePrice);
+ log.info("平仓结算费用(不含递延费) = {}", close_fee_amt);
userPosition.setSellOrderId(GeneratePosition.getPositionId());
userPosition.setSellOrderPrice(now_price);
@@ -1173,8 +1181,10 @@
userPosition.setProfitAndLose(profitLoss);
- BigDecimal all_profit = profitLoss.subtract(all_fee_amt);
- userPosition.setAllProfitAndLose(all_profit);
+ BigDecimal all_profit_balance = profitLoss.subtract(close_fee_amt);
+ BigDecimal all_profit_display = all_profit_balance.subtract(
+ orderStayFee == null ? BigDecimal.ZERO : orderStayFee);
+ userPosition.setAllProfitAndLose(all_profit_display);
userPosition.setStatus(2);
int updatePositionCount = this.userPositionMapper.updateByPrimaryKeySelective(userPosition);
@@ -1188,13 +1198,13 @@
BigDecimal freez_amt = all_buy_amt.divide(new BigDecimal(userPosition.getOrderLever().intValue()), 2, 4);
//BigDecimal freez_amt = all_buy_amt;
- BigDecimal reckon_all = user_all_amt.add(all_profit);
+ BigDecimal reckon_all = user_all_amt.add(all_profit_balance);
//修改用戶可用余額=當前可用余額+總盈虧+買入總金額+追加保證金
- BigDecimal reckon_enable = user_enable_amt.add(all_profit).add(freez_amt).add(userPosition.getMarginAdd());
+ BigDecimal reckon_enable = user_enable_amt.add(all_profit_balance).add(freez_amt).add(userPosition.getMarginAdd());
log.info("用戶平倉後的總資金 = {} , 可用資金 = {}", reckon_all, reckon_enable);
user.setUserAmt(reckon_all);
- user.setEnableAmt(reckon_enable);
+ applyEnableAndWithdrawChange(user, user_enable_amt, reckon_enable);
int updateUserCount = this.userMapper.updateByPrimaryKeySelective(user);
if (updateUserCount > 0) {
log.info("【用戶平倉】修改用戶金額成功");
@@ -1210,8 +1220,10 @@
ucd.setUserId(user.getId());
ucd.setUserName(user.getRealName());
ucd.setDeType("总盈亏");
- ucd.setDeAmt(all_profit);
- ucd.setDeSummary("卖出股票," + userPosition.getStockCode() + "/" + userPosition.getStockName() + ",占用本金:" + freez_amt + ",总手续费:" + all_fee_amt + ",盈亏:" + profitLoss + ",总盈亏:" + all_profit);
+ ucd.setDeAmt(all_profit_balance);
+ ucd.setDeSummary("卖出股票," + userPosition.getStockCode() + "/" + userPosition.getStockName() + ",占用本金:" + freez_amt
+ + ",总手续费:" + order_fee_all + ",递延费:" + (orderStayFee == null ? BigDecimal.ZERO : orderStayFee)
+ + ",盈亏:" + profitLoss + ",总盈亏:" + all_profit_display);
ucd.setAddTime(new Date());
ucd.setIsRead(Integer.valueOf(0));
@@ -1367,7 +1379,7 @@
BigDecimal partialMargin = all_buy_amt.divide(
new BigDecimal(userPosition.getOrderLever()), 2, RoundingMode.HALF_UP);
- BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(partialMargin);
+ BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(partialMargin, siteSetting.getBuyFee());
log.info("買入手續費 = {}", buy_fee_amt);
BigDecimal orderSpread = all_buy_amt.multiply(siteSetting.getDutyFee()).setScale(2, 4);
@@ -1430,7 +1442,7 @@
log.info("用戶平倉後的總資金 = {} , 可用資金 = {}", reckon_all, reckon_enable);
user.setUserAmt(reckon_all);
- user.setEnableAmt(reckon_enable);
+ applyEnableAndWithdrawChange(user, user_enable_amt, reckon_enable);
int updateUserCount = this.userMapper.updateByPrimaryKeySelective(user);
if (updateUserCount > 0) {
log.info("【用戶平倉】修改用戶金額成功");
@@ -1447,7 +1459,7 @@
ucd.setUserName(user.getRealName());
ucd.setDeType("总盈亏");
ucd.setDeAmt(all_profit);
- ucd.setDeSummary("卖出股票," + userPositionNew.getStockCode() + "/" + userPositionNew.getStockName() + ",占用本金:" + freez_amt + ",总手续费:" + all_fee_amt + ",递延费:" + 0 + ",印花稅:" + orderSpread + ",盈亏:" + profitLoss + ",总盈亏:" + all_profit);
+ ucd.setDeSummary("卖出股票," + userPositionNew.getStockCode() + "/" + userPositionNew.getStockName() + ",占用本金:" + freez_amt + ",总手续费:" + order_fee_all + ",递延费:" + 0 + ",印花稅:" + orderSpread + ",盈亏:" + profitLoss + ",总盈亏:" + all_profit);
ucd.setAddTime(new Date());
ucd.setIsRead(Integer.valueOf(0));
@@ -1503,7 +1515,7 @@
return ServerResponse.createByErrorMsg("不允许追加,请联系管理员");
}
- if (siteProduct.getHolidayDisplay()) {
+ if (TradingDayUtil.shouldBlockTradingToday(siteProduct)) {
return ServerResponse.createByErrorMsg("周末或节假日不能交易!");
}
@@ -1540,7 +1552,7 @@
BigDecimal reckon_enable = user_enable_amt.subtract(marginAdd);
log.info("用户追加保证金后的总资金 = {} , 可用资金 = {}", user_all_amt, reckon_enable);
- user.setEnableAmt(reckon_enable);
+ applyEnableAndWithdrawChange(user, user_enable_amt, reckon_enable);
int updateUserCount = this.userMapper.updateByPrimaryKeySelective(user);
if (updateUserCount > 0) {
log.info("【用户平仓】修改用户金额成功");
@@ -1924,7 +1936,7 @@
BigDecimal buy_amt_autual = buy_amt.divide(new BigDecimal(lever.intValue()), 2, 4);
- BigDecimal buy_fee_amt_check = TradeFeeUtil.calcBuyFee(buy_amt_autual);
+ BigDecimal buy_fee_amt_check = TradeFeeUtil.calcBuyFee(buy_amt_autual, siteSetting.getBuyFee());
BigDecimal buy_debit_check = TradeFeeUtil.calcBuyDebit(buy_amt_autual, buy_fee_amt_check);
if (user_enable_amt.compareTo(buy_debit_check) < 0) {
log.info("下单失败,用户可用金额小于{}元(含保证金及手续费)", buy_debit_check);
@@ -1985,7 +1997,7 @@
userPosition.setOrderStayDays(1);
- BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(buy_amt_autual).setScale(2, 4);
+ BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(buy_amt_autual, siteSetting.getBuyFee()).setScale(2, 4);
log.info("创建模拟持仓 手续费(保证金 * 百分比) = {}", buy_fee_amt);
userPosition.setOrderFee(buy_fee_amt);
@@ -2056,127 +2068,165 @@
public void doClosingStayTask() {
List<UserPosition> userPositions = this.userPositionMapper.findAllStayPosition();
-
-
- if (userPositions.size() > 0) {
- log.info("查询到正在持仓的订单数量 = {}", Integer.valueOf(userPositions.size()));
-
- SiteProduct siteProduct = iSiteProductService.getProductSetting();
- if (!siteProduct.getHolidayDisplay()) {
- for (UserPosition position : userPositions) {
- int stayDays = GetStayDays.getDays(GetStayDays.getBeginDate(position.getBuyOrderTime()));
- //递延费特殊处理
- stayDays = stayDays + 1;
-
- log.info("");
- log.info("开始处理 持仓订单id = {} 订单号 = {} 用户id = {} realName = {} 留仓天数 = {}", new Object[]{position
- .getId(), position.getPositionSn(), position.getUserId(), position
- .getNickName(), Integer.valueOf(stayDays)});
-
- if (stayDays != 0) {
- log.info(" 开始收取 {} 天 留仓费", Integer.valueOf(stayDays));
- try {
- closingStayTask(position, Integer.valueOf(stayDays));
- } catch (Exception e) {
- log.error("doClosingStayTask = ", e);
-
-
- }
-
-
- } else {
-
-
- log.info("持仓订单 = {} ,持仓天数0天,不需要处理...", position.getId());
- }
-
- log.info("修改留仓费 处理结束。");
- log.info("");
- }
-
- SiteTaskLog stl = new SiteTaskLog();
- stl.setTaskType("扣除留仓费");
- stl.setAddTime(new Date());
- stl.setIsSuccess(Integer.valueOf(0));
- stl.setTaskTarget("扣除留仓费,订单数量为" + userPositions.size());
- this.siteTaskLogMapper.insert(stl);
- }
- } else {
+ if (userPositions.isEmpty()) {
log.info("doClosingStayTask没有正在持仓的订单");
+ return;
}
+
+ log.info("查询到正在持仓的订单数量 = {}", userPositions.size());
+ SiteProduct siteProduct = iSiteProductService.getProductSetting();
+ boolean respectHoliday = TradingDayUtil.isHolidayRestrictionEnabled(siteProduct);
+ if (StayFeeUtil.shouldSkipStayFeeTaskToday(respectHoliday)) {
+ log.info("节假日休市开关已开启且今日休市,跳过递延费扣款");
+ return;
+ }
+
+ SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting();
+ if (siteSetting == null) {
+ log.error("递延费扣款失败,网站设置表不存在");
+ return;
+ }
+
+ int processed = 0;
+ for (UserPosition position : userPositions) {
+ log.info("开始处理递延费 持仓id={} 订单号={} 用户={}", position.getId(), position.getPositionSn(), position.getUserId());
+ try {
+ int billedDays = position.getOrderStayDays() == null ? 0 : position.getOrderStayDays();
+ if (siteSetting.getStayMaxDays() != null && billedDays >= siteSetting.getStayMaxDays().intValue()) {
+ log.info("递延费已达最大天数{},强制平仓 positionSn={}", siteSetting.getStayMaxDays(), position.getPositionSn());
+ this.sell(position.getPositionSn(), 0);
+ continue;
+ }
+ if (!StayFeeUtil.isEligibleForCharge(position.getBuyOrderTime(), position.getOrderStayDays(), respectHoliday)) {
+ log.info("持仓订单={} 未到T+1递延费扣款日或今日已扣,跳过", position.getId());
+ continue;
+ }
+ closingStayTask(position, null);
+ processed++;
+ } catch (Exception e) {
+ log.error("doClosingStayTask positionSn=" + position.getPositionSn(), e);
+ }
+ }
+
+ SiteTaskLog stl = new SiteTaskLog();
+ stl.setTaskType("扣除递延费");
+ stl.setAddTime(new Date());
+ stl.setIsSuccess(Integer.valueOf(0));
+ stl.setTaskTarget("扣除递延费,持仓数量" + userPositions.size() + ",实际扣款" + processed);
+ this.siteTaskLogMapper.insert(stl);
}
- /*留仓到期强制平仓,每天15点执行*/
+ /*递延费达到最大天数强制平仓*/
public void expireStayUnwindTask() {
List<UserPosition> userPositions = this.userPositionMapper.findAllStayPosition();
+ if (userPositions.isEmpty()) {
+ log.info("expireStayUnwindTask没有正在持仓的订单");
+ return;
+ }
+ SiteProduct siteProduct = iSiteProductService.getProductSetting();
+ boolean respectHoliday = TradingDayUtil.isHolidayRestrictionEnabled(siteProduct);
+ if (StayFeeUtil.shouldSkipStayFeeTaskToday(respectHoliday)) {
+ log.info("节假日休市开关已开启且今日休市,跳过递延费到期强平");
+ return;
+ }
- if (userPositions.size() > 0) {
- log.info("查询到正在持仓的订单数量 = {}", Integer.valueOf(userPositions.size()));
+ SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting();
+ if (siteSetting == null || siteSetting.getStayMaxDays() == null) {
+ return;
+ }
+ int maxDays = siteSetting.getStayMaxDays().intValue();
- SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting();
- for (UserPosition position : userPositions) {
- int stayDays = GetStayDays.getDays(GetStayDays.getBeginDate(position.getBuyOrderTime()));
-
- log.info("");
- log.info("开始处理 持仓订单id = {} 订单号 = {} 用户id = {} realName = {} 留仓天数 = {}", new Object[]{position
- .getId(), position.getPositionSn(), position.getUserId(), position
- .getNickName(), Integer.valueOf(stayDays)});
-
- //留仓达到最大天数
- if (stayDays >= siteSetting.getStayMaxDays().intValue()) {
- log.info(" 开始强平 {} 天", Integer.valueOf(stayDays));
- try {
- this.sell(position.getPositionSn(), 0);
- } catch (Exception e) {
- log.error("expireStayUnwindTask = ", e);
- }
- } else {
- log.info("持仓订单 = {} ,持仓天数0天,不需要处理...", position.getId());
+ for (UserPosition position : userPositions) {
+ int billedDays = position.getOrderStayDays() == null ? 0 : position.getOrderStayDays();
+ if (billedDays >= maxDays) {
+ log.info("递延费天数{}达上限{},强制平仓 positionSn={}", billedDays, maxDays, position.getPositionSn());
+ try {
+ this.sell(position.getPositionSn(), 0);
+ } catch (Exception e) {
+ log.error("expireStayUnwindTask positionSn=" + position.getPositionSn(), e);
}
}
- } else {
- log.info("doClosingStayTask没有正在持仓的订单");
}
}
@Transactional
public ServerResponse closingStayTask(UserPosition position, Integer stayDays) throws Exception {
- log.info("=================closingStayTask====================");
- log.info("修改留仓费,持仓id={},持仓天数={}", position.getId(), stayDays);
-
+ log.info("=================closingStayTask 递延费扣款====================");
SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting();
if (siteSetting == null) {
- log.error("修改留仓费出错,网站设置表不存在");
- return ServerResponse.createByErrorMsg("修改留仓费出错,网站设置表不存在");
+ log.error("递延费扣款失败,网站设置表不存在");
+ return ServerResponse.createByErrorMsg("递延费扣款失败,网站设置表不存在");
}
+ SiteProduct siteProduct = iSiteProductService.getProductSetting();
+ boolean respectHoliday = TradingDayUtil.isHolidayRestrictionEnabled(siteProduct);
+ int daysToCharge = StayFeeUtil.getDaysToChargeThisRun(
+ position.getBuyOrderTime(), position.getOrderStayDays(), respectHoliday);
+ if (daysToCharge <= 0) {
+ return ServerResponse.createBySuccess();
+ }
- BigDecimal stayFee = position.getOrderTotalPrice().multiply(siteSetting.getStayFee());
+ PositionProfitVO profitVO = getPositionProfitVO(position);
+ BigDecimal marketValue = profitVO.getOrderTotalPrice();
+ BigDecimal billingMarketValue = StayFeeUtil.calcBillingMarketValue(marketValue);
+ BigDecimal dailyFee = StayFeeUtil.calcDailyStayFee(marketValue, siteSetting.getStayFee());
+ BigDecimal totalFee = dailyFee.multiply(new BigDecimal(daysToCharge)).setScale(2, RoundingMode.HALF_UP);
+ log.info("持仓id={} 市值={} 计费基数={} 单日递延费={} 本次扣费天数={} 合计={}",
+ position.getId(), marketValue, billingMarketValue, dailyFee, daysToCharge, totalFee);
- BigDecimal allStayFee = stayFee.multiply(new BigDecimal(stayDays.intValue()));
+ if (totalFee.compareTo(BigDecimal.ZERO) <= 0) {
+ return ServerResponse.createBySuccess();
+ }
- log.info("总留仓费 = {}", allStayFee);
+ User user = this.userMapper.selectByPrimaryKey(position.getUserId());
+ if (user == null) {
+ throw new Exception("递延费扣款失败,用户不存在");
+ }
+ BigDecimal enableAmt = user.getEnableAmt() == null ? BigDecimal.ZERO : user.getEnableAmt();
+ if (enableAmt.compareTo(totalFee) < 0) {
+ log.info("余额不足支付递延费{},可用{},强制平仓 positionSn={}", totalFee, enableAmt, position.getPositionSn());
+ this.sell(position.getPositionSn(), 0);
+ return ServerResponse.createBySuccess();
+ }
- position.setOrderStayFee(allStayFee);
- position.setOrderStayDays(stayDays);
+ BigDecimal userAmt = user.getUserAmt() == null ? BigDecimal.ZERO : user.getUserAmt();
+ user.setUserAmt(userAmt.subtract(totalFee));
+ UserFundUtil.debitUserBalance(user, totalFee);
+ int userRows = this.userMapper.updateByPrimaryKeySelective(user);
+ if (userRows <= 0) {
+ throw new Exception("递延费扣款失败,更新用户余额出错");
+ }
- BigDecimal all_profit = position.getAllProfitAndLose().subtract(allStayFee);
- position.setAllProfitAndLose(all_profit);
+ BigDecimal accumulated = (position.getOrderStayFee() == null ? BigDecimal.ZERO : position.getOrderStayFee()).add(totalFee);
+ int billedDays = (position.getOrderStayDays() == null ? 0 : position.getOrderStayDays()) + daysToCharge;
+ position.setOrderStayFee(accumulated);
+ position.setOrderStayDays(billedDays);
int updateCount = this.userPositionMapper.updateByPrimaryKeySelective(position);
- if (updateCount > 0) {
- //核算代理收入-延递费
- iAgentAgencyFeeService.AgencyFeeIncome(3, position.getPositionSn());
- log.info("【closingStayTask收持仓费】修改持仓记录成功");
- } else {
- log.error("【closingStayTask收持仓费】修改持仓记录出错");
- throw new Exception("【closingStayTask收持仓费】修改持仓记录出错");
+ if (updateCount <= 0) {
+ throw new Exception("递延费扣款失败,更新持仓记录出错");
}
+ UserCashDetail ucd = new UserCashDetail();
+ ucd.setPositionId(position.getId());
+ ucd.setAgentId(user.getAgentId());
+ ucd.setAgentName(user.getAgentName());
+ ucd.setUserId(user.getId());
+ ucd.setUserName(user.getRealName());
+ ucd.setDeType("递延费");
+ ucd.setDeAmt(totalFee.negate());
+ ucd.setDeSummary("递延费扣款," + position.getStockCode() + "/" + position.getStockName()
+ + ",持仓市值:" + marketValue + ",计费基数:" + billingMarketValue + ",单日:" + dailyFee
+ + ",扣费天数:" + daysToCharge + ",本次扣费:" + totalFee + ",累计递延费:" + accumulated
+ + ",递延天数:" + billedDays);
+ ucd.setAddTime(new Date());
+ ucd.setIsRead(Integer.valueOf(0));
+ this.userCashDetailMapper.insert(ucd);
- log.info("=======================================================");
+ iAgentAgencyFeeService.AgencyFeeIncome(3, position.getPositionSn());
+ log.info("【递延费扣款成功】positionSn={} 天数={} 本次={} 累计={}", position.getPositionSn(), daysToCharge, totalFee, accumulated);
return ServerResponse.createBySuccess();
}
@@ -2217,10 +2267,18 @@
adminPositionVO.setStockPlate(position.getStockPlate());
- PositionProfitVO positionProfitVO = getPositionProfitVO(position);
- adminPositionVO.setProfitAndLose(positionProfitVO.getProfitAndLose());
- adminPositionVO.setAllProfitAndLose(positionProfitVO.getAllProfitAndLose());
- adminPositionVO.setNow_price(positionProfitVO.getNowPrice());
+ if (position.getStatus() != null && position.getStatus().intValue() == 2) {
+ adminPositionVO.setProfitAndLose(position.getProfitAndLose());
+ adminPositionVO.setAllProfitAndLose(position.getAllProfitAndLose());
+ if (position.getSellOrderPrice() != null) {
+ adminPositionVO.setNow_price(position.getSellOrderPrice().toPlainString());
+ }
+ } else {
+ PositionProfitVO positionProfitVO = getPositionProfitVO(position);
+ adminPositionVO.setProfitAndLose(positionProfitVO.getProfitAndLose());
+ adminPositionVO.setAllProfitAndLose(positionProfitVO.getAllProfitAndLose());
+ adminPositionVO.setNow_price(positionProfitVO.getNowPrice());
+ }
return adminPositionVO;
@@ -2259,10 +2317,18 @@
agentPositionVO.setStockPlate(position.getStockPlate());
- PositionProfitVO positionProfitVO = getPositionProfitVO(position);
- agentPositionVO.setProfitAndLose(positionProfitVO.getProfitAndLose());
- agentPositionVO.setAllProfitAndLose(positionProfitVO.getAllProfitAndLose());
- agentPositionVO.setNow_price(positionProfitVO.getNowPrice());
+ if (position.getStatus() != null && position.getStatus().intValue() == 2) {
+ agentPositionVO.setProfitAndLose(position.getProfitAndLose());
+ agentPositionVO.setAllProfitAndLose(position.getAllProfitAndLose());
+ if (position.getSellOrderPrice() != null) {
+ agentPositionVO.setNow_price(position.getSellOrderPrice().toPlainString());
+ }
+ } else {
+ PositionProfitVO positionProfitVO = getPositionProfitVO(position);
+ agentPositionVO.setProfitAndLose(positionProfitVO.getProfitAndLose());
+ agentPositionVO.setAllProfitAndLose(positionProfitVO.getAllProfitAndLose());
+ agentPositionVO.setNow_price(positionProfitVO.getNowPrice());
+ }
return agentPositionVO;
@@ -2318,6 +2384,15 @@
.divide(new BigDecimal(position.getOrderLever()), 2, RoundingMode.HALF_UP));
}
+ if (position.getSellOrderId() == null && Integer.valueOf(1).equals(position.getStatus())) {
+ SiteProduct siteProduct = iSiteProductService.getProductSetting();
+ boolean respectHoliday = TradingDayUtil.isHolidayRestrictionEnabled(siteProduct);
+ long nextTs = StayFeeUtil.getNextStayFeeTimestamp(position.getBuyOrderTime(), position.getOrderStayDays(), respectHoliday);
+ userPositionVO.setNextStayFeeTime(nextTs);
+ userPositionVO.setStayFeeCountdownSec(StayFeeUtil.getStayFeeCountdownSec(nextTs));
+ userPositionVO.setRespectHoliday(respectHoliday);
+ }
+
return userPositionVO;
}
@@ -2329,16 +2404,20 @@
BigDecimal orderTotalPrice = position.getOrderTotalPrice();
if (position.getSellOrderId() != null) {
-
- BigDecimal subPrice = position.getSellOrderPrice().subtract(position.getBuyOrderPrice());
-// profitAndLose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())).multiply(new BigDecimal(position.getOrderLever())).setScale(2,4);
- profitAndLose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())).setScale(2,4);
- if ("买跌".equals(position.getOrderDirection())) {
- profitAndLose = profitAndLose.negate();
+ if (Integer.valueOf(2).equals(position.getStatus())
+ && position.getProfitAndLose() != null
+ && position.getAllProfitAndLose() != null) {
+ profitAndLose = position.getProfitAndLose();
+ allProfitAndLose = position.getAllProfitAndLose();
+ } else {
+ BigDecimal subPrice = position.getSellOrderPrice().subtract(position.getBuyOrderPrice());
+ profitAndLose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())).setScale(2, 4);
+ if ("买跌".equals(position.getOrderDirection())) {
+ profitAndLose = profitAndLose.negate();
+ }
+ allProfitAndLose = profitAndLose.subtract(position.getOrderFee()).subtract(position.getOrderSpread())
+ .subtract(position.getOrderStayFee()).subtract(position.getSpreadRatePrice());
}
-
-
- allProfitAndLose = profitAndLose.subtract(position.getOrderFee()).subtract(position.getOrderSpread()).subtract(position.getOrderStayFee()).subtract(position.getSpreadRatePrice());
} else {
StockListVO stockListVO = new StockListVO();
StockCoin stockCoin = new StockCoin();
@@ -2603,7 +2682,7 @@
// if (!pm_flag) {
// return ServerResponse.createByErrorMsg("下單失敗,不在交易時段內");
// }
- if (siteProduct.getHolidayDisplay()) {
+ if (TradingDayUtil.shouldBlockTradingToday(siteProduct)) {
return ServerResponse.createByErrorMsg("周末或节假日不能交易!");
}
// if (!Objects.equals(stockDz.getPassword(), password)) {
@@ -2755,7 +2834,7 @@
}
- BigDecimal buy_fee_amt_dz = TradeFeeUtil.calcBuyFee(buy_amt_autual);
+ BigDecimal buy_fee_amt_dz = TradeFeeUtil.calcBuyFee(buy_amt_autual, siteSetting.getBuyFee());
BigDecimal buy_debit_dz = TradeFeeUtil.calcBuyDebit(buy_amt_autual, buy_fee_amt_dz);
if (user_enable_amt.compareTo(buy_debit_dz) == -1) {
return ServerResponse.createByErrorMsg("下单失败,融资可用金额小于" + buy_debit_dz + "元(含保证金及手续费)");
@@ -2904,7 +2983,7 @@
if (!am_flag && !pm_flag) {
return ServerResponse.createByErrorMsg("下單失敗,不在交易時段內");
}
- if (siteProduct.getHolidayDisplay()) {
+ if (TradingDayUtil.shouldBlockTradingToday(siteProduct)) {
return ServerResponse.createByErrorMsg("周末或節假日不能交易!");
}
@@ -3063,7 +3142,7 @@
}
- BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(buy_amt_autual);
+ BigDecimal buy_fee_amt = TradeFeeUtil.calcBuyFee(buy_amt_autual, siteSetting.getBuyFee());
BigDecimal buy_debit = TradeFeeUtil.calcBuyDebit(buy_amt_autual, buy_fee_amt);
if (user_enable_amt.compareTo(buy_debit) == -1) {
return ServerResponse.createByErrorMsg("下單失敗,可用金額小於" + buy_debit + "元(含保证金及手续费)");
--
Gitblit v1.9.3