/** * 人员底数新增「退养资格类型」字段,并从备注回填。 * 字段:c_retire_qualify_type * 取值:WITH_LAND(有土地退养)/ WITHOUT_LAND(无土地有资格) * * 用法:node scripts/migrate-retire-qualify-type.js */ const http = require("http"); const qs = require("querystring"); const HOST = "121.43.55.7"; const PORT = 2101; const MODEL_ID = 1970; const COLUMN_ID = 1847; function post(urlPath, fields, token) { return new Promise((resolve, reject) => { const body = qs.stringify(fields || {}); const headers = { "Content-Type": "application/x-www-form-urlencoded", "Content-Length": Buffer.byteLength(body), }; if (token) { headers.Token = token; headers.token = token; } const req = http.request( { hostname: HOST, port: PORT, path: urlPath, method: "POST", headers }, (res) => { let data = ""; res.on("data", (c) => (data += c)); res.on("end", () => { try { resolve(JSON.parse(data)); } catch (e) { resolve({ raw: data, status: res.statusCode }); } }); } ); req.on("error", reject); req.write(body); req.end(); }); } function text(shortName, alias, must, seq) { return { alias, customType: "", describe: "WITH_LAND/WITHOUT_LAND", frontType: "content", id: 2, must: !!must, name: "c_" + shortName, searchType: "2", sequence: seq || 1, showParam: "name,alias,desc,type,front_type,must,default_value", type: "text", }; } function normalizeFieldList(raw) { let fl = raw; if (typeof fl === "string") fl = JSON.parse(fl); const out = {}; Object.keys(fl || {}).forEach((k) => { let v = fl[k]; if (typeof v === "string") v = JSON.parse(v); out[k] = v; }); return out; } function inferQualify(remarks) { const r = String(remarks || ""); if (/无土地|无承包地|WITHOUT_LAND/.test(r)) return "WITHOUT_LAND"; if (/有土地退养|有土地|资格已核验|WITH_LAND/.test(r)) return "WITH_LAND"; return ""; } (async () => { const login = await post("/proxy_oauth/user/login", { userName: "user_liu", password: "WE176852439@lmx", clientId: "1", }); if (login.code != 200) throw new Error("login fail " + JSON.stringify(login)); const token = login.message; const modelRes = await post("/proxy_dms/model/getModelById", { modelId: String(MODEL_ID) }, token); if (modelRes.code != 200) throw new Error("getModel fail"); const fieldList = normalizeFieldList(modelRes.content.fieldList); const shortName = "retire_qualify_type"; const full = "c_" + shortName; if (!fieldList[full]) { const p = text(shortName, "退养资格类型", false, 55); fieldList[full] = p; const addfieldList = { [shortName]: { alias: p.alias, type: p.type, frontType: p.frontType, must: p.must, name: shortName, describe: p.describe, searchType: p.searchType, sortType: p.sortType, sequence: p.sequence, showParam: p.showParam, customType: "", id: p.id, }, }; const upd = await post( "/proxy_dms/model/updateFieldList", { modelId: String(MODEL_ID), fieldList: JSON.stringify(fieldList), addfieldList: JSON.stringify(addfieldList), delfieldList: JSON.stringify({}), updatefieldList: JSON.stringify({}), }, token ); console.log("add field", upd.code, upd.message || ""); } else { console.log("field exists", full); } let scanned = 0; let filled = 0; let skipped = 0; let defaulted = 0; for (let page = 0; page < 80; page++) { const list = await post( "/proxy_dms/content/selectContentList", { columnId: String(COLUMN_ID), modelId: String(MODEL_ID), page: String(page), pageSize: "100", states: "0", }, token ); const rows = (list.content && list.content.data) || []; for (const row of rows) { scanned++; if (row.c_retire_qualify_type) { skipped++; continue; } let q = inferQualify(row.c_remarks); // 已进入业务库、备注无痕迹的:默认有土地退养(联调/历史补齐) const st = String(row.c_biz_status || ""); if ( !q && (st === "NORMAL" || st === "PAUSED" || st === "STOPPED" || st === "FUNERAL" || st === "ABNORMAL") ) { q = "WITH_LAND"; defaulted++; } if (!q) continue; const tip = q === "WITHOUT_LAND" ? "无承包地,按政策认定具备退养补助资格;资格已核验" : "有土地退养;资格已核验"; const old = String(row.c_remarks || ""); const remarks = old.includes("资格已核验") || old.includes("有土地") || old.includes("无承包地") ? old : old ? old + ";" + tip : tip; const res = await post( "/proxy_dms/content/updateContent", { columnId: String(COLUMN_ID), modelId: String(MODEL_ID), content: JSON.stringify({ id: row.id, c_retire_qualify_type: q, c_remarks: remarks, }), }, token ); if (res.code == 200) filled++; } if (rows.length < 100) break; } console.log( "DONE scanned=" + scanned + " filled=" + filled + " already=" + skipped + " defaultedWithLand=" + defaulted ); })().catch((e) => { console.error(e); process.exit(1); });