From 96be94fc3c33c49e15b538bebbea455e839a7a7b Mon Sep 17 00:00:00 2001
From: Lius <Lius2225@163.com>
Date: 星期二, 10 六月 2025 16:32:12 +0800
Subject: [PATCH] 数字孪生看板接口 维修service提取到公共模块

---
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java                       |    2 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java                        |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeMapper.java                                    |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml                 |   30 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml                         |   15 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOeeInfoService.java                                  |    3 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamRepairOrderMapper.java                          |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOeeInfoMapper.xml                                  |   13 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRate.java                                            |   20 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOeeMonth.java                                            |   20 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderQuery.java                          |    0 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamReportRepairServiceImpl.java              |    0 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamRepairOrderService.java                       |    0 
 lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java                                       |   25 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml                       |    0 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java         |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java                    |    6 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java                 |    6 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java            |    4 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/ThirdMaintenanceStandardImport.java                   |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcAlarmInfoMapper.xml                                |    9 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java                 |    0 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml         |   63 +
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java                    |   13 
 lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java                                      |   12 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamReportRepairQuery.java                         |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcAlarmInfoServiceImpl.java                        |    4 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java                            |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java                          |    5 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrderDetail.java                |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquStatus.java                                              |   15 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java                            |    6 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java                         |    1 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/WebsocketPushEquStatusJob.java                               |  108 ++
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamInspectionOrderDetail.java                      |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOeeInfoMapper.java                                     |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOperation.java                                           |   16 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceImpl.java                         |    6 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java                  |    0 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java               |    0 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamReportRepairService.java                      |    0 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java                         |    3 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamReportRepairMapper.java                         |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java                                   |   30 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportRepairMapper.xml                      |    0 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentMapper.java                               |   14 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquDowntimeInfo.java                                        |   23 
 lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java                                            |    1 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcAlarmInfoMapper.java                                   |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java         |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java                           |  340 ++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRateMonth.java                                       |   20 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java                        |    0 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java               |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml                                 |   20 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java                 |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeService.java                                 |    4 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml                            |   18 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java                              |   95 ++
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/util/DateUtils.java                                       | 1089 ++++++++++++++++++++++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRunInfo.java                                             |   24 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/WeekMaintenanceStandardImport.java                    |    0 
 /dev/null                                                                                                            |   74 -
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/SecondMaintenanceStandardImport.java                  |    0 
 lxzn-module-mdc/pom.xml                                                                                              |    5 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java |   10 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java                  |   39 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAlarm.java                                               |   21 
 68 files changed, 2,163 insertions(+), 108 deletions(-)

diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
index 2343268..a258837 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
@@ -598,6 +598,11 @@
     String DICT_MDC_STAFF_TEAM = "mdc_staff_team";
 
     /**
+     * 椹卞姩鍙傛暟鍗曚綅瀛楀吀缂栧彿
+     */
+    String DICT_EQUIPMENT_RUN_UNIT = "equipment_run_unit";
+
+    /**
      * 鍔犵彮鏁版嵁 鑷姩璁$畻鏍囪瘑 1(鏄�) 2(鍚�)
      */
     Integer AUTO_FLAG_Y = 1;
@@ -612,8 +617,11 @@
      */
     String CLOSE_TYPE_0 = "0";
     String CLOSE_TYPE_1 = "1";
-
-    String ORG_TYPE = "3";
+    /**
+     * 浜х嚎绫诲瀷 1涓�绾ч儴闂� 2瀛愰儴闂� 3瀛愰儴闂�
+     */
+    String ORG_TYPE_2 = "2";
+    String ORG_TYPE_3 = "3";
 
     Integer SHIFT_TYPE_1 = 1;
     Integer SHIFT_TYPE_2 = 2;
diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java b/lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java
index 55417e1..bfbd96a 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java
@@ -14,6 +14,7 @@
 
 /**
  * websocket 鍓嶇灏唗oken鏀惧埌瀛愬崗璁噷浼犲叆 涓庡悗绔缓绔嬭繛鎺ユ椂闇�瑕佺敤鍒癶ttp鍗忚锛屾澶勭敤浜庢牎楠宼oken鐨勬湁鏁堟��
+ *
  * @Author taoYan
  * @Date 2022/4/21 17:01
  **/
@@ -34,20 +35,22 @@
         if (redisUtil == null) {
             redisUtil = SpringContextUtils.getBean(RedisUtil.class);
         }
