文件
hyb-oa/server/src/services/notifications/workflowCopy.js
T

229 行
6.8 KiB
JavaScript

const { formatDateOnly } = require("../leave");
const { toMoneyString } = require("../../utils/workflow");
function normalizeWorkflowEntityType(entityType) {
return entityType === "procurement" ? "purchase_request" : entityType;
}
function formatAmount(value) {
return toMoneyString(value) ?? "-";
}
function formatRequestedDays(value) {
const numeric = Number(value ?? 0);
if (!Number.isFinite(numeric)) {
return "-";
}
return Number.isInteger(numeric) ? String(numeric) : numeric.toFixed(1);
}
function formatDateRange(startDate, endDate) {
const start = startDate ? formatDateOnly(startDate) : null;
const end = endDate ? formatDateOnly(endDate) : null;
if (start && end) {
return start === end ? start : `${start} ~ ${end}`;
}
return start ?? end ?? null;
}
function buildReference(normalizedEntityType, entityRecord, entityId) {
if (normalizedEntityType === "reimbursement") {
return entityRecord?.form_number ?? entityId;
}
if (normalizedEntityType === "leave") {
return formatDateRange(entityRecord?.start_date, entityRecord?.end_date) ?? entityId;
}
if (normalizedEntityType === "purchase_request") {
return entityRecord?.request_no ?? entityId;
}
if (normalizedEntityType === "travel_request") {
return entityRecord?.request_no ?? entityId;
}
return entityId;
}
function buildWorkflowEntityMeta(entityType, entityRecord, entityId) {
const normalizedEntityType = normalizeWorkflowEntityType(entityType);
if (normalizedEntityType === "reimbursement") {
return {
entityType: normalizedEntityType,
label: "报销单",
reference: buildReference(normalizedEntityType, entityRecord, entityId),
targetType: "reimbursement_form",
detailPath: `/reimbursements/${entityId}`,
summary: {
applicantName: entityRecord?.owner?.name ?? null,
amount: formatAmount(entityRecord?.total_amount),
},
};
}
if (normalizedEntityType === "leave") {
return {
entityType: normalizedEntityType,
label: "请假单",
reference: buildReference(normalizedEntityType, entityRecord, entityId),
targetType: "leave_request",
detailPath: "/leave-requests",
summary: {
applicantName: entityRecord?.owner?.name ?? null,
leaveTypeName: entityRecord?.leave_type?.name ?? null,
requestedDays: formatRequestedDays(entityRecord?.requested_days),
dateRange: formatDateRange(entityRecord?.start_date, entityRecord?.end_date) ?? "-",
},
};
}
if (normalizedEntityType === "purchase_request") {
return {
entityType: normalizedEntityType,
label: "采购申请",
reference: buildReference(normalizedEntityType, entityRecord, entityId),
targetType: "purchase_request",
detailPath: "/purchase-requests",
summary: {
applicantName: entityRecord?.applicant?.name ?? null,
amount: formatAmount(entityRecord?.total_amount),
},
};
}
if (normalizedEntityType === "travel_request") {
return {
entityType: normalizedEntityType,
label: "差旅申请",
reference: buildReference(normalizedEntityType, entityRecord, entityId),
targetType: "travel_request",
detailPath: `/travel-requests?id=${entityId}`,
summary: {
applicantName: entityRecord?.applicant?.name ?? null,
estimatedAmount: formatAmount(entityRecord?.estimated_amount),
},
};
}
return {
entityType: normalizedEntityType,
label: "审批单",
reference: entityId,
targetType: normalizedEntityType,
detailPath: `/workflow/tasks/${entityId}`,
summary: {},
};
}
function buildSummaryLines(entityMeta) {
if (entityMeta.entityType === "reimbursement") {
return [
`申请人:${entityMeta.summary.applicantName ?? "未知申请人"}`,
`金额:${entityMeta.summary.amount ?? "-"}`,
`单号:${entityMeta.reference}`,
];
}
if (entityMeta.entityType === "leave") {
return [
`申请人:${entityMeta.summary.applicantName ?? "未知申请人"}`,
`假种:${entityMeta.summary.leaveTypeName ?? "请假"}`,
`天数:${entityMeta.summary.requestedDays ?? "-"} 天`,
`起止日期:${entityMeta.summary.dateRange ?? "-"}`,
];
}
if (entityMeta.entityType === "purchase_request") {
return [
`申请人:${entityMeta.summary.applicantName ?? "未知申请人"}`,
`金额:${entityMeta.summary.amount ?? "-"}`,
`单号:${entityMeta.reference}`,
];
}
if (entityMeta.entityType === "travel_request") {
return [
`申请人:${entityMeta.summary.applicantName ?? "未知申请人"}`,
`预估金额:${entityMeta.summary.estimatedAmount ?? "-"}`,
`单号:${entityMeta.reference}`,
];
}
return [`单据:${entityMeta.reference}`];
}
function buildSubject(entityMeta) {
return entityMeta.reference ? `${entityMeta.label} ${entityMeta.reference}` : entityMeta.label;
}
function buildBody(entityMeta, resultLine) {
return [...buildSummaryLines(entityMeta), resultLine].join("\n");
}
function buildPendingTaskCopy(entityMeta, { transfer = false } = {}) {
return {
title: `【待办】${buildSubject(entityMeta)} ${transfer ? "转审待处理" : "待审批"}`,
body: buildBody(
entityMeta,
transfer ? "动作:该审批已转审给你,请及时处理。" : "动作:请及时处理审批任务。",
),
};
}
function buildRemindedTaskCopy(entityMeta) {
return {
title: `【催办】${buildSubject(entityMeta)} 待审批`,
body: buildBody(entityMeta, "动作:申请人已催办,请及时处理审批任务。"),
};
}
function buildOverdueTaskCopy(entityMeta) {
return {
title: `【超时提醒】${buildSubject(entityMeta)} 待审批`,
body: buildBody(entityMeta, "动作:该审批已超时,请尽快处理。"),
};
}
function buildApprovedCopy(entityMeta) {
return {
title: `【已批准】${buildSubject(entityMeta)}`,
body: buildBody(
entityMeta,
entityMeta.targetType === "reimbursement_form"
? "结果:已审批通过,等待财务付款。"
: "结果:已审批通过。",
),
};
}
function buildRejectedCopy(entityMeta, comment) {
const safeComment = String(comment ?? "").trim() || "无";
return {
title: `【已驳回】${buildSubject(entityMeta)}`,
body: buildBody(entityMeta, `结果:已驳回:${safeComment}`),
};
}
function buildReturnedCopy(entityMeta, comment) {
const safeComment = String(comment ?? "").trim() || "无";
return {
title: `【已退回】${buildSubject(entityMeta)}`,
body: buildBody(entityMeta, `结果:已退回:${safeComment}`),
};
}
module.exports = {
buildApprovedCopy,
buildOverdueTaskCopy,
buildPendingTaskCopy,
buildRejectedCopy,
buildRemindedTaskCopy,
buildReturnedCopy,
buildWorkflowEntityMeta,
normalizeWorkflowEntityType,
};