@ -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 ;
@ -51,14 +52,12 @@ public class AuditGatewayImpl implements AuditGateway {
LambdaQueryWrapper < AuditDO > 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 < AuditDO > page = new Page < > ( auditPageQry . getPageIndex ( ) , auditPageQry . getPageSize ( ) ) ;
page = auditMapper . selectPage ( page , queryWrapper );
page = auditMapper . selectPage ( page , queryWrapper , auditPageQry );
Set < Long > orderIdList = page . getRecords ( ) . stream ( ) . filter ( auditDO - > auditDO . getSubjectType ( ) . equals ( AuditSubjectTypeEnum . PURCHASE_ORDER ) ) . map ( AuditDO : : getSubjectId ) . collect ( Collectors . toSet ( ) ) ;
if ( CollUtil . isNotEmpty ( orderIdList ) ) {
List < OrderDO > orderDOList = orderMapper . selectByOrderIdList ( orderIdList ) ;
@ -102,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 < AuditDO > auditQueryWrapper = Wrappers . lambdaQuery ( AuditDO . class ) ;
auditQueryWrapper . eq ( AuditDO : : getSubjectId , orderSubmitReviewCmd . getOrderId ( ) ) ;
auditQueryWrapper . eq ( AuditDO : : getSubjectType , AuditSubjectTypeEnum . PURCHASE_ORDER ) ;
@ -125,144 +141,194 @@ public class AuditGatewayImpl implements AuditGateway {
auditMapper . updateById ( auditDO ) ;
}
/ / 发送提审消息 ( 待审核消息 )
sendAuditNotification ( MessageTemplateSceneEnum . WAIT_AUDIT , 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 < AuditDO > 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 ) ;
/ / 1 . 验证审核记录ID
Long auditId = orderWithdrawReviewCmd . getAuditId ( ) ;
if ( Objects . isNull ( auditId ) ) {
throw new BizException ( BizErrorCode . B_BIZ_AUDIT_NOT_FOUND ) ;
}
if ( auditDO ! = null ) {
/ / 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_FOR_WITHDRAW ) ;
}
/ / 4 . 更新审核记录状态为已取消
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 < AuditDO > 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 ) ;
/ / 1 . 验证审核记录ID
Long auditId = orderRejectApproveCmd . getAuditId ( ) ;
if ( Objects . isNull ( auditId ) ) {
throw new BizException ( BizErrorCode . B_BIZ_AUDIT_NOT_FOUND ) ;
}
if ( auditDO ! = null ) {
/ / 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 ) ;
} else {
/ / 如果审核记录不存在 , 抛出异常
throw new BizException ( BizErrorCode . B_BIZ_AUDIT_NOT_FOUND ) ;
}
/ / 发送审核驳回消息
sendAuditNotification ( MessageTemplateSceneEnum . AUDIT_REJECT , auditDO . getAuditId ( ) ,
orderRejectApproveCmd . getCreatedBy ( ) , orderRejectApproveCmd . getCreatedByName ( ) ) ;
/ / 6 . 发送审核驳回消息
sendAuditNotification ( MessageTemplateSceneEnum . AUDIT_REJECT , auditDO , orderRejectApproveCmd . getCreatedBy ( ) , orderRejectApproveCmd . getCreatedByName ( ) ) ;
return auditConvert . toAudit ( auditDO ) ;
}
/ * *
* 老板审批通过
* /
@Override
public Audit finalApprove ( OrderFinalApproveCmd orderFinalApproveCmd ) {
/ / 更新审核记录为审核成功
LambdaQueryWrapper < AuditDO > 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 ) ;
/ / 1 . 验证审核记录ID
Long auditId = orderFinalApproveCmd . getAuditId ( ) ;
if ( Objects . isNull ( auditId ) ) {
throw new BizException ( BizErrorCode . B_BIZ_AUDIT_NOT_FOUND ) ;
}
if ( auditDO ! = null ) {
/ / 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 ) ;
} else {
/ / 如果审核记录不存在 , 抛出异常
throw new BizException ( BizErrorCode . B_BIZ_AUDIT_NOT_FOUND ) ;
}
/ / 发送审批通过消息
sendAuditNotification ( MessageTemplateSceneEnum . APPROVE_PASS , auditDO . getAuditId ( ) ,
orderFinalApproveCmd . getCreatedBy ( ) , orderFinalApproveCmd . getCreatedByName ( ) ) ;
/ / 6 . 发送审批通过消息
sendAuditNotification ( MessageTemplateSceneEnum . APPROVE_PASS , auditDO , orderFinalApproveCmd . getCreatedBy ( ) , orderFinalApproveCmd . getCreatedByName ( ) ) ;
return auditConvert . toAudit ( auditDO ) ;
}
/ * *
* 老板审批驳回
* /
@Override
public Audit rejectFinal ( OrderRejectFinalCmd orderRejectFinalCmd ) {
/ / 更新审核记录
LambdaQueryWrapper < AuditDO > 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 ) ;
/ / 1 . 验证审核记录ID
Long auditId = orderRejectFinalCmd . getAuditId ( ) ;
if ( Objects . isNull ( auditId ) ) {
throw new BizException ( BizErrorCode . B_BIZ_AUDIT_NOT_FOUND ) ;
}
if ( auditDO ! = null ) {
/ / 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 ) ;
} else {
/ / 如果审核记录不存在 , 抛出异常
throw new BizException ( BizErrorCode . B_BIZ_AUDIT_NOT_FOUND ) ;
}
/ / 发送审批驳回消息
sendAuditNotification ( MessageTemplateSceneEnum . APPROVE_REJECT , auditDO . getAuditId ( ) ,
orderRejectFinalCmd . getCreatedBy ( ) , orderRejectFinalCmd . getCreatedByName ( ) ) ;
/ / 6 . 发送审批驳回消息
sendAuditNotification ( MessageTemplateSceneEnum . APPROVE_REJECT , auditDO , orderRejectFinalCmd . getCreatedBy ( ) , orderRejectFinalCmd . getCreatedByName ( ) ) ;
return auditConvert . toAudit ( auditDO ) ;
}
/ * *
* 审核员审核通过 ,
* 1 、 录入员提交的审核 , 审核员审核通过 。
* 2 、 老板驳回审核 , 审核员重新提交审核 。
* /
@Override
public Audit approve ( OrderApproveCmd orderApproveCmd ) {
/ / 更新审核记录状态为审核成功
LambdaQueryWrapper < AuditDO > 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 ) ;
if ( Objects . isNull ( auditDO ) ) {
/ / 如果审核记录不存在 , 抛出异常
/ / 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 ) ;
}
@ -273,7 +339,7 @@ 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 ) ;
@ -282,25 +348,36 @@ 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 ,
orderApproveCmd . getCreatedBy ( ) , orderApproveCmd . getCreatedByName ( ) ) ;
return auditConvert . toAudit ( auditDO1 ) ;
}
/ / 审核员被驳回后的审核
if ( auditDO . getType ( ) . equals ( AuditTypeEnum . BOSS_AUDIT ) ) {
auditDO . setState ( AuditStateEnum . WAITING_AUDIT ) ;
auditMapper . updateById ( auditDO ) ;
/ / 发送待审批消息
sendAuditNotification ( MessageTemplateSceneEnum . WAIT_APPROVE , auditDO , orderApproveCmd . getCreatedBy ( ) , orderApproveCmd . getCreatedByName ( ) ) ;
return auditConvert . toAudit ( auditDO ) ;
}
return null ;
}
/ * *
* 发送审核流程消息通知
*
* @param sceneEnum 消息场景枚举
* @param subjectId 关联主体ID ( 订单ID等 )
* @param auditDO 审核记录
* @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 createdBy , String createdByName ) {
/ / 1 . 查询启用的消息模板
LambdaQueryWrapper < MessageTemplateDO > templateWrapper = Wrappers . lambdaQuery ( MessageTemplateDO . class ) ;
templateWrapper . eq ( MessageTemplateDO : : getTemplateCategory , MessageTemplateCategoryEnum . PURCHASE_ORDER_MESSAGE_TEMPLATE ) ;
@ -320,38 +397,55 @@ public class AuditGatewayImpl implements AuditGateway {
return ;
}
/ / 2 . 创建消息记录
/ / 2 . 查询订单信息用于变量替换
OrderDO orderDO = orderMapper . selectByOrderId ( auditDO . getSubjectId ( ) ) ;
/ / 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 ( t itle) ;
message . setContent ( content ) ;
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 ) ;
/ / 3 . 查询所有需要接收消息的用户
/ / 6 . 查询所有需要接收消息的用户
UserListQry userListQry = new UserListQry ( ) ;
userListQry . setRoleIdList ( template . getRoleIds ( ) ) ;
List < UserVO > userVOList = userService . list ( userListQry ) ;
List < Long > userIdList = userVOList . stream ( ) . map ( UserVO : : getUserId ) . toList ( ) ;
if ( CollUtil . isEmpty ( user Id List) ) {
if ( CollUtil . isEmpty ( user VO List) ) {
return ;
}
/ / 7 . 根据消息场景过滤接收人
List < Long > targetUserIdList = filterTargetUsers ( sceneEnum , userVOList , orderDO , createdBy ) ;
if ( CollUtil . isEmpty ( targetUserIdList ) ) {
return ;
}
/ / 8 . 查询对应的 Admin 记录
AdminListQry adminListQry = new AdminListQry ( ) ;
adminListQry . setUserIdList ( userIdList ) ;
adminListQry . setUserIdList ( targetU serIdList) ;
List < AdminVO > adminVOList = adminService . list ( adminListQry ) ;
if ( CollUtil . isEmpty ( adminVOList ) ) {
return ;
}
/ / 4 . 批量创建消息接收记录
/ / 9 . 批量创建消息接收记录
List < MessageReceiverDO > receiverList = new ArrayList < > ( ) ;
for ( AdminVO adminVO : adminVOList ) {
MessageReceiverDO receiver = new MessageReceiverDO ( ) ;
@ -366,5 +460,109 @@ public class AuditGatewayImpl implements AuditGateway {
receiverList . forEach ( messageReceiverMapper : : insert ) ;
}
}
/ * *
* 根据消息场景过滤目标用户
*
* @param sceneEnum 消息场景
* @param userVOList 所有拥有对应角色的用户列表
* @param orderDO 订单信息
* @param currentUserId 当前操作人ID
* @return 目标用户ID列表
* /
private List < Long > filterTargetUsers ( MessageTemplateSceneEnum sceneEnum , List < UserVO > 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 ( ) ;
}
/ * *
* 构建模板变量映射
*
* @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 ;
}
}