From a7bb19097114e06e43de10f41ad546bce114f552 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Fri, 02 Apr 2021 14:58:15 +0800
Subject: [PATCH] modify force price
---
src/main/resources/mapper/member/MemberWalletContractDao.xml | 20 +++++++++
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 4 +-
src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java | 29 +++++++++++++-
src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletContractDao.java | 2 +
src/main/java/com/xcong/excoin/utils/CalculateUtil.java | 32 ++++++++++++++++
5 files changed, 82 insertions(+), 5 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
index ea11209..9d3a457 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
@@ -531,8 +531,8 @@
holdOrderListVo.setReturnRate(returnRate);
holdOrderListVo.setProfitOrLoss(rewardRatio);
if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) {
- BigDecimal forcePrice = CalculateUtil.calForcePriceForWhole(memberEntity, holdOrderEntity);
- contractHoldOrderDao.updateForcePriceBySymbolAndMemberId(forcePrice, memberEntity.getId(), holdOrderEntity.getSymbol());
+ BigDecimal forcePrice = CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity);
+// contractHoldOrderDao.updateForcePriceBySymbolAndMemberId(forcePrice, memberEntity.getId(), holdOrderEntity.getSymbol());
holdOrderListVo.setForceClosingPrice(forcePrice);
}
resultList.add(holdOrderListVo);
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java b/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java
index f82fc86..e1886e2 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java
@@ -125,7 +125,7 @@
for (FollowFollowerSettingEntity followerSetting : followerSettings) {
// 加redis锁,同一个用户不能同时触发两个跟单任务,否则会出现金额问题
while (true) {
- boolean flag = redisUtils.setNotExist(AppContants.MEMBER_HAS_FOLLOW + "_" + followerSetting.getMemberId(), "1", 1);
+ boolean flag = redisUtils.setNotExist(AppContants.MEMBER_HAS_FOLLOW + "_" + followerSetting.getMemberId(), "1", 5);
// List<Object> followerMemberId = redisUtils.lGet(AppContants.MEMBER_HAS_FOLLOW, 0, -1);
// log.info("#跟单用户任务已存在:{}, 当前:{}#", followerMemberId, followerSetting.getMemberId());
// log.info("#------->{}#", followerMemberId.contains(followerSetting.getMemberId().intValue()));
@@ -210,6 +210,31 @@
continue;
}
+ boolean flag = false;
+ while(true) {
+ MemberWalletContractEntity updateEntity = new MemberWalletContractEntity();
+ updateEntity.setAvailableBalance(prePaymentAmount.negate());
+ updateEntity.setTotalBalance(openFeePrice.negate());
+ updateEntity.setId(walletContract.getId());
+ updateEntity.setVersion(walletContract.getVersion());
+ int i = memberWalletContractDao.updateWalletContractWithVersion(updateEntity);
+ if (i > 0) {
+ break;
+ }
+
+ walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(followerSetting.getMemberId(), CoinTypeEnum.USDT.name());
+ if (prePaymentAmount.compareTo(walletContract.getAvailableBalance()) > -1) {
+ log.info("可用金额不足");
+ LogRecordUtils.insertFollowerNotice(followerSetting.getMemberId(), NoticeConstant.MONEY_NOT_ENOUGH_TITLE, StrUtil.format(NoticeConstant.MONEY_NOT_ENOUGH_CONTENT, followTraderInfoEntity.getNickname()));
+ flag = true;
+ break;
+ }
+ }
+
+ if (flag) {
+ continue;
+ }
+
MemberEntity memberEntity = memberDao.selectById(followerSetting.getMemberId());
// 强平价
BigDecimal forceClosingPrice = CalculateUtil.getForceSetPrice(bondAmount, openPrice, symbolCnt, lotNumber, holdOrderEntity.getOpeningType(), memberEntity);
@@ -240,7 +265,7 @@
contractHoldOrderDao.insert(followHoldOrder);
int i = contractOrderDao.insert(contractOrderEntity);
if (i > 0) {
- memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId());
+// memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId());
FollowFollowerOrderRelationEntity relationEntity = new FollowFollowerOrderRelationEntity();
relationEntity.setIsShow(FollowFollowerOrderRelationEntity.IS_SHOW_Y);
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletContractDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletContractDao.java
index dbd1942..25326fd 100644
--- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletContractDao.java
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletContractDao.java
@@ -23,4 +23,6 @@
void increaseWalletContractBalanceById(@Param("availableBalance") BigDecimal availableBalance,@Param("totalBalance") BigDecimal totalBalance,@Param("frozenBalance") BigDecimal frozenBalance,@Param("id") Long id);
List<ContractSymbolListVo> findContractSymbolListBymemberId(@Param("memberId")Long memberId);
+
+ public int updateWalletContractWithVersion(@Param("record") MemberWalletContractEntity memberWalletContractEntity);
}
diff --git a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java
index deed491..8ec19a9 100644
--- a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java
+++ b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java
@@ -204,6 +204,38 @@
return forcePrice;
}
+ public static BigDecimal calWholePriceTwo(MemberEntity memberEntity, ContractHoldOrderEntity contractHoldOrderEntity) {
+ ContractHoldOrderDao holdOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class);
+ MemberWalletContractDao walletContractDao = SpringContextHolder.getBean(MemberWalletContractDao.class);
+ RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
+ BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(contractHoldOrderEntity.getSymbol())));
+
+ Long memberId = memberEntity.getId();
+ MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
+ List<ContractHoldOrderEntity> holdOrderEntities = holdOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, null);
+ BigDecimal forcePrice = BigDecimal.ZERO;
+ if (CollUtil.isNotEmpty(holdOrderEntities)) {
+ BigDecimal totalBondAmount = BigDecimal.ZERO;
+ BigDecimal totalProfitOrLoss = BigDecimal.ZERO;
+ for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) {
+ if (holdOrderEntity.getId().equals(contractHoldOrderEntity.getId())) {
+// totalBondAmount = totalBondAmount.add(holdOrderEntity.getHoldBond());
+ } else {
+ totalBondAmount = totalBondAmount.add(holdOrderEntity.getBondAmount());
+ }
+ totalProfitOrLoss = totalProfitOrLoss.add(calProfitOrLoss(holdOrderEntity, memberEntity));
+ }
+
+ BigDecimal holdBond = contractHoldOrderEntity.getHoldBond();
+ BigDecimal cost = contractHoldOrderEntity.getSymbolSku().multiply(contractHoldOrderEntity.getOpeningPrice()).multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCntSale()));
+ BigDecimal divideChild = walletContract.getTotalBalance().subtract(holdBond).subtract(cost).add(newPrice.multiply(new BigDecimal("0.005")));
+ BigDecimal divideParent = contractHoldOrderEntity.getSymbolSku().multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCntSale()));
+
+ forcePrice = divideChild.divide(divideParent, 8, BigDecimal.ROUND_DOWN).negate();
+ }
+ return forcePrice;
+ }
+
public static BigDecimal calProfitOrLoss(ContractHoldOrderEntity holdOrderEntity, MemberEntity memberEntity) {
CacheSettingUtils cacheSettingUtils = SpringContextHolder.getBean(CacheSettingUtils.class);
RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
diff --git a/src/main/resources/mapper/member/MemberWalletContractDao.xml b/src/main/resources/mapper/member/MemberWalletContractDao.xml
index c9b2ece..646c09a 100644
--- a/src/main/resources/mapper/member/MemberWalletContractDao.xml
+++ b/src/main/resources/mapper/member/MemberWalletContractDao.xml
@@ -31,5 +31,23 @@
</set>
where id =#{id}
</update>
-
+
+ <update id="updateWalletContractWithVersion">
+ update member_wallet_contract
+ <if test="record != null">
+ <set>
+ <if test="record.availableBalance!=null">
+ available_balance = available_balance + #{record.availableBalance},
+ </if>
+ <if test="record.totalBalance!=null">
+ total_balance =total_balance + #{record.totalBalance},
+ </if>
+ <if test="record.frozenBalance!=null">
+ frozen_balance = frozen_balance + #{record.frozenBalance},
+ </if>
+ version = version + 1
+ </set>
+ where id=#{record.id} and version=#{record.version}
+ </if>
+ </update>
</mapper>
\ No newline at end of file
--
Gitblit v1.9.1