Initial commit: 风影 OA 全栈源码(API/Web/Flutter/IM)

含 Phase 1.1 IM seq 排序、断线重连、多端已读同步与微信式语音转文字 UI。
排除 node_modules、构建产物、安装包与 .env 密钥。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-02 10:04:03 +00:00
commit 76f266645d
507 changed files with 99891 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
import * as fs from 'fs';
/** OA 雪花 ID 超过 Number.MAX_SAFE_INTEGERJSON.parse 会丢精度导致报销明细串单。 */
export function parseOaJson<T = Record<string, unknown>>(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';
}