seed-dms-mock-data.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  1. /**
  2. * 松江退养补贴 - DMS 模拟数据种子
  3. * 网关: 121.43.55.7:2101
  4. *
  5. * 用法: node scripts/seed-dms-mock-data.js
  6. * 可选: node scripts/seed-dms-mock-data.js --force (即使已有数据也追加)
  7. */
  8. const http = require("http");
  9. const qs = require("querystring");
  10. const fs = require("fs");
  11. const path = require("path");
  12. const HOST = "121.43.55.7";
  13. const PORT = 2101;
  14. const FORCE = process.argv.includes("--force");
  15. const COL = {
  16. xzqh: { columnId: 1842, modelId: 1965, tag: "sjnmtybt_xzqh" },
  17. jebz: { columnId: 1843, modelId: 1966, tag: "sjnmtybt_jebz" },
  18. alart: { columnId: 1841, modelId: 1964, tag: "sjnmtybt_alart" },
  19. lcb: { columnId: 1844, modelId: 1967, tag: "sjnmtybt_lcb" },
  20. pcb: { columnId: 1845, modelId: 1968, tag: "sjnmtybt_pcb" },
  21. pctj: { columnId: 1846, modelId: 1969, tag: "sjnmtybt_pctj" },
  22. ryjbxx: { columnId: 1847, modelId: 1970, tag: "sjnmtybt_ryjbxx" },
  23. ffmx: { columnId: 1849, modelId: 1974, tag: "sjnmtybt_ffmx" },
  24. };
  25. function req(urlPath, fields, token, method) {
  26. return new Promise((resolve, reject) => {
  27. const body = qs.stringify(fields || {});
  28. const headers = {
  29. "Content-Type": "application/x-www-form-urlencoded",
  30. "Content-Length": Buffer.byteLength(body),
  31. };
  32. if (token) {
  33. headers.Token = token;
  34. headers.token = token;
  35. }
  36. const r = http.request(
  37. { hostname: HOST, port: PORT, path: urlPath, method: method || "POST", headers },
  38. (res) => {
  39. let data = "";
  40. res.on("data", (c) => (data += c));
  41. res.on("end", () => {
  42. try {
  43. resolve(JSON.parse(data));
  44. } catch (e) {
  45. resolve({ raw: data, status: res.statusCode });
  46. }
  47. });
  48. }
  49. );
  50. r.on("error", reject);
  51. r.write(body);
  52. r.end();
  53. });
  54. }
  55. async function login() {
  56. const res = await req("/proxy_oauth/user/login", {
  57. userName: "user_liu",
  58. password: "WE176852439@lmx",
  59. clientId: "1",
  60. });
  61. if (res.code != 200) throw new Error("login fail: " + JSON.stringify(res));
  62. return res.message;
  63. }
  64. async function addContent(token, col, contentObj) {
  65. const payload = Object.assign(
  66. {
  67. title: contentObj.title || contentObj.c_name || contentObj.c_batch_number || "模拟数据",
  68. content: contentObj.content || contentObj.c_remarks || "mock",
  69. },
  70. contentObj
  71. );
  72. const res = await req(
  73. "/proxy_dms/content/addContent",
  74. {
  75. columnId: String(col.columnId),
  76. modelId: String(col.modelId),
  77. content: JSON.stringify(payload),
  78. },
  79. token
  80. );
  81. return res;
  82. }
  83. async function selectList(token, col, pageSize) {
  84. const res = await req(
  85. "/proxy_dms/content/selectContentList",
  86. {
  87. columnId: String(col.columnId),
  88. modelId: String(col.modelId),
  89. states: "0",
  90. pageNum: "1",
  91. pageSize: String(pageSize || 5),
  92. },
  93. token
  94. );
  95. const list =
  96. (res.content && res.content.list) ||
  97. (res.content && res.content.records) ||
  98. (Array.isArray(res.content) ? res.content : []) ||
  99. [];
  100. return { code: res.code, total: (res.content && (res.content.total || res.content.totalCount)) || list.length, list };
  101. }
  102. function towns() {
  103. return [
  104. { code: "T_YEXIE", name: "叶榭镇", plan: "17010002" },
  105. { code: "T_SHESHAN", name: "佘山镇", plan: "17010003" },
  106. { code: "T_CHEDUN", name: "车墩镇" },
  107. { code: "T_SHIHUDANG", name: "石湖荡镇" },
  108. { code: "T_MAOGANG", name: "泖港镇" },
  109. { code: "T_XINBANG", name: "新浜镇" },
  110. { code: "T_XIAOKUNSHAN", name: "小昆山镇" },
  111. ];
  112. }
  113. (async () => {
  114. const token = await login();
  115. console.log("login ok");
  116. const summary = { added: {}, skipped: {}, errors: [] };
  117. // 若人员表已有模拟标记数据且非 force,则跳过整库种子(避免重复)
  118. const existRy = await selectList(token, COL.ryjbxx, 20);
  119. const hasMock =
  120. existRy.list &&
  121. existRy.list.some((i) => String(i.c_remarks || i.content || "").includes("MOCK_SEED_260804"));
  122. if (hasMock && !FORCE) {
  123. console.log("检测到已有 MOCK_SEED_260804 数据,跳过写入。如需追加请加 --force");
  124. const out = { skipped: true, tip: "use --force to append" };
  125. fs.writeFileSync(path.join(__dirname, "seed-dms-mock-result.json"), JSON.stringify(out, null, 2));
  126. return;
  127. }
  128. async function seedOne(key, col, rows) {
  129. const ids = [];
  130. for (const row of rows) {
  131. const res = await addContent(token, col, row);
  132. if (res.code == 200) {
  133. ids.push(res.content);
  134. console.log(" +", key, res.content, row.title || row.c_name || row.c_batch_number || "");
  135. } else {
  136. console.log(" x", key, res.code, res.message || res.content);
  137. summary.errors.push({ key, row, res });
  138. }
  139. }
  140. summary.added[key] = ids;
  141. return ids;
  142. }
  143. // ---------- 1. 行政区划 ----------
  144. console.log("\n[1] 行政区划");
  145. const districtTitle = "松江区";
  146. await seedOne("xzqh_district", COL.xzqh, [
  147. {
  148. title: districtTitle,
  149. c_name: districtTitle,
  150. c_parent_id: "0",
  151. c_level: "DISTRICT",
  152. c_code: "D_SJ",
  153. c_remarks: "MOCK_SEED_260804|level=DISTRICT|code=D_SJ",
  154. content: "MOCK_SEED_260804",
  155. },
  156. ]);
  157. const townRows = towns().map((t) => ({
  158. title: t.name,
  159. c_name: t.name,
  160. c_parent_id: "D_SJ",
  161. c_level: "TOWN",
  162. c_code: t.code,
  163. c_entrust_plan_code: t.plan || "",
  164. c_remarks: "MOCK_SEED_260804|level=TOWN|code=" + t.code,
  165. content: "MOCK_SEED_260804",
  166. }));
  167. await seedOne("xzqh_town", COL.xzqh, townRows);
  168. const villageRows = [
  169. { town: "T_YEXIE", name: "叶榭村", code: "V_YX_001" },
  170. { town: "T_YEXIE", name: "井凌桥村", code: "V_YX_002" },
  171. { town: "T_SHESHAN", name: "陈坊村", code: "V_SS_001" },
  172. { town: "T_CHEDUN", name: "车墩村", code: "V_CD_001" },
  173. ].map((v) => ({
  174. title: v.name,
  175. c_name: v.name,
  176. c_parent_id: v.town,
  177. c_level: "VILLAGE",
  178. c_code: v.code,
  179. c_remarks: "MOCK_SEED_260804|level=VILLAGE|code=" + v.code + "|town=" + v.town,
  180. content: "MOCK_SEED_260804",
  181. }));
  182. await seedOne("xzqh_village", COL.xzqh, villageRows);
  183. // ---------- 2. 金额标准(年度标准一行双金额)----------
  184. console.log("\n[2] 金额标准");
  185. const now = Date.now();
  186. const stdRows = towns().map((t) => ({
  187. title: t.name + "-年度标准",
  188. c_town_id: t.code,
  189. c_amount: 1280,
  190. c_funeral_amount: 6000,
  191. c_date_time: now,
  192. c_standard_type: "YEARLY_ADJUST",
  193. c_current_flag: "true",
  194. c_adjust_reason: "2025年度标准",
  195. c_remarks: "MOCK_SEED_260804|YEARLY_ADJUST|" + t.code,
  196. content: "MOCK_SEED_260804",
  197. }));
  198. await seedOne("jebz", COL.jebz, stdRows);
  199. // ---------- 3. 人员 ----------
  200. console.log("\n[3] 人员");
  201. const people = [
  202. {
  203. title: "张三",
  204. c_name: "张三",
  205. c_id_number: "310117198001011234",
  206. c_phone_number: 13800138001,
  207. c_address: "上海市松江区叶榭镇叶榭村1组",
  208. c_bank_card_number: "6228480030001234567",
  209. c_social_insurance_code: "170100021001",
  210. c_household_type: "农业",
  211. c_district_id: "D_SJ",
  212. c_town_id: "T_YEXIE",
  213. c_village_id: "V_YX_001",
  214. c_village_code: "310117112001",
  215. c_entrust_plan_code: "17010002",
  216. c_entrust_plan_name: "叶榭镇委托发放",
  217. c_payee_name: "张三",
  218. c_bank_name: "上海农商银行叶榭支行",
  219. c_bank_type: "农商",
  220. c_bank_branch_code: "322290003001",
  221. c_enjoy_start_month: "202501",
  222. c_monthly_standard: 1280,
  223. c_insurance_status: "正常参保",
  224. c_insurance_match_result: "SUCCESS",
  225. c_biz_status: "NORMAL",
  226. c_pay_this_month: "true",
  227. c_source: "村级录入",
  228. c_input_village_id: "V_YX_001",
  229. c_remarks: "MOCK_SEED_260804|P001|正常在库",
  230. content: "MOCK_SEED_260804",
  231. },
  232. {
  233. title: "李四",
  234. c_name: "李四",
  235. c_id_number: "310117197505051234",
  236. c_phone_number: 13800138002,
  237. c_address: "上海市松江区叶榭镇井凌桥村2组",
  238. c_bank_card_number: "6228480030002234567",
  239. c_social_insurance_code: "170100021002",
  240. c_household_type: "农业",
  241. c_district_id: "D_SJ",
  242. c_town_id: "T_YEXIE",
  243. c_village_id: "V_YX_002",
  244. c_entrust_plan_code: "17010002",
  245. c_payee_name: "李四",
  246. c_bank_name: "中国农业银行松江支行",
  247. c_bank_type: "农行",
  248. c_enjoy_start_month: "202406",
  249. c_monthly_standard: 1280,
  250. c_insurance_status: "正常参保",
  251. c_insurance_match_result: "SUCCESS",
  252. c_biz_status: "NORMAL",
  253. c_pay_this_month: "true",
  254. c_source: "Excel导入",
  255. c_input_village_id: "V_YX_002",
  256. c_remarks: "MOCK_SEED_260804|P002|正常在库",
  257. content: "MOCK_SEED_260804",
  258. },
  259. {
  260. title: "王五",
  261. c_name: "王五",
  262. c_id_number: "310117196808081234",
  263. c_phone_number: 13800138003,
  264. c_address: "上海市松江区佘山镇陈坊村",
  265. c_bank_card_number: "6228480030003234567",
  266. c_social_insurance_code: "170100031001",
  267. c_household_type: "农业",
  268. c_town_id: "T_SHESHAN",
  269. c_village_id: "V_SS_001",
  270. c_entrust_plan_code: "17010003",
  271. c_payee_name: "王五",
  272. c_bank_type: "农商",
  273. c_monthly_standard: 1280,
  274. c_insurance_match_result: "PENDING",
  275. c_biz_status: "PENDING_TOWN_APPROVE",
  276. c_pay_this_month: "true",
  277. c_source: "村级录入",
  278. c_remarks: "MOCK_SEED_260804|P003|待镇经发初审",
  279. content: "MOCK_SEED_260804",
  280. },
  281. {
  282. title: "赵六",
  283. c_name: "赵六",
  284. c_id_number: "310117195912121234",
  285. c_phone_number: 13800138004,
  286. c_address: "上海市松江区叶榭镇叶榭村",
  287. c_bank_card_number: "6228480030004234567",
  288. c_town_id: "T_YEXIE",
  289. c_village_id: "V_YX_001",
  290. c_payee_name: "赵六",
  291. c_bank_type: "农商",
  292. c_monthly_standard: 1280,
  293. c_biz_status: "FUNERAL",
  294. c_pay_this_month: "false",
  295. c_death_date: "2025-09-15",
  296. c_heir_name: "赵小明",
  297. c_heir_id_number: "310117199001011111",
  298. c_heir_bank_card: "6228480030005234567",
  299. c_heir_phone: "13900139001",
  300. c_funeral_diff_amount: 6000,
  301. c_source: "死亡名单",
  302. c_remarks: "MOCK_SEED_260804|P004|死亡丧葬",
  303. content: "MOCK_SEED_260804",
  304. },
  305. {
  306. title: "钱七",
  307. c_name: "钱七",
  308. c_id_number: "310117197011111234",
  309. c_phone_number: 13800138005,
  310. c_address: "上海市松江区车墩镇车墩村",
  311. c_bank_card_number: "6228480030006234567",
  312. c_town_id: "T_CHEDUN",
  313. c_village_id: "V_CD_001",
  314. c_payee_name: "钱七",
  315. c_bank_type: "农行",
  316. c_monthly_standard: 1280,
  317. c_insurance_match_result: "FAIL",
  318. c_biz_status: "ABNORMAL",
  319. c_pay_this_month: "false",
  320. c_source: "村级录入",
  321. c_remarks: "MOCK_SEED_260804|P005|居保匹配失败待人工确认",
  322. content: "MOCK_SEED_260804",
  323. },
  324. {
  325. title: "孙八",
  326. c_name: "孙八",
  327. c_id_number: "310117198303031234",
  328. c_phone_number: 13800138006,
  329. c_town_id: "T_YEXIE",
  330. c_village_id: "V_YX_001",
  331. c_payee_name: "孙八",
  332. c_bank_card_number: "6228480030007234567",
  333. c_bank_type: "农商",
  334. c_monthly_standard: 1280,
  335. c_biz_status: "PAUSED",
  336. c_pay_this_month: "false",
  337. c_source: "村级录入",
  338. c_remarks: "MOCK_SEED_260804|P006|暂停发放",
  339. content: "MOCK_SEED_260804",
  340. },
  341. ];
  342. await seedOne("ryjbxx", COL.ryjbxx, people);
  343. // ---------- 4. 批次 ----------
  344. console.log("\n[4] 批次");
  345. const batches = [
  346. {
  347. title: "202604-叶榭-村级待初审",
  348. c_batch_number: "VB202604001",
  349. c_town_id: "T_YEXIE",
  350. c_village_id: "V_YX_001",
  351. c_district_id: "D_SJ",
  352. c_batch_level: "VILLAGE",
  353. c_pay_month: "202604",
  354. c_current_stage: "STAGE2_TOWN_PRECHECK",
  355. c_status: "PENDING_TOWN_APPROVE",
  356. c_people_count: 2,
  357. c_standard_amount: 2560,
  358. c_normal_amount: 2560,
  359. c_death_amount: 0,
  360. c_additional_amount: 0,
  361. c_supplementary_payment_amount: 0,
  362. c_funeral_amount: 0,
  363. c_deduct_amount: 0,
  364. c_total_amount: 2560,
  365. c_export_status: "未出盘",
  366. c_return_status: "未回盘",
  367. c_pay_date: "2026-04-20",
  368. c_submitter: "叶榭村合作社-张会计",
  369. c_entrust_plan_code: "17010002",
  370. c_remarks: "MOCK_SEED_260804|待镇经发初审",
  371. content: "MOCK_SEED_260804",
  372. },
  373. {
  374. title: "202603-叶榭-镇级已回盘",
  375. c_batch_number: "MB202603001",
  376. c_town_id: "T_YEXIE",
  377. c_village_id: "",
  378. c_district_id: "D_SJ",
  379. c_batch_level: "TOWN",
  380. c_pay_month: "202603",
  381. c_current_stage: "STAGE8_RETURN_CONFIRM",
  382. c_status: "RETURNED",
  383. c_people_count: 3,
  384. c_standard_amount: 3840,
  385. c_normal_amount: 3840,
  386. c_death_amount: 6000,
  387. c_additional_amount: 0,
  388. c_supplementary_payment_amount: 0,
  389. c_funeral_amount: 6000,
  390. c_deduct_amount: 0,
  391. c_total_amount: 9840,
  392. c_export_disk_no: "DP20260301",
  393. c_export_file_name: "LSJ20260320.N7C",
  394. c_export_status: "已导出",
  395. c_return_status: "部分异常",
  396. c_summary_no: "170000061804",
  397. c_pay_bank: "农商",
  398. c_pay_date: "2026-03-20",
  399. c_return_date: "2026-03-25",
  400. c_submitter: "社区事务中心-业务科",
  401. c_town_opinion: "同意发放",
  402. c_entrust_plan_code: "17010002",
  403. c_remarks: "MOCK_SEED_260804|已回盘含失败",
  404. content: "MOCK_SEED_260804",
  405. },
  406. // 注:不再种子混村镇级批 MB202604002(两村明细挂同一无村居镇批,属脏数据;领导审走真实村批流程)
  407. ];
  408. await seedOne("pcb", COL.pcb, batches);
  409. // ---------- 5. 发放明细 ----------
  410. console.log("\n[5] 发放明细");
  411. const details = [
  412. {
  413. title: "张三-202603发放",
  414. c_batch_id: "MB202603001",
  415. c_batch_number: "MB202603001",
  416. c_user_id: "P001",
  417. c_name: "张三",
  418. c_id_number: "310117198001011234",
  419. c_pay_month: "202603",
  420. c_town_id: "T_YEXIE",
  421. c_village_id: "V_YX_001",
  422. c_district_id: "D_SJ",
  423. c_standard_amount: 1280,
  424. c_one_time_amount: 0,
  425. c_supplementary_payment_amount: 0,
  426. c_death_amount: 0,
  427. c_deduct_amount: 0,
  428. c_additional_amount: 0,
  429. c_total_amount: 1280,
  430. c_pay_bank: "农商",
  431. c_bank_card_number: "6228480030001234567",
  432. c_standard_id: "STD_YEXIE_MONTHLY",
  433. c_exported: "true",
  434. c_remarks: "MOCK_SEED_260804|回盘成功",
  435. content: "MOCK_SEED_260804",
  436. },
  437. {
  438. title: "李四-202603发放",
  439. c_batch_id: "MB202603001",
  440. c_batch_number: "MB202603001",
  441. c_user_id: "P002",
  442. c_name: "李四",
  443. c_id_number: "310117197505051234",
  444. c_pay_month: "202603",
  445. c_town_id: "T_YEXIE",
  446. c_village_id: "V_YX_002",
  447. c_standard_amount: 1280,
  448. c_total_amount: 1280,
  449. c_pay_bank: "农行",
  450. c_bank_card_number: "6228480030002234567",
  451. c_exported: "true",
  452. c_remarks: "MOCK_SEED_260804|回盘失败-冻结",
  453. content: "MOCK_SEED_260804",
  454. },
  455. {
  456. title: "赵六-202603丧葬",
  457. c_batch_id: "MB202603001",
  458. c_batch_number: "MB202603001",
  459. c_user_id: "P004",
  460. c_name: "赵六",
  461. c_id_number: "310117195912121234",
  462. c_pay_month: "202603",
  463. c_town_id: "T_YEXIE",
  464. c_village_id: "V_YX_001",
  465. c_standard_amount: 0,
  466. c_death_amount: 6000,
  467. c_total_amount: 6000,
  468. c_pay_bank: "农商",
  469. c_bank_card_number: "6228480030005234567",
  470. c_exported: "true",
  471. c_remarks: "MOCK_SEED_260804|丧葬补贴-继承人账户",
  472. content: "MOCK_SEED_260804",
  473. },
  474. ];
  475. await seedOne("ffmx", COL.ffmx, details);
  476. // ---------- 6. 流程跟踪 ----------
  477. console.log("\n[6] 流程跟踪");
  478. const logs = [
  479. {
  480. title: "VB202604001-提交初审",
  481. c_process_number: "PN202604001",
  482. c_batch_id: "VB202604001",
  483. c_batch_no: "202604",
  484. c_town_id: "T_YEXIE",
  485. c_village_id: "V_YX_001",
  486. c_stage: "STAGE1_PERSONNEL_INPUT",
  487. c_biz_type: "月度批次人员申请",
  488. c_approve_node: "村合作社",
  489. c_operator: "张会计",
  490. c_operator_role: "村合作社录入员",
  491. c_operator_org: "叶榭村合作社",
  492. c_action: "提交",
  493. c_opinion: "本月新增人员已录入",
  494. c_result: "成功",
  495. c_status: "已完成",
  496. c_operate_time: now - 86400000 * 2,
  497. c_remarks: "MOCK_SEED_260804",
  498. content: "MOCK_SEED_260804",
  499. },
  500. {
  501. title: "MB202603001-回盘确认",
  502. c_process_number: "PN202603010",
  503. c_batch_id: "MB202603001",
  504. c_batch_no: "202603",
  505. c_town_id: "T_YEXIE",
  506. c_stage: "STAGE8_RETURN_CONFIRM",
  507. c_biz_type: "回盘信息更新",
  508. c_approve_node: "社区事务中心-业务部门",
  509. c_operator: "王专员",
  510. c_action: "回盘确认",
  511. c_opinion: "1人账户冻结失败,纳入下月处理",
  512. c_result: "部分异常",
  513. c_status: "已完成",
  514. c_operate_time: now - 86400000 * 10,
  515. c_remarks: "MOCK_SEED_260804",
  516. content: "MOCK_SEED_260804",
  517. },
  518. ];
  519. await seedOne("lcb", COL.lcb, logs);
  520. // ---------- 7. 告警 ----------
  521. console.log("\n[7] 告警");
  522. const alerts = [
  523. {
  524. title: "AL-死亡停发-赵六",
  525. c_batch_no: "202603",
  526. c_batch_id: "MB202603001",
  527. c_personnel_id: "P004",
  528. c_personnel_name: "赵六",
  529. c_town_id: "T_YEXIE",
  530. c_village_id: "V_YX_001",
  531. c_level: "HIGH",
  532. c_type: "DEATH_STATUS",
  533. c_content: "死亡信息已录入,系统预警停止继续发放",
  534. c_handle_status: "CLOSED",
  535. c_handle_result: "已转丧葬补贴申请",
  536. c_initiator: "系统",
  537. c_recipient: "社区事务中心-业务部门",
  538. c_handler: "王专员",
  539. c_handle_time: now - 86400000 * 20,
  540. c_status: "已关闭",
  541. c_process_id: "PN202603010",
  542. c_remarks: "MOCK_SEED_260804|系统预警",
  543. content: "MOCK_SEED_260804",
  544. },
  545. {
  546. title: "AL-回盘失败-李四",
  547. c_batch_no: "202603",
  548. c_batch_id: "MB202603001",
  549. c_personnel_id: "P002",
  550. c_personnel_name: "李四",
  551. c_town_id: "T_YEXIE",
  552. c_village_id: "V_YX_002",
  553. c_level: "HIGH",
  554. c_type: "RETURN_FAIL",
  555. c_content: "回盘失败:账户冻结",
  556. c_fail_reason_code: "003",
  557. c_handle_status: "PENDING",
  558. c_initiator: "系统",
  559. c_recipient: "社区事务中心-业务部门",
  560. c_status: "待处理",
  561. c_remarks: "MOCK_SEED_260804|失败码003",
  562. content: "MOCK_SEED_260804",
  563. },
  564. {
  565. title: "AL-居保匹配失败-钱七",
  566. c_batch_no: "202604",
  567. c_personnel_id: "P005",
  568. c_personnel_name: "钱七",
  569. c_town_id: "T_CHEDUN",
  570. c_village_id: "V_CD_001",
  571. c_level: "MEDIUM",
  572. c_type: "INSURANCE_MATCH_FAIL",
  573. c_content: "居保状态匹配失败,待人工确认",
  574. c_handle_status: "PROCESSING",
  575. c_initiator: "系统",
  576. c_recipient: "社区事务中心-业务部门",
  577. c_status: "处理中",
  578. c_remarks: "MOCK_SEED_260804",
  579. content: "MOCK_SEED_260804",
  580. },
  581. ];
  582. await seedOne("alart", COL.alart, alerts);
  583. // ---------- 8. 批次统计 ----------
  584. console.log("\n[8] 批次统计");
  585. const stats = [
  586. {
  587. title: "202603-叶榭-街镇汇总",
  588. c_batch_id: "MB202603001",
  589. c_batch_number: "MB202603001",
  590. c_summary_no: "170000061804",
  591. c_pay_month: "202603",
  592. c_town_id: "T_YEXIE",
  593. c_village_id: "",
  594. c_pay_bank: "合计",
  595. c_grain: "街镇",
  596. c_number_of_people: "3",
  597. c_should_pay_count: 3,
  598. c_should_pay_amount: 9840,
  599. c_actual_pay_count: 2,
  600. c_actual_pay_amount: 7280,
  601. c_fail_count: 1,
  602. c_fail_amount: 1280,
  603. c_standard_amount: 3840,
  604. c_death_amount: 6000,
  605. c_additional_amount: 0,
  606. c_supplementary_payment_amount: 0,
  607. c_return_date: "2026-03-25",
  608. c_handler: "王专员",
  609. c_reviewer: "李复核",
  610. c_remarks: "MOCK_SEED_260804|应发/实发/失败三套",
  611. content: "MOCK_SEED_260804",
  612. },
  613. {
  614. title: "202603-叶榭-农商",
  615. c_batch_id: "MB202603001",
  616. c_batch_number: "MB202603001",
  617. c_pay_month: "202603",
  618. c_town_id: "T_YEXIE",
  619. c_pay_bank: "农商",
  620. c_grain: "银行",
  621. c_number_of_people: "2",
  622. c_should_pay_count: 2,
  623. c_should_pay_amount: 7280,
  624. c_actual_pay_count: 2,
  625. c_actual_pay_amount: 7280,
  626. c_fail_count: 0,
  627. c_fail_amount: 0,
  628. c_standard_amount: 1280,
  629. c_death_amount: 6000,
  630. c_remarks: "MOCK_SEED_260804",
  631. content: "MOCK_SEED_260804",
  632. },
  633. {
  634. title: "202603-叶榭-农行",
  635. c_batch_id: "MB202603001",
  636. c_batch_number: "MB202603001",
  637. c_pay_month: "202603",
  638. c_town_id: "T_YEXIE",
  639. c_pay_bank: "农行",
  640. c_grain: "银行",
  641. c_number_of_people: "1",
  642. c_should_pay_count: 1,
  643. c_should_pay_amount: 1280,
  644. c_actual_pay_count: 0,
  645. c_actual_pay_amount: 0,
  646. c_fail_count: 1,
  647. c_fail_amount: 1280,
  648. c_standard_amount: 1280,
  649. c_remarks: "MOCK_SEED_260804|李四冻结失败",
  650. content: "MOCK_SEED_260804",
  651. },
  652. ];
  653. await seedOne("pctj", COL.pctj, stats);
  654. // 校验计数
  655. console.log("\n[校验] 各表条数抽样");
  656. const counts = {};
  657. for (const [k, col] of Object.entries(COL)) {
  658. const r = await selectList(token, col, 100);
  659. const mockCount = (r.list || []).filter((i) =>
  660. String(JSON.stringify(i)).includes("MOCK_SEED_260804")
  661. ).length;
  662. counts[k] = { apiTotal: r.total, pageMockHits: mockCount, code: r.code };
  663. console.log(" ", k, counts[k]);
  664. }
  665. const result = {
  666. time: new Date().toISOString(),
  667. force: FORCE,
  668. summary,
  669. counts,
  670. tips: {
  671. filter: "所有模拟数据 c_remarks/content 含 MOCK_SEED_260804",
  672. townCodes: towns().map((t) => t.code),
  673. sampleBatchNos: ["VB202604001", "MB202603001"],
  674. samplePeople: ["P001张三", "P002李四", "P003王五", "P004赵六死亡", "P005钱七匹配失败", "P006孙八暂停"],
  675. queryExample: {
  676. url: "POST /proxy_dms/content/selectContentList",
  677. body: { columnId: 1847, modelId: 1970, states: 0, pageNum: 1, pageSize: 20 },
  678. },
  679. },
  680. };
  681. const outPath = path.join(__dirname, "seed-dms-mock-result.json");
  682. fs.writeFileSync(outPath, JSON.stringify(result, null, 2), "utf8");
  683. console.log("\nDONE ->", outPath);
  684. })().catch((e) => {
  685. console.error(e);
  686. process.exit(1);
  687. });