Helius
2020-08-20 665aae9e293c4e97be597ddc4f21b4c1b1edca61
modify
12 files modified
134 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/contract/controller/ContractEntrustOrderController.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SubmitCloseEntrustDto.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/ContractEntrustOrderService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java 23 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java 29 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java 22 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/utils/CalculateUtil.java 5 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java 8 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberDao.xml 5 ●●●●● patch | view | raw | blame | history
src/test/java/com/xcong/excoin/WholeTest.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/controller/ContractEntrustOrderController.java
@@ -65,6 +65,6 @@
    @ApiOperation(value = "全仓模式 -- 提交平仓委托单", notes = "平仓委托单")
    @PostMapping(value = "/submitCloseEntrustOrder")
    public Result submitCloseEntrustOrder(@RequestBody SubmitCloseEntrustDto submitCloseEntrustDto) {
        return Result.ok("提交成功");
        return contractEntrustOrderService.addCloseContractEntrustOrder(submitCloseEntrustDto);
    }
}
src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SubmitCloseEntrustDto.java
@@ -31,4 +31,8 @@
    @ApiModelProperty(value = "币种数量", example = "1")
    private int symbolCnt;
    @NotNull
    @ApiModelProperty(value = "币种", example = "BTC/USDT")
    private String symbol;
}
src/main/java/com/xcong/excoin/modules/contract/service/ContractEntrustOrderService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity;
import com.xcong.excoin.modules.contract.parameter.dto.SubmitCloseEntrustDto;
import com.xcong.excoin.modules.contract.parameter.dto.SubmitEntrustDto;
import java.util.List;
@@ -20,4 +21,6 @@
    public List<ContractEntrustOrderEntity> selectEntrustOrderListByIds( List<Long> list);
    Result addCloseContractEntrustOrder(SubmitCloseEntrustDto submitCloseEntrustDto);
}
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java
@@ -8,10 +8,13 @@
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.common.system.service.CommonService;
import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao;
import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao;
import com.xcong.excoin.modules.contract.dao.ContractOrderDao;
import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity;
import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity;
import com.xcong.excoin.modules.contract.entity.ContractOrderEntity;
import com.xcong.excoin.modules.contract.mapper.ContractEntrustOrderEntityMapper;
import com.xcong.excoin.modules.contract.parameter.dto.SubmitCloseEntrustDto;
import com.xcong.excoin.modules.contract.parameter.dto.SubmitEntrustDto;
import com.xcong.excoin.modules.contract.parameter.dto.SubmitOrderDto;
import com.xcong.excoin.modules.contract.parameter.vo.ContractEntrustVo;
@@ -61,6 +64,9 @@
    @Resource
    private OrderProducer producer;
    @Resource
    private ContractHoldOrderDao contractHoldOrderDao;
    @Resource
    private ContractHoldOrderService contractHoldOrderService;
@@ -207,4 +213,21 @@
    public List<ContractEntrustOrderEntity> selectEntrustOrderListByIds(List<Long> list) {
        return contractEntrustOrderDao.selectEntrustOrderListByIds(list);
    }
    @Override
    public Result addCloseContractEntrustOrder(SubmitCloseEntrustDto submitCloseEntrustDto) {
        MemberEntity member = LoginUserUtils.getAppLoginUser();
        ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectHoldOrderByMemberIdAndId(member.getId(), submitCloseEntrustDto.getId());
        if (holdOrderEntity == null) {
            return Result.fail("订单不存在");
        }
        if(holdOrderEntity.getSymbolCntSale() - submitCloseEntrustDto.getSymbolCnt() < 0) {
            return Result.fail("可平张数不足");
        }
        // 获取最新价
        BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(submitCloseEntrustDto.getSymbol())));
        return null;
    }
}
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
@@ -131,7 +131,7 @@
        log.info("全仓逻辑");
        // 获取最新价
        BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(submitOrderDto.getSymbol())));
        MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
        MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeConvert.convertContractTypeToCoin(submitOrderDto.getSymbol()));
        PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
        MemberSettingEntity memberSetting = memberSettingDao.selectMemberSettingByMemberId(memberEntity.getId());
