| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- /**
- * 把本地政策库(`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}"`);
|