feat(detail-page-structure-progress-actions): 统一详情处理进度与操作区
这个提交包含在:
@@ -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,
|
||||
};
|
||||
在新工单中引用
屏蔽一个用户