@@ -161,6 +161,12 @@
            BigDecimal subBondAmount = bondAmount.subtract(wholeHoldOrder.getBondAmount());
            log.info("保证金差值:{}", subBondAmount);
            if (subBondAmount.compareTo(walletContract.getAvailableBalance()) > -1) {
                // 可用余额不足
                return Result.fail(MessageSourceUtils.getString("member_service_0085"));
            }
//            BigDecimal forceClosingPrice = CalculateUtil.getForceSetPriceForWhole(submitOrderDto.getSymbol(), memberEntity);
//            log.info("新预估强平价:{}", forceClosingPrice);
@@ -750,11 +756,20 @@
        PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting();
        BigDecimal newPriceSymbol = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol)));
        // 当前合约委托单
        List<ContractEntrustOrderEntity> entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId());
        // 当前持仓列表
        List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId());
        List<ContractEntrustOrderEntity> entrustOrderEntities = new ArrayList<>();
        List<ContractHoldOrderEntity> holdOrderEntities = new ArrayList<>();
        MemberWalletContractEntity walletContractEntity = null;
        if (memberEntity.getContractPositionType().equals(ContractEntrustOrderEntity.POSITION_TYPE_ADD)) {
            // 当前合约委托单
            entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId());
            // 当前持仓列表
            holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId());
            walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
        } else {
            entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberIdAndSymbol(memberEntity.getId(), symbol);
            holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberEntity.getId(), symbol);
            walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeConvert.convertContractTypeToCoin(symbol));
        }
        // 冻结保证金 -- 即委托单中的保证金之和
        BigDecimal frozenBondAmount = BigDecimal.ZERO;
@@ -796,8 +811,6 @@
                totalProfitOrLess = totalProfitOrLess.add(profitOrLess);
            }
        }
        MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
        MemberLevelRateEntity rateEntity = memberLevelRateDao.selectLeverRateByMemberIdAndSymbol(memberEntity.getId(), symbol);
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
@@ -261,7 +261,7 @@
        MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId());
        MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeEnum.USDT.name());
        MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(symbol));
        if (walletContract != null) {
            BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol);
            // 盈亏
src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
@@ -21,4 +21,6 @@
    public List<NeedMoneyMemberVo> selectAllNeedMoneyMember(@Param("list") List<String> list);
    public List<MemberEntity> selectAllMember();
}
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -185,16 +185,6 @@
        member.setRefererIds(ids);
        memberDao.updateById(member);
        //初始化合约钱包
        MemberWalletContractEntity walletContract = new MemberWalletContractEntity();
        walletContract.setMemberId(member.getId());
        walletContract.setAvailableBalance(AppContants.INIT_MONEY);
        walletContract.setFrozenBalance(AppContants.INIT_MONEY);
        walletContract.setTotalBalance(AppContants.INIT_MONEY);
        walletContract.setBorrowedFund(AppContants.INIT_MONEY);
        walletContract.setWalletCode(CoinTypeEnum.USDT.name());
        memberWalletContractDao.insert(walletContract);
        MemberWalletContractSimulateEntity walletContractSimulate = new MemberWalletContractSimulateEntity();
        walletContractSimulate.setMemberId(member.getId());
        walletContractSimulate.setAvailableBalance(new BigDecimal(AppContants.INIT_SIMULATE_MONEY));
