feat(P19IM1-1,P19IM1-2): 新增通知渠道配置与Outbox派发

这个提交包含在:
2026-03-08 13:14:04 +08:00
父节点 43a0af0803
当前提交 f6d9f23553
共修改 13 个文件,包含 1582 行新增和 364 行删除
+86
查看文件
@@ -0,0 +1,86 @@
const NOTIFICATION_DOMAIN_SCOPES = Object.freeze({
workflow: 'workflow',
reimbursement: 'reimbursement',
leave: 'leave',
procurement: 'procurement',
asset: 'asset',
inventory: 'inventory',
});
const NOTIFICATION_TYPES = Object.freeze({
workflowTaskAssigned: 'workflow.task_assigned',
reimbursementApproved: 'reimbursement.approved',
reimbursementRejected: 'reimbursement.rejected',
reimbursementReturned: 'reimbursement.returned',
reimbursementPaid: 'reimbursement.paid',
leaveApproved: 'leave.approved',
leaveRejected: 'leave.rejected',
purchaseRequestApproved: 'purchase_request.approved',
purchaseRequestRejected: 'purchase_request.rejected',
assetAssigned: 'asset.assigned',
assetReturned: 'asset.returned',
assetTransferred: 'asset.transferred',
inventoryCheckCompleted: 'inventory_check.completed',
});
const IM_SUPPORTED_NOTIFICATION_TYPES = Object.freeze([
NOTIFICATION_TYPES.workflowTaskAssigned,
NOTIFICATION_TYPES.reimbursementApproved,
NOTIFICATION_TYPES.reimbursementRejected,
NOTIFICATION_TYPES.reimbursementReturned,
NOTIFICATION_TYPES.reimbursementPaid,
NOTIFICATION_TYPES.leaveApproved,
NOTIFICATION_TYPES.leaveRejected,
NOTIFICATION_TYPES.purchaseRequestApproved,
NOTIFICATION_TYPES.purchaseRequestRejected,
NOTIFICATION_TYPES.assetAssigned,
NOTIFICATION_TYPES.assetReturned,
NOTIFICATION_TYPES.assetTransferred,
NOTIFICATION_TYPES.inventoryCheckCompleted,
]);
const NOTIFICATION_TYPE_TO_DOMAIN_SCOPE = Object.freeze({
[NOTIFICATION_TYPES.workflowTaskAssigned]: NOTIFICATION_DOMAIN_SCOPES.workflow,
[NOTIFICATION_TYPES.reimbursementApproved]: NOTIFICATION_DOMAIN_SCOPES.reimbursement,
[NOTIFICATION_TYPES.reimbursementRejected]: NOTIFICATION_DOMAIN_SCOPES.reimbursement,
[NOTIFICATION_TYPES.reimbursementReturned]: NOTIFICATION_DOMAIN_SCOPES.reimbursement,
[NOTIFICATION_TYPES.reimbursementPaid]: NOTIFICATION_DOMAIN_SCOPES.reimbursement,
[NOTIFICATION_TYPES.leaveApproved]: NOTIFICATION_DOMAIN_SCOPES.leave,
[NOTIFICATION_TYPES.leaveRejected]: NOTIFICATION_DOMAIN_SCOPES.leave,
[NOTIFICATION_TYPES.purchaseRequestApproved]: NOTIFICATION_DOMAIN_SCOPES.procurement,
[NOTIFICATION_TYPES.purchaseRequestRejected]: NOTIFICATION_DOMAIN_SCOPES.procurement,
[NOTIFICATION_TYPES.assetAssigned]: NOTIFICATION_DOMAIN_SCOPES.asset,
[NOTIFICATION_TYPES.assetReturned]: NOTIFICATION_DOMAIN_SCOPES.asset,
[NOTIFICATION_TYPES.assetTransferred]: NOTIFICATION_DOMAIN_SCOPES.asset,
[NOTIFICATION_TYPES.inventoryCheckCompleted]: NOTIFICATION_DOMAIN_SCOPES.inventory,
});
const TARGET_TYPE_TO_DOMAIN_SCOPE = Object.freeze({
workflow_task: NOTIFICATION_DOMAIN_SCOPES.workflow,
reimbursement_form: NOTIFICATION_DOMAIN_SCOPES.reimbursement,
leave_request: NOTIFICATION_DOMAIN_SCOPES.leave,
purchase_request: NOTIFICATION_DOMAIN_SCOPES.procurement,
asset_card: NOTIFICATION_DOMAIN_SCOPES.asset,
inventory_check: NOTIFICATION_DOMAIN_SCOPES.inventory,
});
function resolveNotificationDomainScope(type, targetType = null) {
const normalizedType = type == null ? '' : String(type).trim();
if (normalizedType && NOTIFICATION_TYPE_TO_DOMAIN_SCOPE[normalizedType]) {
return NOTIFICATION_TYPE_TO_DOMAIN_SCOPE[normalizedType];
}
const normalizedTargetType = targetType == null ? '' : String(targetType).trim();
if (normalizedTargetType && TARGET_TYPE_TO_DOMAIN_SCOPE[normalizedTargetType]) {
return TARGET_TYPE_TO_DOMAIN_SCOPE[normalizedTargetType];
}
return null;
}
module.exports = {
NOTIFICATION_TYPES,
IM_SUPPORTED_NOTIFICATION_TYPES,
NOTIFICATION_DOMAIN_SCOPES,
resolveNotificationDomainScope,
};