xiaoyong931011
2023-04-06 13e710cac7ce8ac3438aee3123d964cfe0ad4055
测试环境
6 files modified
2 files added
388 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnum.java 101 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/PerkEnum.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java 9 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 179 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 3 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/system/perkSet.html 75 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnum.java
New file
@@ -0,0 +1,101 @@
package cc.mrbird.febs.common.enumerates;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
@Getter
public enum MemberLevelEnum {
    /**
     * 合伙人
     */
    V_PARTNER("V_PARTNER",8),
    /**
     * 董事
     */
    V_DIRECTOR("V_DIRECTOR",7),
    /**
     * v1-v6
     */
    V6("V6",6),
    V5("V5",5),
    V4("V4",4),
    V3("V3",3),
    V2("V2",2),
    V1("V1",1),
    //普通用户
    NORMAL("NORMAL",0);
    private String type;
    private Integer code;
    MemberLevelEnum(String type, Integer code) {
        this.type = type;
        this.code = code;
    }
    public List<String> getLevelType(){
        List<String> strs = new ArrayList<>();
        for (MemberLevelEnum value : MemberLevelEnum.values()) {
            strs.add(value.type);
        }
        return strs;
    }
    public int getLevelCode(String Level){
        int codeOne = 0;
        for (MemberLevelEnum value : MemberLevelEnum.values()) {
            if(value.type.equals(Level)){
                codeOne = value.code;
            }
        }
        return codeOne;
    }
    public String getNextLevel(String Level){
        String levelNext = Level;
        int codeOne = 0;
        for (MemberLevelEnum value : MemberLevelEnum.values()) {
            if(value.type.equals(Level)){
                codeOne = value.code;
                break;
            }
        }
        codeOne = codeOne + 1;
        for (MemberLevelEnum value : MemberLevelEnum.values()) {
            if(value.code == (codeOne)){
                levelNext = value.type;
                break;
            }
        }
        return levelNext;
    }
//    public static void main(String[] args) {
//        String zero_level = MemberLevelEnum.SECOND_LEVEL.getNextLevel("SIX_LEVEL");
//        System.out.println(zero_level);
//    }
    /**
     * 比较两个级别的大小,levelOne大于levelTwo返回1,否则返回0
     */
    public int compareLevel(String levelOne ,String levelTwo) {
        int codeOne = 0;
        int codeTwo = 0;
        for (MemberLevelEnum value : MemberLevelEnum.values()) {
            if(value.type.equals(levelOne)){
                codeOne = value.code;
            }
            if(value.type.equals(levelTwo)){
                codeTwo = value.code;
            }
        }
        if(codeOne > codeTwo){
            return 1;
        }
        return 0;
    }
}
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -108,7 +108,17 @@
    /**
     * 直推积分补贴
     */
    DIRECT_SCORE_PERK(21);
    DIRECT_SCORE_PERK(21),
    /**
     * 董事现金补贴
     */
    DIRECTOR_CASH_PERK(22),
    /**
     * 董事现金补贴
     */
    PARTNER_CASH_PERK(23);
    private final int value;
