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 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user