KKSU
2024-04-17 d23645e976981bc9b670eea1d469fe8a36be309c
src/test/java/com/xcong/excoin/LocalTest.java
@@ -90,85 +90,85 @@
    private FollowTraderLabelDao followTraderLabelDao;
    @Resource
    private MemberSettingDao memberSettingDao;
    @Test
   public void traderProfitUpdate() {
      log.info("交易员定时任务执行");
      // 查询所有交易员信息
      List<FollowTraderInfoEntity> allTraders = followTraderInfoDao.selectAllTraderInfo();
      if (CollUtil.isNotEmpty(allTraders)) {
         for (FollowTraderInfoEntity trader : allTraders) {
            Long tradeMemberId = trader.getMemberId();
            //获取交易员的当前跟随者
            Map<String, Object> hashMap = new HashMap<>();
            hashMap.put("trade_member_id", tradeMemberId);
            hashMap.put("is_follow", FollowFollowerProfitEntity.IS_FOLLOW_Y);
            List<FollowFollowerProfitEntity> followFollowerProfitEntityList = followFollowerProfitDao.selectByMap(hashMap);
            if(CollUtil.isNotEmpty(followFollowerProfitEntityList)) {
               for(FollowFollowerProfitEntity followFollowerProfitEntity : followFollowerProfitEntityList) {
                  //获取当前跟随者的跟随本金
                  Long memberId = followFollowerProfitEntity.getMemberId();
                  BigDecimal sumBondAmountBigDecimal = followFollowerProfitDao.selectSumBondAmountBymemberId(memberId,trader.getId());
                  sumBondAmountBigDecimal = (sumBondAmountBigDecimal == null?BigDecimal.ZERO:sumBondAmountBigDecimal.setScale(2, BigDecimal.ROUND_DOWN));
                  followFollowerProfitEntity.setTotalPrincipal(sumBondAmountBigDecimal);
                  //获取当前的盈亏
                  BigDecimal sumRewardAmountBigDecimal = followFollowerProfitDao.selectSumRewardAmountByMemberId(memberId,trader.getId());
                  sumRewardAmountBigDecimal = (sumRewardAmountBigDecimal == null?BigDecimal.ZERO:sumRewardAmountBigDecimal.setScale(2, BigDecimal.ROUND_DOWN));
                  followFollowerProfitEntity.setTotalProfit(sumRewardAmountBigDecimal);
                  followFollowerProfitDao.updateById(followFollowerProfitEntity);
               }
            }
            FollowTraderProfitInfoEntity traderInfoProfit = followTraderProfitInfoDao.selectTraderInfoProfitByMemberId(tradeMemberId);
            // 累计收益率
            BigDecimal ljsyl = contractOrderDao.selectFollowOrderTotalProfitByMemberId(tradeMemberId);
            BigDecimal totalProfitRatio = (ljsyl == null?BigDecimal.ZERO:ljsyl.setScale(2, BigDecimal.ROUND_DOWN));
            traderInfoProfit.setTotalProfitRatio(totalProfitRatio);
            // 带单总收益,只查询交易员自己的带单总收益
            BigDecimal totalProfit = followFollowerOrderRelationDao.selectTraderTotalProfitSelf(tradeMemberId);
            //BigDecimal totalProfit = followFollowerOrderRelationDao.selectTraderTotalProfit(tradeMemberId);
            traderInfoProfit.setTotalProfit(totalProfit);
            // 交易笔数
//                List<ContractOrderEntity> orders = contractOrderDao.selectFollowOrderByMemberId(tradeMemberId);
            List<ContractOrderEntity> orders = contractOrderDao.selectFollowOrderListByMemberId(tradeMemberId);
            traderInfoProfit.setTotalOrderCnt(CollUtil.isNotEmpty(orders) ? orders.size() : 0);
            // 近三周胜率
            Integer winCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, 1);
            Integer allCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, null);
            if (winCnt != null && allCnt != null && allCnt!=0) {
               BigDecimal winRate = BigDecimal.valueOf(winCnt).divide(BigDecimal.valueOf(allCnt), 4, BigDecimal.ROUND_DOWN);
               traderInfoProfit.setWinRate(winRate);
            }
            Date date = new Date();
            DateTime offsetDay = DateUtil.offsetDay(new Date(), -30);
            //30天胜率(30天盈利总单数/30平仓总单数)
            BigDecimal thirtyTotalCnt = contractOrderDao.selectThirtyTotalCntByMemberId(tradeMemberId,date,offsetDay);
            BigDecimal thirtyWinCnt = contractOrderDao.selectThirtyWinCntByMemberId(tradeMemberId,date,offsetDay);
            BigDecimal thirtyTotalCntRatio = (thirtyTotalCnt == null?BigDecimal.ZERO:thirtyTotalCnt.setScale(2, BigDecimal.ROUND_DOWN));
            BigDecimal thirtyWinCntRatio = (thirtyWinCnt == null?BigDecimal.ZERO:thirtyWinCnt.setScale(2, BigDecimal.ROUND_DOWN));
            BigDecimal thirtyProfitRatio = BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_DOWN);;
            if(thirtyTotalCnt.compareTo(BigDecimal.ZERO) > 0) {
               thirtyProfitRatio = thirtyWinCntRatio.divide(thirtyTotalCntRatio, 2, BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_DOWN);
            }
            traderInfoProfit.setThirtyProfitRatio(thirtyProfitRatio);
            //30天最大回撤率(30天最高收益率-30天最低收益率)
            BigDecimal thirtyMaxRatio = contractOrderDao.selectThirtyMaxRatioByMemberId(tradeMemberId,date,offsetDay);
            BigDecimal thirtyMinRatio = contractOrderDao.selectThirtyMinRatioByMemberId(tradeMemberId,date,offsetDay);
            BigDecimal thirtyRatio = (thirtyMaxRatio == null?BigDecimal.ZERO:thirtyMaxRatio.setScale(2, BigDecimal.ROUND_DOWN))
                  .subtract((thirtyMinRatio == null?BigDecimal.ZERO:thirtyMinRatio.setScale(2, BigDecimal.ROUND_DOWN)));
            traderInfoProfit.setThirtyRatio(thirtyRatio);
            // 当前跟随者总收益
            BigDecimal followerProfit = followFollowerProfitDao.selectAllFollowerProfit(tradeMemberId);
            traderInfoProfit.setFollowerTotalProfit(followerProfit);
            // 当前跟随人数
            int followerCnt = followFollowerProfitDao.selectFollowerCntByTradeMemberId(tradeMemberId);
            traderInfoProfit.setTotalFollowerCnt(followerCnt);
            followTraderProfitInfoDao.updateById(traderInfoProfit);
         }
      }
   }
