Hentua
2023-04-21 4f0449594ac069d569d477e800ed77de1a339836
添加全网分红逻辑
2 files added
6 files modified
137 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallSystemSetting.java 24 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallSystemSettingMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 70 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 23 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -81,7 +81,12 @@
    /**
     * 美业直推分红设置
     */
    DIRECT_BONUS_SETTING("DIRECT_BONUS_SETTING", "");
    DIRECT_BONUS_SETTING("DIRECT_BONUS_SETTING", ""),
    INTERNET_LEVEL_BONUS("INTERNET_LEVEL_BONUS", ""),
    ALL_INTERNET_BONUS("MEIYE_BONUS_TYPE", "ALL_BONUS"),
    ALL_INTERNET_BONUS_RELEASE("MEIYE_BONUS_TYPE", "BONUS_RELEASE");
    private String type;
    private String code;
src/main/java/cc/mrbird/febs/mall/entity/MallSystemSetting.java
New file
@@ -0,0 +1,24 @@
package cc.mrbird.febs.mall.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author wzy
 * @date 2023-04-21
 **/
@Data
@TableName("mall_system_setting")
public class MallSystemSetting {
    @TableId(type = IdType.AUTO)
    private Long id;
    private BigDecimal allBonus;
    private BigDecimal agentBonus;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -103,4 +103,6 @@
    List<MallMember> selectByRole(@Param("type") int type, @Param("state")int state);
    List<MallMember> selectParentMemberList(@Param("list") List<String> inviteIds, @Param("refererId") String refererId, @Param("limit") Integer limit);
    List<MallMember> selectMemberAfterLevelList(String level);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallSystemSettingMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallSystemSetting;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface MallSystemSettingMapper extends BaseMapper<MallSystemSetting> {
}
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -42,7 +42,7 @@
     */
    @Scheduled(cron = "0 30 0 * * ?")
    public void profitJob() {
        memberProfitService.agentProfit(null);
        memberProfitService.agentProfit();
    }
    /**
src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java
@@ -30,4 +30,6 @@
    void scorePool();
    void selaHalfVoucher(String price);
    void allInternetProfit();
}
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -61,6 +61,8 @@
    private final MallScoreAchieveReleaseMapper mallScoreAchieveReleaseMapper;
    private final MallScoreVoucherMapper mallScoreVoucherMapper;
    private final MallSystemSettingMapper mallSystemSettingMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void staticProfit(Date profitDate) {
@@ -628,4 +630,72 @@
        return achieveRelease;
    }
    @Override
    public void allInternetProfit() {
        log.info("###全网分红执行--start--###");
        MallSystemSetting systemSetting = mallSystemSettingMapper.selectById(1L);
        if (systemSetting == null) {
            log.info("没有系统配置");
            return;
        }
        BigDecimal hundred = BigDecimal.valueOf(100);
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.ALL_INTERNET_BONUS_RELEASE.getType(), DataDictionaryEnum.ALL_INTERNET_BONUS_RELEASE.getCode());
        if (dic == null || StrUtil.isBlank(dic.getValue()) || Integer.parseInt(dic.getValue()) == 0) {
            log.info("不进行全网分红");
            return;
        }
        // 全网分红
        BigDecimal waitToBonus = systemSetting.getAllBonus().multiply(new BigDecimal(dic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
        List<MallMember> mallMembers = mallMemberMapper.selectMemberAfterLevelList(MemberLevelEnums.FIRST_LEVEL_Y.getCode());
        if (CollUtil.isEmpty(mallMembers) || waitToBonus.compareTo(BigDecimal.ZERO) < 1) {
            log.info("待分红金额不足或会员不足");
            return;
        }
        List<DataDictionaryCustom> dicList = dataDictionaryCustomMapper.selectDicByType(DataDictionaryEnum.INTERNET_LEVEL_BONUS.getType());
        if (CollUtil.isEmpty(dicList)) {
            return;
        }
        Map<String, BigDecimal> levelBonusMap = new HashMap<>();
        dicList.forEach(item -> {
            BigDecimal levelRatio = new BigDecimal(item.getValue()).divide(hundred, 2, RoundingMode.HALF_UP);
            levelBonusMap.put(item.getCode(), waitToBonus.multiply(levelRatio));
        });
        Map<String, List<MallMember>> levelMemberMap = new HashMap<>();
        // TODO 并发处理
        mallMembers.forEach(item -> {
            List<MallMember> memberList = levelMemberMap.get(item.getLevel());
            if (CollUtil.isEmpty(memberList)) {
                memberList = new ArrayList<>();
            }
            memberList.add(item);
            levelMemberMap.put(item.getLevel(), memberList);
        });
        if (levelMemberMap.isEmpty()) {
            return;
        }
        for (Map.Entry<String, List<MallMember>> entry : levelMemberMap.entrySet()) {
            BigDecimal levelBonus = levelBonusMap.get(entry.getKey());
            List<MallMember> memberList = entry.getValue();
            if (CollUtil.isEmpty(memberList) || levelBonus.compareTo(BigDecimal.ZERO) < 1) {
                continue;
            }
            BigDecimal perBonus = levelBonus.divide(BigDecimal.valueOf(memberList.size()), 2, RoundingMode.HALF_UP);
            memberList.forEach(item -> {
                changeScoreAndCommission(item.getId(), perBonus, 2, null);
            });
        }
        log.info("###全网分红执行--end--###");
    }
}
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -457,4 +457,27 @@
            limit #{limit}
        </if>
    </select>
    <select id="selectMemberAfterLevelList" resultType="cc.mrbird.febs.mall.entity.MallMember">
        SELECT
            m.*, b.
            VALUE
        FROM
            mall_member m
                INNER JOIN data_dictionary_custom b ON m.LEVEL = b. CODE
        WHERE 1=1
          AND b.type = 'AGENT_LEVEL'
          AND b.VALUE > (
            SELECT
                VALUE
            FROM
                data_dictionary_custom a
            WHERE
                a. CODE = #{level}
              AND a.type = 'AGENT_LEVEL'
        )
        GROUP BY
            m.id
    </select>
</mapper>