feat: 完成P6-P8后端能力与P9路由重构(V1-V2,D1,D3,B1-B2,B4,I1-I4,P9A2-P9A3)
这个提交包含在:
@@ -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,
|
||||
};
|
||||
在新工单中引用
屏蔽一个用户