From 198cc6e8d9207dbf3b88c2ebf421ed16470dfd66 Mon Sep 17 00:00:00 2001 From: shenyifei Date: Fri, 16 Jan 2026 11:05:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(audit):=20=E5=A2=9E=E5=BC=BA=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在AuditPageQry和OrderPageQry中新增订单编号、车辆编号和车牌字段 - 重构审核网关实现,添加详细的业务验证逻辑和异常处理 - 实现录入员提交审核、撤回审核以及审核员驳回等功能 - 优化消息通知机制,添加目标用户过滤功能 - 修复数据库表字段映射错误,统一audit_reason和delivery_time字段名 - 添加订单发货时西瓜等级更新的安全检查 - 实现自定义分页查询支持订单编号、车辆编号和车牌的模糊搜索 --- .../gateway/AuditGatewayImpl.java | 415 +++++++++++------- .../gateway/OrderShipGatewayImpl.java | 15 +- .../infrastructure/mapper/AuditMapper.java | 6 + .../src/main/resources/mapper/AuditMapper.xml | 44 +- .../src/main/resources/mapper/OrderMapper.xml | 19 +- .../turbo/api/biz/dto/qry/AuditPageQry.java | 9 + .../turbo/api/biz/dto/qry/OrderPageQry.java | 3 + 7 files changed, 340 insertions(+), 171 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 78e4d25..98d50ea 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 @@ -52,14 +52,12 @@ public class AuditGatewayImpl implements AuditGateway { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(AuditDO.class); queryWrapper.eq(Objects.nonNull(auditPageQry.getAuditId()), AuditDO::getAuditId, auditPageQry.getAuditId()); - queryWrapper.eq(Objects.nonNull(auditPageQry.getType()), AuditDO::getType, auditPageQry.getType()); - queryWrapper.eq(Objects.nonNull(auditPageQry.getState()), AuditDO::getState, auditPageQry.getState()); queryWrapper.eq(Objects.nonNull(auditPageQry.getSubjectType()), AuditDO::getSubjectType, auditPageQry.getSubjectType()); queryWrapper.orderByDesc(AuditDO::getCreatedAt); IPage page = new Page<>(auditPageQry.getPageIndex(), auditPageQry.getPageSize()); - page = auditMapper.selectPage(page, queryWrapper); + page = auditMapper.selectPage(page, queryWrapper, auditPageQry); Set orderIdList = page.getRecords().stream().filter(auditDO -> auditDO.getSubjectType().equals(AuditSubjectTypeEnum.PURCHASE_ORDER)).map(AuditDO::getSubjectId).collect(Collectors.toSet()); if (CollUtil.isNotEmpty(orderIdList)) { List orderDOList = orderMapper.selectByOrderIdList(orderIdList); @@ -103,8 +101,25 @@ public class AuditGatewayImpl implements AuditGateway { return auditConvert.toAudit(auditDO); } + /** + * 录入员提交审核 + * 1、录入员首次提交。 + * 2、审核员驳回后,录入员提交 + */ @Override public Audit submitReview(OrderSubmitReviewCmd orderSubmitReviewCmd) { + // 1. 验证订单是否存在 + OrderDO orderDO = orderMapper.selectByOrderId(orderSubmitReviewCmd.getOrderId()); + if (Objects.isNull(orderDO)) { + throw new BizException(BizErrorCode.B_BIZ_ORDER_NOT_FOUND); + } + + // 2. 验证订单状态是否允许提交审核 + if (!orderDO.getState().equals(OrderStateEnum.DRAFT)) { + throw new BizException(BizErrorCode.B_BIZ_ORDER_NOT_DRAFT); + } + + // 3. 查询或创建审核记录 LambdaQueryWrapper auditQueryWrapper = Wrappers.lambdaQuery(AuditDO.class); auditQueryWrapper.eq(AuditDO::getSubjectId, orderSubmitReviewCmd.getOrderId()); auditQueryWrapper.eq(AuditDO::getSubjectType, AuditSubjectTypeEnum.PURCHASE_ORDER); @@ -126,167 +141,206 @@ public class AuditGatewayImpl implements AuditGateway { auditMapper.updateById(auditDO); } - // 发送提审消息(待审核消息) - sendAuditNotification(MessageTemplateSceneEnum.WAIT_AUDIT, auditDO, auditDO.getAuditId(), - orderSubmitReviewCmd.getCreatedBy(), orderSubmitReviewCmd.getCreatedByName()); + // 4. 发送提审消息(待审核消息) + sendAuditNotification(MessageTemplateSceneEnum.WAIT_AUDIT, auditDO, orderSubmitReviewCmd.getCreatedBy(), orderSubmitReviewCmd.getCreatedByName()); return auditConvert.toAudit(auditDO); } + /** + * 录入员撤回审核 + */ @Override public Audit withdrawReview(OrderWithdrawReviewCmd orderWithdrawReviewCmd) { - // 更新审核记录状态为草稿(撤回审核) - LambdaQueryWrapper auditQueryWrapper = Wrappers.lambdaQuery(AuditDO.class); - auditQueryWrapper.eq(AuditDO::getSubjectId, orderWithdrawReviewCmd.getOrderId()); - auditQueryWrapper.eq(AuditDO::getSubjectType, AuditSubjectTypeEnum.PURCHASE_ORDER); - auditQueryWrapper.eq(AuditDO::getState, AuditStateEnum.WAITING_AUDIT); - auditQueryWrapper.eq(AuditDO::getType, AuditTypeEnum.REVIEWER_AUDIT); - auditQueryWrapper.last("limit 1"); - AuditDO auditDO = auditMapper.selectOne(auditQueryWrapper); - - if (auditDO != null) { - auditDO.setState(AuditStateEnum.AUDIT_CANCEL); - auditDO.setAuditAt(LocalDateTime.now()); - auditDO.setAuditBy(orderWithdrawReviewCmd.getCreatedBy()); - auditDO.setAuditByName(orderWithdrawReviewCmd.getCreatedByName()); - auditMapper.updateById(auditDO); - } - - // 撤回审核不发送消息通知 - - return auditConvert.toAudit(auditDO); - } - - @Override - public Audit rejectApprove(OrderRejectApproveCmd orderRejectApproveCmd) { - // 更新审核记录 - LambdaQueryWrapper auditQueryWrapper = Wrappers.lambdaQuery(AuditDO.class); - auditQueryWrapper.eq(AuditDO::getAuditId, orderRejectApproveCmd.getAuditId()); - auditQueryWrapper.eq(AuditDO::getSubjectId, orderRejectApproveCmd.getOrderId()); - auditQueryWrapper.eq(AuditDO::getSubjectType, AuditSubjectTypeEnum.PURCHASE_ORDER); - auditQueryWrapper.eq(AuditDO::getState, AuditStateEnum.WAITING_AUDIT); - auditQueryWrapper.eq(AuditDO::getType, AuditTypeEnum.REVIEWER_AUDIT); - auditQueryWrapper.last("limit 1"); - AuditDO auditDO = auditMapper.selectOne(auditQueryWrapper); - - if (auditDO != null) { - auditDO.setState(AuditStateEnum.AUDIT_REJECTED); - auditDO.setAuditReason(orderRejectApproveCmd.getRejectReason()); - auditDO.setAuditAt(LocalDateTime.now()); - auditDO.setAuditBy(orderRejectApproveCmd.getCreatedBy()); - auditDO.setAuditByName(orderRejectApproveCmd.getCreatedByName()); - auditMapper.updateById(auditDO); - } else { - // 如果审核记录不存在,抛出异常 + // 1. 验证审核记录ID + Long auditId = orderWithdrawReviewCmd.getAuditId(); + if (Objects.isNull(auditId)) { throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); } - // 发送审核驳回消息 - sendAuditNotification(MessageTemplateSceneEnum.AUDIT_REJECT, auditDO, auditDO.getAuditId(), - orderRejectApproveCmd.getCreatedBy(), orderRejectApproveCmd.getCreatedByName()); - - return auditConvert.toAudit(auditDO); - } - - @Override - public Audit finalApprove(OrderFinalApproveCmd orderFinalApproveCmd) { - // 更新审核记录为审核成功 - LambdaQueryWrapper auditQueryWrapper = Wrappers.lambdaQuery(AuditDO.class); - auditQueryWrapper.eq(AuditDO::getSubjectId, orderFinalApproveCmd.getOrderId()); - auditQueryWrapper.eq(AuditDO::getSubjectType, AuditSubjectTypeEnum.PURCHASE_ORDER); - auditQueryWrapper.eq(AuditDO::getState, AuditStateEnum.WAITING_AUDIT); - auditQueryWrapper.eq(AuditDO::getType, AuditTypeEnum.BOSS_AUDIT); - auditQueryWrapper.eq(AuditDO::getAuditId, orderFinalApproveCmd.getAuditId()); - auditQueryWrapper.last("limit 1"); - AuditDO auditDO = auditMapper.selectOne(auditQueryWrapper); - - if (auditDO != null) { - auditDO.setState(AuditStateEnum.AUDIT_SUCCESS); - auditDO.setAuditAt(LocalDateTime.now()); - auditDO.setAuditBy(orderFinalApproveCmd.getCreatedBy()); - auditDO.setAuditByName(orderFinalApproveCmd.getCreatedByName()); - auditMapper.updateById(auditDO); - } else { - // 如果审核记录不存在,抛出异常 - throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); - } - - // 发送审批通过消息 - sendAuditNotification(MessageTemplateSceneEnum.APPROVE_PASS, auditDO, auditDO.getAuditId(), - orderFinalApproveCmd.getCreatedBy(), orderFinalApproveCmd.getCreatedByName()); - - return auditConvert.toAudit(auditDO); - } - - @Override - public Audit rejectFinal(OrderRejectFinalCmd orderRejectFinalCmd) { - // 更新审核记录 - LambdaQueryWrapper auditQueryWrapper = Wrappers.lambdaQuery(AuditDO.class); - auditQueryWrapper.eq(AuditDO::getSubjectId, orderRejectFinalCmd.getOrderId()); - auditQueryWrapper.eq(AuditDO::getSubjectType, AuditSubjectTypeEnum.PURCHASE_ORDER); - auditQueryWrapper.eq(AuditDO::getState, AuditStateEnum.WAITING_AUDIT); - auditQueryWrapper.eq(AuditDO::getType, AuditTypeEnum.BOSS_AUDIT); - auditQueryWrapper.eq(AuditDO::getAuditId, orderRejectFinalCmd.getAuditId()); - auditQueryWrapper.last("limit 1"); - AuditDO auditDO = auditMapper.selectOne(auditQueryWrapper); - - if (auditDO != null) { - auditDO.setState(AuditStateEnum.AUDIT_REJECTED); - auditDO.setAuditReason(orderRejectFinalCmd.getRejectReason()); - auditDO.setAuditAt(LocalDateTime.now()); - auditDO.setAuditBy(orderRejectFinalCmd.getCreatedBy()); - auditDO.setAuditByName(orderRejectFinalCmd.getCreatedByName()); - auditMapper.updateById(auditDO); - } else { - // 如果审核记录不存在,抛出异常 - throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); - } - - // 发送审批驳回消息 - sendAuditNotification(MessageTemplateSceneEnum.APPROVE_REJECT, auditDO, auditDO.getAuditId(), - orderRejectFinalCmd.getCreatedBy(), orderRejectFinalCmd.getCreatedByName()); - - return auditConvert.toAudit(auditDO); - } - - @Override - public Audit approve(OrderApproveCmd orderApproveCmd) { - // 更新审核记录状态为审核成功 - LambdaQueryWrapper auditQueryWrapper = Wrappers.lambdaQuery(AuditDO.class); - auditQueryWrapper.eq(AuditDO::getSubjectId, orderApproveCmd.getOrderId()); - auditQueryWrapper.eq(AuditDO::getSubjectType, AuditSubjectTypeEnum.PURCHASE_ORDER); - auditQueryWrapper.eq(AuditDO::getState, AuditStateEnum.WAITING_AUDIT); - auditQueryWrapper.eq(AuditDO::getType, AuditTypeEnum.REVIEWER_AUDIT); - AuditDO auditDO = auditMapper.selectOne(auditQueryWrapper); - + // 2. 查询审核记录 + AuditDO auditDO = auditMapper.selectById(auditId); if (Objects.isNull(auditDO)) { - // 如果审核记录不存在,抛出异常 throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); } - if (orderApproveCmd.getDraft()) { - return auditConvert.toAudit(auditDO); + // 3. 验证审核记录状态是否为待审核 + if (!auditDO.getState().equals(AuditStateEnum.WAITING_AUDIT)) { + throw new BizException(BizErrorCode.B_BIZ_ORDER_NOT_WAITING_FOR_WITHDRAW); } - auditDO.setState(AuditStateEnum.AUDIT_SUCCESS); + // 4. 更新审核记录状态为已取消 + auditDO.setState(AuditStateEnum.AUDIT_CANCEL); auditDO.setAuditAt(LocalDateTime.now()); - auditDO.setAuditBy(orderApproveCmd.getCreatedBy()); - auditDO.setAuditByName(orderApproveCmd.getCreatedByName()); + auditDO.setAuditBy(orderWithdrawReviewCmd.getCreatedBy()); + auditDO.setAuditByName(orderWithdrawReviewCmd.getCreatedByName()); auditMapper.updateById(auditDO); - // 更新审核记录状态为审核成功 - 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 { + // 撤回审核不发送消息通知 + return auditConvert.toAudit(auditDO); + } + + /** + * 审核员驳回 + */ + @Override + public Audit rejectApprove(OrderRejectApproveCmd orderRejectApproveCmd) { + // 1. 验证审核记录ID + Long auditId = orderRejectApproveCmd.getAuditId(); + if (Objects.isNull(auditId)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 2. 查询审核记录 + AuditDO auditDO = auditMapper.selectById(auditId); + if (Objects.isNull(auditDO)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 3. 验证审核记录类型是否为审核员审核 + if (!auditDO.getType().equals(AuditTypeEnum.REVIEWER_AUDIT)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 4. 验证审核记录状态是否为待审核 + if (!auditDO.getState().equals(AuditStateEnum.WAITING_AUDIT)) { + throw new BizException(BizErrorCode.B_BIZ_ORDER_NOT_WAITING_AUDIT); + } + + // 5. 更新审核记录为已驳回 + auditDO.setState(AuditStateEnum.AUDIT_REJECTED); + auditDO.setAuditReason(orderRejectApproveCmd.getRejectReason()); + auditDO.setAuditAt(LocalDateTime.now()); + auditDO.setAuditBy(orderRejectApproveCmd.getCreatedBy()); + auditDO.setAuditByName(orderRejectApproveCmd.getCreatedByName()); + auditMapper.updateById(auditDO); + + // 6. 发送审核驳回消息 + sendAuditNotification(MessageTemplateSceneEnum.AUDIT_REJECT, auditDO, orderRejectApproveCmd.getCreatedBy(), orderRejectApproveCmd.getCreatedByName()); + + return auditConvert.toAudit(auditDO); + } + + /** + * 老板审批通过 + */ + @Override + public Audit finalApprove(OrderFinalApproveCmd orderFinalApproveCmd) { + // 1. 验证审核记录ID + Long auditId = orderFinalApproveCmd.getAuditId(); + if (Objects.isNull(auditId)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 2. 查询审核记录 + AuditDO auditDO = auditMapper.selectById(auditId); + if (Objects.isNull(auditDO)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 3. 验证审核记录类型是否为老板审核 + if (!auditDO.getType().equals(AuditTypeEnum.BOSS_AUDIT)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 4. 验证审核记录状态是否为待审核 + if (!auditDO.getState().equals(AuditStateEnum.WAITING_AUDIT)) { + throw new BizException(BizErrorCode.B_BIZ_ORDER_NOT_WAITING_FOR_FINAL_APPROVE); + } + + // 5. 更新审核记录为审核成功 + auditDO.setState(AuditStateEnum.AUDIT_SUCCESS); + auditDO.setAuditAt(LocalDateTime.now()); + auditDO.setAuditBy(orderFinalApproveCmd.getCreatedBy()); + auditDO.setAuditByName(orderFinalApproveCmd.getCreatedByName()); + auditMapper.updateById(auditDO); + + // 6. 发送审批通过消息 + sendAuditNotification(MessageTemplateSceneEnum.APPROVE_PASS, auditDO, orderFinalApproveCmd.getCreatedBy(), orderFinalApproveCmd.getCreatedByName()); + + return auditConvert.toAudit(auditDO); + } + + /** + * 老板审批驳回 + */ + @Override + public Audit rejectFinal(OrderRejectFinalCmd orderRejectFinalCmd) { + // 1. 验证审核记录ID + Long auditId = orderRejectFinalCmd.getAuditId(); + if (Objects.isNull(auditId)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 2. 查询审核记录 + AuditDO auditDO = auditMapper.selectById(auditId); + if (Objects.isNull(auditDO)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 3. 验证审核记录类型是否为老板审核 + if (!auditDO.getType().equals(AuditTypeEnum.BOSS_AUDIT)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 4. 验证审核记录状态是否为待审核 + if (!auditDO.getState().equals(AuditStateEnum.WAITING_AUDIT)) { + throw new BizException(BizErrorCode.B_BIZ_ORDER_NOT_WAITING_FOR_REJECT_FINAL); + } + + // 5. 更新审核记录为已驳回 + auditDO.setState(AuditStateEnum.AUDIT_REJECTED); + auditDO.setAuditReason(orderRejectFinalCmd.getRejectReason()); + auditDO.setAuditAt(LocalDateTime.now()); + auditDO.setAuditBy(orderRejectFinalCmd.getCreatedBy()); + auditDO.setAuditByName(orderRejectFinalCmd.getCreatedByName()); + auditMapper.updateById(auditDO); + + // 6. 发送审批驳回消息 + sendAuditNotification(MessageTemplateSceneEnum.APPROVE_REJECT, auditDO, orderRejectFinalCmd.getCreatedBy(), orderRejectFinalCmd.getCreatedByName()); + + return auditConvert.toAudit(auditDO); + } + + /** + * 审核员审核通过, + * 1、录入员提交的审核,审核员审核通过。 + * 2、老板驳回审核,审核员重新提交审核。 + */ + @Override + public Audit approve(OrderApproveCmd orderApproveCmd) { + // 1. 验证审核记录ID + Long auditId = orderApproveCmd.getAuditId(); + if (Objects.isNull(auditId)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 2. 查询审核记录 + AuditDO auditDO = auditMapper.selectById(auditId); + if (Objects.isNull(auditDO)) { + throw new BizException(BizErrorCode.B_BIZ_AUDIT_NOT_FOUND); + } + + // 3. 验证审核记录状态是否为待审核 + if (!auditDO.getState().equals(AuditStateEnum.WAITING_AUDIT)) { + throw new BizException(BizErrorCode.B_BIZ_ORDER_NOT_WAITING_AUDIT); + } + + // 4. 根据审核类型执行不同逻辑 + // 录入员的记录审核员审核 + if (auditDO.getType().equals(AuditTypeEnum.REVIEWER_AUDIT)) { + if (orderApproveCmd.getDraft()) { + return auditConvert.toAudit(auditDO); + } + + auditDO.setState(AuditStateEnum.AUDIT_SUCCESS); + auditDO.setAuditAt(LocalDateTime.now()); + auditDO.setAuditBy(orderApproveCmd.getCreatedBy()); + auditDO.setAuditByName(orderApproveCmd.getCreatedByName()); + auditMapper.updateById(auditDO); + // 自动生成报老板待审核记录 - auditDO1 = new AuditDO(); + AuditDO auditDO1 = new AuditDO(); auditDO1.setSubjectId(orderApproveCmd.getOrderId()); auditDO1.setSubjectType(AuditSubjectTypeEnum.PURCHASE_ORDER); auditDO1.setType(AuditTypeEnum.BOSS_AUDIT); @@ -294,14 +348,24 @@ public class AuditGatewayImpl implements AuditGateway { auditDO1.setCreatedBy(orderApproveCmd.getCreatedBy()); auditDO1.setCreatedByName(orderApproveCmd.getCreatedByName()); auditMapper.insert(auditDO1); + // 发送待审批消息 + sendAuditNotification(MessageTemplateSceneEnum.WAIT_APPROVE, auditDO, + orderApproveCmd.getCreatedBy(), orderApproveCmd.getCreatedByName()); + + return auditConvert.toAudit(auditDO1); } - // 发送待审批消息 - sendAuditNotification(MessageTemplateSceneEnum.WAIT_APPROVE, auditDO, auditDO.getAuditId(), - orderApproveCmd.getCreatedBy(), orderApproveCmd.getCreatedByName()); + // 审核员被驳回后的审核 + if (auditDO.getType().equals(AuditTypeEnum.BOSS_AUDIT)) { + auditDO.setState(AuditStateEnum.WAITING_AUDIT); + auditMapper.updateById(auditDO); - return auditConvert.toAudit(auditDO1); + // 发送待审批消息 + sendAuditNotification(MessageTemplateSceneEnum.WAIT_APPROVE, auditDO, orderApproveCmd.getCreatedBy(), orderApproveCmd.getCreatedByName()); + return auditConvert.toAudit(auditDO); + } + return null; } /** @@ -309,12 +373,11 @@ 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, AuditDO auditDO, Long subjectId, Long createdBy, String createdByName) { + private void sendAuditNotification(MessageTemplateSceneEnum sceneEnum, AuditDO auditDO, Long createdBy, String createdByName) { // 1. 查询启用的消息模板 LambdaQueryWrapper templateWrapper = Wrappers.lambdaQuery(MessageTemplateDO.class); templateWrapper.eq(MessageTemplateDO::getTemplateCategory, MessageTemplateCategoryEnum.PURCHASE_ORDER_MESSAGE_TEMPLATE); @@ -335,7 +398,7 @@ public class AuditGatewayImpl implements AuditGateway { } // 2. 查询订单信息用于变量替换 - OrderDO orderDO = orderMapper.selectByOrderId(subjectId); + OrderDO orderDO = orderMapper.selectByOrderId(auditDO.getSubjectId()); // 3. 构建变量替换映射 Map variables = buildTemplateVariables(orderDO, auditDO, createdByName, sceneEnum); @@ -352,7 +415,7 @@ public class AuditGatewayImpl implements AuditGateway { message.setCreatedBy(createdBy); message.setCreatedByName(createdByName); message.setState(MessageStateEnum.SENT); - message.setSubjectId(subjectId); + message.setSubjectId(auditDO.getSubjectId()); message.setSubjectType(MessageSubjectTypeEnum.AUDIT); message.setSentAt(LocalDateTime.now()); messageMapper.insert(message); @@ -361,21 +424,28 @@ public class AuditGatewayImpl implements AuditGateway { UserListQry userListQry = new UserListQry(); userListQry.setRoleIdList(template.getRoleIds()); List userVOList = userService.list(userListQry); - List userIdList = userVOList.stream().map(UserVO::getUserId).toList(); - if (CollUtil.isEmpty(userIdList)) { + if (CollUtil.isEmpty(userVOList)) { return; } + // 7. 根据消息场景过滤接收人 + List targetUserIdList = filterTargetUsers(sceneEnum, userVOList, orderDO, createdBy); + + if (CollUtil.isEmpty(targetUserIdList)) { + return; + } + + // 8. 查询对应的 Admin 记录 AdminListQry adminListQry = new AdminListQry(); - adminListQry.setUserIdList(userIdList); + adminListQry.setUserIdList(targetUserIdList); List adminVOList = adminService.list(adminListQry); if (CollUtil.isEmpty(adminVOList)) { return; } - // 7. 批量创建消息接收记录 + // 9. 批量创建消息接收记录 List receiverList = new ArrayList<>(); for (AdminVO adminVO : adminVOList) { MessageReceiverDO receiver = new MessageReceiverDO(); @@ -391,6 +461,37 @@ public class AuditGatewayImpl implements AuditGateway { } } + /** + * 根据消息场景过滤目标用户 + * + * @param sceneEnum 消息场景 + * @param userVOList 所有拥有对应角色的用户列表 + * @param orderDO 订单信息 + * @param currentUserId 当前操作人ID + * @return 目标用户ID列表 + */ + private List filterTargetUsers(MessageTemplateSceneEnum sceneEnum, List userVOList, OrderDO orderDO, Long currentUserId) { + // 驳回场景:只发给订单创建人(且拥有对应角色的人) + if (sceneEnum.equals(MessageTemplateSceneEnum.AUDIT_REJECT) || + sceneEnum.equals(MessageTemplateSceneEnum.APPROVE_REJECT)) { + + if (Objects.isNull(orderDO) || Objects.isNull(orderDO.getCreatedBy())) { + return List.of(); + } + + final Long orderCreatedBy = orderDO.getCreatedBy(); + return userVOList.stream() + .filter(user -> user.getUserId().equals(orderCreatedBy)) + .map(UserVO::getUserId) + .toList(); + } + + // 其他场景:发给所有拥有对应角色的用户 + return userVOList.stream() + .map(UserVO::getUserId) + .toList(); + } + /** * 构建模板变量映射 * diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/OrderShipGatewayImpl.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/OrderShipGatewayImpl.java index 68e0ecf..7ec300c 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/OrderShipGatewayImpl.java +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/OrderShipGatewayImpl.java @@ -147,12 +147,15 @@ public class OrderShipGatewayImpl implements OrderShipGateway { OrderShipDO orderShipDO = orderShipMapper.selectOne(queryWrapper); - // 更新订单明细 - for (OrderShipItem orderShipItem : orderShipGenerateDocumentCmd.getOrderShipItemList()) { - LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(OrderShipItemDO.class); - updateWrapper.eq(OrderShipItemDO::getOrderShipId, orderShipDO.getOrderShipId()); - updateWrapper.set(OrderShipItemDO::getWatermelonGrade, orderShipItem.getWatermelonGrade()); - orderShipItemMapper.update(null, updateWrapper); + List orderShipItemList = orderShipGenerateDocumentCmd.getOrderShipItemList(); + if (CollUtil.isNotEmpty(orderShipItemList)) { + // 更新订单明细 + for (OrderShipItem orderShipItem : orderShipItemList) { + LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(OrderShipItemDO.class); + updateWrapper.eq(OrderShipItemDO::getOrderShipId, orderShipDO.getOrderShipId()); + updateWrapper.set(OrderShipItemDO::getWatermelonGrade, orderShipItem.getWatermelonGrade()); + orderShipItemMapper.update(null, updateWrapper); + } } orderShipConvert.toOrderShipDO(orderShipDO, orderShipGenerateDocumentCmd); diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/AuditMapper.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/AuditMapper.java index f0825f5..eaa70e3 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/AuditMapper.java +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/AuditMapper.java @@ -1,13 +1,19 @@ package com.xunhong.erp.turbo.biz.infrastructure.mapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.xunhong.erp.turbo.api.biz.dto.qry.AuditPageQry; import com.xunhong.erp.turbo.biz.infrastructure.entity.AuditDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * @author shenyifei */ @Mapper public interface AuditMapper extends BaseMapper { + IPage selectPage(IPage page, @Param(Constants.WRAPPER) LambdaQueryWrapper queryWrapper, @Param("query") AuditPageQry auditPageQry); } diff --git a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/AuditMapper.xml b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/AuditMapper.xml index da3a195..4e5d3bd 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/AuditMapper.xml +++ b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/AuditMapper.xml @@ -9,10 +9,10 @@ - + - + @@ -20,5 +20,45 @@ + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderMapper.xml b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderMapper.xml index e6e00de..41e0be7 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderMapper.xml +++ b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderMapper.xml @@ -30,7 +30,7 @@ - + @@ -49,6 +49,7 @@ + @@ -57,7 +58,7 @@ resultMap="SelectByOrderIdListResultMap"> SELECT po.order_id, po.order_sn, po.state, po.audit_state, po.type, - ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, + ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, ov.delivery_time, ov.destination FROM `order` po LEFT JOIN order_vehicle ov ON po.order_id = ov.order_id AND ov.is_delete @@ -79,7 +80,7 @@ resultMap="BaseResultMap"> SELECT po.*, - ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, + ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, ov.delivery_time, ov.destination FROM `order` po LEFT JOIN order_vehicle ov ON po.order_id = ov.order_id AND ov.is_delete @@ -89,6 +90,12 @@ AND ov.vehicle_no LIKE CONCAT('%',#{query.vehicleNo},'%') + + AND po.order_sn LIKE CONCAT('%',#{query.orderSn},'%') + + + AND ov.plate LIKE CONCAT('%',#{query.plate},'%') + AND ov.dealer_id = #{query.dealerId} @@ -120,7 +127,7 @@ resultMap="SelectByOrderIdListResultMap"> SELECT po.order_id, po.order_sn, po.state, po.audit_state, po.type, - ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, + ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, ov.delivery_time, ov.destination FROM `order` po LEFT JOIN order_vehicle ov ON po.order_id = ov.order_id AND ov.is_delete @@ -134,7 +141,7 @@ resultMap="BaseResultMap"> SELECT po.*, - ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, + ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, ov.delivery_time, ov.destination, ov.delivery_time FROM `order` po LEFT JOIN order_vehicle ov ON po.order_id = ov.order_id AND ov.is_delete @@ -160,7 +167,7 @@ resultType="com.xunhong.erp.turbo.biz.infrastructure.entity.OrderDO"> SELECT po.*, - ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, + ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin, ov.delivery_time, ov.destination FROM `order` po LEFT JOIN order_vehicle ov ON po.order_id = ov.order_id AND ov.is_delete diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/AuditPageQry.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/AuditPageQry.java index 0ea39bf..3fb4d52 100644 --- a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/AuditPageQry.java +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/AuditPageQry.java @@ -27,5 +27,14 @@ public class AuditPageQry extends PageQuery { @Schema(title = "审核对象类型:1_采购单;") private AuditSubjectTypeEnum subjectType; + + @Schema(title = "订单编号") + private String orderSn; + + @Schema(title = "车辆编号") + private String vehicleNo; + + @Schema(title = "车牌") + private String plate; } diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/OrderPageQry.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/OrderPageQry.java index a877e3b..07b424c 100644 --- a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/OrderPageQry.java +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/OrderPageQry.java @@ -25,6 +25,9 @@ public class OrderPageQry extends PageQuery { @Schema(title = "采购订单编号", type = "string") private String orderSn; + @Schema(title = "车牌号", type = "string") + private String plate; + /** * 采购订单状态: 0_草稿;1_审核中;2_已完成;3_已关闭; */