refactor(audit): 优化审核网关实现并支持模板变量替换

- 修改sendAuditNotification方法参数,增加AuditDO对象传递
- 重构老板审核记录处理逻辑,改为查询更新或新建记录
- 新增buildTemplateVariables方法构建模板变量映射
- 新增replaceTemplateVariables方法实现模板变量替换功能
- 集成订单信息查询并填充到消息模板变量中
- 支持订单编号、录入员、车辆信息等动态变量替换
- 支持审核员、审批员等操作人员信息变量替换
- 添加日期时间格式化处理功能
- 优化消息发送流程,支持动态模板内容生成
This commit is contained in:
shenyifei 2026-01-15 18:08:11 +08:00
parent ed6a5f6ed9
commit a0bfb12556

View File

@ -27,6 +27,7 @@ import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; 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()); orderSubmitReviewCmd.getCreatedBy(), orderSubmitReviewCmd.getCreatedByName());
return auditConvert.toAudit(auditDO); 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()); orderRejectApproveCmd.getCreatedBy(), orderRejectApproveCmd.getCreatedByName());
return auditConvert.toAudit(auditDO); 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()); orderFinalApproveCmd.getCreatedBy(), orderFinalApproveCmd.getCreatedByName());
return auditConvert.toAudit(auditDO); 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()); orderRejectFinalCmd.getCreatedBy(), orderRejectFinalCmd.getCreatedByName());
return auditConvert.toAudit(auditDO); return auditConvert.toAudit(auditDO);
@ -273,8 +274,19 @@ public class AuditGatewayImpl implements AuditGateway {
auditDO.setAuditByName(orderApproveCmd.getCreatedByName()); auditDO.setAuditByName(orderApproveCmd.getCreatedByName());
auditMapper.updateById(auditDO); 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.setSubjectId(orderApproveCmd.getOrderId());
auditDO1.setSubjectType(AuditSubjectTypeEnum.PURCHASE_ORDER); auditDO1.setSubjectType(AuditSubjectTypeEnum.PURCHASE_ORDER);
auditDO1.setType(AuditTypeEnum.BOSS_AUDIT); auditDO1.setType(AuditTypeEnum.BOSS_AUDIT);
@ -282,9 +294,10 @@ public class AuditGatewayImpl implements AuditGateway {
auditDO1.setCreatedBy(orderApproveCmd.getCreatedBy()); auditDO1.setCreatedBy(orderApproveCmd.getCreatedBy());
auditDO1.setCreatedByName(orderApproveCmd.getCreatedByName()); auditDO1.setCreatedByName(orderApproveCmd.getCreatedByName());
auditMapper.insert(auditDO1); auditMapper.insert(auditDO1);
}
// 发送待审批消息 // 发送待审批消息
sendAuditNotification(MessageTemplateSceneEnum.WAIT_APPROVE, auditDO.getAuditId(), sendAuditNotification(MessageTemplateSceneEnum.WAIT_APPROVE, auditDO, auditDO.getAuditId(),
orderApproveCmd.getCreatedBy(), orderApproveCmd.getCreatedByName()); orderApproveCmd.getCreatedBy(), orderApproveCmd.getCreatedByName());
return auditConvert.toAudit(auditDO1); return auditConvert.toAudit(auditDO1);
@ -295,12 +308,13 @@ public class AuditGatewayImpl implements AuditGateway {
* 发送审核流程消息通知 * 发送审核流程消息通知
* *
* @param sceneEnum 消息场景枚举 * @param sceneEnum 消息场景枚举
* @param auditDO 审核记录
* @param subjectId 关联主体ID订单ID等 * @param subjectId 关联主体ID订单ID等
* @param createdBy 操作人ID * @param createdBy 操作人ID
* @param createdByName 操作人名称 * @param createdByName 操作人名称
*/ */
@Transactional(rollbackFor = Exception.class) @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. 查询启用的消息模板 // 1. 查询启用的消息模板
LambdaQueryWrapper<MessageTemplateDO> templateWrapper = Wrappers.lambdaQuery(MessageTemplateDO.class); LambdaQueryWrapper<MessageTemplateDO> templateWrapper = Wrappers.lambdaQuery(MessageTemplateDO.class);
templateWrapper.eq(MessageTemplateDO::getTemplateCategory, MessageTemplateCategoryEnum.PURCHASE_ORDER_MESSAGE_TEMPLATE); templateWrapper.eq(MessageTemplateDO::getTemplateCategory, MessageTemplateCategoryEnum.PURCHASE_ORDER_MESSAGE_TEMPLATE);
@ -320,11 +334,21 @@ public class AuditGatewayImpl implements AuditGateway {
return; 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(); MessageDO message = new MessageDO();
message.setMessageTemplateId(template.getMessageTemplateId()); message.setMessageTemplateId(template.getMessageTemplateId());
message.setTitle(template.getTitleTemplate()); message.setTitle(title);
message.setContent(template.getContentTemplate()); message.setContent(content);
message.setCreatedBy(createdBy); message.setCreatedBy(createdBy);
message.setCreatedByName(createdByName); message.setCreatedByName(createdByName);
message.setState(MessageStateEnum.SENT); message.setState(MessageStateEnum.SENT);
@ -333,7 +357,7 @@ public class AuditGatewayImpl implements AuditGateway {
message.setSentAt(LocalDateTime.now()); message.setSentAt(LocalDateTime.now());
messageMapper.insert(message); messageMapper.insert(message);
// 3. 查询所有需要接收消息的用户 // 6. 查询所有需要接收消息的用户
UserListQry userListQry = new UserListQry(); UserListQry userListQry = new UserListQry();
userListQry.setRoleIdList(template.getRoleIds()); userListQry.setRoleIdList(template.getRoleIds());
List<UserVO> userVOList = userService.list(userListQry); List<UserVO> userVOList = userService.list(userListQry);
@ -351,7 +375,7 @@ public class AuditGatewayImpl implements AuditGateway {
return; return;
} }
// 4. 批量创建消息接收记录 // 7. 批量创建消息接收记录
List<MessageReceiverDO> receiverList = new ArrayList<>(); List<MessageReceiverDO> receiverList = new ArrayList<>();
for (AdminVO adminVO : adminVOList) { for (AdminVO adminVO : adminVOList) {
MessageReceiverDO receiver = new MessageReceiverDO(); MessageReceiverDO receiver = new MessageReceiverDO();
@ -366,5 +390,78 @@ public class AuditGatewayImpl implements AuditGateway {
receiverList.forEach(messageReceiverMapper::insert); 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;
}
} }