sql/xc_mall.sql | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java | ●●●●● patch | view | raw | blame | history | |
src/main/resources/mapper/modules/MallMemberMapper.xml | ●●●●● patch | view | raw | blame | history | |
src/main/resources/mapper/modules/MallMoneyFlowMapper.xml | ●●●●● patch | view | raw | blame | history | |
src/test/java/cc/mrbird/febs/AgentTest.java | ●●●●● patch | view | raw | blame | history |
sql/xc_mall.sql
@@ -371,3 +371,5 @@ PRIMARY KEY (ID) ) COMMENT = '新闻中心'; alter table mall_money_flow add is_return int null comment '是否返利'; src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -36,7 +36,11 @@ /** * 排名奖励 */ RANK(7); RANK(7), /** * 利润分红 */ PARENT_BONUS(8); private final int value; src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
@@ -19,7 +19,7 @@ private BigDecimal amount; /** * 流水类型 1-直推奖励 2-团队奖励 3-订单支付 4-退款 5-转账 6-提现 7-排名奖励 * 流水类型 1-直推奖励 2-团队奖励 3-订单支付 4-退款 5-转账 6-提现 7-排名奖励 8-利润分红 */ private Integer type; @@ -35,4 +35,10 @@ * 提现状态 1-提现中2-成功 3-拒绝 */ private Integer status; /** * 是否返利 1-是 2-否 */ private Integer isReturn; public static final Integer IS_RETURN_Y = 1; } src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -61,4 +61,6 @@ BigDecimal getAgentTeamAmountByInviteId(@Param("inviteId")String inviteId); IPage<AppVersion> getAppVersionListInPage(Page<AppVersion> page, AppVersion appVersion); List<MallMember> selectByIdAndNoLevel(@Param("refererId") String refererId, @Param("level") String level); } src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
@@ -14,6 +14,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; public interface MallMoneyFlowMapper extends BaseMapper<MallMoneyFlow> { IPage<AdminMallMoneyFlowVo> selectMoneyFlowInPage(Page<AdminMallMoneyFlowVo> page, @Param("record")MallMember mallMember); @@ -23,4 +26,8 @@ IPage<AdminMoneyFlowListVo> getMoneyFlowListInPage(Page<AdminMoneyFlowListVo> page, @Param("record")MoneyFlowListDto moneyFlowListDto); IPage<AdminMoneyChargeListVo> getMoneyChargeListInPage(Page<AdminMoneyChargeListVo> page, @Param("record")MoneyChargeListDto moneyChargeListDto); List<MallMoneyFlow> selectMoneyFlowProfitByDate(@Param("date") Date date); int updateIsReturnByMemberId(@Param("isReturn") Integer isReturn, @Param("memberId") Long memberId); } src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
New file @@ -0,0 +1,86 @@ package cc.mrbird.febs.mall.quartz; import cc.mrbird.febs.common.enumerates.AgentLevelEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallMoneyFlow; import cc.mrbird.febs.mall.mapper.MallMemberMapper; 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.impl.CommonService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.List; /** * @author wzy * @date 2021-09-28 **/ @Slf4j @Component public class ProfitJob { @Autowired private MallMoneyFlowMapper moneyFlowMapper; @Autowired private MallMemberMapper memberMapper; @Autowired private IApiMallMemberWalletService memberWalletService; @Autowired private IApiMallMemberService memberService; @Scheduled(cron = "0 0 1 * * ?") @Transactional(rollbackFor = Exception.class) public void profitJob() { 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()); } } } src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -50,7 +50,7 @@ } } // @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY) @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY) public void agentReturnMoney(String orderId) { log.info("收到返利消息:{}", orderId); try{ src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -159,7 +159,7 @@ <select id="selectMemberParentAgentList" resultType="cc.mrbird.febs.mall.entity.MallMember"> select * from mall_member where level not in ('ZERO_LEVEL', 'FIRST_LEVEL') and invteId!=#{refererId} and invite_id IN where level not in ('ZERO_LEVEL', 'FIRST_LEVEL') and invite_id!=#{refererId} and invite_id IN <foreach collection = "list" item = "item" separator="," open = "(" close = ")" > #{item} </foreach > @@ -208,4 +208,8 @@ <select id="getAppVersionListInPage" resultType="cc.mrbird.febs.mall.entity.AppVersion"> select a.* from app_version a </select> <select id="selectByIdAndNoLevel" resultType="cc.mrbird.febs.mall.entity.MallMember"> select * from mall_member where referrer_id=#{refererId} and level != #{level} </select> </mapper> src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
@@ -81,4 +81,17 @@ </where> order by a.created_time desc </select> <select id="selectMoneyFlowProfitByDate" resultType="cc.mrbird.febs.mall.entity.MallMoneyFlow"> select a.member_id, sum(a.amount) amount from mall_money_flow a where a.type in (1, 2) and date_format(now(), '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') and is_return is null group by a.member_id; </select> <update id="updateIsReturnByMemberId"> update mall_money_flow set is_return=#{isReturn} where member_id=#{memberId} and type in (1, 2) </update> </mapper> src/test/java/cc/mrbird/febs/AgentTest.java
@@ -5,6 +5,7 @@ import cc.mrbird.febs.mall.entity.AgentInfo; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.quartz.ProfitJob; import cc.mrbird.febs.mall.service.IAgentService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import com.alibaba.fastjson.JSONObject; @@ -99,9 +100,9 @@ @Test public void autoLevelUp() { // agentService.autoUpAgentLevel(3L); agentProducer.sendAutoLevelUpMsg(5L); // agentProducer.sendAutoLevelUpMsg(5L); // agentProducer.sendReturnMoneyMsg(24L); agentProducer.sendReturnMoneyMsg(2L); } @Test @@ -111,4 +112,12 @@ System.out.println(aa.setScale(2, RoundingMode.DOWN)); System.out.println(aa.setScale(2, RoundingMode.UP)); } @Autowired private ProfitJob profitJob; @Test public void profitJobTest() { profitJob.profitJob(); } }