src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -9,6 +9,7 @@ import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IMemberProfitService; import cc.mrbird.febs.mall.service.impl.CommonService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; @@ -34,54 +35,29 @@ public class ProfitJob { @Autowired private MallMoneyFlowMapper moneyFlowMapper; private IMemberProfitService memberProfitService; @Autowired private MallMemberMapper memberMapper; @Autowired private IApiMallMemberWalletService memberWalletService; @Autowired private IApiMallMemberService memberService; @Scheduled(cron = "0 1 0 * * ?") @Transactional(rollbackFor = Exception.class) /** * 代理分红 */ @Scheduled(cron = "0 0 1 * * ?") public void profitJob() { log.info("推荐人返利执行"); // DateTime yesterday = DateUtil.yesterday(); // List<MallMoneyFlow> flows = moneyFlowMapper.selectMoneyFlowProfitByDate(yesterday); // // if (CollUtil.isEmpty(flows)) { // return; // } // // for (MallMoneyFlow flow : flows) { // MallMember member = memberMapper.selectById(flow.getMemberId()); // // List<MallMember> child = memberMapper.selectByIdAndNoLevel(member.getInviteId(), AgentLevelEnum.ZERO_LEVEL.name()); // if (CollUtil.isEmpty(child)) { // continue; // } // int size = child.size(); // BigDecimal needReturn = flow.getAmount().multiply(BigDecimal.valueOf(0.1)); // // String orderNo = MallUtils.getOrderNum("R"); // String remarkFormat = "{}, 用户:{}, 利润分红: {}"; // // BigDecimal returnMoney = needReturn.divide(BigDecimal.valueOf(size), 2, RoundingMode.DOWN); // for (MallMember mallMember : child) { // memberWalletService.addBalance(returnMoney, mallMember.getId()); // // String remark = StrUtil.format(remarkFormat, DateUtil.format(yesterday, "yyyy-MM-dd"), member.getName(), returnMoney); // memberService.addMoneyFlow(mallMember.getId(), returnMoney, MoneyFlowTypeEnum.PARENT_BONUS.getValue(), orderNo, null, remark, member.getId(), null); // } // // String remark = StrUtil.format(remarkFormat, DateUtil.format(yesterday, "yyyy-MM-dd"), member.getName(), needReturn); // memberService.addMoneyFlow(member.getId(), needReturn.negate(), MoneyFlowTypeEnum.PARENT_BONUS.getValue(), orderNo, null, remark, null, null); // memberWalletService.reduceBalance(needReturn, member.getId()); // // moneyFlowMapper.updateIsReturnByMemberId(MallMoneyFlow.IS_RETURN_Y, flow.getMemberId()); // } memberProfitService.agentProfit(null); } /** * 感恩奖 */ @Scheduled(cron = "0 0 2 * * ?") public void thankfulJob() { memberProfitService.thankfulProfit(); } /** * 排名奖 每月1号 */ @Scheduled(cron = "0 0 3 1 * ?") public void rankJob() { memberProfitService.rankProfit(); } } src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -111,7 +111,6 @@ DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.DYNAMIC_BONUS.getType(), DataDictionaryEnum.DYNAMIC_BONUS.getCode()); // 隔代字典 DataDictionaryCustom indrectDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.INDRECT_BONUS.getType(), DataDictionaryEnum.INDRECT_BONUS.getCode()); // 直接父级 MallMember parent = mallMemberMapper.selectInfoByInviteId(member.getReferrerId()); @@ -120,44 +119,9 @@ // 减去成本后算收益 BigDecimal amount = item.getPrice().subtract(item.getCostPrice()).multiply(BigDecimal.valueOf(item.getCnt())); // =======直推返利== start ===== // 直接奖励收益 BigDecimal dynamicProfit = amount.divide(new BigDecimal(dic.getValue()), 2, RoundingMode.HALF_UP); if (StrUtil.isBlank(parent.getReferrerId())) { continue; } List<String> parents = StrUtil.split(parent.getReferrerIds(), ','); List<MallMember> members = mallMemberMapper.selectByInviteIds(parents); if (CollUtil.isEmpty(members)) { return; } // 隔代比例 BigDecimal indrectDicProp = new BigDecimal(indrectDic.getValue()); // 隔代推荐奖 收益 BigDecimal direct = dynamicProfit.divide(indrectDicProp, 2, RoundingMode.HALF_UP); for (MallMember parentMember : members) { if (parent.getInviteId().equals(parentMember.getInviteId())) { continue; } if (direct.compareTo(BigDecimal.ONE) < 1) { break; } int reduce = walletService.reduce(direct, parentMember.getId(), "score"); if (reduce == 2) { continue; } walletService.add(direct, parentMember.getId(), "commission"); moneyFlowService.addMoneyFlow(parentMember.getId(), direct, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.COMMISSION.getValue()); moneyFlowService.addMoneyFlow(parentMember.getId(), direct.negate(), MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue()); direct = direct.divide(indrectDicProp, 2, RoundingMode.HALF_UP); } if (dynamicProfit.compareTo(BigDecimal.ZERO) < 1) { continue; @@ -172,10 +136,51 @@ moneyFlowService.addMoneyFlow(parent.getId(), dynamicProfit, MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.COMMISSION.getValue()); moneyFlowService.addMoneyFlow(parent.getId(), dynamicProfit.negate(), MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue()); // =======直推返利== end ===== // =======隔代奖== start ===== if (StrUtil.isBlank(parent.getReferrerId())) { continue; } List<String> parents = StrUtil.split(parent.getReferrerIds(), ','); List<MallMember> members = mallMemberMapper.selectByInviteIds(parents); if (CollUtil.isEmpty(members)) { return; } // 隔代比例 BigDecimal indrectDicProp = new BigDecimal(indrectDic.getValue()); // 隔代推荐奖 收益 BigDecimal direct = dynamicProfit.divide(indrectDicProp, 2, RoundingMode.HALF_UP); // direct 收益小于1,则跳出 if (direct.compareTo(BigDecimal.ONE) < 1) { continue; } for (MallMember parentMember : members) { if (parent.getInviteId().equals(parentMember.getInviteId())) { continue; } int reduceResult = walletService.reduce(direct, parentMember.getId(), "score"); if (reduceResult == 2) { continue; } walletService.add(direct, parentMember.getId(), "commission"); moneyFlowService.addMoneyFlow(parentMember.getId(), direct, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.COMMISSION.getValue()); moneyFlowService.addMoneyFlow(parentMember.getId(), direct.negate(), MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue()); direct = direct.divide(indrectDicProp, 2, RoundingMode.HALF_UP); } // =======隔代奖== end ===== } } @Override @Transactional(rollbackFor = Exception.class) public void agentProfit(Date profitDate) { log.info("#####==代理分红==start==#####"); if (profitDate == null) { src/main/java/cc/mrbird/febs/mall/vo/AdminMoneyFlowListVo.java
@@ -36,4 +36,6 @@ private String bindPhone; private Integer flowType; } src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html
@@ -18,19 +18,38 @@ </div> </div> <div class="layui-inline"> <label class="layui-form-label layui-form-label-sm">账户状态</label> <label class="layui-form-label layui-form-label-sm">流水类型</label> <div class="layui-input-inline"> <select name="type"> <option value="">请选择</option> <option value="1">直推奖励</option> <option value="2">团队奖励</option> <option value="3">订单支付</option> <option value="4">退款</option> <option value="5">转账</option> <option value="6">提现</option> <option value="7">排名奖励</option> <option value="8">利润分红</option> <option value="9">系统拨付</option> <option value="1">静态收益</option> <option value="2">动态收益</option> <option value="3">代理收益</option> <option value="4">排名收益</option> <option value="5">董事收益</option> <option value="6">社区店补</option> <option value="7">推荐人收益</option> <option value="8">提现</option> <option value="9">转账</option> <option value="10">支付</option> <option value="11">退款</option> <option value="12">佣金转竞猜积分</option> <option value="13">佣金转余额</option> <option value="14">竞猜积分签到</option> <option value="15">感恩奖</option> <option value="16">系统拨付</option> </select> </div> </div> <div class="layui-inline"> <label class="layui-form-label layui-form-label-sm">资金类型</label> <div class="layui-input-inline"> <select name="flowType"> <option value="">请选择</option> <option value="1">余额</option> <option value="2">赠送积分</option> <option value="3">竞猜积分</option> <option value="4">佣金</option> </select> </div> </div> @@ -104,37 +123,53 @@ {field: 'type', title: '流水类型', templet: function (d) { if (d.type === 1) { return '<span>直推奖励</span>' return '<span>静态收益</span>' } else if (d.type === 2) { return '<span>团队奖励</span>' return '<span>动态收益</span>' } else if (d.type === 3) { return '<span>订单支付</span>' return '<span>代理收益</span>' } else if (d.type === 4) { return '<span>退款</span>' return '<span>排名收益</span>' }else if (d.type === 5) { return '<span>转账</span>' return '<span>董事收益</span>' }else if (d.type === 6) { return '<span>提现</span>' return '<span>社区店补</span>' }else if (d.type === 7) { return '<span>排名奖励</span>' return '<span>推荐人收益</span>' }else if (d.type === 8) { return '<span>利润分红</span>' return '<span>提现</span>' }else if (d.type === 9) { return '<span>转账</span>' }else if (d.type === 10) { return '<span>支付</span>' }else if (d.type === 11) { return '<span>退款</span>' }else if (d.type === 12) { return '<span>佣金转竞猜积分</span>' }else if (d.type === 13) { return '<span>佣金转余额</span>' }else if (d.type === 14) { return '<span>竞猜积分签到</span>' }else if (d.type === 15) { return '<span>感恩奖</span>' }else if (d.type === 16) { return '<span>系统拨付</span>' }else{ return '' } }, minWidth: 80,align:'center'}, {field: 'type', title: '支付方式', {field: 'flowType', title: '资金类型', templet: function (d) { if (d.type === 3) { if(d.payMethod === null || d.payMethod ===''){ return '' }else{ return '<span>'+d.payMethod+'</span>' } } else{ return '' if (d.flowType === 1) { return '余额'; } else if(d.flowType === 2) { return '赠送积分' } else if(d.flowType === 3) { return '竞猜积分' } else if(d.flowType === 4) { return '佣金' } else { return '-'; } }, minWidth: 80,align:'center'}, {field: 'orderNo', title: '订单编号', minWidth: 150,align:'left'}, @@ -149,6 +184,7 @@ name: $searchForm.find('input[name="name"]').val().trim(), phone: $searchForm.find('input[name="phone"]').val().trim(), type: $searchForm.find("select[name='type']").val(), flowType: $searchForm.find("select[name='flowType']").val(), }; } src/test/java/cc/mrbird/febs/AgentTest.java
@@ -623,6 +623,6 @@ @Test public void orderReturnTest() { agentConsumer.orderReturnMoney("1"); agentConsumer.orderReturnMoney("7"); } }