src/main/java/cc/mrbird/febs/common/enumerates/PerkEnum.java
@@ -8,6 +8,10 @@
@Getter
public enum PerkEnum {
    /**
     * 合伙人享全公司入单分红5%加权(现金)
     */
    PARTNER_CASH_PERK_PERCENT("PERK_SET", "PARTNER_CASH_PERK_PERCENT"),
    /**
     * 董事享受全公司入单分红2%加权(现金)
     */
    DIRECTOR_CASH_PERK_PERCENT("PERK_SET", "DIRECTOR_CASH_PERK_PERCENT"),
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
@@ -125,13 +125,18 @@
    private String levelName;
    /**
     * 董事
     * 董事1:是 2:否
     */
    private Integer director;
    /**
     * 店长
     * 店长1:是 2:否
     */
    private Integer storeMaster;
    /**
     * 是否是合伙人 1:是 2:否
     */
    private Integer partner;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -82,6 +82,11 @@
    List<MallMember> selectMemberDirectForHasLevel(@Param("inviteId") String inviteId);
    /**
     * 根据type获取用户集合
     * @param type 1:董事 2:店主 3:合伙人
     * @return
     */
    List<MallMember> selectDirectorsOrStoreMaster(@Param("type") Integer type);
    List<MallMember> selectMemberWithLevel(String level);
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -1,9 +1,6 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.enumerates.PerkEnum;
import cc.mrbird.febs.common.enumerates.*;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
@@ -184,85 +181,147 @@
        String orderNo = mallOrderInfo.getOrderNo();
        //购买人
        Long memberId = mallOrderInfo.getMemberId();
        MallMember mallMember = mallMemberMapper.selectById(memberId);
        /**
         * 1、购买人获得固定比例的积分
         *      = amountTC * 固定比例
         */
        DataDictionaryCustom buySetMealPerkPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PerkEnum.BUY_SET_MEAL_PERK_PERCENT.getType(),
                PerkEnum.BUY_SET_MEAL_PERK_PERCENT.getCode());
        if(ObjectUtil.isNotEmpty(buySetMealPerkPercentDic)){
            BigDecimal buySetMealPerkPercent = new BigDecimal(buySetMealPerkPercentDic.getValue() == null ? "0" : buySetMealPerkPercentDic.getValue());
            //购买人获得的积分数量
            BigDecimal buySetMealPerk = buySetMealPerkPercent.multiply(AppContants.PERCENTAGE).multiply(amountTC).setScale(2, BigDecimal.ROUND_DOWN);
            //增加积分
            iApiMallMemberWalletService.add(buySetMealPerk,memberId,"score");
            //增加一个获得积分的流水记录
            mallMoneyFlowService.addMoneyFlow(
                    memberId,
                    buySetMealPerk,
                    MoneyFlowTypeEnum.BUY_SET_MEAL_PERK.getValue(),
                    orderNo,
                    FlowTypeEnum.SCORE.getValue(),
                    AppContants.IS_RETURN_YES);
        }
        perkMember(memberId,
                PerkEnum.BUY_SET_MEAL_PERK_PERCENT,
                amountTC,
                "score",
                MoneyFlowTypeEnum.BUY_SET_MEAL_PERK.getValue(),
                FlowTypeEnum.SCORE.getValue(),
                orderNo);
        /**
         * 2、直推获取8%的现金->余额,4%的积分->积分
         */
        MallMember mallMember = mallMemberMapper.selectById(memberId);
        if(ObjectUtil.isNotEmpty(mallMember.getReferrerId())){
            String referrerId = mallMember.getReferrerId();
            MallMember mallMemberDirect = mallMemberMapper.selectInfoByInviteId(referrerId);
            Long directMemberId = mallMemberDirect.getId();
            DataDictionaryCustom directCashPerkPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    PerkEnum.DIRECT_CASH_PERK_PERCENT.getType(),
                    PerkEnum.DIRECT_CASH_PERK_PERCENT.getCode());
            if(ObjectUtil.isNotEmpty(directCashPerkPercentDic)){
                BigDecimal directCashPerkPercent = new BigDecimal(directCashPerkPercentDic.getValue() == null ? "0" : directCashPerkPercentDic.getValue());
                //获得的现金数量
                BigDecimal directCashPerk = directCashPerkPercent.multiply(AppContants.PERCENTAGE).multiply(amountTC).setScale(2, BigDecimal.ROUND_DOWN);
                //增加余额
                iApiMallMemberWalletService.add(directCashPerk,directMemberId,"balance");
                //增加一个获得现金的流水记录
                mallMoneyFlowService.addMoneyFlow(
                        directMemberId,
                        directCashPerk,
                        MoneyFlowTypeEnum.DIRECT_CASH_PERK.getValue(),
                        orderNo,
                        FlowTypeEnum.BALANCE.getValue(),
                        AppContants.IS_RETURN_YES);
            }
            DataDictionaryCustom directScorePerkPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    PerkEnum.DIRECT_SCORE_PERK_PERCENT.getType(),
                    PerkEnum.DIRECT_SCORE_PERK_PERCENT.getCode());
            if(ObjectUtil.isNotEmpty(directScorePerkPercentDic)){
                BigDecimal directScorePerkPercent = new BigDecimal(directScorePerkPercentDic.getValue() == null ? "0" : directScorePerkPercentDic.getValue());
                //获得的积分数量
                BigDecimal directScorePerk = directScorePerkPercent.multiply(AppContants.PERCENTAGE).multiply(amountTC).setScale(2, BigDecimal.ROUND_DOWN);
                //增加余额
                iApiMallMemberWalletService.add(directScorePerk,directMemberId,"score");
                //增加一个获得积分的流水记录
                mallMoneyFlowService.addMoneyFlow(
                        directMemberId,
                        directScorePerk,
                        MoneyFlowTypeEnum.DIRECT_SCORE_PERK.getValue(),
                        orderNo,
                        FlowTypeEnum.SCORE.getValue(),
                        AppContants.IS_RETURN_YES);
            }
            perkMember(directMemberId,
                    PerkEnum.DIRECT_CASH_PERK_PERCENT,
                    amountTC,
                    "balance",
                    MoneyFlowTypeEnum.DIRECT_CASH_PERK.getValue(),
                    FlowTypeEnum.BALANCE.getValue(),
                    orderNo);
            perkMember(directMemberId,
                    PerkEnum.DIRECT_SCORE_PERK_PERCENT,
                    amountTC,
                    "score",
                    MoneyFlowTypeEnum.DIRECT_SCORE_PERK.getValue(),
                    FlowTypeEnum.SCORE.getValue(),
                    orderNo);
        }
        /**
         * 4、董事享受全公司入单分红2%加权(现金)
         */
