一.时序图
![](https://img-blog.csdnimg.cn/direct/15d36c60f1af4027b24e5519ef5372b4.png)
二.系统逻辑
1. 订单新增消息处理
- 监听订单新增消息
- 类:
LeadsOrderConsumer
- 方法:
recvMessage
- 监听的Topic:
com.sankuai.leads.notify
- 处理方法:
newLeadsCountHandle
- 类:
2. 决策最小留资身份
- 决策最小留资身份
Integer salesBizCode = decideSalesBizCode(leadsType);
3. 获取逻辑表达式
- 获取逻辑表达式ID对应的逻辑表达式DTO Map
Map<Integer, LogicExpressionDTO> logicExpressionDTOMap = newLeadsCountDomainReadService.getLogicExpressionByBizId(bizCode, true);
4. 获取主体纬度
- 获取主体纬度
LeadsCountMultiSubjectDTO leadsCountMultiSubject = newLeadsCountDomainReadService.getLeadsCountMultiSubjectByIdByCache(logicExpression DTO.getSubjectType());
5. 逻辑表达式示例
- 逻辑表达式示例
p84&&p37&&s38
- 常量规则:
CONSTANT("p", "规则值配在表里,是常量,且作为消费时的匹配条件")
- 动态获取规则:
CONTEXT("s", "规则值在上上下文动态获取")
- 非前端校验规则:
CONTEXT_NO_FRONT_VALID("t", "规则值配在表里,是常量,不作为消费时的匹配条件")
6. 处理逻辑表达式
-
处理逻辑表达式
List<String> pExpressionIdStrList = Lists.newArrayList(); // 先通过&&split逻辑表达式,再过滤出p类型规则存在pExpressionIdStrList中 expressionIdStr存所有的逻辑规则
-
组合p类型规则
String pExpressionIdStr = String.join("&&", pExpressionIdStrList);
-
最终组合出完整的逻辑匹配语句
Map<String, Integer> varNameToOperate = logicUnitExpressionGroupDTOS.stream() .collect(Collectors.toMap(res -> res.getVarName(), res -> res.getOperate()));
7. 判断逻辑匹配条件
- 判断本次新增订单是否符合逻辑表达式匹配条件
- 方法:
ifMatchLogicRule
- 如果符合,修改该逻辑表达式对应的销量
- 方法:
8. 获取订单总数
- 从云搜中获取符合条件的订单总数
LeadsCounSubjectDTO leadsCounSubjectDTO = getLeadsCountSubjectDTOByCloud(logicExpressionDTO, leadsCountUpdateDTO, expressionIdList, logicUnitExpressionGroupDTOS, leadsCountMultiSubject);
9. 发送销量更新消息
-
获取Kafka分片ID,发送销量更新消息
String partitionId = getPartitionId(leadsCountMultiSubject, leadsCounSubjectDTO); try { leadsCounSubjectDTO.setBizId(bizId); iProducerProcessor.sendMessage(JSON.toJSONString(leadsCounSubjectDTO), partitionId); } catch (Exception e) { log.error("[更新销量发送mafka消息异常]LeadsCountRuleDomainService.doExecute leadsCounSubjectDTO:{}", JSONObject.toJSONString(leadsCounSubjectDTO), e); Cat.logEvent(LogEventType.MQ, LogEventName.MQ.MQ_COUNT_UPDATE+bizId, "1", JSONObject.toJSONString(leadsCounSubjectDTO)); }
-
消息的Topic
countUpdateProducer
10. 监听销量更新消息
- 监听销量更新消息
- 类:
LeadsCountUpdateConsumer
- 方法:
recvMessage
- 类:
11. 新增或更新销量
- 新增或更新销量
try { LeadsCountSubjectExample leadsCountSubjectExample = new LeadsCountSubjectExample(); leadsCountSubjectExample.createCriteria() .andLogicExpressionIdEqualTo(leadsCounSubjectDTO.getLogicExpressionId()) .andSubjectTypeEqualTo(leadsCounSubjectDTO.getSubjectType()) .andSubjectIdEqualTo(leadsCounSubjectDTO.getSubjectId()); List<LeadsCountSubject> leadsCountSubjects = leadsCountSubjectMapper.selectByExample(leadsCountSubjectExample); int i = 0; if (CollectionUtils.isEmpty(leadsCountSubjects)) { LeadsCountSubject leadsCountSubject = new LeadsCountSubject(); BeanUtils.copyProperties(leadsCounSubjectDTO, leadsCountSubject); i = leadsCountSubjectMapper.insertSelective(leadsCountSubject); return i > 0 ? true : false; } else { LeadsCountSubject leadsCountSubjectUpdate = new LeadsCountSubject(); leadsCountSubjectUpdate.setUpdateTime(new Date()); leadsCountSubjectUpdate.setCnt(leadsCounSubjectDTO.getCnt()); leadsCountSubjectUpdate.setVersion(leadsCounSubjectDTO.getVersion()); i = leadsCountSubjectMapper.updateByExampleSelective(leadsCountSubjectUpdate, leadsCountSubjectExample); return i > 0 ? true : false; } } catch (Exception e) { log.error("updateOrInsertLeadsSubjectCount update db exception leadsCounSubjectDTO:{}", JSON.toJSONString(leadsCounSubjectDTO), e); return false; }