fix
Helius
2022-05-27 3d51d141bc43d68a738cd15183254f1b980bcb92
fix
5 files modified
241 ■■■■ changed files
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java 70 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 79 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMoneyFlowListVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html 88 ●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/AgentTest.java 2 ●●● patch | view | raw | blame | history
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 ''
                            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 '<span>'+d.payMethod+'</span>'
                                }
                            } else{
                                return ''
                                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");
    }
}