From a0bfb12556da67becd8fab7714fb59a86e47c122 Mon Sep 17 00:00:00 2001 From: shenyifei Date: Thu, 15 Jan 2026 18:08:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor(audit):=20=E4=BC=98=E5=8C=96=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E7=BD=91=E5=85=B3=E5=AE=9E=E7=8E=B0=E5=B9=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=A8=A1=E6=9D=BF=E5=8F=98=E9=87=8F=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改sendAuditNotification方法参数,增加AuditDO对象传递 - 重构老板审核记录处理逻辑,改为查询更新或新建记录 - 新增buildTemplateVariables方法构建模板变量映射 - 新增replaceTemplateVariables方法实现模板变量替换功能 - 集成订单信息查询并填充到消息模板变量中 - 支持订单编号、录入员、车辆信息等动态变量替换 - 支持审核员、审批员等操作人员信息变量替换 - 添加日期时间格式化处理功能 - 优化消息发送流程,支持动态模板内容生成 --- .../gateway/AuditGatewayImpl.java | 153 ++++++++++++++---- 1 file changed, 125 insertions(+), 28 deletions(-) diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/AuditGatewayImpl.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/AuditGatewayImpl.java index f4a0117..78e4d25 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/AuditGatewayImpl.java +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/AuditGatewayImpl.java @@ -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,8 +127,8 @@ public class AuditGatewayImpl implements AuditGateway { } // 发送提审消息(待审核消息) - sendAuditNotification(MessageTemplateSceneEnum.WAIT_AUDIT, auditDO.getAuditId(), - orderSubmitReviewCmd.getCreatedBy(), orderSubmitReviewCmd.getCreatedByName()); + sendAuditNotification(MessageTemplateSceneEnum.WAIT_AUDIT, auditDO, auditDO.getAuditId(), + orderSubmitReviewCmd.getCreatedBy(), orderSubmitReviewCmd.getCreatedByName()); return auditConvert.toAudit(auditDO); } @@ -181,8 +182,8 @@ public class AuditGatewayImpl implements AuditGateway { } // 发送审核驳回消息 - sendAuditNotification(MessageTemplateSceneEnum.AUDIT_REJECT, auditDO.getAuditId(), - orderRejectApproveCmd.getCreatedBy(), orderRejectApproveCmd.getCreatedByName()); + sendAuditNotification(MessageTemplateSceneEnum.AUDIT_REJECT, auditDO, auditDO.getAuditId(), + orderRejectApproveCmd.getCreatedBy(), orderRejectApproveCmd.getCreatedByName()); return auditConvert.toAudit(auditDO); } @@ -211,8 +212,8 @@ public class AuditGatewayImpl implements AuditGateway { } // 发送审批通过消息 - sendAuditNotification(MessageTemplateSceneEnum.APPROVE_PASS, auditDO.getAuditId(), - orderFinalApproveCmd.getCreatedBy(), orderFinalApproveCmd.getCreatedByName()); + sendAuditNotification(MessageTemplateSceneEnum.APPROVE_PASS, auditDO, auditDO.getAuditId(), + orderFinalApproveCmd.getCreatedBy(), orderFinalApproveCmd.getCreatedByName()); return auditConvert.toAudit(auditDO); } @@ -242,8 +243,8 @@ public class AuditGatewayImpl implements AuditGateway { } // 发送审批驳回消息 - sendAuditNotification(MessageTemplateSceneEnum.APPROVE_REJECT, auditDO.getAuditId(), - orderRejectFinalCmd.getCreatedBy(), orderRejectFinalCmd.getCreatedByName()); + sendAuditNotification(MessageTemplateSceneEnum.APPROVE_REJECT, auditDO, auditDO.getAuditId(), + orderRejectFinalCmd.getCreatedBy(), orderRejectFinalCmd.getCreatedByName()); return auditConvert.toAudit(auditDO); } @@ -273,19 +274,31 @@ public class AuditGatewayImpl implements AuditGateway { auditDO.setAuditByName(orderApproveCmd.getCreatedByName()); auditMapper.updateById(auditDO); - // 自动生成报老板待审核记录(每次都创建新记录) - AuditDO auditDO1 = new AuditDO(); - auditDO1.setSubjectId(orderApproveCmd.getOrderId()); - auditDO1.setSubjectType(AuditSubjectTypeEnum.PURCHASE_ORDER); - auditDO1.setType(AuditTypeEnum.BOSS_AUDIT); - auditDO1.setState(AuditStateEnum.WAITING_AUDIT); - auditDO1.setCreatedBy(orderApproveCmd.getCreatedBy()); - auditDO1.setCreatedByName(orderApproveCmd.getCreatedByName()); - auditMapper.insert(auditDO1); + // 更新审核记录状态为审核成功 + LambdaQueryWrapper 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); + auditDO1.setState(AuditStateEnum.WAITING_AUDIT); + auditDO1.setCreatedBy(orderApproveCmd.getCreatedBy()); + auditDO1.setCreatedByName(orderApproveCmd.getCreatedByName()); + auditMapper.insert(auditDO1); + } // 发送待审批消息 - sendAuditNotification(MessageTemplateSceneEnum.WAIT_APPROVE, auditDO.getAuditId(), - orderApproveCmd.getCreatedBy(), orderApproveCmd.getCreatedByName()); + sendAuditNotification(MessageTemplateSceneEnum.WAIT_APPROVE, auditDO, auditDO.getAuditId(), + orderApproveCmd.getCreatedBy(), orderApproveCmd.getCreatedByName()); return auditConvert.toAudit(auditDO1); @@ -294,13 +307,14 @@ public class AuditGatewayImpl implements AuditGateway { /** * 发送审核流程消息通知 * - * @param sceneEnum 消息场景枚举 - * @param subjectId 关联主体ID(订单ID等) - * @param createdBy 操作人ID + * @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 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 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 userVOList = userService.list(userListQry); @@ -351,7 +375,7 @@ public class AuditGatewayImpl implements AuditGateway { return; } - // 4. 批量创建消息接收记录 + // 7. 批量创建消息接收记录 List 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 buildTemplateVariables(OrderDO orderDO, AuditDO auditDO, String operatorName, MessageTemplateSceneEnum sceneEnum) { + Map 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 variables) { + if (Objects.isNull(template) || template.isEmpty()) { + return template; + } + + String result = template; + for (Map.Entry entry : variables.entrySet()) { + String placeholder = "{{" + entry.getKey() + "}}"; + String value = Objects.nonNull(entry.getValue()) ? entry.getValue() : ""; + result = result.replace(placeholder, value); + } + + return result; + } }