import * as fs from 'fs'; /** OA 雪花 ID 超过 Number.MAX_SAFE_INTEGER,JSON.parse 会丢精度导致报销明细串单。 */ export function parseOaJson>(file: string): T { const text = fs.readFileSync(file, 'utf8'); const safe = text.replace( /"(id|reimbursement_id|project_id|employee_id|payer_id|created_by|updated_by|department_id|cc_user_id|offset_advance_id|current_approver_id|user_id|post_id|dept_id|apply_id|tender_id|contract_id)"\s*:\s*(-?\d+)/g, '"$1":"$2"', ); return JSON.parse(safe) as T; } export function mapExpenseLineKind(itemType: string, remark = '') { const t = `${itemType}${remark}`; if (t.includes('机票') || t.includes('航班')) return 'AIR'; if (t.includes('高铁')) return 'HSR'; if (t.includes('火车') || t.includes('卧铺')) return 'TRAIN'; if (t.includes('出租') || t.includes('打车') || t.includes('交通') || t.includes('高速')) return 'TAXI'; if (t.includes('住宿') || t.includes('酒店')) return 'HOTEL'; if (t.includes('餐')) return 'MEAL'; if (t.includes('办公') || t.includes('胶装')) return 'OFFICE'; return 'OTHER'; }