//        mallMemberMapper.selectMemberWithLevel()
        List<MallMember> mallMembersDirectors = mallMemberMapper.selectDirectorsOrStoreMaster(1);
        if(CollUtil.isNotEmpty(mallMembersDirectors)){
            perkMembersLevel(mallMembersDirectors,
                    PerkEnum.DIRECTOR_CASH_PERK_PERCENT,
                    amountTC,
                    "balance",
                    MoneyFlowTypeEnum.DIRECTOR_CASH_PERK.getValue(),
                    FlowTypeEnum.BALANCE.getValue(),
                    orderNo);
        }
        /**
         * 5、合伙人享全公司入单分红5%加权(现金)
         */
        List<MallMember> mallMemberPartners = mallMemberMapper.selectDirectorsOrStoreMaster(3);
        if(CollUtil.isNotEmpty(mallMemberPartners)){
            perkMembersLevel(mallMemberPartners,
                    PerkEnum.PARTNER_CASH_PERK_PERCENT,
                    amountTC,
                    "balance",
                    MoneyFlowTypeEnum.PARTNER_CASH_PERK.getValue(),
                    FlowTypeEnum.BALANCE.getValue(),
                    orderNo);
        }
        /**
         *
         */
    }
    /**
     * 给某一个用户根据订单金额去加权平分
     * @param memberId 用户ID
     * @param perkEnum 比例的枚举值
     * @param amountTC 总金额
     * @param walletField 类型:score:积分 balance:余额
     * @param type 流水类型
     * @param flowType 流水分类
     * @param orderNo 订单编号
     */
    private void perkMember(Long memberId,PerkEnum perkEnum,BigDecimal amountTC,String walletField,int type,int flowType,String orderNo){
        DataDictionaryCustom perkEnumDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                perkEnum.getType(),
                perkEnum.getCode());
        if(ObjectUtil.isNotEmpty(perkEnumDic)){
            BigDecimal perkEnumDicPercent = new BigDecimal(perkEnumDic.getValue() == null ? "0" : perkEnumDic.getValue());
            //获得数量
            BigDecimal perkEnumDicPercentPerk = perkEnumDicPercent.multiply(AppContants.PERCENTAGE).multiply(amountTC).setScale(2, BigDecimal.ROUND_DOWN);
            //增加
            iApiMallMemberWalletService.add(perkEnumDicPercentPerk,memberId,walletField);
            //增加一个流水记录
            mallMoneyFlowService.addMoneyFlow(
                    memberId,
                    perkEnumDicPercentPerk,
                    type,
                    orderNo,
                    flowType,
                    AppContants.IS_RETURN_YES);
        }
    }
    /**
     *  按照级别,根据订单金额去加权平分
     * @param mallMembers 用户
     * @param perkEnum  比例的枚举值
     * @param amountTC  总金额
     * @param walletField   类型:score:积分 balance:余额
     * @param type  流水类型
     * @param flowType  流水分类
     * @param orderNo   订单编号
     */
    private void perkMembersLevel(List<MallMember> mallMembers,PerkEnum perkEnum,BigDecimal amountTC,String walletField,int type,int flowType,String orderNo){
        DataDictionaryCustom perkEnumDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                perkEnum.getType(),
                perkEnum.getCode());
        if(ObjectUtil.isNotEmpty(perkEnumDic)){
            BigDecimal perkEnumDicPercent = new BigDecimal(perkEnumDic.getValue() == null ? "0" : perkEnumDic.getValue());
            //获得的现金
            BigDecimal perkEnumDicPercentPerkSum = perkEnumDicPercent.multiply(AppContants.PERCENTAGE).multiply(amountTC).setScale(2, BigDecimal.ROUND_DOWN);
            //然后董事平分
            BigDecimal perkEnumDicPercentPerk = perkEnumDicPercentPerkSum.divide(new BigDecimal(mallMembers.size()), 2, BigDecimal.ROUND_DOWN);
            if(perkEnumDicPercentPerk.compareTo(BigDecimal.ZERO) > 0){
                for(MallMember mallMember : mallMembers){
                    Long memberId = mallMember.getId();
                    //增加余额
                    iApiMallMemberWalletService.add(perkEnumDicPercentPerk,memberId,walletField);
                    //增加一个获得现金的流水记录
                    mallMoneyFlowService.addMoneyFlow(
                            memberId,
                            perkEnumDicPercentPerk,
                            type,
                            orderNo,
                            flowType,
                            AppContants.IS_RETURN_YES);
                }
            }
        }
    }
    @Override
    public void rankReturnMoney(Long orderId) {
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -393,6 +393,9 @@
            <if test="type == 2">
                and store_master = 1
            </if>
            <if test="type == 3">
                and partner = 1
            </if>
        </where>
    </select>
src/main/resources/templates/febs/views/modules/system/perkSet.html
New file
@@ -0,0 +1,75 @@
<div class="layui-fluid layui-anim febs-anim" id="perk-set" lay-title="补贴设置">
    <div class="layui-row layui-col-space8 febs-container">
        <form class="layui-form" action="" lay-filter="perk-set-form">
            <div class="layui-card">
                <div class="layui-card-body">
                    <div class="layui-form-item">
                        <label class="layui-form-label ">增加到积分池比例:</label>
                        <div class="layui-input-block">
                            <input type="text" name="everydayRatio" data-th-id="${scorePoor.everydayRatio}"
                                   lay-verify="number" autocomplete="off" class="layui-input" >
                        </div>
                        <div class="layui-word-aux" style="margin-left: 150px;">【填写整数】每日订单金额的百分之几,增加到积分池:直接输入百分比,例如25%,直接输入25</div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">每日平分百分比:</label>
                        <div class="layui-input-block">
                            <input type="text" name="dividEquallyRatio" data-th-id="${scorePoor.dividEquallyRatio}"
                                   lay-verify="number" autocomplete="off" class="layui-input" >
                        </div>
                        <div class="layui-word-aux" style="margin-left: 150px;">【填写整数】积分池每日平分百分比:直接输入百分比,例如25%,直接输入25</div>
                    </div>
                </div>
                <div class="layui-card-footer">
                    <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="perk-set-form-submit" id="submit">保存</button>
                </div>
            </div>
        </form>
    </div>
</div>
<style>
    .layui-form-label {
        width: 120px;
    }
    .layui-form-item .layui-input-block {
        margin-left: 150px;
    }
    .layui-table-form .layui-form-item {
        margin-bottom: 20px !important;
    }
</style>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['dropdown', 'jquery', 'validate', 'febs', 'form', 'eleTree'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            scorePoor = [[${scorePoor}]],
            validate = layui.validate,
            $view = $('#perk-set');
        form.verify(validate);
        initCashoutValue();
        form.render();
        function initCashoutValue() {
            form.val("perk-set-form", {
                "everydayRatio": scorePoor.everydayRatio,
                "dividEquallyRatio": scorePoor.dividEquallyRatio
            });
        }
        form.on('submit(perk-set-form-submit)', function (data) {
            console.log(data);
            febs.post(ctx + 'admin/system/scorePoor', data.field, function (res) {
                febs.alert.success('设置成功');
            });
            window.location.reload();
            return false;
        });
    });
</script>