feat: 完成P6-P8后端能力与P9路由重构(V1-V2,D1,D3,B1-B2,B4,I1-I4,P9A2-P9A3)

这个提交包含在:
2026-02-10 11:28:28 +08:00
父节点 bec21e1b38
当前提交 6bc09f557b
共修改 33 个文件,包含 3467 行新增和 13 行删除
@@ -0,0 +1,40 @@
function normalizeTravelImportRows(rows) {
if (!Array.isArray(rows)) {
return [];
}
return rows
.map((item) => {
const source = String(item?.source ?? "manual").trim().toLowerCase();
const externalOrderNo = String(item?.externalOrderNo ?? "").trim();
const employeeId = String(item?.employeeId ?? "").trim();
if (!externalOrderNo || !employeeId) {
return null;
}
const amountRaw = item?.amount;
const amount = amountRaw == null || amountRaw === "" ? null : Number(amountRaw);
const occurredAt = item?.occurredAt
? new Date(`${String(item.occurredAt).slice(0, 10)}T00:00:00.000Z`)
: null;
return {
source,
externalOrderNo,
employeeId,
linkedReimbursementId:
item?.linkedReimbursementId && String(item.linkedReimbursementId).trim()
? String(item.linkedReimbursementId).trim()
: null,
amount: Number.isFinite(amount) ? amount.toFixed(2) : null,
currency: String(item?.currency ?? "CNY").trim().toUpperCase() || "CNY",
occurredAt,
rawPayload: item ?? null,
};
})
.filter(Boolean);
}
module.exports = {
normalizeTravelImportRows,
};