/** * 把本地政策库(`public/merchant-agent/policies_public.v2.json`)**上传到 DMS 文件服务**, * 打印出它的**相对路径**与**可访问地址** —— 那个地址就是前端的"远端政策接口"。 * * 用户 2026-09-24 的要求: * 「把 policies_public.v2.json 上传到 DMS,记住那个路径,那个路径就是新的远端政策接口, * 后续先从那个接口拿,拿不到再用本地的兜底,最终目标是不再依赖原来的政策相关接口。」 * * 用的是**已有的上传模块**(`src/network/api/dms/file-upload.ts`,与附件上传同一份实现、 * 同一套实测契约:multipart 五个字段全必填);路径本身取不到,要拼 DMS 代理前缀才能访问 * (见 `buildDmsFileDisplayUrl` 的注释与实测结论)。 * * 怎么跑(需要 dev server 起着,代理负责补 `/dms` 前缀并注入 token): * node harness/tools/upload-policy-library.mjs # 默认打 https://localhost:8083/dms * node harness/tools/upload-policy-library.mjs https://host/dms # 也可以显式给代理地址 * * 跑完把打印出来的「相对路径」写进 `.env.*` 的 `VITE_POLICY_REMOTE_URL`(拼好代理前缀的那份)。 */ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; // dev server 是自签证书 const base = String(process.argv[2] || 'https://localhost:8083/dms').replace(/\/+$/, ''); globalThis.VITE_DMS_API = base; const { uploadDmsAttachment, buildDmsFileDisplayUrl } = await import('./_dms.mjs'); const { readFileSync } = await import('node:fs'); const LOCAL_FILE = 'public/merchant-agent/policies_public.v2.json'; const bytes = readFileSync(LOCAL_FILE); const list = JSON.parse(bytes.toString('utf8')); console.log(`上传 ${LOCAL_FILE}(${(bytes.length / 1024).toFixed(0)} KB / ${Array.isArray(list) ? list.length : '?'} 条)`); console.log(`经代理 ${base}(代理负责补 /dms 前缀并注入 token)`); const file = new File([bytes], 'policies_public.v2.json', { type: 'application/json' }); const relativePath = await uploadDmsAttachment(file, { isImage: false }); const displayUrl = buildDmsFileDisplayUrl(relativePath); console.log('\n相对路径(发给后端那种,也是 DMS 里存的位置):'); console.log(' ' + relativePath); console.log('可访问地址(前端实际 fetch 的,拼了代理前缀):'); console.log(' ' + displayUrl); // 立刻自检一次:这个地址真的能取回同一份 JSON(不是 404、也不是 HTML 兜底) const response = await fetch(displayUrl); const contentType = response.headers.get('content-type') || ''; const text = await response.text(); let parsed = null; try { parsed = JSON.parse(text); } catch { /* 下面报出来 */ } const count = Array.isArray(parsed) ? parsed.length : null; console.log('\n自检:'); console.log(` HTTP ${response.status} · content-type=${contentType}`); console.log(` 条数=${count ?? '(解析失败)'}${count === list.length ? ' ✓ 与本地一致' : ' ✗ 与本地不一致!'}`); if (count !== list.length) { console.error(' ⚠️ 远端内容与本地不一致,先别写进 VITE_POLICY_REMOTE_URL'); process.exit(1); } console.log('\n把下面这行写进 .env.development / .env.production(生产换成 nginx 映射的同源路径):'); console.log(` VITE_POLICY_REMOTE_URL="${displayUrl}"`);