refactor(audit): 优化审核网关实现并支持模板变量替换
- 修改sendAuditNotification方法参数,增加AuditDO对象传递 - 重构老板审核记录处理逻辑,改为查询更新或新建记录 - 新增buildTemplateVariables方法构建模板变量映射 - 新增replaceTemplateVariables方法实现模板变量替换功能 - 集成订单信息查询并填充到消息模板变量中 - 支持订单编号、录入员、车辆信息等动态变量替换 - 支持审核员、审批员等操作人员信息变量替换 - 添加日期时间格式化处理功能 - 优化消息发送流程,支持动态模板内容生成
This commit is contained in:
parent
ed6a5f6ed9
commit
a0bfb12556
@ -27,6 +27,7 @@ import org.springframework.stereotype.Repository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
@ -126,7 +127,7 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
}
|
||||
|
||||
// 发送提审消息(待审核消息)
|
||||
sendAuditNotification(MessageTemplateSceneEnum.WAIT_AUDIT, auditDO.getAuditId(),
|
||||
sendAuditNotification(MessageTemplateSceneEnum.WAIT_AUDIT, auditDO, auditDO.getAuditId(),
|
||||
orderSubmitReviewCmd.getCreatedBy(), orderSubmitReviewCmd.getCreatedByName());
|
||||
|
||||
return auditConvert.toAudit(auditDO);
|
||||
@ -181,7 +182,7 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
}
|
||||
|
||||
// 发送审核驳回消息
|
||||
sendAuditNotification(MessageTemplateSceneEnum.AUDIT_REJECT, auditDO.getAuditId(),
|
||||
sendAuditNotification(MessageTemplateSceneEnum.AUDIT_REJECT, auditDO, auditDO.getAuditId(),
|
||||
orderRejectApproveCmd.getCreatedBy(), orderRejectApproveCmd.getCreatedByName());
|
||||
|
||||
return auditConvert.toAudit(auditDO);
|
||||
@ -211,7 +212,7 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
}
|
||||
|
||||
// 发送审批通过消息
|
||||
sendAuditNotification(MessageTemplateSceneEnum.APPROVE_PASS, auditDO.getAuditId(),
|
||||
sendAuditNotification(MessageTemplateSceneEnum.APPROVE_PASS, auditDO, auditDO.getAuditId(),
|
||||
orderFinalApproveCmd.getCreatedBy(), orderFinalApproveCmd.getCreatedByName());
|
||||
|
||||
return auditConvert.toAudit(auditDO);
|
||||
@ -242,7 +243,7 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
}
|
||||
|
||||
// 发送审批驳回消息
|
||||
sendAuditNotification(MessageTemplateSceneEnum.APPROVE_REJECT, auditDO.getAuditId(),
|
||||
sendAuditNotification(MessageTemplateSceneEnum.APPROVE_REJECT, auditDO, auditDO.getAuditId(),
|
||||
orderRejectFinalCmd.getCreatedBy(), orderRejectFinalCmd.getCreatedByName());
|
||||
|
||||
return auditConvert.toAudit(auditDO);
|
||||
@ -273,8 +274,19 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
auditDO.setAuditByName(orderApproveCmd.getCreatedByName());
|
||||
auditMapper.updateById(auditDO);
|
||||
|
||||
// 自动生成报老板待审核记录(每次都创建新记录)
|
||||
AuditDO auditDO1 = new AuditDO();
|
||||
// 更新审核记录状态为审核成功
|
||||
LambdaQueryWrapper<AuditDO> approveQueryWrapper = Wrappers.lambdaQuery(AuditDO.class);
|
||||
approveQueryWrapper.eq(AuditDO::getSubjectId, orderApproveCmd.getOrderId());
|
||||
approveQueryWrapper.eq(AuditDO::getSubjectType, AuditSubjectTypeEnum.PURCHASE_ORDER);
|
||||
approveQueryWrapper.eq(AuditDO::getType, AuditTypeEnum.BOSS_AUDIT);
|
||||
AuditDO auditDO1 = auditMapper.selectOne(approveQueryWrapper);
|
||||
if (Objects.nonNull(auditDO1)) {
|
||||
// 存在老板审批记录就修改状态
|
||||
auditDO1.setState(AuditStateEnum.WAITING_AUDIT);
|
||||
auditMapper.updateById(auditDO1);
|
||||
} else {
|
||||
// 自动生成报老板待审核记录
|
||||
auditDO1 = new AuditDO();
|
||||
auditDO1.setSubjectId(orderApproveCmd.getOrderId());
|
||||
auditDO1.setSubjectType(AuditSubjectTypeEnum.PURCHASE_ORDER);
|
||||
auditDO1.setType(AuditTypeEnum.BOSS_AUDIT);
|
||||
@ -282,9 +294,10 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
auditDO1.setCreatedBy(orderApproveCmd.getCreatedBy());
|
||||
auditDO1.setCreatedByName(orderApproveCmd.getCreatedByName());
|
||||
auditMapper.insert(auditDO1);
|
||||
}
|
||||
|
||||
// 发送待审批消息
|
||||
sendAuditNotification(MessageTemplateSceneEnum.WAIT_APPROVE, auditDO.getAuditId(),
|
||||
sendAuditNotification(MessageTemplateSceneEnum.WAIT_APPROVE, auditDO, auditDO.getAuditId(),
|
||||
orderApproveCmd.getCreatedBy(), orderApproveCmd.getCreatedByName());
|
||||
|
||||
return auditConvert.toAudit(auditDO1);
|
||||
@ -295,12 +308,13 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
* 发送审核流程消息通知
|
||||
*
|
||||
* @param sceneEnum 消息场景枚举
|
||||
* @param auditDO 审核记录
|
||||
* @param subjectId 关联主体ID(订单ID等)
|
||||
* @param createdBy 操作人ID
|
||||
* @param createdByName 操作人名称
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
private void sendAuditNotification(MessageTemplateSceneEnum sceneEnum, Long subjectId, Long createdBy, String createdByName) {
|
||||
private void sendAuditNotification(MessageTemplateSceneEnum sceneEnum, AuditDO auditDO, Long subjectId, Long createdBy, String createdByName) {
|
||||
// 1. 查询启用的消息模板
|
||||
LambdaQueryWrapper<MessageTemplateDO> templateWrapper = Wrappers.lambdaQuery(MessageTemplateDO.class);
|
||||
templateWrapper.eq(MessageTemplateDO::getTemplateCategory, MessageTemplateCategoryEnum.PURCHASE_ORDER_MESSAGE_TEMPLATE);
|
||||
@ -320,11 +334,21 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 创建消息记录
|
||||
// 2. 查询订单信息用于变量替换
|
||||
OrderDO orderDO = orderMapper.selectByOrderId(subjectId);
|
||||
|
||||
// 3. 构建变量替换映射
|
||||
Map<String, String> variables = buildTemplateVariables(orderDO, auditDO, createdByName, sceneEnum);
|
||||
|
||||
// 4. 替换模板变量
|
||||
String title = replaceTemplateVariables(template.getTitleTemplate(), variables);
|
||||
String content = replaceTemplateVariables(template.getContentTemplate(), variables);
|
||||
|
||||
// 5. 创建消息记录
|
||||
MessageDO message = new MessageDO();
|
||||
message.setMessageTemplateId(template.getMessageTemplateId());
|
||||
message.setTitle(template.getTitleTemplate());
|
||||
message.setContent(template.getContentTemplate());
|
||||
message.setTitle(title);
|
||||
message.setContent(content);
|
||||
message.setCreatedBy(createdBy);
|
||||
message.setCreatedByName(createdByName);
|
||||
message.setState(MessageStateEnum.SENT);
|
||||
@ -333,7 +357,7 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
message.setSentAt(LocalDateTime.now());
|
||||
messageMapper.insert(message);
|
||||
|
||||
// 3. 查询所有需要接收消息的用户
|
||||
// 6. 查询所有需要接收消息的用户
|
||||
UserListQry userListQry = new UserListQry();
|
||||
userListQry.setRoleIdList(template.getRoleIds());
|
||||
List<UserVO> userVOList = userService.list(userListQry);
|
||||
@ -351,7 +375,7 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
return;
|
||||
}
|
||||
|
||||
// 4. 批量创建消息接收记录
|
||||
// 7. 批量创建消息接收记录
|
||||
List<MessageReceiverDO> receiverList = new ArrayList<>();
|
||||
for (AdminVO adminVO : adminVOList) {
|
||||
MessageReceiverDO receiver = new MessageReceiverDO();
|
||||
@ -366,5 +390,78 @@ public class AuditGatewayImpl implements AuditGateway {
|
||||
receiverList.forEach(messageReceiverMapper::insert);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建模板变量映射
|
||||
*
|
||||
* @param orderDO 订单信息
|
||||
* @param operatorName 操作人
|
||||
* @param sceneEnum 消息场景
|
||||
* @return 变量映射表
|
||||
*/
|
||||
private Map<String, String> buildTemplateVariables(OrderDO orderDO, AuditDO auditDO, String operatorName, MessageTemplateSceneEnum sceneEnum) {
|
||||
Map<String, String> variables = new HashMap<>();
|
||||
|
||||
if (Objects.nonNull(orderDO)) {
|
||||
// 订单基本信息
|
||||
variables.put("订单编号", Objects.nonNull(orderDO.getOrderSn()) ? orderDO.getOrderSn() : "未知");
|
||||
variables.put("录入员姓名", Objects.nonNull(orderDO.getCreatedByName()) ? orderDO.getCreatedByName() : "未知");
|
||||
variables.put("录入员提审时间", Objects.nonNull(orderDO.getCreatedAt()) ? orderDO.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "未知");
|
||||
variables.put("车牌号", Objects.nonNull(orderDO.getOrderVehicleDO()) ? orderDO.getOrderVehicleDO().getPlate() : "未知");
|
||||
variables.put("目的地", Objects.nonNull(orderDO.getOrderVehicleDO()) ? orderDO.getOrderVehicleDO().getDestination() : "未知");
|
||||
variables.put("车次号", Objects.nonNull(orderDO.getOrderVehicleDO()) ? orderDO.getOrderVehicleDO().getVehicleNo() : "-");
|
||||
|
||||
// 经销商信息
|
||||
if (Objects.nonNull(orderDO.getOrderDealerDO())) {
|
||||
variables.put("经销商简称", Objects.nonNull(orderDO.getOrderDealerDO().getShortName())
|
||||
? orderDO.getOrderDealerDO().getShortName() : "未知");
|
||||
} else {
|
||||
variables.put("经销商简称", "未知");
|
||||
}
|
||||
}
|
||||
|
||||
if (auditDO.getType().equals(AuditTypeEnum.REVIEWER_AUDIT)) {
|
||||
// 操作人信息
|
||||
variables.put("审核员姓名", Objects.nonNull(operatorName) ? operatorName : "系统");
|
||||
// 审核员驳回原因
|
||||
variables.put("审核员驳回原因", Objects.nonNull(auditDO.getAuditReason()) ? auditDO.getAuditReason() : "无");
|
||||
// 审核员审核时间
|
||||
variables.put("审核员审核时间", Objects.nonNull(auditDO.getAuditAt()) ? auditDO.getAuditAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "未知");
|
||||
}
|
||||
|
||||
if (auditDO.getType().equals(AuditTypeEnum.BOSS_AUDIT)) {
|
||||
// 操作人信息
|
||||
variables.put("审批员姓名", Objects.nonNull(operatorName) ? operatorName : "系统");
|
||||
// 审核员驳回原因
|
||||
variables.put("审批员驳回原因", Objects.nonNull(auditDO.getAuditReason()) ? auditDO.getAuditReason() : "无");
|
||||
// 审核员审核时间
|
||||
variables.put("审批员审批时间", Objects.nonNull(auditDO.getAuditAt()) ? auditDO.getAuditAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "未知");
|
||||
}
|
||||
|
||||
return variables;
|
||||
}
|
||||
|
||||
/**
|
||||
* 替换模板变量
|
||||
* 支持格式:{{变量名}}
|
||||
*
|
||||
* @param template 模板内容
|
||||
* @param variables 变量映射
|
||||
* @return 替换后的内容
|
||||
*/
|
||||
private String replaceTemplateVariables(String template, Map<String, String> variables) {
|
||||
if (Objects.isNull(template) || template.isEmpty()) {
|
||||
return template;
|
||||
}
|
||||
|
||||
String result = template;
|
||||
for (Map.Entry<String, String> entry : variables.entrySet()) {
|
||||
String placeholder = "{{" + entry.getKey() + "}}";
|
||||
String value = Objects.nonNull(entry.getValue()) ? entry.getValue() : "";
|
||||
result = result.replace(placeholder, value);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user