evoToK3Cloud/script/sql/update/gen-ding-scheme-wide.mjs
2026-05-18 10:56:56 +08:00

262 lines
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const IDS = [
"TextField_1BBYI1OFDJA80",
"TextField_FRLYG3CQ3CG0",
"InnerContactField_9DSIOI7Y7AO0",
"DDDateField_1BHYQ7T5N5TS0",
"DDDateField_YYD1HAMKFXS0",
"DDSelectField_1VS1BX17O9MO0",
"InnerContactField_U886PC45AO00",
"TextField_1HXMC0VO5TCW0",
"TextField_QBMQQBNCTA80",
"DDSelectField_845RKMRCBNC",
"DDSelectField_1XTHOHPHULNK0",
"TextField_1EIAVY538AM80",
"ColumnLayout_N0ZDGQT4UJ40",
"TextareaField_GO981AG879K0",
"InnerContactField_1TXM18E414740",
"InnerContactField_SHOIEPZ1X8W0",
"DDDateField_1107GY4FF5R40",
"TextareaField_1JNZ7QFU4GLC0",
"ColumnLayout_5UK9OEEPNQG0",
"TextNote_14QFWOA0NXUK",
"TextField_7KHHS2KML4G0",
"TextField_17ONU2GWWQQK0",
"TextField_1D66PIGUHPEO0",
"TextField_2E68TAT1P2B",
"TextField_1FVHYJIFC9340",
"DDSelectField_12J1O9KUMFK00",
"DDSelectField_1CTHXMP1W6000",
"DDSelectField_1QQEC44I00G00",
"TextField_1X4ISVYJ2E000",
"TextareaField_9MIMABZEHW40",
"TextField_1N728V92Z1LS0",
"DDSelectField_4JP6PT1HB480",
"TextareaField_1WLKQPZU8UF40",
"TextareaField_ZCRQZCLP3800",
"ColumnLayout_704TMWHBUK00",
"DDAttachment_XJYUB17OFGW0",
"TextNote_1S3AH8USXUU80",
"TextNote_1S2UFGJ55CDC0",
"TextField_1JWDW5KVN95S0",
"TextField_1CTQW75A6XK00",
"TextField_23GWUBGROXWG0",
"TextField_SIM35ICCGOW0",
"TextField_18UFLIYK2G0W",
"TextField_EEO52079YWG0",
"TextField_17J58EEU17DS0",
"TextField_F05H5U3N9NC0",
"TextField_J84FK4ALUOG0",
"TextField_3IXTW5EOSTK0",
"ColumnLayout_OWD8CAEIPCW0",
"DDAttachment_ZVUJAK8ZRVK0",
"TextNote_196NEZF2GKQO0",
"TextareaField_1BXA83S0L9Q80",
"DDSelectField_1J17P5TOEU0W0",
"TextField_1ED24R0QOG4G0",
"TextField_62OWJDX5J780",
"TextField_W509DMUVT0W0",
"TextField_IR0XM2QFI4G0",
"TextField_MWLXHEAJYDS0",
"TextField_GZISO77XGU80",
"DDSelectField_1XGOO6QI7YE80",
"TextareaField_15N86B1OM9R40",
"ColumnLayout_13OIS5R5G4G00",
"DDAttachment_Y0KM7E71JY80",
"TextNote_65FUYS6PMOG0",
"TextField_1WOIAN7UXMXS0",
"TextField_1B349K9H85FK0",
"TextField_V3UBXSM0V400",
"TextField_1N6AOCMUFXXC0",
"TextField_5B1TRAUGUP80",
"DDSelectField_R805UL353UO0",
"TextField_210LMWSH8CCG0",
"TextareaField_6JU2QSEND4G0",
"ColumnLayout_1OBP4JCUUC1S0",
"DDAttachment_1OQ414MMSQE80",
"TextNote_7USWEJCWOHO0",
"TextField_10A0OELOA9CW0",
"TextField_1F35DOLS3GJK0",
"TextField_G2N28LNPOKO0",
"DDSelectField_Y8AKWL5T20G0",
"TextField_1X0CJO3BBELC0",
"TextField_1DCKMEARM96O0",
"TextareaField_8ZYS78VXXKG0",
"DDSelectField_1UNDZ9DNXIN4",
"TextareaField_902TJ8AC3BO0",
"ColumnLayout_1V6324DSHDMO0",
"DDAttachment_19GLQ5UABT9C0",
"TextNote_1JGD3A0EBOU80",
"DDSelectField_JDD37MSAU7K0",
"TextField_1ODO49P4QIOW0",
"TextField_15YXLN28VYWW0",
"TextField_N3EEZETOMLS0",
"TextField_MZLNE0WXSYO0",
"DDSelectField_1D1NY47OPRY80",
"TextField_CO3RY4XTL800",
"TextField_1LJRN85YYW680",
"TextareaField_1W3YXGM2WVWG0",
"ColumnLayout_FVVK6OHVSMO0",
"DDAttachment_NISKKTWA4LC0",
"TextNote_18NMSNM15JLS0",
"TextField_YON75A1BPDS0",
"TextField_1LA4D1ZNJCO00",
"TextField_QZAR20YC9DC0",
"TextField_W5VDI6TJE0W0",
"DDSelectField_JQFNCPP9Q8G0",
"TextField_X7WT90RW88W0",
"TextareaField_XVWU129IDG00",
"TextField_21CFZH9VCESG0",
"TextareaField_20MIUBGWHAYO0",
"ColumnLayout_7E01AAY4TUO0",
"DDAttachment_PVHB9480IPS0",
"TextareaField_I623WTCGKBK0",
"DDDateField_1QY4LG6SI9FK0",
"DDSelectField_W8ZTK2TQHHS0",
];
const createSql = `\
-- 钉钉「技术方案申请表」审批通过后落库(业务 MySQL 执行一次)
-- 宽表字段改为单列 wf_values_json避免 InnoDB 行大小 >8126key=控件 idvalue={ "value","ext" }
-- 与 form_label_mapid->中文名)键一致,均为钉钉 componentId
CREATE TABLE IF NOT EXISTS ding_scheme_application
(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
process_instance_id VARCHAR(64) NOT NULL COMMENT '钉钉审批实例 ID',
business_id VARCHAR(64) DEFAULT NULL COMMENT '钉钉 businessId',
process_code VARCHAR(128) DEFAULT NULL COMMENT '审批模板 processCode',
title VARCHAR(512) DEFAULT NULL COMMENT '审批标题',
instance_result VARCHAR(32) DEFAULT NULL COMMENT '实例审批结果 agree/refuse 等',
ding_process_status VARCHAR(32) DEFAULT NULL COMMENT '钉钉实例状态 COMPLETED 等',
originator_user_id VARCHAR(64) DEFAULT NULL COMMENT '发起人 userId',
originator_dept_name VARCHAR(256) DEFAULT NULL COMMENT '发起人部门',
ding_instance_create_time DATETIME DEFAULT NULL COMMENT '钉钉实例创建时间',
ding_instance_finish_time DATETIME DEFAULT NULL COMMENT '钉钉实例结束时间',
trigger_event_type VARCHAR(64) DEFAULT NULL COMMENT '触发入库的事件类型',
form_json MEDIUMTEXT COMMENT '表单控件快照 JSON完整备份',
form_label_map MEDIUMTEXT COMMENT '控件 id -> 中文 nameJSON',
wf_values_json LONGTEXT COMMENT '控件 id -> {value,ext}JSON与 gen-ding-scheme-wide IDS 顺序写入)',
scheme_apply_no VARCHAR(128) DEFAULT NULL COMMENT '方案申请编号(冗余)',
overview_name VARCHAR(1000) DEFAULT NULL COMMENT '概述名称(冗余)',
filler_name VARCHAR(128) DEFAULT NULL COMMENT '填表人展示名(冗余)',
fill_date DATE DEFAULT NULL COMMENT '填表日期(冗余)',
need_date DATE DEFAULT NULL COMMENT '需求日期(冗余)',
customer_full_name VARCHAR(512) DEFAULT NULL COMMENT '客户全称(冗余)',
contact_and_phone VARCHAR(512) DEFAULT NULL COMMENT '联系人及电话(冗余)',
project_category VARCHAR(128) DEFAULT NULL COMMENT '项目分类(冗余)',
product_name VARCHAR(256) DEFAULT NULL COMMENT '产品名称(冗余)',
task_detail VARCHAR(2000) DEFAULT NULL COMMENT '任务详情(冗余)',
scheme_submit_date DATE DEFAULT NULL COMMENT '方案提交日期(冗余)',
scheme_received VARCHAR(32) DEFAULT NULL COMMENT '是否收到方案(冗余)',
plm_push_status VARCHAR(32) DEFAULT 'PENDING' COMMENT 'PLM 推送状态 PENDING/SUCCESS/FAIL 等',
plm_push_time DATETIME DEFAULT NULL COMMENT 'PLM 推送时间',
plm_push_message VARCHAR(1000) DEFAULT NULL COMMENT 'PLM 推送结果说明',
create_by VARCHAR(64) DEFAULT '',
create_time DATETIME DEFAULT NULL,
update_by VARCHAR(64) DEFAULT '',
update_time DATETIME DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_process_instance (process_instance_id),
KEY idx_scheme_apply_no (scheme_apply_no),
KEY idx_business_id (business_id),
KEY idx_plm_push_status (plm_push_status)
) ENGINE = InnoDB
ROW_FORMAT = DYNAMIC
DEFAULT CHARSET = utf8mb4 COMMENT ='钉钉技术方案申请表审批归档';
`;
const alterAddWfJson = `\
-- 已有旧表(含大量 wf_* 列导致 1118先加 JSON 列、升级应用后再按需删除旧 wf_* 列
-- 若 wf_values_json 已存在则跳过本段
ALTER TABLE ding_scheme_application
ADD COLUMN wf_values_json LONGTEXT NULL COMMENT '控件 id -> {value,ext} JSON' AFTER form_label_map;
`;
const drops = [];
for (const cid of IDS) {
const c = "wf_" + cid.toLowerCase();
drops.push(`ALTER TABLE ding_scheme_application DROP COLUMN \`${c}\`;`);
drops.push(`ALTER TABLE ding_scheme_application DROP COLUMN \`${c}_ext\`;`);
}
const dropSql =
"-- 仅当表上曾创建过数百个 wf_* 列且已成功添加 wf_values_json、应用已改为写 JSON 后执行。\n" +
"-- 列不存在时会报错,可忽略该条。\n\n" +
drops.join("\n") +
"\n";
fs.writeFileSync(path.join(__dirname, "ding-scheme-application.sql"), createSql, "utf8");
fs.writeFileSync(path.join(__dirname, "ding-scheme-application-alter-wf-values-json.sql"), alterAddWfJson, "utf8");
fs.writeFileSync(path.join(__dirname, "ding-scheme-application-drop-old-wf-columns.sql"), dropSql, "utf8");
// 旧版「逐列 ADD wf_*」已不再使用,保留空说明文件避免误执行
fs.writeFileSync(
path.join(__dirname, "ding-scheme-application-alter-wide.sql"),
"-- 已废弃:数百个 wf_* 列会触发 MySQL [1118] Row size too large。\n" +
"-- 请使用 ding-scheme-application.sql新装或 ding-scheme-application-alter-wf-values-json.sql + wf_values_json。\n",
"utf8"
);
const javaPath = path.join(
__dirname,
"..",
"..",
"..",
"ruoyi-system",
"src",
"main",
"java",
"com",
"ruoyi",
"system",
"constant",
"DingSchemeFormWideColumns.java"
);
const javaBody = `package com.ruoyi.system.constant;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
/**
* 与 event.json formComponentValues(146-843) 及 gen-ding-scheme-wide.mjs 的 IDS 一致。
* 表单宽数据写入 {@code wf_values_json}JSON 的 key 为钉钉控件 id原始大小写与 {@code form_label_map} 的 key 一致。
*/
public final class DingSchemeFormWideColumns {
private DingSchemeFormWideColumns() {
}
public static final List<String> ORDERED_IDS = Collections.unmodifiableList(Arrays.asList(
${IDS.map((id) => ` "${id}"`).join(",\n")}
));
private static final Set<String> ID_SET = new HashSet<>(ORDERED_IDS);
public static boolean isKnownComponentId(String componentId) {
return componentId != null && ID_SET.contains(componentId);
}
/** JSON 中的控件 id key与钉钉一致 */
public static String jsonKey(String componentId) {
return componentId;
}
/** 兼容旧「列名」思路wf_ + id 小写,仅用于文档/SQL 排查,不再建物理列 */
public static String legacyPhysicalColumnName(String componentId) {
return "wf_" + componentId.toLowerCase(Locale.ROOT);
}
}
`;
fs.mkdirSync(path.dirname(javaPath), { recursive: true });
fs.writeFileSync(javaPath, javaBody, "utf8");
console.log("OK", javaPath);