-        HttpServletRequest request = (HttpServletRequest)servletRequest;
-        String token = request.getHeader(TOKEN_KEY);
+        HttpServletRequest request = (HttpServletRequest) servletRequest;
+        if (request.getHeader(TOKEN_KEY) != null) {
+            String token = request.getHeader(TOKEN_KEY);
 
-        log.debug("Websocket杩炴帴 Token瀹夊叏鏍¢獙锛孭ath = {}锛宼oken:{}", request.getRequestURI(), token);
+            log.debug("Websocket杩炴帴 Token瀹夊叏鏍¢獙锛孭ath = {}锛宼oken:{}", request.getRequestURI(), token);
 
-        try {
-            TokenUtils.verifyToken(token, commonApi, redisUtil);
-        } catch (Exception exception) {
-            //log.error("Websocket杩炴帴 Token瀹夊叏鏍¢獙澶辫触锛孖P:{}, Token:{}, Path = {}锛屽紓甯革細{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
-            log.debug("Websocket杩炴帴 Token瀹夊叏鏍¢獙澶辫触锛孖P:{}, Token:{}, Path = {}锛屽紓甯革細{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
-            return;
+            try {
+                TokenUtils.verifyToken(token, commonApi, redisUtil);
+            } catch (Exception exception) {
+                //log.error("Websocket杩炴帴 Token瀹夊叏鏍¢獙澶辫触锛孖P:{}, Token:{}, Path = {}锛屽紓甯革細{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
+                log.debug("Websocket杩炴帴 Token瀹夊叏鏍¢獙澶辫触锛孖P:{}, Token:{}, Path = {}锛屽紓甯革細{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
+                return;
+            }
+            HttpServletResponse response = (HttpServletResponse) servletResponse;
+            response.setHeader(TOKEN_KEY, token);
         }
-        HttpServletResponse response = (HttpServletResponse)servletResponse;
-        response.setHeader(TOKEN_KEY, token);
         filterChain.doFilter(servletRequest, servletResponse);
     }
 
diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
index 982587e..93a33b0 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@@ -99,6 +99,7 @@
         filterChainDefinitionMap.put("/sys/getQrcodeToken/**", "anon"); //鐩戝惉鎵爜
         filterChainDefinitionMap.put("/sys/checkAuth", "anon"); //鎺堟潈鎺ュ彛鎺掗櫎
         filterChainDefinitionMap.put("/msi/**", "anon"); //闆嗘垚鎺ュ彛
+        filterChainDefinitionMap.put("/board/dtBoard/**", "anon"); //鏁板瓧瀛敓鐪嬫澘鎺ュ彛鎺掗櫎
 
         filterChainDefinitionMap.put("/", "anon");
         filterChainDefinitionMap.put("/doc.html", "anon");
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/SecondMaintenanceStandardImport.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/SecondMaintenanceStandardImport.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/SecondMaintenanceStandardImport.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/SecondMaintenanceStandardImport.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/ThirdMaintenanceStandardImport.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/ThirdMaintenanceStandardImport.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/ThirdMaintenanceStandardImport.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/ThirdMaintenanceStandardImport.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/WeekMaintenanceStandardImport.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/WeekMaintenanceStandardImport.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/WeekMaintenanceStandardImport.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/WeekMaintenanceStandardImport.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamInspectionOrderDetail.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamInspectionOrderDetail.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamInspectionOrderDetail.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamInspectionOrderDetail.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrderDetail.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrderDetail.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrderDetail.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrderDetail.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamRepairOrderMapper.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamRepairOrderMapper.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamRepairOrderMapper.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamRepairOrderMapper.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamReportRepairMapper.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamReportRepairMapper.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamReportRepairMapper.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamReportRepairMapper.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportRepairMapper.xml b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportRepairMapper.xml
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportRepairMapper.xml
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportRepairMapper.xml
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderQuery.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderQuery.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderQuery.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderQuery.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java
similarity index 94%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java
index d3616d8..922934e 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java
@@ -5,9 +5,7 @@
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.jeecg.common.api.vo.FileUploadResult;
-import org.jeecg.common.aspect.annotation.Dict;
 import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
-import org.jeecgframework.poi.excel.annotation.Excel;
 
 import java.io.Serializable;
 import java.util.List;
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java
similarity index 95%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java
index 15b0dd3..2bf13c2 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java
@@ -8,9 +8,7 @@
 import lombok.experimental.Accessors;
 import org.jeecg.common.aspect.annotation.Dict;
 import org.jeecg.modules.eam.entity.EamRepairOrder;
-import org.jeecg.modules.eam.entity.EamReportRepair;
 import org.jeecgframework.poi.excel.annotation.Excel;
-import org.springframework.beans.BeanUtils;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamReportRepairQuery.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamReportRepairQuery.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamReportRepairQuery.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamReportRepairQuery.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamRepairOrderService.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamRepairOrderService.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamRepairOrderService.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamRepairOrderService.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamReportRepairService.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamReportRepairService.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamReportRepairService.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamReportRepairService.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamReportRepairServiceImpl.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamReportRepairServiceImpl.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamReportRepairServiceImpl.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamReportRepairServiceImpl.java
diff --git a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/util/DateUtils.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/util/DateUtils.java
new file mode 100644
index 0000000..fd0d32f
--- /dev/null
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/util/DateUtils.java
@@ -0,0 +1,1089 @@
+package org.jeecg.modules.eam.util;
+
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.ChronoField;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class DateUtils {
+
+    private final static long DAYTIMESUNSET = 86400;
+
+    /**
+     * @return 寰楀埌鏄庡ぉ
+     */
+    public static Date getNextDay(Date d1) {
+        long d2 = d1.getTime() + 86400 * 1000;
+        return new Date(d2);
+    }
+
+    /**
+     * @return 寰楀埌鏄ㄥぉ
+     */
+    public static Date getPreviousDay(Date d1) {
+        long d2 = d1.getTime() - 86400 * 1000;
+        return new Date(d2);
+    }
+
+    /**
+     * @return 杩斿洖鏃堕棿宸殑璇█鎻忚堪  濡�1澶�2灏忔椂5鍒�6绉�
+     */
+    public static String different(Date d1, Date d2) {
+        if (d1 == null || d2 == null) {
+            return "";
+        }
+        StringBuilder strB = new StringBuilder();
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            //姣ms
+            long diff = d2.getTime() - d1.getTime();
+            long diffSeconds = diff / 1000 % 60;
+            long diffMinutes = diff / (60 * 1000) % 60;
+            long diffHours = diff / (60 * 60 * 1000) % 24;
+            long diffDays = diff / (24 * 60 * 60 * 1000);
+            if (diffDays > 0) {
+                strB.append(diffDays + " 澶� ");
+                strB.append(diffHours + " 灏忔椂 ");
+                strB.append(diffMinutes + " 鍒嗛挓 ");
+                strB.append(diffSeconds + " 绉� ");
+            } else if (diffHours > 0) {
+                strB.append(diffHours + " 灏忔椂 ");
+                strB.append(diffMinutes + " 鍒嗛挓 ");
+                strB.append(diffSeconds + " 绉� ");
+            } else if (diffMinutes > 0) {
+                strB.append(diffMinutes + " 鍒嗛挓 ");
+                strB.append(diffSeconds + " 绉� ");
+            } else {
+                strB.append(diffSeconds + " 绉� ");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return strB.toString();
+    }
+
+    /**
+     * @return 鑾峰彇涓や釜date鐨勬椂闂村樊锛岀粨鏋滀负绉� 闄�
+     */
+    public static long differentSecond(Date startDate, Date endDate) {
+        return new BigDecimal(endDate.getTime() - startDate.getTime()).divide(new BigDecimal("1000"), 0, BigDecimal.ROUND_HALF_UP).longValue();
+//        return (endDate.getTime() - startDate.getTime()) / 1000;
+    }
+
+    /**
+     * @return 鑾峰彇涓や釜date鐨勬椂闂村樊锛岀粨鏋滀负鍒嗛挓
+     */
+    public static Integer differentMinutes(Date startDate, Date endDate) {
+        return new BigDecimal(endDate.getTime() - startDate.getTime()).divide(new BigDecimal("60000"), 0, RoundingMode.HALF_UP).intValue();
+    }
+
+    /**
+     * @return 杩斿洖浼犲叆鏃堕棿鐨�0鐐�0鍒�0绉�
+     */
+    public static Date getTodayZero(Date d) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(d);
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        return cal.getTime();
+    }
+
+    /**
+     * @return 杩斿洖浼犲叆鏃堕棿鐨�0鐐�0鍒�0绉�
+     */
+    public static Date getTomorrowZero(Date d) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(d);
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.add(Calendar.DAY_OF_MONTH, 1);
+        return cal.getTime();
+    }
+
+    /**
+     * @return 鍒ゆ柇鏃堕棿鏄惁鏄綋澶�
+     */
+    public static boolean isTaday(Date date) {
+        Date now = new Date();
+        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
+        String nowDay = sf.format(now);
+        String day = sf.format(date);
+        return day.equals(nowDay);
+    }
+
+    /**
+     * @return 鍒ゆ柇涓や釜鏃堕棿鏄惁涓哄悓涓�澶�
+     */
+    public static boolean isOneDay(Date d1, Date d2) {
+        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
+        String d1Str = sf.format(d1);
+        String d2Str = sf.format(d2);
+        return d1Str.equals(d2Str);
+    }
+
+    /**
+     * @return 鍒ゆ柇涓や釜鏃堕棿鏄惁涓哄悓涓�骞�
+     */
+    public static boolean isOneYear(Date d1, Date d2) {
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy");
+        String d1Str = sf.format(d1);
+        String d2Str = sf.format(d2);
+        return d1Str.equals(d2Str);
+    }
+
+    public static String dateProportion(Date start, Date end) {
+        float differentSecond = DateUtils.differentSecond(start, end);
+        float f = differentSecond / DAYTIMESUNSET * 100;
+        return String.format("%.2f", f) + "%";
+    }
+
+    public static Date strToDate(String dateStr, String format) {
+        SimpleDateFormat sf = new SimpleDateFormat(format);
+        Date result = null;
+        try {
+            result = sf.parse(dateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    public static final String STR_DATE = "yyyy-MM-dd";
+    public static final String STRDATE = "yyyyMMdd";
+    public static final String STR_YEAR_MONTH = "yyyy-MM";
+    public static final String STRYEARMONTH = "yyyyMM";
+    public static final String STR_DATE_TIME = "yyyy-MM-dd HH:mm:ss.SSS";
+    public static final String STR_DATE_TIME_SMALL = "yyyy-MM-dd HH:mm:ss";
+    public static final String STR_DATE_TIME_MIN = "yyyy-MM-dd HH:mm";
+    public static final String STR_DATE_TIME_HOUR = "yyyy-MM-dd HH";
+    public static final String STR_DATE_TIME_FULL = "yyyyMMddHHmmssSSS";
+    public static final String STR_HHMMSS = "HH:mm:ss";
+    public static final String STR_HHMM = "HH:mm";
+    public static final String STR_MMDD = "MM-dd";
+
+    /**
+     * <p>
+     * Description: 瀹為檯鎶曟爣鏈堜唤
+     * </p>
+     *
+     * @param startDate
+     * @param endDate
+     * @return obj [0] 瀹為檯鎶曟爣鏈堜唤 渚嬪瀹為檯鎶曟爣鏈堜唤锛�3.86锛夋剰涔夋槸3涓湀鍙�26澶� obj[1] 瀹為檯鍙栨暣鏈堜唤 锛�3锛�
+     */
+    public static Integer getRealMonth(Date startDate, Date endDate) {
+        Integer month = 0;
+        Calendar start = Calendar.getInstance();
+        start.setTime(startDate);
+
+        Calendar end = Calendar.getInstance();
+        end.setTime(endDate);
+        int year = start.get(Calendar.YEAR);
+        int year2 = end.get(Calendar.YEAR);
+        int month2 = start.get(Calendar.MONTH);
+        int month3 = end.get(Calendar.MONTH);
+        try {
+            while (start.before(end)) {
+                start.add(Calendar.MONTH, 1);
+                month++;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        int day2 = start.get(Calendar.DAY_OF_MONTH);
+        int day3 = end.get(Calendar.DAY_OF_MONTH);
+        int tmpYear = year2 - year;
+        if (day2 == day3) {
+            return (tmpYear * 12) + (month3 - month2);
+        }
+        return month == 0 ? month : (month - 1);
+    }
+
+    public static Date getNow() {
+        return new Date(System.currentTimeMillis());
+    }
+
+    public static int getDayOfMonth() {
+        Calendar aCalendar = Calendar.getInstance(Locale.CHINA);
+        int day = aCalendar.getActualMaximum(Calendar.DATE);
+        return day;
+    }
+
+    /**
+     * <p>
+     * Description: 淇敼鏃堕棿涓烘寚瀹氭椂闂村綋澶╃殑23:59:59.000
+     * </p>
+     *
+     * @param date 闇�瑕佷慨鏀圭殑鏃堕棿
+     * @return 淇敼鍚庣殑鏃堕棿
+     */
+    public static Date fillTime(Date date) {
+        Date result = removeTime(date);
+        result.setTime(result.getTime() + 24 * 60 * 60 * 1000 - 1000); // 鍔犱竴澶�
+        return result;
+    }
+
+    /**
+     * @param date 褰撳墠鏃堕棿
+     * @param i    寰�鍓嶅嚑澶�
+     * @return
+     */
+    public static Date fillBeforeTime(Date date, Integer i) {
+        Date result = removeTime(date);
+        Calendar calendar = Calendar.getInstance(); // 寰楀埌鏃ュ巻
+        calendar.setTime(result);// 鎶婂綋鍓嶆椂闂磋祴缁欐棩鍘�
+        calendar.add(Calendar.DAY_OF_MONTH, i); // 璁剧疆涓哄墠涓�澶�
+        result.setTime(calendar.getTime().getTime() + 24 * 60 * 60 * 1000
+                - 1000); // 鍔犱竴澶�
+        return result;
+    }
+
+    /**
+     * <p>
+     * Description: 淇敼鏃堕棿涓烘寚瀹氭椂闂村墠涓�澶╃殑00:00:00
+     * </p>
+     *
+     * @param date 闇�瑕佷慨鏀圭殑鏃堕棿
+     * @return 淇敼鍚庣殑鏃堕棿
+     */
+    public static Date plusTime(Date date, Integer i) {
+        Date result = removeTime(date);
+        Calendar calendar = Calendar.getInstance(); // 寰楀埌鏃ュ巻
+        calendar.setTime(result);// 鎶婂綋鍓嶆椂闂磋祴缁欐棩鍘�
+        calendar.add(Calendar.DAY_OF_MONTH, i); // 璁剧疆涓哄墠涓�澶�
+        return calendar.getTime();
+    }
+
+    /**
+     * <p>
+     * Description: 鍘绘帀鏃ユ湡鏃堕棿涓殑鏃堕棿閮ㄥ垎
+     * </p>
+     * 濡�: 2013-11-11 18:56:33 ---> 2013-11-11 00:00:00
+     *
+     * @param date 闇�瑕佷慨鏀圭殑鏃堕棿
+     * @return 淇敼鍚庣殑鏃堕棿
+     */
+    public static Date removeTime(Date date) {
+        Date result = null;
+        try {
+            SimpleDateFormat df = new SimpleDateFormat(STR_DATE);
+            String dateStr = df.format(date);
+            result = df.parse(dateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * <p>
+     * Description: 鎸夐粯璁ゆ牸寮�(yyyy-MM-dd HH:mm:ss.SSS)鑾峰彇鏃堕棿瀛楃涓�
+     * </p>
+     *
+     * @param date 瑕佽浆鎹㈢殑鏃ユ湡
+     * @return 杞崲鍚庣殑鏃堕棿瀛楃涓�
+     */
+    public static String format(Date date) {
+        SimpleDateFormat df = new SimpleDateFormat(STR_DATE_TIME);
+        return df.format(date);
+    }
+
+    public static Date parseDate(Date date, String format) {
+        SimpleDateFormat df = new SimpleDateFormat(format);
+        try {
+            date = df.parse(df.format(date));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return date;
+    }
+
+    public static Date getDelayedYear() {
+        Calendar curr = Calendar.getInstance();
+        curr.set(Calendar.YEAR, curr.get(Calendar.YEAR) + 1);
+        Date date = curr.getTime();
+        return date;
+    }
+
+    /**
+     * <p>
+     * Description: 鎸夋寚瀹氭牸寮忚幏鍙栨椂闂村瓧绗︿覆
+     * </p>
+     *
+     * @param date   瑕佽浆鎹㈢殑鏃ユ湡
+     * @param format 鏍煎紡,渚嬪:yyyy-MM-dd HH:mm:ss.SSS
+     * @return 杞崲鍚庣殑鏃堕棿瀛楃涓�
+     */
+    public static String format(Date date, String format) {
+        SimpleDateFormat df = new SimpleDateFormat(format);
+        return df.format(date);
+    }
+
+    /**
+     * <p>
+     * Description: 鍔犳湀鍑芥暟
+     * </p>
+     *
+     * @param month 鏈堜唤鏁�
+     * @return
+     */
+    public static Date addMonth(Integer month, Date time) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(time);
+        c.add(Calendar.MONTH, month);
+        return c.getTime();
+    }
+
+    public static Boolean greater(Date startTime, Date endTime) {
+        return startTime.getTime() > endTime.getTime();
+    }
+
+    public static Boolean less(Date startTime, Date endTime) {
+        return startTime.getTime() < endTime.getTime();
+    }
+
+    public static Boolean equals(Date startTime, Date endTime) {
+        return startTime.getTime() == endTime.getTime();
+    }
+
+    public static Integer getDiffMonth(Calendar c, Calendar c1) {
+        return (c.get(Calendar.YEAR) - c1.get(Calendar.YEAR)) * 12
+                + (c.get(Calendar.MONTH) - c1.get(Calendar.MONTH));
+    }
+
+    /**
+     * 鏄惁涓哄悓涓�澶�
+     */
+    public static boolean equalsDay(Date a, Date b) {
+        return removeTime(a).getTime() == removeTime(b).getTime();
+    }
+
+    public static Integer getDays(Date startTime, Date endTime) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(startTime);
+        Calendar c1 = Calendar.getInstance();
+        c1.setTime(endTime);
+        long t1 = c.getTimeInMillis();
+        long t2 = c1.getTimeInMillis();
+        // 璁$畻澶╂暟
+        Long days = (t2 - t1) / (24 * 60 * 60 * 1000);
+        return days.intValue();
+    }
+
+    public static Integer getSeconds(Date startTime, Date endTime) {
+        try {
+            Calendar c = Calendar.getInstance();
+            c.setTime(startTime);
+            Calendar c1 = Calendar.getInstance();
+            c1.setTime(endTime);
+            long t1 = c.getTimeInMillis();
+            long t2 = c1.getTimeInMillis();
+            // 璁$畻绉掓暟
+            Long days = (t2 - t1) / (1000);
+            return days.intValue();
+        } catch (Exception e) {
+            return 0;
+        }
+
+    }
+
+    //鑾峰彇灏忔椂宸�
+    public static double subHours(Date startTime, Date endTime) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(startTime);
+        Calendar c1 = Calendar.getInstance();
+        c1.setTime(endTime);
+        double t1 = c.getTimeInMillis();
+        double t2 = c1.getTimeInMillis();
+        // 璁$畻澶╂暟
+        double hours = (t2 - t1) / (1000 * 60 * 60);
+        return Double.valueOf(new DecimalFormat("#.00").format(hours));
+    }
+
+    //鏍规嵁褰撳墠鏃堕棿鍜屽嚭鐢熸棩鏈熻幏鍙栧勾榫�
+    public static int getAge(Date birthDay) {
+        Calendar cal = Calendar.getInstance();
+        // 鍙栧嚭绯荤粺褰撳墠鏃堕棿鐨勫勾銆佹湀銆佹棩閮ㄥ垎
+        int yearNow = cal.get(Calendar.YEAR);
+        int monthNow = cal.get(Calendar.MONTH);
+        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
+        cal.setTime(birthDay);
+        // 鍙栧嚭鍑虹敓鏃ユ湡鐨勫勾銆佹湀銆佹棩閮ㄥ垎
+        int yearBirth = cal.get(Calendar.YEAR);
+        int monthBirth = cal.get(Calendar.MONTH);
+        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
+        // 褰撳墠骞翠唤涓庡嚭鐢熷勾浠界浉鍑忥紝鍒濇璁$畻骞撮緞
+        int age = yearNow - yearBirth;
+        // 褰撳墠鏈堜唤涓庡嚭鐢熸棩鏈熺殑鏈堜唤鐩告瘮锛屽鏋滄湀浠藉皬浜庡嚭鐢熸湀浠斤紝鍒欏勾榫勪笂鍑�1锛岃〃绀轰笉婊″灏戝懆宀�
+        if (monthNow <= monthBirth) {
+            // 濡傛灉鏈堜唤鐩哥瓑锛屽湪姣旇緝鏃ユ湡锛屽鏋滃綋鍓嶆棩锛屽皬浜庡嚭鐢熸棩锛屼篃鍑�1锛岃〃绀轰笉婊″灏戝懆宀�
+            if (monthNow == monthBirth) {
+                if (dayOfMonthNow < dayOfMonthBirth) {
+                    age--;
+                }
+            } else {
+                age--;
+            }
+
+        }
+        return age;
+    }
+
+    public static Date subDays(Date startTime, Integer day) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(startTime);
+        c.add(Calendar.DATE, day * -1);
+        return c.getTime();
+    }
+
+    public static Date addDays(Date startTime, Integer day) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(startTime);
+        c.add(Calendar.DATE, day);
+        return c.getTime();
+    }
+    /*public static Date addHours(Date startTime, Integer hours) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(startTime);
+        c.add(Calendar.HOUR, hours );
+        return c.getTime();
+    }*/
+
+    public static Date toDate(String date, String format) {
+        SimpleDateFormat df = new SimpleDateFormat(format);
+        try {
+            return df.parse(date);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static Date toDateFull(String date) {
+        SimpleDateFormat df = new SimpleDateFormat(STR_DATE_TIME);
+        try {
+            return df.parse(date);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static Date toDateMedium(String date) {
+        SimpleDateFormat df = new SimpleDateFormat(STR_DATE_TIME_SMALL);
+        try {
+            Date dd = df.parse(date);
+            return dd;
+        } catch (ParseException e) {
+            return null;
+        }
+    }
+
+    public static Integer getDate(Date date) {
+        if (date != null) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            int day = calendar.get(Calendar.DATE);
+            return day;
+        }
+        return null;
+    }
+
+    public static Integer getYear() {
+        return getYear(new Date());
+    }
+
+    public static Integer getYear(Date date) {
+        if (date != null) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            int year = calendar.get(Calendar.YEAR);
+            return year;
+        }
+        return null;
+    }
+
+    public static Integer getMonth() {
+        return getMonth(new Date());
+    }
+
+    public static Integer getMonth(Date date) {
+        if (date != null) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            int month = calendar.get(Calendar.MONTH);
+            return month + 1;
+        }
+        return null;
+    }
+
+    public static Integer getDay() {
+        return getDay(new Date());
+    }
+
+    public static Integer getDay(Date date) {
+        if (date != null) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            int day = calendar.get(Calendar.DAY_OF_MONTH);
+            return day;
+        }
+        return null;
+    }
+
+
+    public static Date[] getMonthStartTimeAndEndTime(Integer month) {
+        Calendar calendar = Calendar.getInstance();
+        Date[] dates = new Date[2];
+        Date startTime = null;
+        Date endsTime = null;
+        if (month != null) {
+            calendar.set(Calendar.MONTH, month);
+            //鑾峰緱鍒版湰鏈堢殑绗竴澶�
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
+            startTime = calendar.getTime();
+            startTime = DateUtils.removeTime(startTime);
+            //鑾峰緱鍒版湰鏈堢殑鏈�鍚庝竴澶�
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+            endsTime = calendar.getTime();
+            endsTime = DateUtils.fillTime(endsTime);
+        }
+        dates[0] = startTime;
+        dates[1] = endsTime;
+        return dates;
+    }
+
+    public static Date[] getMonthStartTimeAndEndTime(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        Integer month = calendar.get(Calendar.MONTH);
+        Date[] dates = new Date[2];
+        Date startTime = null;
+        Date endsTime = null;
+        if (month != null) {
+            calendar.set(Calendar.MONTH, month);
+            //鑾峰緱鍒版湰鏈堢殑绗竴澶�
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
+            startTime = calendar.getTime();
+            startTime = DateUtils.removeTime(startTime);
+            //鑾峰緱鍒版湰鏈堢殑鏈�鍚庝竴澶�
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+            endsTime = calendar.getTime();
+            endsTime = DateUtils.fillTime(endsTime);
+        }
+        dates[0] = startTime;
+        dates[1] = endsTime;
+        return dates;
+    }
+
+    /**
+     * 鑾峰彇days澶╃殑鏃堕棿鍖洪棿锛宔ndTime 涓哄綋澶╃殑鍚庝竴澶�0鐐癸紝
+     * startTime 涓篹ndTime鍓峝ays澶�
+     *
+     * @param days
+     * @return
+     */
+    public static Date[] getDaysStartTimeAndEndTime(Integer days) {
+        Date[] dates = new Date[2];
+        Date endDate = plusTime(removeTime(getNow()), 1);
+        Date startDate = subDays(endDate, days);
+        dates[0] = startDate;
+        dates[1] = endDate;
+        return dates;
+    }
+
+    /**
+     * 鏍规嵁鏌愪竴骞磋幏鍙栨渶鍚庝竴澶╃殑鏃堕棿
+     * 2013 ---> 2013-12-31 23:59:59.000
+     *
+     * @param year
+     * @return
+     */
+    public static Date getYearEndDay(Integer year) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.clear();
+        calendar.set(Calendar.YEAR, year);
+        calendar.roll(Calendar.DAY_OF_YEAR, -1);
+        Date yearLast = calendar.getTime();
+        Date lastYear = DateUtils.fillTime(yearLast);
+        return lastYear;
+    }
+
+    /**
+     * 鑾峰彇start/end鐨勬墍鏈夋棩鏈熷瓧绗︿覆 鏍煎紡yyyy-MM-dd
+     *
+     * @param start
+     * @param end
+     * @return
+     */
+    public static List<String> getDatesStringList(Date start, Date end, String strDate) {
+        List<String> list = new ArrayList<>();
+        int i = getDays(start, end);
+        for (int j = 0; j <= i; j++) {
+            if (j == 0) {
+                list.add(format(start, strDate));
+            } else {
+                list.add(format(plusTime(start, j), strDate));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 鑾峰彇start/end鐨勬墍鏈夋棩鏈熷瓧绗︿覆 鏍煎紡yyyy-MM-dd
+     *
+     * @param start
+     * @param end
+     * @return
+     */
+    public static List<String> getDatesStringList(Date start, Date end) {
+        List<String> list = new ArrayList<>();
+        int i = getDays(start, end);
+        for (int j = 0; j <= i; j++) {
+            if (j == 0) {
+                list.add(format(start, STR_DATE));
+            } else {
+                list.add(format(plusTime(start, j), STR_DATE));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 鑾峰彇start/end鐨勬墍鏈夋棩鏈熷瓧绗︿覆 鏍煎紡yyyyMMdd
+     *
+     * @param start
+     * @param end
+     * @return
+     */
+    public static List<String> getDatesStringList2(Date start, Date end) {
+        List<String> list = new ArrayList<>();
+        int i = getDays(start, end);
+        for (int j = 0; j <= i; j++) {
+            if (j == 0) {
+                list.add(format(start, STRDATE));
+            } else {
+                list.add(format(plusTime(start, j), STRDATE));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 鑾峰彇start/end鐨勬墍鏈夋棩鏈熷瓧绗︿覆 鏍煎紡MM-dd
+     *
+     * @param start
+     * @param end
+     * @return
+     */
+    public static List<String> getDatesStringLists(Date start, Date end) {
+        List<String> list = new ArrayList<>();
+        int i = getDays(start, end);
+        for (int j = 0; j <= i; j++) {
+            if (j == 0) {
+                list.add(format(start, STR_MMDD));
+            } else {
+                list.add(format(plusTime(start, j), STR_MMDD));
+            }
+        }
+        return list;
+    }
+
+    public static List<String> getMonthBetween(Date start, Date end) {
+        List<String> list = new ArrayList<>();
+        Calendar min = Calendar.getInstance();
+        Calendar max = Calendar.getInstance();
+        min.setTime(start);
+        min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
+        max.setTime(end);
+        max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
+        Calendar curr = min;
+        while (curr.before(max)) {
+            list.add(format(curr.getTime(), STR_YEAR_MONTH));
+            curr.add(Calendar.MONTH, 1);
+        }
+        return list;
+    }
+
+    /**
+     * 鑾峰彇dateStr鐨勬棩鏈熸牸寮弝yyy-MM-dd
+     *
+     * @param dateStr
+     * @return
+     */
+    public static Date getShortDate(String dateStr) {
+        SimpleDateFormat sdf = new SimpleDateFormat(STR_DATE);
+        Date startTime = null;
+        try {
+            startTime = sdf.parse(dateStr);
+        } catch (ParseException e) {
+        }
+        return startTime == null ? removeTime(new Date()) : startTime;
+    }
+
+    /**
+     * 鑾峰彇dateStr鐨勬棩鏈熸牸寮弝yyyMMdd
+     *
+     * @param dateStr
+     * @return
+     */
+    public static Date getShortDate2(String dateStr) {
+        SimpleDateFormat sdf = new SimpleDateFormat(STRDATE);
+        Date startTime = null;
+        try {
+            startTime = sdf.parse(dateStr);
+        } catch (ParseException e) {
+        }
+        return startTime == null ? removeTime(new Date()) : startTime;
+    }
+
+    public static Date getFormatDate(String dateStr, String format) {
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        Date startTime = null;
+        try {
+            startTime = sdf.parse(dateStr);
+        } catch (ParseException e) {
+        }
+        return startTime == null ? removeTime(new Date()) : startTime;
+    }
+
+    /**
+     * @param time
+     * @param n
+     * @return 鍦ㄤ竴涓椂闂翠笂鍔犵
+     */
+    public static Date addSecond(Date time, Integer n) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(time);
+        c.add(Calendar.SECOND, n);
+        return c.getTime();
+    }
+
+    /**
+     * @param time
+     * @param n
+     * @return 鍦ㄤ竴涓椂闂翠笂鍔犲垎閽�
+     */
+    public static Date addMinute(Date time, Integer n) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(time);
+        c.add(Calendar.MINUTE, n);
+        return c.getTime();
+    }
+
+    /**
+     * @param time
+     * @param n
+     * @return 鍦ㄤ竴涓椂闂翠笂鍔犲皬鏃�
+     */
+    public static Date addHour(Date time, Integer n) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(time);
+        c.add(Calendar.HOUR_OF_DAY, n);
+        return c.getTime();
+    }
+
+    /**
+     * 鑾峰彇start/end鐨勬墍鏈夋棩鏈熷瓧绗︿覆 鏍煎紡yyyy-MM-dd
+     *
+     * @param start
+     * @param end
+     * @return
+     */
+    public static List<String> getDateMonth(String start, String end) {
+        List<String> list = new ArrayList<>();
+        SimpleDateFormat yyyyMM = new SimpleDateFormat("yyyy-MM");
+        Date startyear = null;
+        try {
+            startyear = yyyyMM.parse(start);
+            Date endyear = yyyyMM.parse(end);
+            Calendar dd = Calendar.getInstance();//瀹氫箟鏃ユ湡瀹炰緥
+            dd.setTime(startyear);//璁剧疆鏃ユ湡璧峰鏃堕棿
+            while (dd.getTime().before(endyear)) {//鍒ゆ柇鏄惁鍒扮粨鏉熸棩鏈�
+                String str = yyyyMM.format(dd.getTime());
+                dd.add(Calendar.MONTH, 1);//杩涜褰撳墠鏃ユ湡鏈堜唤鍔�1
+                list.add(str);
+            }
+            list.add(yyyyMM.format(endyear));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 鑾峰彇start/end鐨勬墍鏈夋棩鏈熷瓧绗︿覆 鏍煎紡yyyy
+     *
+     * @param start
+     * @param end
+     * @return
+     */
+    public static List<String> getDateYear(String start, String end) {
+        List<String> list = new ArrayList<>();
+        SimpleDateFormat yyyy = new SimpleDateFormat("yyyy");
+        Date startyear = null;
+        try {
+            startyear = yyyy.parse(start);
+            Date endyear = yyyy.parse(end);
+            Calendar dd = Calendar.getInstance();//瀹氫箟鏃ユ湡瀹炰緥
+            dd.setTime(startyear);//璁剧疆鏃ユ湡璧峰鏃堕棿
+            while (dd.getTime().before(endyear)) {//鍒ゆ柇鏄惁鍒扮粨鏉熸棩鏈�
+                String str = yyyy.format(dd.getTime());
+                dd.add(Calendar.YEAR, 1);//杩涜褰撳墠鏃ユ湡鏈堜唤鍔�1
+                list.add(str);
+            }
+            list.add(yyyy.format(endyear));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏃堕棿 瀹氫綅鍒板皬鏃�
+     * 鏍煎紡涓� yyyy-MM-dd hh:mm
+     * 渚嬶細2018-02-27 11:00
+     *
+     * @return
+     */
+    public static Date getNowHourDate() {
+        Date now = getNow();
+        Date result;
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(now);
+        int hour = calendar.get(Calendar.HOUR_OF_DAY);
+        String dateStr = format(now, STR_DATE);
+        dateStr = dateStr + " " + (hour < 10 ? "0" + hour : hour) + ":00";
+        result = toDate(dateStr, STR_DATE_TIME_MIN);
+        return result;
+    }
+
+    /**
+     * 鑾峰彇姣忔棩8:11鎴�11:11鐨勬椂闂寸偣
+     *
+     * @return
+     */
+    public static Date getNowHourDateTo() {
+        Date now = getNow();
+        Date result;
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(now);
+        int hour = calendar.get(Calendar.HOUR_OF_DAY);
+        if (hour != 8 && hour != 11) {
+            return null;
+        }
+        int minute = calendar.get(Calendar.MINUTE);
+        if (minute < 11) {
+            return null;
+        }
+        String dateStr = format(now, STR_DATE);
+        dateStr = dateStr + " " + (hour < 10 ? "0" + hour : hour) + ":11";
+        result = toDate(dateStr, STR_DATE_TIME_MIN);
+        return result;
+    }
+
+    /**
+     * 鑾峰彇姣忔棩8:00銆�13:00銆�20:00鐨勬椂闂寸偣
+     *
+     * @return
+     */
+    public static List<Date> getHourDateList(Date time) {
+        List<Date> result = new ArrayList<>();
+        result.add(addHour(time, 8));
+        result.add(addHour(time, 13));
+        result.add(addHour(time, 20));
+        return result;
+    }
+
+    /**
+     * 鑾峰彇涓婃湀鐨勬渶鍚庝竴澶�
+     *
+     * @return
+     */
+    public static Date getPreviousMonthLastDay() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_MONTH, 0);
+        return DateUtils.removeTime(calendar.getTime());
+    }
+
+    /**
+     * 鑾峰彇end鏃堕棿鏈堢殑绗竴澶�
+     *
+     * @param end 鏈堜唤鏈�鍚庝竴澶�
+     * @return
+     */
+    public static Date getTheMonthFirstDay(Date end) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(end);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        return calendar.getTime();
+    }
+
+    public static String secToTimeHour(int time) {
+        String timeStr = null;
+        int hour = 0;
+        if (time <= 0) {
+            return "0灏忔椂";
+        } else {
+            BigDecimal bigDecimal = new BigDecimal(time);
+            BigDecimal bigDecimal1 = new BigDecimal(3600);
+            BigDecimal hourBigDecimal = new BigDecimal(0);
+            hourBigDecimal = new BigDecimal(String.valueOf(bigDecimal)).
+                    divide(new BigDecimal(String.valueOf(bigDecimal1)), 2, BigDecimal.ROUND_HALF_UP);
+            timeStr = hourBigDecimal + "灏忔椂";
+        }
+        return timeStr;
+    }
+
+    public static String secToTime(int time) {
+        String timeStr = null;
+        int hour = 0;
+        int minute = 0;
+        int second = 0;
+        if (time <= 0)
+            return " ";
+        else {
+            minute = time / 60;
+            if (minute < 60) {
+                second = time % 60;
+                timeStr = unitFormat(minute) + "鍒�" + unitFormat(second) + " 绉�";
+            } else {
+                hour = minute / 60;
+                minute = minute % 60;
+                second = time - hour * 3600 - minute * 60;
+                timeStr = unitFormat(hour) + "灏忔椂" + unitFormat(minute) + "鍒�" + unitFormat(second) + "绉�";
+            }
+        }
+        return timeStr;
+    }
+
+    public static String unitFormat(int i) {
+        String retStr = null;
+        if (i >= 0 && i < 10)
+            retStr = "0" + Integer.toString(i);
+        else
+            retStr = "" + i;
+        return retStr;
+    }
+
+    /**
+     * 楠岃瘉鏃堕棿
+     *
+     * @param time 鏃堕棿瀛楃涓� HH:mm
+     * @return 楠岃瘉鎴愬姛杩斿洖true锛岄獙璇佸け璐ヨ繑鍥瀎alse
+     */
+    public static boolean checkTime(String time) {
+        String regex = "([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
+        return Pattern.matches(regex, time);
+    }
+
+    /**
+     * 鑾峰彇姣忔棩07:30:00鐨勬椂闂寸偣
+     * 鏍煎紡涓� yyyy-MM-dd HH:mm:ss
+     * 渚嬶細2018-05-28 07:30:00
+     *
+     * @return
+     */
+    public static Date getHourDateTo(Date now, String time) {
+        String dateStr = format(now, STR_DATE);
+        dateStr = dateStr + " " + time;
+        Date result = toDate(dateStr, STR_DATE_TIME_SMALL);
+        return result;
+    }
+
+    public static Date setTimeForDay(Date theDate, String planTime) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(theDate);
+        String[] times = planTime.split(":");
+        cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(times[0]));
+        cal.set(Calendar.MINUTE, Integer.parseInt(times[1]));
+        cal.set(Calendar.SECOND, Integer.parseInt(times[2]));
+        return cal.getTime();
+    }
+
+    public static long getTimeWithOutDay(Date d) {
+        return d.getTime() / 1000 % 86400;
+    }
+
+    /**
+     * @param lo 姣鏁�
+     * @return String yyyy-MM-dd HH:mm:ss
+     * @Description: long绫诲瀷杞崲鎴愭棩鏈�
+     */
+    public static String longToDate(long lo) {
+        Date date = new Date(lo);
+        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sd.format(date);
+    }
+
+    /**
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public static List<Date> getWeekDays(LocalDate startDate, LocalDate endDate) {
+        List<Date> result = new ArrayList<>();
+        List<LocalDate> dateList = Stream.iterate(startDate, localDate -> localDate.plusDays(1))
+                .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
+                .filter(localDate -> DayOfWeek.SATURDAY.equals(DayOfWeek.of(localDate.get(ChronoField.DAY_OF_WEEK))) || DayOfWeek.SUNDAY.equals(DayOfWeek.of(localDate.get(ChronoField.DAY_OF_WEEK))))
+                .collect(Collectors.toList());
+        dateList.forEach(localDate -> result.add(Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())));
+        return result;
+    }
+
+    /**
+     * @param smallDate
+     * @param bigDate
+     * @desc 鑾峰彇涓や釜鏃ユ湡涔嬮棿鐨勫ぉ鏁�
+     */
+    public static Integer getDaysBetween(String smallDate, String bigDate) throws ParseException {
+        // 鏃ユ湡鏍煎紡
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        // 鑾峰彇涓や釜鏃ユ湡鐨勬椂闂存埑
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(sdf.parse(smallDate));
+        long smallTime = cal.getTimeInMillis();
+        cal.setTime(sdf.parse(bigDate));
+        long bigTime = cal.getTimeInMillis();
+        // 鐩稿樊鐨勬棩鏈�
+        long days = (bigTime - smallTime) / (1000 * 3600 * 24);
+        // long杞琲nt 瀛樺湪婧㈠嚭鎯呭喌  鏍规嵁涓氬姟鎯呭喌缂栬緫catch涓繑鍥炲��
+        try {
+            return Integer.parseInt(String.valueOf(days));
+        } catch (NumberFormatException e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 鏃ユ湡杞崲锛屽皢鎺ュ彛杩斿洖鐨�20180524杞负2018-05-24
+     *
+     * @param str
+     * @return
+     */
+    public static String dateConvertion(String str) {
+        Date parse = null;
+        String dateString = "";
+        try {
+            parse = new SimpleDateFormat("yyyyMMdd").parse(str);
+            dateString = new SimpleDateFormat("yyyy-MM-dd").format(parse);
+        } catch (ParseException e) {
+            dateString = null;
+        }
+
+        return dateString;
+    }
+}
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentMapper.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentMapper.java
index 5cdf91e..bec930b 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentMapper.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentMapper.java
@@ -7,6 +7,8 @@
 import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.mdc.entity.Equipment;
 
+import java.util.List;
+
 /**
  * @Description: 閲囬泦璁惧琛�
  * @Author: liuS
@@ -19,15 +21,19 @@
     @Select(" SELECT name FROM SysObjects Where XType='U' AND name = '${saveTableName}' ")
     String checkTableExists(@Param("saveTableName") String saveTableName);
 
-    @Select(" SELECT COUNT(CollectTime) num FROM ${saveTableName} WHERE CollectTime < '${day}' ")
+    @Select(" SELECT COUNT(CollectTime) num FROM [${saveTableName}] WHERE CollectTime < '${day}' ")
     Integer checkTableDataNum(@Param("saveTableName") String saveTableName, @Param("day") String day);
 
-    @Insert(" INSERT INTO ${tableName} SELECT * FROM ${lastTableName}  WHERE CollectTime < '${date}' ")
+    @Insert(" INSERT INTO [${tableName}] SELECT * FROM [${lastTableName}]  WHERE CollectTime < '${date}' ")
     void insertTableData(@Param("tableName") String tableName, @Param("lastTableName") String lastTableName, @Param("date") String date);
 
-    @Delete(" delete from ${tableName} where CollectTime < '${day}' ")
+    @Delete(" delete from [${tableName}] where CollectTime < '${day}' ")
     void deleteTableData(@Param("tableName") String saveTableName, @Param("day") String day);
 
-    @Insert(" SELECT * INTO ${tableName} FROM ${lastTableName} WHERE CollectTime < '${date}' ")
+    @Insert(" SELECT * INTO [${tableName}] FROM [${lastTableName}] WHERE CollectTime < '${date}' ")
     void insertNoTableData(@Param("tableName") String tableName, @Param("lastTableName") String lastTableName, @Param("date") String date);
+
+    List<Equipment> listByProds(@Param("proIds") List<String> proIds);
+
+    Equipment findByEquId(@Param("equipmentId") String equipmentId);
 }
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
index e0e0e88..0a71450 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
@@ -141,5 +141,7 @@
 
     List<MdcEquipment> findByProIdsAndType(@Param("mdcProductionIds") List<String> mdcProductionIds, @Param("typeList") List<String> typeList);
 
+    List<String> getEquIdsByProIds(@Param("proIds") List<String> proIds);
+
     List<MdcEquipment> getEquipmentList(@Param("allProductionIds") List<String> allProductionIds);
 }
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml
index b504640..126990b 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml
@@ -2,4 +2,22 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.mdc.mapper.EquipmentMapper">
 
+    <select id="listByProds" resultType="org.jeecg.modules.mdc.entity.Equipment">
+        SELECT
+            t1.*
+        FROM
+            Equipment t1
+            LEFT JOIN mdc_equipment t2 ON t1.EquipmentID = t2.equipment_id
+            LEFT JOIN mdc_production_equipment t3 ON t2.id = t3.equipment_id
+        <where>
+            t3.production_id IN
+            <foreach collection="proIds" index="index" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+    </select>
+
+    <select id="findByEquId" resultType="org.jeecg.modules.mdc.entity.Equipment">
+        SELECT TOP 1 * FROM Equipment WHERE EquipmentID = #{equipmentId}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
index 80df077..3d0755f 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
@@ -354,6 +354,7 @@
             #{equipmentType}
         </foreach>
     </select>
+
     <select id="queryByDepartIdsAndType" resultType="org.jeecg.modules.mdc.entity.MdcEquipment">
         SELECT
             e.*,
@@ -372,4 +373,18 @@
         </foreach>
     </select>
 
+    <select id="getEquIdsByProIds" resultType="java.lang.String">
+        SELECT
+        t1.equipment_id
+        FROM
+        mdc_equipment t1
+        LEFT JOIN mdc_production_equipment t2 ON t1.id = t2.equipment_id
+        <where>
+            t2.production_id IN
+            <foreach collection="proIds" index="index" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+    </select>
+
 </mapper>
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java
index 8dfe74b..9649a2c 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.mdc.entity.Equipment;
 
+import java.util.List;
+
 /**
  * @Description: 閲囬泦璁惧琛�
  * @Author: liuS
@@ -48,4 +50,8 @@
      * @param day
      */
     void insertNoTableData(String backupTableName, String tableName, String day);
+
+    List<Equipment> listByProds(List<String> proIds);
+
+    Equipment findByEquId(String equipmentId);
 }
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java
index aee61dc..2b65899 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java
@@ -11,4 +11,5 @@
  */
 public interface IMdcAlarmInfoService extends IService<MdcAlarmInfo> {
 
+    MdcAlarmInfo findAlarmContent(String alarmNo, String equipmentId);
 }
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
index e4e1ba3..f3493f9 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
@@ -240,6 +240,9 @@
      */
     List<MdcEquipment> findByProIdsAndType(List<String> allProductionIds, List<String> typeList);
 
+    List<String> getEquIdsByProIds(List<String> proIds);
+
+
     /**
      * 鏍规嵁鐢ㄦ埛鏌ヨ璁惧鍒楄〃淇℃伅
      * @return
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java
index 3db46bc..03126fb 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java
@@ -6,6 +6,9 @@
 import org.jeecg.modules.mdc.service.IEquipmentService;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
  * @Description: 閲囬泦璁惧琛�
  * @Author: liuS
@@ -39,4 +42,14 @@
     public void insertNoTableData(String backupTableName, String tableName, String day) {
         this.baseMapper.insertNoTableData(backupTableName, tableName, day);
     }
+
+    @Override
+    public List<Equipment> listByProds(List<String> proIds) {
+        return this.baseMapper.listByProds(proIds);
+    }
+
+    @Override
+    public Equipment findByEquId(String equipmentId) {
+        return this.baseMapper.findByEquId(equipmentId);
+    }
 }
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
index 9f09066..c4d6284 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
@@ -1070,4 +1070,9 @@
         return equipmentIds;
     }
 
+    @Override
+    public List<String> getEquIdsByProIds(List<String> proIds) {
+        return this.baseMapper.getEquIdsByProIds(proIds);
+    }
+
 }
diff --git a/lxzn-module-mdc/pom.xml b/lxzn-module-mdc/pom.xml
index bfb2188..51cc508 100644
--- a/lxzn-module-mdc/pom.xml
+++ b/lxzn-module-mdc/pom.xml
@@ -25,6 +25,11 @@
             <artifactId>lxzn-module-mdc-common</artifactId>
             <version>3.4.3</version>
         </dependency>
+        <dependency>
+            <groupId>org.jeecgframework.boot</groupId>
+            <artifactId>lxzn-module-eam-common</artifactId>
+            <version>3.4.3</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
new file mode 100644
index 0000000..861621f
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
@@ -0,0 +1,95 @@
+package org.jeecg.modules.board.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.board.service.IDtBoardService;
+import org.jeecg.modules.board.vo.*;
+import org.jeecg.modules.system.entity.MdcProduction;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-05-30
+ * @Description: 鏁板瓧瀛敓鐪嬫澘鎺ュ彛
+ */
+@Slf4j
+@Api(tags = "鏁板瓧瀛敓鐪嬫澘")
+@RestController
+@RequestMapping("/board/dtBoard")
+public class DtBoardController {
+
+    @Resource
+    private IDtBoardService dtBoardService;
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-鑾峰彇杞﹂棿鍒嗙粍", notes = "鏁板瓧瀛敓鐪嬫澘-鑾峰彇杞﹂棿鍒嗙粍")
+    @GetMapping("/productionList")
+    public Result<?> productionList() {
+        List<MdcProduction> result = dtBoardService.productionList();
+        return Result.OK(result);
+    }
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧鏈堝害鍒╃敤鐜�", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧鏈堝害鍒╃敤鐜�")
+    @GetMapping("/equipmentMonthUtilizationRate")
+    public Result<?> equipmentMonthUtilizationRate(@ApiParam(value = "productionId", required = true) String productionId) {
+        List<EquUtilRateMonth> result = dtBoardService.equipmentMonthUtilizationRate(productionId);
+        return Result.OK(result);
+    }
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧鍒╃敤鐜�", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧鍒╃敤鐜�")
+    @GetMapping("/equipmentUtilizationRate")
+    public Result<?> equipmentUtilizationRate(@ApiParam(value = "productionId", required = true) String productionId) {
+        List<EquUtilRate> result = dtBoardService.equipmentUtilizationRate(productionId);
+        return Result.OK(result);
+    }
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-鏈堝害OEE", notes = "鏁板瓧瀛敓鐪嬫澘-鏈堝害OEE")
+    @GetMapping("/equipmentMonthOee")
+    public Result<?> equipmentMonthOee(@ApiParam(value = "productionId", required = true) String productionId) {
+        List<EquOeeMonth> result = dtBoardService.equipmentMonthOee(productionId);
+        return Result.OK(result);
+    }
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧杩愯鐘舵�佺粺璁�", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧杩愯鐘舵��")
+    @GetMapping("/equipmentOperationStatistics")
+    public Result<?> equipmentOperationStatistics(@ApiParam(value = "productionId", required = true) String productionId) {
+        EquOperation result = dtBoardService.equipmentOperationStatistics(productionId);
+        return Result.OK(result);
+    }
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧淇℃伅", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧淇℃伅")
+    @GetMapping("/equipmentRunInfo")
+    public Result<?> equipmentRunInfo(@ApiParam(value = "equipmentId", required = true) String equipmentId) {
+        List<EquRunInfo> result = dtBoardService.equipmentRunInfo(equipmentId);
+        return Result.OK(result);
+    }
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧鍋滄満缁熻", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧鍋滄満缁熻")
+    @GetMapping("/equDowntimeStatistics")
+    public Result<?> equDowntimeStatistics(@ApiParam(value = "productionId", required = true) String productionId) {
+        List<EquDowntimeInfo> result = dtBoardService.equDowntimeStatistics(productionId);
+        return Result.OK(result);
+    }
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧鎶ヨ", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧鎶ヨ")
+    @GetMapping("/equAlarmList")
+    public Result<?> equAlarmList(@ApiParam(value = "productionId", required = true) String productionId) {
+        List<EquAlarm> result = dtBoardService.equAlarmList(productionId);
+        return Result.OK(result);
+    }
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰")
+    @GetMapping("/equAlarmList")
+    public Result<?> equAlarmList(@ApiParam(value = "productionId", required = true) String productionId) {
+        dtBoardService
+    }
+
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
new file mode 100644
index 0000000..07069e7
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
@@ -0,0 +1,30 @@
+package org.jeecg.modules.board.service;
+
+import org.jeecg.modules.board.vo.*;
+import org.jeecg.modules.system.entity.MdcProduction;
+
+import java.util.List;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-05-30
+ * @Description:
+ */
+public interface IDtBoardService {
+
+    List<MdcProduction> productionList();
+
+    List<EquUtilRateMonth> equipmentMonthUtilizationRate(String productionId);
+
+    List<EquUtilRate> equipmentUtilizationRate(String productionId);
+
+    List<EquOeeMonth> equipmentMonthOee(String productionId);
+
+    EquOperation equipmentOperationStatistics(String productionId);
+
+    List<EquRunInfo> equipmentRunInfo(String equipmentId);
+
+    List<EquDowntimeInfo> equDowntimeStatistics(String productionId);
+
+    List<EquAlarm> equAlarmList(String productionId);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
new file mode 100644
index 0000000..bf79693
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
@@ -0,0 +1,340 @@
+package org.jeecg.modules.board.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import liquibase.pro.packaged.I;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.vo.DictModel;
+import org.jeecg.modules.board.service.IDtBoardService;
+import org.jeecg.modules.board.vo.*;
+import org.jeecg.modules.mdc.constant.MdcConstant;
+import org.jeecg.modules.mdc.entity.*;
+import org.jeecg.modules.mdc.service.*;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.system.entity.MdcProduction;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.jeecg.modules.system.service.ISysDictService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-05-30
+ * @Description:
+ */
+@Service
+public class DtBoardServiceImpl implements IDtBoardService {
+
+    @Resource
+    private IMdcProductionService mdcProductionService;
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+
+    @Resource
+    private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService;
+
+    @Resource
+    private IMdcOeeInfoService mdcOeeInfoService;
+
+    @Resource
+    private IEquipmentService equipmentService;
+
+    @Resource
+    private IEquipmentWorkLineService equipmentWorkLineService;
+
+    @Resource
+    private IMdcDriveTypeParamConfigService mdcDriveTypeParamConfigService;
+
+    @Resource
+    private ISysDictService sysDictService;
+
+    @Resource
+    private IMdcDowntimeService mdcDowntimeService;
+
+    @Resource
+    private IEquipmentAlarmService equipmentAlarmService;
+
+    @Resource
+    private IMdcAlarmInfoService mdcAlarmInfoService;
+
+    /**
+     * 杞﹂棿淇℃伅
+     */
+    @Override
+    public List<MdcProduction> productionList() {
+        return mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getOrgType, CommonConstant.ORG_TYPE_2).eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0).orderByAsc(MdcProduction::getProductionOrder));
+    }
+
+    /**
+     * 璁惧鏈堝害鍒╃敤鐜�
+     */
+    @Override
+    public List<EquUtilRateMonth> equipmentMonthUtilizationRate(String productionId) {
+        // 缁勮杩斿洖鏁版嵁
+        LocalDate now = LocalDate.now();
+        Date start = DateUtils.toDate(now.plusMonths(-12).toString(), DateUtils.STR_DATE);
+        Date end = DateUtils.toDate(now.plusMonths(-1).toString(), DateUtils.STR_DATE);
+        List<String> monthBetween = DateUtils.getMonthBetween(start, end);
+        Map<String, EquUtilRateMonth> resultMap = monthBetween.stream().collect(Collectors.toMap(
+                date -> date,
+                date -> new EquUtilRateMonth(date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "鏈�"),
+                (existing, replacement) -> existing, // 澶勭悊閿啿绐佺殑鍚堝苟鍑芥暟锛堥�氬父涓嶄細鍐茬獊锛�
+                LinkedHashMap::new // 鎸囧畾浣跨敤LinkedHashMap淇濇寔鎻掑叆椤哄簭
+        ));
+        List<String> proIds = mdcProductionService.findChildByProId(productionId);
+        if (proIds == null || proIds.isEmpty()) {
+            return new ArrayList<>(resultMap.values());
+        }
+        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            return new ArrayList<>(resultMap.values());
+        }
+        for (String month : monthBetween) {
+            MdcEquipmentStatisticalInfo mdcEquipmentStatisticalInfo = mdcEquipmentStatisticalInfoService.findByEquIdsAndMonth(equipmentIdList, month.replaceAll("-", ""));
+            if (mdcEquipmentStatisticalInfo != null) {
+                if (resultMap.containsKey(month)) {
+                    EquUtilRateMonth equUtilRateMonth = resultMap.get(month);
+                    if (mdcEquipmentStatisticalInfo.getProcessLong().compareTo(BigDecimal.ZERO) > 0) {
+                        equUtilRateMonth.setUtilizationRate(mdcEquipmentStatisticalInfo.getProcessLong().divide(new BigDecimal("864"), 2, RoundingMode.HALF_UP));
+                    }
+                    resultMap.put(month, equUtilRateMonth);
+                }
+            }
+        }
+        return new ArrayList<>(resultMap.values());
+    }
+
+    /**
+     * 璁惧鍒╃敤鐜�(鏄ㄥぉ)
+     */
+    @Override
+    public List<EquUtilRate> equipmentUtilizationRate(String productionId) {
+        List<String> proIds = mdcProductionService.findChildByProId(productionId);
+        if (proIds == null || proIds.isEmpty()) {
+            return null;
+        }
+        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            return null;
+        }
+        Map<String, EquUtilRate> resultMap = new LinkedHashMap<>();
+        equipmentIdList.forEach(equipmentId -> {
+            EquUtilRate equUtilRate = new EquUtilRate(equipmentId);
+            resultMap.put(equipmentId, equUtilRate);
+        });
+        String yesterday = LocalDate.now().plusDays(-1).toString();
+        List<MdcEquipmentStatisticalInfo> mdcEquipmentStatisticalInfoList = mdcEquipmentStatisticalInfoService.findByEquipmentAndDate(equipmentIdList, yesterday.replaceAll("-", ""));
+        if (mdcEquipmentStatisticalInfoList != null && !mdcEquipmentStatisticalInfoList.isEmpty()) {
+            mdcEquipmentStatisticalInfoList.forEach(mdcEquipmentStatisticalInfo -> {
+                if (resultMap.containsKey(mdcEquipmentStatisticalInfo.getEquipmentId())) {
+                    EquUtilRate equUtilRate = resultMap.get(mdcEquipmentStatisticalInfo.getEquipmentId());
+                    if (mdcEquipmentStatisticalInfo.getProcessLong().compareTo(BigDecimal.ZERO) > 0) {
+                        equUtilRate.setUtilizationRate(mdcEquipmentStatisticalInfo.getProcessLong().divide(new BigDecimal("864"), 2, RoundingMode.HALF_UP));
+                    }
+                    resultMap.put(mdcEquipmentStatisticalInfo.getEquipmentId(), equUtilRate);
+                }
+            });
+        }
+        return new ArrayList<>(resultMap.values());
+    }
+
+    /**
+     * 鏈堝害璁惧缁煎悎鏁堢巼
+     */
+    @Override
+    public List<EquOeeMonth> equipmentMonthOee(String productionId) {
+        LocalDate now = LocalDate.now();
+        Date start = DateUtils.toDate(now.plusMonths(-12).toString(), DateUtils.STR_DATE);
+        Date end = DateUtils.toDate(now.plusMonths(-1).toString(), DateUtils.STR_DATE);
+        List<String> monthBetween = DateUtils.getMonthBetween(start, end);
+        Map<String, EquOeeMonth> resultMap = monthBetween.stream().collect(Collectors.toMap(
+                date -> date,
+                date -> new EquOeeMonth(date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "鏈�"),
+                (existing, replacement) -> existing, // 澶勭悊閿啿绐佺殑鍚堝苟鍑芥暟锛堥�氬父涓嶄細鍐茬獊锛�
+                LinkedHashMap::new // 鎸囧畾浣跨敤LinkedHashMap淇濇寔鎻掑叆椤哄簭
+        ));
+        List<String> proIds = mdcProductionService.findChildByProId(productionId);
+        if (proIds == null || proIds.isEmpty()) {
+            return new ArrayList<>(resultMap.values());
+        }
+        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            return new ArrayList<>(resultMap.values());
+        }
+        for (String month : monthBetween) {
+            BigDecimal oee = mdcOeeInfoService.findByEquIdAndMonth(equipmentIdList, month);
+            if (oee != null) {
+                EquOeeMonth equOeeMonth = resultMap.get(month);
+                equOeeMonth.setOee(oee.setScale(2, RoundingMode.HALF_UP));
+                resultMap.put(month, equOeeMonth);
+            }
+        }
+        return new ArrayList<>(resultMap.values());
+    }
+
+    /**
+     * 璁惧鐘舵�佺粺璁�
+     */
+    @Override
+    public EquOperation equipmentOperationStatistics(String productionId) {
+        EquOperation equOperation = new EquOperation();
+        List<String> proIds = mdcProductionService.findChildByProId(productionId);
+        if (proIds == null || proIds.isEmpty()) {
+            return equOperation;
+        }
+        List<Equipment> equipmentList = equipmentService.listByProds(proIds);
+        if (equipmentList == null || equipmentList.isEmpty()) {
+            return equOperation;
+        }
+        for (Equipment equipment : equipmentList) {
+            if (equipment.getOporation() != null) {
+                switch (equipment.getOporation()) {
+                    case 1:
+                    case 2:
+                        equOperation.setStandby(equOperation.getStandby() + 1);
+                        break;
+                    case 3:
+                        equOperation.setRun(equOperation.getRun() + 1);
+                        break;
+                    case 22:
+                        equOperation.setAlarm(equOperation.getAlarm() + 1);
+                        break;
+                    default:
+                        equOperation.setShutdown(equOperation.getShutdown() + 1);
+                        break;
+                }
+            } else {
+                equOperation.setShutdown(equOperation.getShutdown() + 1);
+            }
+        }
+        return equOperation;
+    }
+
+    /**
+     * 璁惧杩愯淇℃伅
+     */
+    @Override
+    public List<EquRunInfo> equipmentRunInfo(String equipmentId) {
+        List<EquRunInfo> equRunInfoList = new ArrayList<>();
+        Equipment equipment = equipmentService.findByEquId(equipmentId);
+        if (equipment != null) {
+            //濉厖璁惧鍩虹淇℃伅
+            equRunInfoList.add(new EquRunInfo("璁惧鍚嶇О", equipment.getEquipmentname(), ""));
+            equRunInfoList.add(new EquRunInfo("璁惧缂栧彿", equipment.getEquipmentid(), ""));
+            if (equipment.getOporation() != null && equipment.getOporation() != 0) {
+                String saveTableName = equipment.getSavetablename();
+                Map<String, Object> mapData = equipmentWorkLineService.getDataList(saveTableName);
+                if (mapData != null) {
+                    //鑾峰彇 MDC 椹卞姩瀵瑰簲鐨勫睍绀哄弬鏁�   骞舵牴鎹甼ey 鎷艰浠� workData  鏌ヨ鐨勬暟鎹�
+                    List<MdcDriveTypeParamConfig> mdcDriveTypeParamList = mdcDriveTypeParamConfigService.getShowDriveParam(equipment.getDrivetype());
+                    if (mdcDriveTypeParamList != null && !mdcDriveTypeParamList.isEmpty()) {
+                        List<DictModel> dictItems = sysDictService.getDictItems(CommonConstant.DICT_EQUIPMENT_RUN_UNIT);
+                        Map<String, DictModel> resultMap = new HashMap<>();
+                        dictItems.forEach(dictModel -> {
+                            resultMap.put(dictModel.getText(), dictModel);
+                        });
+                        for (MdcDriveTypeParamConfig mdcDriveTypeParamConfig : mdcDriveTypeParamList) {
+                            EquRunInfo equRunInfo = new EquRunInfo();
+                            String englishName = mdcDriveTypeParamConfig.getEnglishName();
+                            String chineseName = mdcDriveTypeParamConfig.getChineseName();
+                            equRunInfo.setKey(chineseName);
+                            if (mapData.containsKey(englishName)) {
+                                Object object = mapData.get(englishName);
+                                String value = "";
+                                if ("CollectTime".equals(englishName)) {
+                                    Date date = object == null ? null : (Date) object;
+                                    value = DateUtils.format(date, DateUtils.STR_DATE_TIME_SMALL);
+                                } else if ("ZUOLAN".equals(equipment.getDrivetype()) && "spindlespeed".equals(englishName) && equipment.getOporation() == 3) {
+                                    // ZUOLAN璁惧涓昏酱杞�熷瓧娈祍pindlespeed
+                                    value = String.valueOf(((new Random().nextInt(35)) + 1) * 100);
+                                } else if ("ZUOLAN".equals(equipment.getDrivetype()) && "spindleload".equals(englishName) && equipment.getOporation() == 3) {
+                                    // ZUOLAN璁惧涓昏酱璐熻嵎瀛楁spindleload
+                                    value = String.valueOf(Integer.valueOf(new Random().nextInt(21)));
+                                } else if ("ZUOLAN".equals(equipment.getDrivetype()) && "spindlebeilv".equals(englishName) && equipment.getOporation() == 3) {
+                                    // ZUOLAN璁惧涓昏酱鍊嶇巼瀛楁spindlebeilv
+                                    value = String.valueOf((new Random().nextInt(13)) * 10);
+                                } else if ("ZUOLAN".equals(equipment.getDrivetype()) && "feedbeilv".equals(englishName) && equipment.getOporation() == 3) {
+                                    // ZUOLAN璁惧杩涚粰鍊嶇巼瀛楁feedbeilv
+                                    value = String.valueOf((new Random().nextInt(13)) * 10);
+                                } else {
+                                    value = object == null ? "" : object.toString();
+                                }
+                                equRunInfo.setValue(value);
+                                // 璁剧疆鍗曚綅
+                                if (resultMap.containsKey(chineseName)) {
+                                    DictModel dictModel = resultMap.get(chineseName);
+                                    equRunInfo.setUnit(dictModel.getValue());
+                                }
+                                equRunInfoList.add(equRunInfo);
+                            }
+                        }
+
+                    }
+                }
+            }
+        }
+        return equRunInfoList;
+    }
+
+    /**
+     * 璁惧鍋滄満缁熻
+     */
+    @Override
+    public List<EquDowntimeInfo> equDowntimeStatistics(String productionId) {
+        List<String> proIds = mdcProductionService.findChildByProId(productionId);
+        if (proIds == null || proIds.isEmpty()) {
+            return null;
+        }
+        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            return null;
+        }
+        LocalDate end = LocalDate.now();
+        LocalDate start = end.plusDays(-30);
+        List<EquDowntimeInfo> result = mdcDowntimeService.equDowntimeStatistics(equipmentIdList, start.toString(), end.toString());
+        result.forEach(equDowntimeInfo -> {
+            equDowntimeInfo.setDuration(equDowntimeInfo.getDuration().setScale(2, RoundingMode.HALF_UP));
+        });
+        return result;
+    }
+
+    /**
+     * 璁惧鎶ヨ鍒楄〃
+     */
+    @Override
+    public List<EquAlarm> equAlarmList(String productionId) {
+        List<EquAlarm> result = new ArrayList<>();
+        List<String> proIds = mdcProductionService.findChildByProId(productionId);
+        if (proIds == null || proIds.isEmpty()) {
+            return null;
+        }
+        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            return null;
+        }
+        List<EquipmentAlarm> equipmentAlarmList =  equipmentAlarmService.list(new LambdaQueryWrapper<EquipmentAlarm>().in(EquipmentAlarm::getEquipmentid, equipmentIdList).orderByDesc(EquipmentAlarm::getCollecttime).isNotNull(EquipmentAlarm::getAlarmNo).last("TOP 15"));
+        if (equipmentAlarmList == null || equipmentAlarmList.isEmpty()) {
+            return null;
+        }
+        for (EquipmentAlarm equipmentAlarm : equipmentAlarmList) {
+            MdcAlarmInfo mdcAlarmInfo = mdcAlarmInfoService.findAlarmContent(equipmentAlarm.getAlarmNo(), equipmentAlarm.getEquipmentid());
+            EquAlarm equAlarm = new EquAlarm();
+            equAlarm.setEquipmentId(equipmentAlarm.getEquipmentid());
+            if (mdcAlarmInfo != null) {
+                equAlarm.setAlarmInfo(mdcAlarmInfo.getAlarmContent());
+            } else {
+                equAlarm.setAlarmInfo(equipmentAlarm.getAlarmContent());
+            }
+            result.add(equAlarm);
+        }
+        return result;
+    }
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAlarm.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAlarm.java
new file mode 100644
index 0000000..63ac695
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAlarm.java
@@ -0,0 +1,21 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-09
+ * @Description: 璁惧鎶ヨ淇℃伅
+ */
+@Data
+public class EquAlarm {
+
+    /**
+     * 璁惧缂栧彿
+     */
+    private String equipmentId;
+    /**
+     * 鎶ヨ淇℃伅
+     */
+    private String alarmInfo;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquDowntimeInfo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquDowntimeInfo.java
new file mode 100644
index 0000000..0e08d53
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquDowntimeInfo.java
@@ -0,0 +1,23 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-09
+ * @Description: 璁惧鍋滄満缁熻
+ */
+@Data
+public class EquDowntimeInfo {
+
+    /**
+     * 鍋滄満鍘熷洜
+     */
+    private String shutdownInfo;
+    /**
+     * 鍋滄満鏃堕暱
+     */
+    private BigDecimal duration;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOeeMonth.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOeeMonth.java
new file mode 100644
index 0000000..ecf89aa
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOeeMonth.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-05-30
+ * @Description:
+ */
+@Data
+public class EquOeeMonth {
+    private String month;
+    private BigDecimal oee = BigDecimal.ZERO;
+
+    public EquOeeMonth(String month) {
+        this.month = month;
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOperation.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOperation.java
new file mode 100644
index 0000000..7788f84
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOperation.java
@@ -0,0 +1,16 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-06
+ * @Description:
+ */
+@Data
+public class EquOperation {
+    private Integer shutdown = 0;
+    private Integer alarm = 0;
+    private Integer standby = 0;
+    private Integer run = 0;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRunInfo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRunInfo.java
new file mode 100644
index 0000000..a394dbd
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRunInfo.java
@@ -0,0 +1,24 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-06
+ * @Description:
+ */
+@Data
+public class EquRunInfo {
+    private String key;
+    private String value;
+    private String unit;
+
+    public EquRunInfo() {
+    }
+
+    public EquRunInfo(String key, String value, String unit) {
+        this.key = key;
+        this.value = value;
+        this.unit = unit;
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquStatus.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquStatus.java
new file mode 100644
index 0000000..aed1047
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquStatus.java
@@ -0,0 +1,15 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-05
+ * @Description:
+ */
+@Data
+public class EquStatus {
+    private String equipmentId;
+    private Integer state;
+    private String plantName;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRate.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRate.java
new file mode 100644
index 0000000..879f6b2
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRate.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-05-30
+ * @Description:
+ */
+@Data
+public class EquUtilRate {
+    private String deviceNum;
+    private BigDecimal utilizationRate = BigDecimal.ZERO;
+
+    public EquUtilRate(String deviceNum) {
+        this.deviceNum = deviceNum;
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRateMonth.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRateMonth.java
new file mode 100644
index 0000000..8983c4c
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRateMonth.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-05-30
+ * @Description:
+ */
+@Data
+public class EquUtilRateMonth {
+    private String month;
+    private BigDecimal utilizationRate = BigDecimal.ZERO;
+
+    public EquUtilRateMonth(String month) {
+        this.month = month;
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOverallEquipmentEfficiencyJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOverallEquipmentEfficiencyJob.java
deleted file mode 100644
index 304cc7b..0000000
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOverallEquipmentEfficiencyJob.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.jeecg.modules.mdc.job;
-
-import lombok.extern.slf4j.Slf4j;
-import org.jeecg.common.util.DateUtils;
-import org.jeecg.modules.mdc.service.IMdcOverallEquipmentEfficiencyService;
-import org.jeecg.modules.mdc.util.ThrowableUtil;
-import org.jeecg.modules.quartz.entity.QuartzJob;
-import org.jeecg.modules.quartz.entity.SysQuartzLog;
-import org.jeecg.modules.quartz.service.IQuartzJobService;
-import org.jeecg.modules.quartz.service.ISysQuartzLogService;
-import org.jeecg.modules.system.service.ISysAnnouncementService;
-import org.quartz.*;
-
-import javax.annotation.Resource;
-import java.util.Date;
-import java.util.List;
-
-/**
- * @Description: 瀹氭椂璁$畻璁惧缁煎悎鏁堢巼OEE浠诲姟
- * @author: LiuS
- * @create: 2023-07-24 10:26
- */
-@PersistJobDataAfterExecution
-@DisallowConcurrentExecution
-@Slf4j
-public class RunningOverallEquipmentEfficiencyJob implements Job {
-
-    /**
-     * 鑻ュ弬鏁板彉閲忓悕淇敼 QuartzJobController涓篃闇�瀵瑰簲淇敼  鏃堕棿锛� yyyyMMdd 渚嬶細 20230414
-     */
-    private String parameter;
-
-    public void setParameter(String parameter) {
-        this.parameter = parameter;
-    }
-
-    @Resource
-    private IQuartzJobService quartzJobService;
-
-    @Resource
-    private ISysAnnouncementService sysAnnouncementService;
-
-    @Resource
-    private ISysQuartzLogService sysQuartzLogService;
-
-    @Resource
-    private IMdcOverallEquipmentEfficiencyService mdcOverallEquipmentEfficiencyService;
-
-    @Override
-    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        SysQuartzLog quartzLog = new SysQuartzLog();
-        quartzLog.setCreateTime(new Date());
-        List<QuartzJob> byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName());
-        if (byJobClassName != null && !byJobClassName.isEmpty()) {
-            quartzLog.setJobId(byJobClassName.get(0).getId());
-        }
-        quartzLog.setParams(this.parameter);
-        log.info("瀹氭椂璁$畻璁惧缁煎悎鏁堢巼OEE浠诲姟 RunningOverallEquipmentEfficiencyJob start!  鏃堕棿:" + DateUtils.now(), this.parameter);
-        long startTime = System.currentTimeMillis();
-        try {
-            mdcOverallEquipmentEfficiencyService.runningOverallEquipmentEfficiency(this.parameter);
-            quartzLog.setIsSuccess(0);
-        } catch (Exception e) {
-            quartzLog.setIsSuccess(-1);
-            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
-            // 鍙戦�佹秷鎭�氱煡
-            sysAnnouncementService.jobSendMessage("瀹氭椂缁熻娈垫椂闂翠换鍔�", quartzLog.getExceptionDetail());
-        }
-        long endTime = System.currentTimeMillis();
-        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
-        sysQuartzLogService.save(quartzLog);
-    }
-
-}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/WebsocketPushEquStatusJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/WebsocketPushEquStatusJob.java
new file mode 100644
index 0000000..b0a70c8
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/WebsocketPushEquStatusJob.java
@@ -0,0 +1,108 @@
+package org.jeecg.modules.mdc.job;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.constant.WebsocketConst;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.modules.board.vo.EquStatus;
+import org.jeecg.modules.mdc.entity.Equipment;
+import org.jeecg.modules.mdc.service.IEquipmentService;
+import org.jeecg.modules.mdc.util.ThrowableUtil;
+import org.jeecg.modules.message.websocket.WebSocket;
+import org.jeecg.modules.quartz.entity.QuartzJob;
+import org.jeecg.modules.quartz.entity.SysQuartzLog;
+import org.jeecg.modules.quartz.service.IQuartzJobService;
+import org.jeecg.modules.quartz.service.ISysQuartzLogService;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.quartz.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-05
+ * @Description: websocket鎺ㄩ�佽澶囩姸鎬佷换鍔�
+ */
+@DisallowConcurrentExecution
+@Slf4j
+public class WebsocketPushEquStatusJob implements Job {
+
+    @Resource
+    private IQuartzJobService quartzJobService;
+
+    @Resource
+    private ISysQuartzLogService sysQuartzLogService;
+
+    @Resource
+    private RedisUtil redisUtil;
+
+    @Resource
+    private WebSocket webSocket;
+
+    @Resource
+    private IEquipmentService equipmentService;
+
+    @Resource
+    private IMdcProductionService mdcProductionService;
+
+    final private static String redisKey = "board:equipment:status:";
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        SysQuartzLog quartzLog = new SysQuartzLog();
+        quartzLog.setCreateTime(new Date());
+        List<QuartzJob> byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName());
+        if (byJobClassName != null && !byJobClassName.isEmpty()) {
+            quartzLog.setJobId(byJobClassName.get(0).getId());
+        }
+        long startTime = System.currentTimeMillis();
+        try {
+            List<Equipment> equipmentList = equipmentService.list();
+            if (equipmentList != null && !equipmentList.isEmpty()) {
+                List<EquStatus> equStatusList = new ArrayList<>();
+                for (Equipment equipment : equipmentList) {
+                    if (equipment.getOporation() == null) {
+                        equipment.setOporation(0);
+                    }
+                    String key = redisKey + equipment.getEquipmentid();
+                    if (redisUtil.hasKey(key)) {
+                        Integer status = (Integer) redisUtil.get(key);
+                        if (!status.equals(equipment.getOporation())) {
+                            EquStatus equStatus = new EquStatus();
+                            equStatus.setEquipmentId(equipment.getEquipmentid());
+                            equStatus.setState(equipment.getOporation());
+                            // 閫氳繃equipmentId鑾峰彇璁惧杞﹂棿鍚嶇О
+                            String productionName = mdcProductionService.findProName(equipment.getEquipmentid());
+                            equStatus.setPlantName(productionName);
+                            equStatusList.add(equStatus);
+                            redisUtil.set(key, equipment.getOporation());
+                        }
+                    } else {
+                        EquStatus equStatus = new EquStatus();
+                        equStatus.setEquipmentId(equipment.getEquipmentid());
+                        equStatus.setState(equipment.getOporation());
+                        // 閫氳繃equipmentId鑾峰彇璁惧杞﹂棿鍚嶇О
+                        String productionName = mdcProductionService.findProName(equipment.getEquipmentid());
+                        equStatus.setPlantName(productionName);
+                        equStatusList.add(equStatus);
+                        redisUtil.set(key, equipment.getOporation());
+                    }
+                }
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put(WebsocketConst.MSG_CMD, "equStatus");
+                jsonObject.put("data", equStatusList);
+                webSocket.sendMessage(jsonObject.toJSONString());
+            }
+            quartzLog.setIsSuccess(0);
+        } catch (Exception e) {
+            quartzLog.setIsSuccess(-1);
+            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
+        }
+        long endTime = System.currentTimeMillis();
+        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
+        sysQuartzLogService.save(quartzLog);
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcAlarmInfoMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcAlarmInfoMapper.java
index 67a2a02..486151e 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcAlarmInfoMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcAlarmInfoMapper.java
@@ -1,6 +1,7 @@
 package org.jeecg.modules.mdc.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.mdc.entity.MdcAlarmInfo;
 
 /**
@@ -11,4 +12,5 @@
  */
 public interface MdcAlarmInfoMapper extends BaseMapper<MdcAlarmInfo> {
 
+    MdcAlarmInfo findAlarmContent(@Param("alarmNo") String alarmNo, @Param("equipmentId") String equipmentId);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeMapper.java
index 5446655..b1ea9c5 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeMapper.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.board.vo.EquDowntimeInfo;
 import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
 import org.jeecg.modules.mdc.entity.MdcDowntime;
 import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
@@ -20,4 +21,6 @@
     IPage<MdcDowntimeDto> pageList(Page<MdcDowntimeDto> page, @Param("mdcDowntimeVo") MdcDowntimeVo mdcDowntimeVo);
 
     List<MdcDowntime> findPlanTimeDuration(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate, @Param("closeType") String closeType);
+
+    List<EquDowntimeInfo> equDowntimeStatistics(@Param("equipmentIdList") List<String> equipmentIdList, @Param("start") String start, @Param("end") String end);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java
index 03bb2bd..5843f5a 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java
@@ -5,6 +5,8 @@
 import org.jeecg.modules.mdc.dto.MdcEquipmentStatisticalDto;
 import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo;
 
+import java.util.List;
+
 /**
  * @Description: 璁惧鍗曟棩杩愯鏁版嵁琛�
  * @Author: jeecg-boot
@@ -28,4 +30,8 @@
     Integer selectProcessLong(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate);
 
     MdcEquipmentStatisticalDto findByEquipmentAndMonth(@Param("equipmentId") String equipmentId, @Param("date") String date);
+
+    MdcEquipmentStatisticalInfo findByEquIdsAndMonth(@Param("equipmentIdList") List<String> equipmentIdList, @Param("month") String month);
+
+    List<MdcEquipmentStatisticalInfo> findByEquipmentAndDate(@Param("equipmentIdList") List<String> equipmentIdList, @Param("date") String date);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOeeInfoMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOeeInfoMapper.java
index 041a098..af54a04 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOeeInfoMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOeeInfoMapper.java
@@ -7,6 +7,9 @@
 import org.jeecg.modules.mdc.entity.MdcOeeInfo;
 import org.jeecg.modules.mdc.vo.MdcOeeInfoVo;
 
+import java.math.BigDecimal;
+import java.util.List;
+
 /**
  * @Description: OEE琛�
  * @Author: lius
@@ -22,4 +25,6 @@
      * @return
      */
     IPage<MdcOeeInfo> pageList(Page<MdcOeeInfo> page, @Param("mdcOeeInfoVo") MdcOeeInfoVo mdcOeeInfoVo);
+
+    BigDecimal findByEquIdAndMonth(@Param("equipmentIdList") List<String> equipmentIdList, @Param("month") String month);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcAlarmInfoMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcAlarmInfoMapper.xml
index 00e233e..4e71d72 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcAlarmInfoMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcAlarmInfoMapper.xml
@@ -2,4 +2,13 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.mdc.mapper.MdcAlarmInfoMapper">
 
+    <select id="findAlarmContent" resultType="org.jeecg.modules.mdc.entity.MdcAlarmInfo">
+        SELECT
+            t1.*
+        FROM
+            mdc_alarm_info t1
+                LEFT JOIN mdc_equipment t2 ON t1.drive_type = t2.drive_type
+        WHERE
+            t2.equipment_id = #{equipmentId} AND t1.alarm_code = #{alarmNo}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml
index e5adea6..898cd96 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml
@@ -40,4 +40,24 @@
             AND t2.downtime_type = #{closeType}
             AND t1.the_date = #{validDate}
     </select>
+
+    <select id="equDowntimeStatistics" resultType="org.jeecg.modules.board.vo.EquDowntimeInfo">
+        SELECT
+            t2.downtime_description AS shutdown_info,
+            SUM ( DATEDIFF( SECOND, t1.start_date, t1.end_date ) ) / 3600.0 AS duration_hours
+        FROM
+            mdc_downtime t1
+                LEFT JOIN mdc_downtime_reason t2 ON t1.reason_id = t2.id
+        WHERE
+            t1.reason_id != ''
+          AND t1.the_date BETWEEN #{start} AND #{end}
+        AND t1.equipment_id IN
+        <foreach collection="equipmentIdList" item="equipmentId" index="index" open="(" close=")" separator=",">
+            #{ equipmentId }
+        </foreach>
+        GROUP BY
+            t2.downtime_description
+        ORDER BY
+            duration_hours DESC
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml
index 2d4f020..e542769 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml
@@ -26,4 +26,34 @@
         WHERE
             equipment_id = #{equipmentId} AND the_date LIKE CONCAT(#{date}, '%')
     </select>
+
+    <select id="findByEquIdsAndMonth" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo">
+        SELECT
+            AVG(open_long) openLong,
+            AVG(close_long) closeLong,
+            AVG(wait_long) waitLong,
+            AVG(process_long) processLong,
+            AVG(error_long) errorLong
+        FROM
+            mdc_equipment_statistical_info
+        WHERE
+            equipment_id IN
+            <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
+                #{ id }
+            </foreach>
+            AND the_date LIKE CONCAT(#{month}, '%')
+    </select>
+
+    <select id="findByEquipmentAndDate" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo">
+        SELECT
+            *
+        FROM
+            mdc_equipment_statistical_info
+        WHERE
+        equipment_id IN
+        <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
+            #{ id }
+        </foreach>
+        AND the_date = #{date}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOeeInfoMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOeeInfoMapper.xml
index 664b2fa..3261ab9 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOeeInfoMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOeeInfoMapper.xml
@@ -27,4 +27,17 @@
         </where>
         ORDER BY the_date DESC, equipment_id ASC
     </select>
+
+    <select id="findByEquIdAndMonth" resultType="java.math.BigDecimal">
+        SELECT
+            AVG(oee)
+        FROM
+            mdc_oee_info
+        WHERE
+            the_date LIKE CONCAT(#{month}, '%')
+          AND equipment_id IN
+        <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
+            #{ id }
+        </foreach>
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeService.java
index 80807ff..db2f22e 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeService.java
@@ -3,11 +3,13 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.board.vo.EquDowntimeInfo;
 import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
 import org.jeecg.modules.mdc.entity.MdcDowntime;
 import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * @Description: 寰呮満鍋滄満琛�
@@ -35,4 +37,6 @@
      * @return
      */
     Integer findPlanTimeDuration(String equipmentId, String validDate, String closeType);
+
+    List<EquDowntimeInfo> equDowntimeStatistics(List<String> equipmentIdList, String start, String end);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java
index 4b27b44..516822e 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java
@@ -4,6 +4,8 @@
 import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * @Description: 璁惧鍗曟棩杩愯鏁版嵁琛�
  * @Author: lius
@@ -29,4 +31,8 @@
     Integer selectProcessLong(String equipmentId, String validDate);
 
     MdcEquipmentStatisticalDto findByEquipmentAndMonth(String equipmentId, String date);
+
+    MdcEquipmentStatisticalInfo findByEquIdsAndMonth(List<String> equipmentIdList, String month);
+
+    List<MdcEquipmentStatisticalInfo> findByEquipmentAndDate(List<String> equipmentIdList, String date);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOeeInfoService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOeeInfoService.java
index f544260..1a0bdab 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOeeInfoService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOeeInfoService.java
@@ -9,6 +9,8 @@
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @Description: OEE琛�
@@ -44,4 +46,5 @@
      */
     void computeOee(MdcOeeComputeVo mdcOeeComputeVo);
 
+    BigDecimal findByEquIdAndMonth(List<String> equipmentIdList, String month);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcAlarmInfoServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcAlarmInfoServiceImpl.java
index 4f20292..12b90a1 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcAlarmInfoServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcAlarmInfoServiceImpl.java
@@ -15,4 +15,8 @@
 @Service
 public class MdcAlarmInfoServiceImpl extends ServiceImpl<MdcAlarmInfoMapper, MdcAlarmInfo> implements IMdcAlarmInfoService {
 
+    @Override
+    public MdcAlarmInfo findAlarmContent(String alarmNo, String equipmentId) {
+        return this.baseMapper.findAlarmContent(alarmNo, equipmentId);
+    }
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceImpl.java
index 8826b16..e914e8e 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang3.StringUtils;
+import org.jeecg.modules.board.vo.EquDowntimeInfo;
 import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
 import org.jeecg.modules.mdc.entity.MdcDowntime;
 import org.jeecg.modules.mdc.mapper.MdcDowntimeMapper;
@@ -68,6 +69,11 @@
         return result;
     }
 
+    @Override
+    public List<EquDowntimeInfo> equDowntimeStatistics(List<String> equipmentIdList, String start, String end) {
+        return this.baseMapper.equDowntimeStatistics(equipmentIdList, start, end);
+    }
+
     private List<String> getEquipmentIds(String userId, MdcDowntimeVo mdcDowntimeVo) {
         if (StringUtils.isNotEmpty(mdcDowntimeVo.getEquipmentId())) {
             return Collections.singletonList(mdcDowntimeVo.getEquipmentId());
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java
index 87b92ae..c149df2 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java
@@ -323,4 +323,14 @@
     public MdcEquipmentStatisticalDto findByEquipmentAndMonth(String equipmentId, String date) {
         return this.baseMapper.findByEquipmentAndMonth(equipmentId, date);
     }
+
+    @Override
+    public MdcEquipmentStatisticalInfo findByEquIdsAndMonth(List<String> equipmentIdList, String month) {
+        return this.baseMapper.findByEquIdsAndMonth(equipmentIdList, month);
+    }
+
+    @Override
+    public List<MdcEquipmentStatisticalInfo> findByEquipmentAndDate(List<String> equipmentIdList, String date) {
+        return this.baseMapper.findByEquipmentAndDate(equipmentIdList, date);
+    }
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java
index d166372..dd23560 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java
@@ -243,4 +243,9 @@
         super.saveBatch(result);
     }
 
+    @Override
+    public BigDecimal findByEquIdAndMonth(List<String> equipmentIdList, String month) {
+        return this.baseMapper.findByEquIdAndMonth(equipmentIdList, month);
+    }
+
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
index b2ccf23..35d7d6d 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
@@ -2,6 +2,9 @@
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 import javax.annotation.Resource;
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
@@ -23,7 +26,7 @@
 @Slf4j
 @ServerEndpoint("/websocket/{userId}")
 public class WebSocket {
-    
+
     /**绾跨▼瀹夊叏Map*/
     private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
 
@@ -34,14 +37,23 @@
     @Resource
     private JeecgRedisClient jeecgRedisClient;
 
+    private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 
     //==========銆恮ebsocket鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�========================================================================================
+
     @OnOpen
     public void onOpen(Session session, @PathParam(value = "userId") String userId) {
         try {
             sessionPool.put(userId, session);
             log.info("銆愮郴缁� WebSocket銆戞湁鏂扮殑杩炴帴锛屾�绘暟涓�:" + sessionPool.size());
+
+            // 鍚姩蹇冭烦浠诲姟锛屾瘡鍒嗛挓鍙戦�佷竴娆″績璺虫秷鎭�
+//            scheduler.scheduleAtFixedRate(() -> {
+//                pushMessage(userId, "{\"cmd\":\"" + WebsocketConst.CMD_USER + "\",\"txt\":\"" + "蹇冭烦鍝嶅簲" + "\"}");
+//            }, 0, 1, TimeUnit.MINUTES);
+
         } catch (Exception e) {
+            log.error("銆愮郴缁� WebSocket銆憃nOpen 寮傚父", e);
         }
     }
 
@@ -50,6 +62,8 @@
         try {
             sessionPool.remove(userId);
             log.info("銆愮郴缁� WebSocket銆戣繛鎺ユ柇寮�锛屾�绘暟涓�:" + sessionPool.size());
+            // 鍙栨秷蹇冭烦浠诲姟
+            scheduler.shutdown();
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -93,12 +107,11 @@
                     log.error(e.getMessage(), e);
                 }
             }
-            log.info("銆愮郴缁� WebSocket銆戠兢鍙戞秷鎭�:" + message);
+            log.info("銆�3D瀹炴椂鏁版嵁 WebSocket銆戞秷鎭�" );
         } catch (Exception e) {
             log.error(e.getMessage(), e);
         }
     }
-
 
     /**
      * ws鎺ュ彈瀹㈡埛绔秷鎭�
@@ -110,14 +123,14 @@
         }else{
             log.debug("銆愮郴缁� WebSocket銆戞敹鍒板鎴风娑堟伅:" + message);
         }
-        
+
         //------------------------------------------------------------------------------
-        JSONObject obj = new JSONObject();
-        //涓氬姟绫诲瀷
-        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
-        //娑堟伅鍐呭
-        obj.put(WebsocketConst.MSG_TXT, "蹇冭烦鍝嶅簲");
-        this.pushMessage(userId, obj.toJSONString());
+//        JSONObject obj = new JSONObject();
+//        //涓氬姟绫诲瀷
+//        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
+//        //娑堟伅鍐呭
+//        obj.put(WebsocketConst.MSG_TXT, "蹇冭烦鍝嶅簲");
+//        this.pushMessage(userId, obj.toJSONString());
         //------------------------------------------------------------------------------
     }
 
@@ -129,11 +142,11 @@
      */
     @OnError
     public void onError(Session session, Throwable t) {
-        log.warn("銆愮郴缁� WebSocket銆戞秷鎭嚭鐜伴敊璇�");
+        log.warn("銆愮郴缁� WebSocket銆戞秷鎭嚭鐜伴敊璇�",t);
         //t.printStackTrace();
     }
     //==========銆愮郴缁� WebSocket鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�========================================================================================
-    
+
 
     //==========銆愰噰鐢╮edis鍙戝竷璁㈤槄妯″紡鈥斺�旀帹閫佹秷鎭��========================================================================================
     /**
@@ -187,5 +200,5 @@
         }
     }
     //=======銆愰噰鐢╮edis鍙戝竷璁㈤槄妯″紡鈥斺�旀帹閫佹秷鎭��==========================================================================================
-    
+
 }
\ No newline at end of file
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
index f53d482..fe64c7a 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
@@ -61,4 +61,8 @@
     List<String> findTeamValue(@Param("userId") String userId, @Param("productionList") List<String> productionList);
 
     List<String> findProIdsByUId(@Param("userId") String userId, @Param("allProductionIds") List<String> allProductionIds);
+
+    List<String> findChildByProId(@Param("productionId") String productionId);
+
+    String findProName(@Param("equipmentId") String equipmentId);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
index 7d0b8f2..ae5f5d3 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
@@ -138,4 +138,67 @@
             </foreach>
           AND user_id = #{userId}
     </select>
+
+    <select id="findChildByProId" resultType="java.lang.String">
+        WITH temp ( id ) AS (
+            SELECT
+                id
+            FROM
+                mdc_production
+            WHERE
+                id = #{ productionId }
+              AND mdc_flag = '1' UNION ALL
+            SELECT
+                a.id
+            FROM
+                mdc_production a
+                    INNER JOIN temp ON a.parent_id = temp.id
+            WHERE
+                a.mdc_flag = '1'
+        ) SELECT
+            *
+        FROM
+            temp
+    </select>
+
+    <select id="findProName" resultType="java.lang.String">
+        WITH production_hierarchy AS (
+            SELECT
+                t3.id,
+                t3.parent_id,
+                t3.production_name,
+                t3.org_type,
+                0 AS level
+            FROM
+                mdc_equipment t1
+                    JOIN
+                mdc_production_equipment t2 ON t1.id = t2.equipment_id
+                    JOIN
+                mdc_production t3 ON t2.production_id = t3.id
+            WHERE
+                t1.equipment_id = #{equipmentId}
+
+            UNION ALL
+            SELECT
+                t4.id,
+                t4.parent_id,
+                t4.production_name,
+                t4.org_type,
+                ph.level + 1
+            FROM
+                production_hierarchy ph
+                    JOIN
+                mdc_production t4 ON ph.parent_id = t4.id
+            WHERE
+                ph.parent_id IS NOT NULL
+        )
+        SELECT TOP 1
+            production_name
+        FROM
+            production_hierarchy
+        WHERE
+            org_type = 2
+        ORDER BY
+            level ASC
+    </select>
 </mapper>
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
index 104a9db..d5d6e64 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
@@ -175,4 +175,14 @@
      * @return
      */
     List<String> findProIdsByUId(String userId, List<String> allProductionIds);
+
+    /**
+     *
+     * @param productionId
+     * @return
+     */
+    List<String> findChildByProId(String productionId);
+
+
+    String findProName(String equipmentId);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
index c502486..a3128e2 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
@@ -627,4 +627,14 @@
             super.update(updateWrapper);
         }
     }
+
+    @Override
+    public List<String> findChildByProId(String productionId) {
+        return this.baseMapper.findChildByProId(productionId);
+    }
+
+    @Override
+    public String findProName(String equipmentId) {
+        return this.baseMapper.findProName(equipmentId);
+    }
 }

--
Gitblit v1.9.3