migrate-retire-qualify-type.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /**
  2. * 人员底数新增「退养资格类型」字段,并从备注回填。
  3. * 字段:c_retire_qualify_type
  4. * 取值:WITH_LAND(有土地退养)/ WITHOUT_LAND(无土地有资格)
  5. *
  6. * 用法:node scripts/migrate-retire-qualify-type.js
  7. */
  8. const http = require("http");
  9. const qs = require("querystring");
  10. const HOST = "121.43.55.7";
  11. const PORT = 2101;
  12. const MODEL_ID = 1970;
  13. const COLUMN_ID = 1847;
  14. function post(urlPath, fields, token) {
  15. return new Promise((resolve, reject) => {
  16. const body = qs.stringify(fields || {});
  17. const headers = {
  18. "Content-Type": "application/x-www-form-urlencoded",
  19. "Content-Length": Buffer.byteLength(body),
  20. };
  21. if (token) {
  22. headers.Token = token;
  23. headers.token = token;
  24. }
  25. const req = http.request(
  26. { hostname: HOST, port: PORT, path: urlPath, method: "POST", headers },
  27. (res) => {
  28. let data = "";
  29. res.on("data", (c) => (data += c));
  30. res.on("end", () => {
  31. try {
  32. resolve(JSON.parse(data));
  33. } catch (e) {
  34. resolve({ raw: data, status: res.statusCode });
  35. }
  36. });
  37. }
  38. );
  39. req.on("error", reject);
  40. req.write(body);
  41. req.end();
  42. });
  43. }
  44. function text(shortName, alias, must, seq) {
  45. return {
  46. alias,
  47. customType: "",
  48. describe: "WITH_LAND/WITHOUT_LAND",
  49. frontType: "content",
  50. id: 2,
  51. must: !!must,
  52. name: "c_" + shortName,
  53. searchType: "2",
  54. sequence: seq || 1,
  55. showParam: "name,alias,desc,type,front_type,must,default_value",
  56. type: "text",
  57. };
  58. }
  59. function normalizeFieldList(raw) {
  60. let fl = raw;
  61. if (typeof fl === "string") fl = JSON.parse(fl);
  62. const out = {};
  63. Object.keys(fl || {}).forEach((k) => {
  64. let v = fl[k];
  65. if (typeof v === "string") v = JSON.parse(v);
  66. out[k] = v;
  67. });
  68. return out;
  69. }
  70. function inferQualify(remarks) {
  71. const r = String(remarks || "");
  72. if (/无土地|无承包地|WITHOUT_LAND/.test(r)) return "WITHOUT_LAND";
  73. if (/有土地退养|有土地|资格已核验|WITH_LAND/.test(r)) return "WITH_LAND";
  74. return "";
  75. }
  76. (async () => {
  77. const login = await post("/proxy_oauth/user/login", {
  78. userName: "user_liu",
  79. password: "WE176852439@lmx",
  80. clientId: "1",
  81. });
  82. if (login.code != 200) throw new Error("login fail " + JSON.stringify(login));
  83. const token = login.message;
  84. const modelRes = await post("/proxy_dms/model/getModelById", { modelId: String(MODEL_ID) }, token);
  85. if (modelRes.code != 200) throw new Error("getModel fail");
  86. const fieldList = normalizeFieldList(modelRes.content.fieldList);
  87. const shortName = "retire_qualify_type";
  88. const full = "c_" + shortName;
  89. if (!fieldList[full]) {
  90. const p = text(shortName, "退养资格类型", false, 55);
  91. fieldList[full] = p;
  92. const addfieldList = {
  93. [shortName]: {
  94. alias: p.alias,
  95. type: p.type,
  96. frontType: p.frontType,
  97. must: p.must,
  98. name: shortName,
  99. describe: p.describe,
  100. searchType: p.searchType,
  101. sortType: p.sortType,
  102. sequence: p.sequence,
  103. showParam: p.showParam,
  104. customType: "",
  105. id: p.id,
  106. },
  107. };
  108. const upd = await post(
  109. "/proxy_dms/model/updateFieldList",
  110. {
  111. modelId: String(MODEL_ID),
  112. fieldList: JSON.stringify(fieldList),
  113. addfieldList: JSON.stringify(addfieldList),
  114. delfieldList: JSON.stringify({}),
  115. updatefieldList: JSON.stringify({}),
  116. },
  117. token
  118. );
  119. console.log("add field", upd.code, upd.message || "");
  120. } else {
  121. console.log("field exists", full);
  122. }
  123. let scanned = 0;
  124. let filled = 0;
  125. let skipped = 0;
  126. let defaulted = 0;
  127. for (let page = 0; page < 80; page++) {
  128. const list = await post(
  129. "/proxy_dms/content/selectContentList",
  130. {
  131. columnId: String(COLUMN_ID),
  132. modelId: String(MODEL_ID),
  133. page: String(page),
  134. pageSize: "100",
  135. states: "0",
  136. },
  137. token
  138. );
  139. const rows = (list.content && list.content.data) || [];
  140. for (const row of rows) {
  141. scanned++;
  142. if (row.c_retire_qualify_type) {
  143. skipped++;
  144. continue;
  145. }
  146. let q = inferQualify(row.c_remarks);
  147. // 已进入业务库、备注无痕迹的:默认有土地退养(联调/历史补齐)
  148. const st = String(row.c_biz_status || "");
  149. if (
  150. !q &&
  151. (st === "NORMAL" ||
  152. st === "PAUSED" ||
  153. st === "STOPPED" ||
  154. st === "FUNERAL" ||
  155. st === "ABNORMAL")
  156. ) {
  157. q = "WITH_LAND";
  158. defaulted++;
  159. }
  160. if (!q) continue;
  161. const tip =
  162. q === "WITHOUT_LAND"
  163. ? "无承包地,按政策认定具备退养补助资格;资格已核验"
  164. : "有土地退养;资格已核验";
  165. const old = String(row.c_remarks || "");
  166. const remarks =
  167. old.includes("资格已核验") || old.includes("有土地") || old.includes("无承包地")
  168. ? old
  169. : old
  170. ? old + ";" + tip
  171. : tip;
  172. const res = await post(
  173. "/proxy_dms/content/updateContent",
  174. {
  175. columnId: String(COLUMN_ID),
  176. modelId: String(MODEL_ID),
  177. content: JSON.stringify({
  178. id: row.id,
  179. c_retire_qualify_type: q,
  180. c_remarks: remarks,
  181. }),
  182. },
  183. token
  184. );
  185. if (res.code == 200) filled++;
  186. }
  187. if (rows.length < 100) break;
  188. }
  189. console.log(
  190. "DONE scanned=" +
  191. scanned +
  192. " filled=" +
  193. filled +
  194. " already=" +
  195. skipped +
  196. " defaultedWithLand=" +
  197. defaulted
  198. );
  199. })().catch((e) => {
  200. console.error(e);
  201. process.exit(1);
  202. });