@@ -205,8 +195,18 @@
        memberWalletContractSimulateDao.insert(walletContractSimulate);
        // 初始化币币钱包
        for (CoinTypeEnum coinTypeEnum : CoinTypeEnum.values()) {
            //初始化合约钱包
            MemberWalletContractEntity walletContract = new MemberWalletContractEntity();
            walletContract.setMemberId(member.getId());
            walletContract.setAvailableBalance(AppContants.INIT_MONEY);
            walletContract.setFrozenBalance(AppContants.INIT_MONEY);
            walletContract.setTotalBalance(AppContants.INIT_MONEY);
            walletContract.setBorrowedFund(AppContants.INIT_MONEY);
            walletContract.setWalletCode(coinTypeEnum.name());
            memberWalletContractDao.insert(walletContract);
            // 初始化币币钱包
            MemberWalletCoinEntity walletCoin = new MemberWalletCoinEntity();
            walletCoin.setWalletCode(coinTypeEnum.name());
            walletCoin.setMemberId(member.getId());
src/main/java/com/xcong/excoin/utils/CalculateUtil.java
@@ -87,7 +87,6 @@
     * 全仓模式 -- 预估强平价
     * 面值*(多单张数*多单开仓价-空单张数*空单开仓价)-余额-已实现盈亏 / 面值*(多单张数-空单张数)-(维持保证金率+TAKER手续费)*面值*(开多张数+开空张数)
     *
     * @return
     */
    public static void getForceSetPriceForWhole(@NotNull String symbol, @NotNull MemberEntity memberEntity) {
        ContractHoldOrderDao holdOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class);
@@ -97,7 +96,7 @@
        Long memberId = memberEntity.getId();
        BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol);
        PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
        MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
        MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(symbol));
        List<ContractHoldOrderEntity> holdOrderEntities = holdOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, symbol);
        if (CollUtil.isNotEmpty(holdOrderEntities)) {
            // 多单开仓价
@@ -149,8 +148,6 @@
                    sendOrderBombMsg(updateHoldOrder.getId(), updateHoldOrder.getOpeningType(), forceSetPrice, updateHoldOrder.getSymbol(), updateHoldOrder.getOperateNo());
                }
            }
        } else {
            throw new GlobalException("强平价异常");
        }
    }
src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java
@@ -47,4 +47,12 @@
                return null;
        }
    }
    public static String convertContractTypeToCoin(String symbol) {
        if (symbol.indexOf("/") > 0) {
            return symbol.substring(0, symbol.indexOf("/"));
        } else {
            return null;
        }
    }
}
src/main/resources/mapper/member/MemberDao.xml
@@ -44,4 +44,9 @@
            #{item}
        </foreach >
    </select>
    <select id="selectAllMember" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
        select * from member
    </select>
</mapper>
src/test/java/com/xcong/excoin/WholeTest.java
@@ -1,10 +1,14 @@
package com.xcong.excoin;
import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao;
import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity;
import com.xcong.excoin.modules.contract.service.RabbitOrderService;
import com.xcong.excoin.modules.member.dao.MemberDao;
import com.xcong.excoin.modules.member.dao.MemberWalletContractDao;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity;
import com.xcong.excoin.utils.CalculateUtil;
import com.xcong.excoin.utils.ThreadPoolUtils;
import org.junit.jupiter.api.Test;
@@ -30,6 +34,9 @@
    @Autowired
    private RabbitOrderService rabbitOrderService;
    @Autowired
    private MemberWalletContractDao memberWalletContractDao;
    @Test
    public void forceClosePriceTest() {
        MemberEntity memberEntity = memberDao.selectById(5L);
@@ -47,5 +54,27 @@
        rabbitOrderService.cancelHoldOrder(ids);
    }
    @Test
    public void wholeContractWalletTest() {
        List<MemberEntity> memberEntities = memberDao.selectAllMember();
        for (MemberEntity member : memberEntities) {
            CoinTypeEnum[] values = CoinTypeEnum.values();
            for (CoinTypeEnum value : values) {
                MemberWalletContractEntity walletContract = new MemberWalletContractEntity();
                if (value.name().equals(CoinTypeEnum.USDT.name())) {
                    continue;
                }
                walletContract.setMemberId(member.getId());
                walletContract.setAvailableBalance(AppContants.INIT_MONEY);
                walletContract.setFrozenBalance(AppContants.INIT_MONEY);
                walletContract.setTotalBalance(AppContants.INIT_MONEY);
                walletContract.setBorrowedFund(AppContants.INIT_MONEY);
                walletContract.setWalletCode(value.name());
                memberWalletContractDao.insert(walletContract);
            }
        }
    }
}