229 行
6.8 KiB
JavaScript
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,
|
|
};
|