Helius
2021-04-02 a7bb19097114e06e43de10f41ad546bce114f552
modify force price
5 files modified
85 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletContractDao.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/utils/CalculateUtil.java 32 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberWalletContractDao.xml 18 ●●●●● patch | view | raw | blame | history
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);
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);
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);
}
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);
src/main/resources/mapper/member/MemberWalletContractDao.xml
@@ -32,4 +32,22 @@
        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>