App.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package com.mes;
  2. import com.mes.core.StationConfig;
  3. import com.mes.ui.LoginFrame;
  4. import com.mes.ui.MainFrame;
  5. import com.mes.util.LockUtil;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import javax.swing.*;
  9. import java.awt.*;
  10. /**
  11. * 通用MES客户端启动入口
  12. */
  13. public class App {
  14. private static final Logger log = LoggerFactory.getLogger(App.class);
  15. private static MainFrame mainFrame;
  16. public static void main(String[] args) {
  17. try {
  18. if (LockUtil.getInstance().isAppActive()) {
  19. log.warn("已有一个MES客户端实例正在运行,当前实例退出");
  20. return;
  21. }
  22. } catch (Exception e) {
  23. log.error("无法建立客户端单实例锁,程序退出", e);
  24. return;
  25. }
  26. log.info("========================================");
  27. log.info("通用MES客户端启动");
  28. log.info("========================================");
  29. // 加载配置
  30. StationConfig config;
  31. try {
  32. config = StationConfig.getInstance();
  33. // 应用项目配置:将运行时保存的设备IP覆盖到所有设备连接
  34. com.mes.core.ProjectConfigManager projectConfig = com.mes.core.ProjectConfigManager.getInstance();
  35. // 工位号/线体覆盖(单工位场景仅覆盖第一个)
  36. String lineOverride = projectConfig.getLineSnOverride();
  37. if (lineOverride != null && !lineOverride.isEmpty()) {
  38. log.info("应用线体覆盖: {} -> {}", config.getLineSn(), lineOverride);
  39. config.setLineSn(lineOverride);
  40. }
  41. String codeOverride = projectConfig.getStationCodeOverride();
  42. if (codeOverride != null && !codeOverride.isEmpty() && !config.getStations().isEmpty()) {
  43. StationConfig.StationInfo first = config.getStations().get(0);
  44. log.info("应用工位号覆盖: {} -> {}", first.getCode(), codeOverride);
  45. first.setCode(codeOverride);
  46. }
  47. String serverIpOverride = projectConfig.getServerIpOverride();
  48. if (serverIpOverride != null && !serverIpOverride.isEmpty()) {
  49. log.info("应用服务器IP覆盖: {} -> {}", config.getServerIp(), serverIpOverride);
  50. config.setServerIp(serverIpOverride);
  51. }
  52. String runtimeIp = projectConfig.getDeviceIp();
  53. if (runtimeIp != null && !runtimeIp.isEmpty()) {
  54. for (StationConfig.DeviceConnection conn : config.getDeviceConnections()) {
  55. if (!runtimeIp.equals(conn.getIp())) {
  56. log.info("应用项目配置IP覆盖: station_index={}, {} -> {}",
  57. conn.getStationIndex(), conn.getIp(), runtimeIp);
  58. conn.setIp(runtimeIp);
  59. }
  60. }
  61. }
  62. log.info("配置加载成功:");
  63. log.info(" - 模式: {}", config.getMode());
  64. log.info(" - 工位数: {}", config.getStationCount());
  65. for (int i = 0; i < config.getStationCount(); i++) {
  66. StationConfig.StationInfo station = config.getStation(i);
  67. log.info(" - 工位{}: {}", i + 1, station.getCode());
  68. }
  69. log.info(" - 服务器: {}:{}", config.getServerIp(), config.getTcpPort());
  70. log.info(" - 设备: {} ({})", config.isDeviceEnabled() ? "启用" : "禁用", config.getDeviceType());
  71. log.info(" - 当前项目: {} ({})", projectConfig.getCurrentProjectId(),
  72. projectConfig.getCurrentProject() != null ? projectConfig.getCurrentProject().getName() : "?");
  73. // 客户端类型由 ClientType.CODE 硬编码(此处 RIVETING),不再由此处传入
  74. com.mes.util.ClientRuntimeAgent.start(config.getServerIp(), config.getStationCode(0), config.getLineSn(), "com.mes.App");
  75. } catch (Exception e) {
  76. log.error("配置加载失败: {}", e.getMessage(), e);
  77. JOptionPane.showMessageDialog(null,
  78. "配置文件加载失败: " + e.getMessage(),
  79. "错误",
  80. JOptionPane.ERROR_MESSAGE);
  81. return;
  82. }
  83. // 启动UI
  84. EventQueue.invokeLater(() -> {
  85. try {
  86. // 创建主窗口
  87. mainFrame = new MainFrame(config);
  88. mainFrame.setVisible(false);
  89. // 显示登录窗口
  90. LoginFrame loginFrame = new LoginFrame(mainFrame);
  91. loginFrame.setVisible(true);
  92. } catch (Exception e) {
  93. log.error("启动失败: {}", e.getMessage(), e);
  94. JOptionPane.showMessageDialog(null,
  95. "程序启动失败: " + e.getMessage(),
  96. "错误",
  97. JOptionPane.ERROR_MESSAGE);
  98. }
  99. });
  100. }
  101. /**
  102. * 获取主窗口
  103. */
  104. public static MainFrame getMainFrame() {
  105. return mainFrame;
  106. }
  107. }