package com.mes; import com.mes.core.StationConfig; import com.mes.ui.LoginFrame; import com.mes.ui.MainFrame; import com.mes.util.LockUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import java.awt.*; /** * 通用MES客户端启动入口 */ public class App { private static final Logger log = LoggerFactory.getLogger(App.class); private static MainFrame mainFrame; public static void main(String[] args) { try { if (LockUtil.getInstance().isAppActive()) { log.warn("已有一个MES客户端实例正在运行,当前实例退出"); return; } } catch (Exception e) { log.error("无法建立客户端单实例锁,程序退出", e); return; } log.info("========================================"); log.info("通用MES客户端启动"); log.info("========================================"); // 加载配置 StationConfig config; try { config = StationConfig.getInstance(); // 应用项目配置:将运行时保存的设备IP覆盖到所有设备连接 com.mes.core.ProjectConfigManager projectConfig = com.mes.core.ProjectConfigManager.getInstance(); // 工位号/线体覆盖(单工位场景仅覆盖第一个) String lineOverride = projectConfig.getLineSnOverride(); if (lineOverride != null && !lineOverride.isEmpty()) { log.info("应用线体覆盖: {} -> {}", config.getLineSn(), lineOverride); config.setLineSn(lineOverride); } String codeOverride = projectConfig.getStationCodeOverride(); if (codeOverride != null && !codeOverride.isEmpty() && !config.getStations().isEmpty()) { StationConfig.StationInfo first = config.getStations().get(0); log.info("应用工位号覆盖: {} -> {}", first.getCode(), codeOverride); first.setCode(codeOverride); } String serverIpOverride = projectConfig.getServerIpOverride(); if (serverIpOverride != null && !serverIpOverride.isEmpty()) { log.info("应用服务器IP覆盖: {} -> {}", config.getServerIp(), serverIpOverride); config.setServerIp(serverIpOverride); } String runtimeIp = projectConfig.getDeviceIp(); if (runtimeIp != null && !runtimeIp.isEmpty()) { for (StationConfig.DeviceConnection conn : config.getDeviceConnections()) { if (!runtimeIp.equals(conn.getIp())) { log.info("应用项目配置IP覆盖: station_index={}, {} -> {}", conn.getStationIndex(), conn.getIp(), runtimeIp); conn.setIp(runtimeIp); } } } log.info("配置加载成功:"); log.info(" - 模式: {}", config.getMode()); log.info(" - 工位数: {}", config.getStationCount()); for (int i = 0; i < config.getStationCount(); i++) { StationConfig.StationInfo station = config.getStation(i); log.info(" - 工位{}: {}", i + 1, station.getCode()); } log.info(" - 服务器: {}:{}", config.getServerIp(), config.getTcpPort()); log.info(" - 设备: {} ({})", config.isDeviceEnabled() ? "启用" : "禁用", config.getDeviceType()); log.info(" - 当前项目: {} ({})", projectConfig.getCurrentProjectId(), projectConfig.getCurrentProject() != null ? projectConfig.getCurrentProject().getName() : "?"); // 客户端类型由 ClientType.CODE 硬编码(此处 RIVETING),不再由此处传入 com.mes.util.ClientRuntimeAgent.start(config.getServerIp(), config.getStationCode(0), config.getLineSn(), "com.mes.App"); } catch (Exception e) { log.error("配置加载失败: {}", e.getMessage(), e); JOptionPane.showMessageDialog(null, "配置文件加载失败: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); return; } // 启动UI EventQueue.invokeLater(() -> { try { // 创建主窗口 mainFrame = new MainFrame(config); mainFrame.setVisible(false); // 显示登录窗口 LoginFrame loginFrame = new LoginFrame(mainFrame); loginFrame.setVisible(true); } catch (Exception e) { log.error("启动失败: {}", e.getMessage(), e); JOptionPane.showMessageDialog(null, "程序启动失败: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } }); } /** * 获取主窗口 */ public static MainFrame getMainFrame() { return mainFrame; } }