Files
workspace/code/fms/fms-api/tools/migration/FieldNameSync.java
T
2026-07-30 17:30:13 +08:00

265 lines
11 KiB
Java
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 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 <viewName>
*/
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 <viewName>");
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<long[]> 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<long[]> 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);
}
}
}
}
}