import java.sql.*; /** * 从旧库 G3HY2025.dbo.s_columnLib 同步到新库 fms: * 1. col_Caption → s_module_field.b_name(字段名称) * 2. col_Visible → s_module_field_list.b_visible(列表显示,不存在则插入记录) * 3. col_edit → s_module_field_edit.b_visible(编辑显示,不存在则插入记录) * * 用法: java -cp ".;mssql-jdbc.jar" FieldNameSync */ public class FieldNameSync { static final String URL = "jdbc:sqlserver://118.89.70.199:1433;databaseName=fms;encrypt=true;trustServerCertificate=true"; static final String USER = "sa"; static final String PASSWORD = "zhang520.."; // 同步字段名称 static final String SYNC_NAME = """ UPDATE sf SET sf.b_name = LTRIM(RTRIM(sc.col_Caption)) FROM dbo.s_module_field sf JOIN dbo.s_module m ON m.b_id = sf.b_module_id JOIN G3HY2025.dbo.s_columnLib sc ON sc.col_TableName COLLATE Chinese_PRC_CI_AS = m.b_viewtable AND sc.col_FieldName COLLATE Chinese_PRC_CI_AS = sf.b_field WHERE m.b_viewtable = ? AND sc.col_Caption IS NOT NULL AND LTRIM(RTRIM(sc.col_Caption)) != '' """; // 同步列表显示:更新已有记录 static final String SYNC_LIST_UPDATE = """ UPDATE sfl SET sfl.b_visible = CASE WHEN sc.col_Visible = '1' THEN 1 ELSE 0 END FROM dbo.s_module_field_list sfl JOIN dbo.s_module_field sf ON sf.b_id = sfl.b_field_id JOIN dbo.s_module m ON m.b_id = sf.b_module_id JOIN G3HY2025.dbo.s_columnLib sc ON sc.col_TableName COLLATE Chinese_PRC_CI_AS = m.b_viewtable AND sc.col_FieldName COLLATE Chinese_PRC_CI_AS = sf.b_field WHERE m.b_viewtable = ? AND sc.col_Visible IS NOT NULL AND LTRIM(RTRIM(sc.col_Visible)) != '' """; // 查询需要插入列表配置的字段 static final String LIST_INSERT_CANDIDATES = """ SELECT sf.b_id AS field_id, m.b_id AS module_id, CASE WHEN sc.col_Visible = '1' THEN 1 ELSE 0 END AS visible FROM dbo.s_module_field sf JOIN dbo.s_module m ON m.b_id = sf.b_module_id JOIN G3HY2025.dbo.s_columnLib sc ON sc.col_TableName COLLATE Chinese_PRC_CI_AS = m.b_viewtable AND sc.col_FieldName COLLATE Chinese_PRC_CI_AS = sf.b_field WHERE m.b_viewtable = ? AND sc.col_Visible IS NOT NULL AND LTRIM(RTRIM(sc.col_Visible)) != '' AND NOT EXISTS ( SELECT 1 FROM dbo.s_module_field_list sfl WHERE sfl.b_field_id = sf.b_id ) """; static final String INSERT_LIST = """ INSERT INTO dbo.s_module_field_list (b_id, b_module_id, b_field_id, b_visible, b_xh) VALUES (?, ?, ?, ?, 0) """; // 同步编辑显示:更新已有记录 static final String SYNC_EDIT_UPDATE = """ UPDATE sfe SET sfe.b_visible = CASE WHEN sc.col_edit = '1' THEN 1 ELSE 0 END FROM dbo.s_module_field_edit sfe JOIN dbo.s_module_field sf ON sf.b_id = sfe.b_field_id JOIN dbo.s_module m ON m.b_id = sf.b_module_id JOIN G3HY2025.dbo.s_columnLib sc ON sc.col_TableName COLLATE Chinese_PRC_CI_AS = m.b_viewtable AND sc.col_FieldName COLLATE Chinese_PRC_CI_AS = sf.b_field WHERE m.b_viewtable = ? AND sc.col_edit IS NOT NULL AND LTRIM(RTRIM(sc.col_edit)) != '' """; static final String EDIT_INSERT_CANDIDATES = """ SELECT sf.b_id AS field_id, m.b_id AS module_id, CASE WHEN sc.col_edit = '1' THEN 1 ELSE 0 END AS visible FROM dbo.s_module_field sf JOIN dbo.s_module m ON m.b_id = sf.b_module_id JOIN G3HY2025.dbo.s_columnLib sc ON sc.col_TableName COLLATE Chinese_PRC_CI_AS = m.b_viewtable AND sc.col_FieldName COLLATE Chinese_PRC_CI_AS = sf.b_field WHERE m.b_viewtable = ? AND sc.col_edit IS NOT NULL AND LTRIM(RTRIM(sc.col_edit)) != '' AND NOT EXISTS ( SELECT 1 FROM dbo.s_module_field_edit sfe WHERE sfe.b_field_id = sf.b_id ) """; static final String INSERT_EDIT = """ INSERT INTO dbo.s_module_field_edit (b_id, b_module_id, b_field_id, b_visible, b_required, b_readonly, b_disabled, b_xh) VALUES (?, ?, ?, ?, 0, 0, 0, 0) """; // 查询模块 ID static final String QUERY_MODULE_ID = "SELECT b_id FROM dbo.s_module WHERE b_viewtable = ?"; // 查询列表/编辑配置现状 static final String QUERY_CONFIG = """ SELECT sf.b_field, sf.b_name, sfl.b_visible AS list_visible, sfe.b_visible AS edit_visible FROM dbo.s_module_field sf JOIN dbo.s_module m ON m.b_id = sf.b_module_id LEFT JOIN dbo.s_module_field_list sfl ON sfl.b_field_id = sf.b_id LEFT JOIN dbo.s_module_field_edit sfe ON sfe.b_field_id = sf.b_id WHERE m.b_viewtable = ? ORDER BY sf.b_field """; static long nextListId; static long nextEditId; public static void main(String[] args) throws Exception { if (args.length == 0) { System.err.println("用法: java FieldNameSync "); System.exit(1); } String viewName = args[0].trim(); if (!viewName.matches("^[A-Za-z_][A-Za-z0-9_]{0,127}$")) { System.err.println("非法视图名: " + viewName); System.exit(1); } System.out.println("连接到 fms 数据库..."); try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD)) { conn.setAutoCommit(false); // 查询模块是否存在 Long moduleId = null; try (PreparedStatement ps = conn.prepareStatement(QUERY_MODULE_ID)) { ps.setString(1, viewName); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) moduleId = rs.getLong(1); } } if (moduleId == null) { System.err.println("模块 " + viewName + " 不存在!"); System.exit(1); } // 初始化 ID 生成器 try (Statement st = conn.createStatement()) { try (ResultSet rs = st.executeQuery("SELECT ISNULL(MAX(b_id),0) FROM dbo.s_module_field_list")) { rs.next(); nextListId = rs.getLong(1) + 1; } try (ResultSet rs = st.executeQuery("SELECT ISNULL(MAX(b_id),0) FROM dbo.s_module_field_edit")) { rs.next(); nextEditId = rs.getLong(1) + 1; } } // === 1. 同步前 === System.out.println("\n=== 同步前 ==="); printConfig(conn, viewName); // === 2. 字段名称 === System.out.println("\n=== 1) 字段名称 (col_Caption → b_name) ==="); try (PreparedStatement ps = conn.prepareStatement(SYNC_NAME)) { ps.setString(1, viewName); System.out.println(" 更新: " + ps.executeUpdate() + " 条"); } // === 3. 列表显示 === System.out.println("\n=== 2) 列表显示 (col_Visible → s_module_field_list.b_visible) ==="); try (PreparedStatement ps = conn.prepareStatement(SYNC_LIST_UPDATE)) { ps.setString(1, viewName); System.out.println(" 更新已有: " + ps.executeUpdate() + " 条"); } java.util.ArrayList listCandidates = new java.util.ArrayList<>(); try (PreparedStatement ps = conn.prepareStatement(LIST_INSERT_CANDIDATES)) { ps.setString(1, viewName); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { listCandidates.add(new long[]{rs.getLong("field_id"), rs.getLong("module_id"), rs.getLong("visible")}); } } } try (PreparedStatement ps = conn.prepareStatement(INSERT_LIST)) { for (long[] row : listCandidates) { ps.setLong(1, nextListId++); ps.setLong(2, row[1]); ps.setLong(3, row[0]); ps.setInt(4, (int) row[2]); ps.addBatch(); } if (!listCandidates.isEmpty()) { ps.executeBatch(); } } System.out.println(" 新增: " + listCandidates.size() + " 条"); // === 4. 编辑显示 === System.out.println("\n=== 3) 编辑显示 (col_edit → s_module_field_edit.b_visible) ==="); try (PreparedStatement ps = conn.prepareStatement(SYNC_EDIT_UPDATE)) { ps.setString(1, viewName); System.out.println(" 更新已有: " + ps.executeUpdate() + " 条"); } java.util.ArrayList editCandidates = new java.util.ArrayList<>(); try (PreparedStatement ps = conn.prepareStatement(EDIT_INSERT_CANDIDATES)) { ps.setString(1, viewName); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { editCandidates.add(new long[]{rs.getLong("field_id"), rs.getLong("module_id"), rs.getLong("visible")}); } } } try (PreparedStatement ps = conn.prepareStatement(INSERT_EDIT)) { for (long[] row : editCandidates) { ps.setLong(1, nextEditId++); ps.setLong(2, row[1]); ps.setLong(3, row[0]); ps.setInt(4, (int) row[2]); ps.addBatch(); } if (!editCandidates.isEmpty()) { ps.executeBatch(); } } System.out.println(" 新增: " + editCandidates.size() + " 条"); conn.commit(); System.out.println("\n=== 事务已提交 ==="); // === 5. 验证 === System.out.println("\n=== 同步后 ==="); printConfig(conn, viewName); } System.out.println("\n完成."); } static void printConfig(Connection conn, String viewName) throws SQLException { System.out.printf(" %-30s %-16s %-8s %-8s%n", "b_field", "b_name", "list", "edit"); System.out.println(" " + "-".repeat(66)); try (PreparedStatement ps = conn.prepareStatement(QUERY_CONFIG)) { ps.setString(1, viewName); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { String listVis = rs.getString("list_visible"); String editVis = rs.getString("edit_visible"); String listStr = listVis == null ? "--" : ("1".equals(listVis) ? "显示" : "隐藏"); String editStr = editVis == null ? "--" : ("1".equals(editVis) ? "显示" : "隐藏"); String name = rs.getString("b_name"); System.out.printf(" %-30s %-16s %-8s %-8s%n", rs.getString("b_field"), name != null ? name : "(null)", listStr, editStr); } } } } }