//
//    @Test
//   public void traderProfitUpdate() {
//      log.info("交易员定时任务执行");
//      // 查询所有交易员信息
//      List<FollowTraderInfoEntity> allTraders = followTraderInfoDao.selectAllTraderInfo();
//      if (CollUtil.isNotEmpty(allTraders)) {
//         for (FollowTraderInfoEntity trader : allTraders) {
//            Long tradeMemberId = trader.getMemberId();
//            //获取交易员的当前跟随者
//            Map<String, Object> hashMap = new HashMap<>();
//            hashMap.put("trade_member_id", tradeMemberId);
//            hashMap.put("is_follow", FollowFollowerProfitEntity.IS_FOLLOW_Y);
//            List<FollowFollowerProfitEntity> followFollowerProfitEntityList = followFollowerProfitDao.selectByMap(hashMap);
//            if(CollUtil.isNotEmpty(followFollowerProfitEntityList)) {
//               for(FollowFollowerProfitEntity followFollowerProfitEntity : followFollowerProfitEntityList) {
//                  //获取当前跟随者的跟随本金
//                  Long memberId = followFollowerProfitEntity.getMemberId();
//                  BigDecimal sumBondAmountBigDecimal = followFollowerProfitDao.selectSumBondAmountBymemberId(memberId,trader.getId());
//                  sumBondAmountBigDecimal = (sumBondAmountBigDecimal == null?BigDecimal.ZERO:sumBondAmountBigDecimal.setScale(2, BigDecimal.ROUND_DOWN));
//                  followFollowerProfitEntity.setTotalPrincipal(sumBondAmountBigDecimal);
//                  //获取当前的盈亏
//                  BigDecimal sumRewardAmountBigDecimal = followFollowerProfitDao.selectSumRewardAmountByMemberId(memberId,trader.getId());
//                  sumRewardAmountBigDecimal = (sumRewardAmountBigDecimal == null?BigDecimal.ZERO:sumRewardAmountBigDecimal.setScale(2, BigDecimal.ROUND_DOWN));
//                  followFollowerProfitEntity.setTotalProfit(sumRewardAmountBigDecimal);
//                  followFollowerProfitDao.updateById(followFollowerProfitEntity);
//               }
//            }
//
//
//            FollowTraderProfitInfoEntity traderInfoProfit = followTraderProfitInfoDao.selectTraderInfoProfitByMemberId(tradeMemberId);
//            // 累计收益率
//            BigDecimal ljsyl = contractOrderDao.selectFollowOrderTotalProfitByMemberId(tradeMemberId);
//            BigDecimal totalProfitRatio = (ljsyl == null?BigDecimal.ZERO:ljsyl.setScale(2, BigDecimal.ROUND_DOWN));
//            traderInfoProfit.setTotalProfitRatio(totalProfitRatio);
//            // 带单总收益,只查询交易员自己的带单总收益
//            BigDecimal totalProfit = followFollowerOrderRelationDao.selectTraderTotalProfitSelf(tradeMemberId);
//            //BigDecimal totalProfit = followFollowerOrderRelationDao.selectTraderTotalProfit(tradeMemberId);
//            traderInfoProfit.setTotalProfit(totalProfit);
//            // 交易笔数
////                List<ContractOrderEntity> orders = contractOrderDao.selectFollowOrderByMemberId(tradeMemberId);
//            List<ContractOrderEntity> orders = contractOrderDao.selectFollowOrderListByMemberId(tradeMemberId);
//            traderInfoProfit.setTotalOrderCnt(CollUtil.isNotEmpty(orders) ? orders.size() : 0);
//            // 近三周胜率
//            Integer winCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, 1);
//            Integer allCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, null);
//
//            if (winCnt != null && allCnt != null && allCnt!=0) {
//               BigDecimal winRate = BigDecimal.valueOf(winCnt).divide(BigDecimal.valueOf(allCnt), 4, BigDecimal.ROUND_DOWN);
//               traderInfoProfit.setWinRate(winRate);
//            }
//            Date date = new Date();
//            DateTime offsetDay = DateUtil.offsetDay(new Date(), -30);
//            //30天胜率(30天盈利总单数/30平仓总单数)
//            BigDecimal thirtyTotalCnt = contractOrderDao.selectThirtyTotalCntByMemberId(tradeMemberId,date,offsetDay);
//            BigDecimal thirtyWinCnt = contractOrderDao.selectThirtyWinCntByMemberId(tradeMemberId,date,offsetDay);
//            BigDecimal thirtyTotalCntRatio = (thirtyTotalCnt == null?BigDecimal.ZERO:thirtyTotalCnt.setScale(2, BigDecimal.ROUND_DOWN));
//            BigDecimal thirtyWinCntRatio = (thirtyWinCnt == null?BigDecimal.ZERO:thirtyWinCnt.setScale(2, BigDecimal.ROUND_DOWN));
//            BigDecimal thirtyProfitRatio = BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_DOWN);;
//            if(thirtyTotalCnt.compareTo(BigDecimal.ZERO) > 0) {
//               thirtyProfitRatio = thirtyWinCntRatio.divide(thirtyTotalCntRatio, 2, BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_DOWN);
//            }
//            traderInfoProfit.setThirtyProfitRatio(thirtyProfitRatio);
//            //30天最大回撤率(30天最高收益率-30天最低收益率)
//            BigDecimal thirtyMaxRatio = contractOrderDao.selectThirtyMaxRatioByMemberId(tradeMemberId,date,offsetDay);
//            BigDecimal thirtyMinRatio = contractOrderDao.selectThirtyMinRatioByMemberId(tradeMemberId,date,offsetDay);
//            BigDecimal thirtyRatio = (thirtyMaxRatio == null?BigDecimal.ZERO:thirtyMaxRatio.setScale(2, BigDecimal.ROUND_DOWN))
//                  .subtract((thirtyMinRatio == null?BigDecimal.ZERO:thirtyMinRatio.setScale(2, BigDecimal.ROUND_DOWN)));
//            traderInfoProfit.setThirtyRatio(thirtyRatio);
//            // 当前跟随者总收益
//            BigDecimal followerProfit = followFollowerProfitDao.selectAllFollowerProfit(tradeMemberId);
//            traderInfoProfit.setFollowerTotalProfit(followerProfit);
//            // 当前跟随人数
//            int followerCnt = followFollowerProfitDao.selectFollowerCntByTradeMemberId(tradeMemberId);
//            traderInfoProfit.setTotalFollowerCnt(followerCnt);
//
//            followTraderProfitInfoDao.updateById(traderInfoProfit);
//         }
//      }
//   }
}