src/main/java/cc/mrbird/febs/mall/entity/MallMqRecord.java
New file @@ -0,0 +1,20 @@ package cc.mrbird.febs.mall.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("mall_mq_record") public class MallMqRecord { private Long id; private Long orderId; /** * 1:已处理 2:未处理 */ private Integer state; private Integer retryTimes; } src/main/java/cc/mrbird/febs/mall/mapper/MallMqRecordMapper.java
New file @@ -0,0 +1,14 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.entity.MallMqRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import java.util.List; public interface MallMqRecordMapper extends BaseMapper<MallMqRecord> { MallMqRecord selectByOrderId(@Param("orderId")long orderId); List<MallMqRecord> selectByStateLimitTen(@Param("state")int i); } src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -82,6 +82,15 @@ memberProfitService.teamEqualsPerkJob(null); } /** * 补贴消息--重试 * 一个小时运行一次 */ @Scheduled(cron = "0 0 * * * ?") public void mqPerkRetryJob() { memberProfitService.mqPerkRetryJob(); } /** * 静态分红 src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java
@@ -47,4 +47,6 @@ void offLinePerkJob(Date profitDate); void teamEqualsPerkJob(Date profitDate); void mqPerkRetryJob(); } src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -47,6 +47,7 @@ private final SqlSessionTemplate sqlSessionTemplate; private final IApiMallMemberWalletService memberWalletService; private final MallMoneyFlowMapper mallMoneyFlowMapper; private final MallMqRecordMapper mallMqRecordMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -269,6 +270,11 @@ long end = System.currentTimeMillis(); log.info("============订单:{},时间:{}===========",mallOrderInfo.getOrderNo(),(end - start)/1000); MallMqRecord mallMqRecord = mallMqRecordMapper.selectByOrderId(orderId); if(ObjectUtil.isNotEmpty(mallMqRecord)){ mallMqRecord.setState(1); mallMqRecordMapper.updateById(mallMqRecord); } } /** src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -78,6 +78,7 @@ private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final MallAchieveRecordMapper mallAchieveRecordMapper; private final MallMemberWalletMapper mallMemberWalletMapper; private final MallMqRecordMapper mallMqRecordMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -343,6 +344,15 @@ orderInfo.setPayResult("1"); changeWallet(orderInfo.getId()); /** * 插入一条待处理记录 * mq处理之后,更新状态 */ MallMqRecord mallMqRecord = new MallMqRecord(); mallMqRecord.setOrderId(orderInfo.getId()); mallMqRecord.setState(2); mallMqRecord.setRetryTimes(2); mallMqRecordMapper.insert(mallMqRecord); //发送补贴消息 agentProducer.sendPerkMoneyMsg(orderInfo.getId()); //发送代理自动升级消息 src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -12,6 +12,7 @@ import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.*; import cc.mrbird.febs.mall.vo.AdminTeamEqualsPerkVo; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; @@ -56,6 +57,8 @@ private final MallMemberWalletMapper mallMemberWalletMapper; private final IAgentService iAgentService; private final IMallMoneyFlowService mallMoneyFlowService; private final MallMqRecordMapper mallMqRecordMapper; private final AgentProducer agentProducer; @Override @Transactional(rollbackFor = Exception.class) @@ -757,4 +760,29 @@ } } @Override public void mqPerkRetryJob() { /** * 每次拿重试次数大于零 * 按ID asc排序的十条数据 */ List<MallMqRecord> mallMqRecords = mallMqRecordMapper.selectByStateLimitTen(2); if(CollUtil.isEmpty(mallMqRecords)){ return; } for(MallMqRecord mallMqRecord : mallMqRecords){ Integer retryTimes = mallMqRecord.getRetryTimes(); if(retryTimes <= 0){ continue; } retryTimes = retryTimes - 1; mallMqRecord.setRetryTimes(retryTimes); mallMqRecordMapper.updateById(mallMqRecord); Long orderId = mallMqRecord.getOrderId(); agentProducer.sendPerkMoneyMsg(orderId); } } } src/main/resources/application-dev.yml
@@ -46,10 +46,10 @@ # 连接超时时间(毫秒) timeout: 5000 rabbitmq: host: 121.37.162.173 host: 47.111.90.145 port: 5672 username: hibit password: hibit123 username: zj_mall password: zj_mall123 publisher-confirm-type: correlated pay: src/main/resources/mapper/modules/MallMqRecordMapper.xml
New file @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.mall.mapper.MallMqRecordMapper"> <select id="selectByOrderId" resultType="cc.mrbird.febs.mall.entity.MallMqRecord"> select a.* from mall_mq_record a where a.order_id = #{orderId} </select> <select id="selectByStateLimitTen" resultType="cc.mrbird.febs.mall.entity.MallMqRecord"> select a.* from mall_mq_record a where a.state = #{state} and a.retry_times > 0 order by a.id asc limit 10 </select> </mapper> src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -15,6 +15,7 @@ import cc.mrbird.febs.pay.model.*; import cc.mrbird.febs.pay.service.UnipayService; import cc.mrbird.febs.rabbit.consumer.AgentConsumer; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; @@ -49,10 +50,14 @@ @Autowired private MallMemberMapper memberMapper; @Autowired private AgentProducer agentProducer; @Test public void dynamicProfit() { agentService.perkMoneyConsumer(665L); memberProfitService.teamEqualsPerkJob(null); agentProducer.sendPerkMoneyMsg(679L); // agentService.perkMoneyConsumer(665L); // memberProfitService.teamEqualsPerkJob(null); // List<MallMember> mallMemberTeamPerk = new ArrayList<>(); // MallMember mallMember = memberMapper.selectById(233L); // List<String> ids = StrUtil.split(mallMember.getReferrerIds(), ',');