feat(detail-page-structure-progress-actions): 统一详情处理进度与操作区

这个提交包含在:
2026-08-03 16:00:42 +08:00
父节点 8d428bd51d
当前提交 b7d5761067
共修改 31 个文件,包含 1453 行新增和 383 行删除
@@ -0,0 +1,135 @@
const PAYMENT_PROCESSING_STAGE_DEFINITIONS = Object.freeze({
created: Object.freeze({ key: "payment_batch_created", label: "批次创建" }),
review: Object.freeze({ key: "payment_batch_review", label: "付款复核" }),
payment: Object.freeze({ key: "payment_and_receipt", label: "付款完成" }),
});
function resolveItemPaymentChannel(batch, item) {
return item?.payment_channel_override ?? batch?.default_payment_channel ??
(batch?.entity_type === "reimbursement" ? "bank" : null);
}
function requiresBankReceipt(batch) {
return (batch?.items ?? []).some((item) =>
["pending", "failed"].includes(item.status) && resolveItemPaymentChannel(batch, item) === "bank",
);
}
function buildStage(definition, overrides = {}) {
return {
...definition,
state: "pending",
result: null,
detail: null,
comment: null,
actorSource: null,
occurredAt: null,
...overrides,
};
}
function buildPaymentProcessingSemantics({
status,
createdAt = null,
reviewedAt = null,
executedAt = null,
cancelledAt = null,
cancelledReason = null,
requiresBankReceipt: bankReceiptRequired = false,
receiptCount = 0,
paymentOrderExportCount = 0,
}) {
const created = buildStage(PAYMENT_PROCESSING_STAGE_DEFINITIONS.created, {
state: "completed",
result: "已创建",
actorSource: "creator",
occurredAt: createdAt,
});
const review = buildStage(PAYMENT_PROCESSING_STAGE_DEFINITIONS.review);
const payment = buildStage(PAYMENT_PROCESSING_STAGE_DEFINITIONS.payment, {
detail: "待付款复核通过后由财务登记,非审批环节",
});
if (status === "draft") {
Object.assign(review, {
state: "current",
result: "待复核",
detail: "待非制单人复核付款",
});
} else if (["reviewed", "executed", "failed"].includes(status)) {
Object.assign(review, {
state: "completed",
result: "通过",
detail: status === "reviewed" ? "付款复核已通过" : null,
actorSource: "reviewer",
occurredAt: reviewedAt,
});
if (status === "reviewed") {
const hasReceipt = Number(receiptCount) > 0;
let detail = "付款复核已通过,等待财务登记付款完成,非审批环节";
if (bankReceiptRequired && !hasReceipt) {
detail = Number(paymentOrderExportCount) > 0
? "已生成银行制单,等待付款完成并上传回单,非审批环节"
: "等待财务线下付款并上传回单,非审批环节";
} else if (bankReceiptRequired) {
detail = "银行回单已上传,等待财务登记付款完成,非审批环节";
}
Object.assign(payment, {
state: "current",
result: "待付款",
detail,
});
} else if (status === "executed") {
Object.assign(payment, {
state: "completed",
result: "已付款",
detail: Number(receiptCount) > 0 ? "付款和回单已留存" : "付款已登记完成",
actorSource: "executor",
occurredAt: executedAt,
});
} else {
Object.assign(payment, {
state: "exception",
result: "付款失败",
detail: "付款登记失败,待财务核对后重试,非审批环节",
actorSource: "executor",
occurredAt: executedAt,
});
}
} else if (status === "cancelled") {
const cancellation = {
state: "exception",
result: "批次已取消",
detail: "付款安排已取消,流程已终止",
comment: cancelledReason,
actorSource: "canceller",
occurredAt: cancelledAt,
};
if (reviewedAt) {
Object.assign(review, {
state: "completed",
result: "通过",
actorSource: "reviewer",
occurredAt: reviewedAt,
});
Object.assign(payment, cancellation);
} else {
Object.assign(review, cancellation);
Object.assign(payment, {
state: "terminated",
result: "已终止",
detail: null,
});
}
}
return { created, review, payment };
}
module.exports = {
PAYMENT_PROCESSING_STAGE_DEFINITIONS,
buildPaymentProcessingSemantics,
requiresBankReceipt,
resolveItemPaymentChannel,
};