From cd00884c3db8fa6808b3b5949ab1a2b1459d6bdc Mon Sep 17 00:00:00 2001
From: cuilei <ray_tsu1@163.com>
Date: 星期三, 11 六月 2025 10:36:55 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DocRelativeController.java                            |    3 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java                                     |   23 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeMapper.java                                    |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceOperatorImpl.java                 |  171 ++
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java           |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml                 |   30 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeReasonController.java                      |   23 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/BaseTools.java                                            |    5 
 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-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocRelativeServiceImpl.java                         |    8 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRate.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-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcDowntime.java                                          |   13 
 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-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml                         |   14 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java                        |    1 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java                 |    0 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java                    |   13 
 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                            |    4 
 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-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java                                    |    3 
 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-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                         |    9 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamReportRepairMapper.java                         |    0 
 lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml                                          |   14 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDowntimeVo.java                                            |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/SplitDowntimeVo.java                                          |   70 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java         |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeOperatorController.java                    |   85 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java                           |  340 +++++
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java                 |   33 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java                |   81 -
 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/mdc/mapper/MdcDowntimeOperatorMapper.java                            |   23 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java                                  |    3 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java                                   |   66 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java                              |   99 +
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/WeekMaintenanceStandardImport.java                    |    0 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java                        |    8 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java                  |   39 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml                                   |    6 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java                       |    2 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java                                 |   22 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java                        |    2 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java                              |   13 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml                         |   29 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java       |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOeeInfoMapper.xml                                  |   13 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DeviceGroupServiceImpl.java                         |   23 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOeeMonth.java                                            |   20 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java                      |    2 
 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-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java       |    2 
 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-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml         |   63 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocInfoMapper.xml                                     |    1 
 lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java                                      |   12 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java                               |   53 
 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/MdcOeeInfoServiceImpl.java                          |    5 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java                            |    6 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java                           |   11 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java            |    8 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java                         |    1 
 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-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java                             |  135 +
 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/mdc/job/ScanDowntimeJob.java                                         |    1 
 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-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java                                  |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcAlarmInfoMapper.java                                   |    2 
 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               |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml                                 |   20 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java               |    2 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/AssignFileStreamController.java                   |   10 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java                               |    3 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java                                       |    3 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java                                |    3 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java                                  |   19 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeService.java                                 |    4 
 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 
 /dev/null                                                                                                            |   74 -
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeOperatorService.java                         |   23 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java                       |    9 
 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-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java                                       |  115 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAlarm.java                                               |   21 
 112 files changed, 3,249 insertions(+), 270 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-dnc/src/main/java/org/jeecg/modules/dnc/controller/DocRelativeController.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DocRelativeController.java
index 8b77545..177f4b2 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DocRelativeController.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DocRelativeController.java
@@ -5,7 +5,6 @@
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.base.controller.JeecgController;
-import org.jeecg.modules.dnc.entity.DeviceInfo;
 import org.jeecg.modules.dnc.entity.DocRelative;
 import org.jeecg.modules.dnc.response.CommonCode;
 import org.jeecg.modules.dnc.response.QueryListResponseResult;
@@ -30,7 +29,7 @@
     @ApiOperation(value = "璁惧鍏宠仈鏂囨。琛�-鍒犻櫎璁惧涓嬬殑鏂囨。鎺ュ彛", notes = "璁惧鍏宠仈鏂囨。琛�-鍒犻櫎璁惧涓嬬殑鏂囨。鎺ュ彛")
     @DeleteMapping("/delete/device/{docId}/{deviceId}")
     public ResponseResult deleteDocByDeviceId(@PathVariable("docId") String docId, @PathVariable("deviceId") String deviceId) {
-        boolean b = relativeService.deleteDocByAttr(docId, 4, deviceId);
+        boolean b = relativeService.deleteDocByAttr(docId, 7, deviceId);
         if(b)
             return new ResponseResult(CommonCode.SUCCESS);
         return new ResponseResult(CommonCode.FAIL);
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java
new file mode 100644
index 0000000..d81e2ea
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java
@@ -0,0 +1,22 @@
+package org.jeecg.modules.dnc.listener;
+import java.io.File;
+import java.util.List;
+
+public class DirectoryValidator {
+    public static void validatePaths(List<String> paths) {
+        //鏍规嵁閰嶇疆鐨勭洰褰曡繘琛屾牎楠岋紝鍙互淇敼yml鏂囦欢瀵瑰簲鐨勭洃鎺х洰褰曟潵鏀瑰彉鏍¢獙鏁伴噺
+        if (paths == null || paths.size() < 3) {
+            throw new IllegalArgumentException("蹇呴』閰嶇疆涓変釜鐩戞帶鐩綍");
+        }
+
+        for (String path : paths) {
+            File dir = new File(path);
+            if (!dir.exists() || !dir.isDirectory()) {
+                throw new IllegalArgumentException("鏃犳晥鐨勭洃鎺х洰褰�: " + path);
+            }
+            if (!dir.canRead()) {
+                throw new SecurityException("鐩綍涓嶅彲璇�: " + path);
+            }
+        }
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
new file mode 100644
index 0000000..59eb0af
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
@@ -0,0 +1,115 @@
+package org.jeecg.modules.dnc.listener;
+import org.apache.commons.io.monitor.FileAlterationListener;
+import org.apache.commons.io.monitor.FileAlterationObserver;
+import org.jeecg.common.util.FileUtil;
+import org.jeecg.modules.dnc.service.IDocInfoService;
+import org.jeecg.modules.dnc.utils.file.FileUtilS;
+import org.jeecg.modules.message.enums.DeployEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.util.Objects;
+
+@Component
+public class FileListener implements FileAlterationListener {
+    private static final Logger log = LoggerFactory.getLogger(FileListener.class);
+
+    @Value("${deploy.deployType}")
+    private String deployType;    //宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓哄伐鎺х綉 1涓烘秹瀵嗙綉
+
+    @Autowired
+    private IDocInfoService docInfoService;  // 鏂囨。鏈嶅姟
+
+    @Override
+    public void onStart(FileAlterationObserver observer) {
+        log.info("寮�濮嬬洃鍚洰褰�: {}", observer.getDirectory().getAbsolutePath());
+    }
+
+    @Override
+    public void onDirectoryCreate(File directory) {
+        log.info("[鐩綍鍒涘缓]: {}", directory.getAbsolutePath());
+    }
+
+    @Override
+    public void onDirectoryChange(File directory) {
+        log.info("[鐩綍淇敼]: {}", directory.getAbsolutePath());
+    }
+
+    @Override
+    public void onDirectoryDelete(File directory) {
+        log.info("[鐩綍鍒犻櫎]: {}", directory.getAbsolutePath());
+    }
+
+    @Override
+    public void onFileCreate(File file) {
+        String filePath = file.getAbsolutePath();
+        log.info("[鏂板缓]: {}", filePath);
+        if (DeployEnum.GW.getCode().equals(deployType)) {
+            //宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽
+            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
+                handleIndustrialDocFile(file);
+            }
+        }else {
+            //娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽锛堢▼搴忓洖浼狅級
+            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
+                handleSecretDocFile(file);
+            }
+        }
+    }
+    @Override
+    public void onFileChange(File file) {
+        log.info("[淇敼]: {}", file.getAbsolutePath());
+    }
+
+    @Override
+    public void onFileDelete(File file) {
+        log.info("[鍒犻櫎]: {}", file.getAbsolutePath());
+    }
+
+    @Override
+    public void onStop(FileAlterationObserver observer) {
+        log.info("缁撴潫鐩戝惉鐩綍: {}", observer.getDirectory().getAbsolutePath());
+    }
+
+    /**
+     * 宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽
+     * @param file
+     */
+    private void handleIndustrialDocFile(File file) {
+        log.info("宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", file.getAbsolutePath());
+        try {
+            if (Objects.equals(FileUtil.getFileSuffix(file.getName()), "nc")) {
+                boolean success = docInfoService.addDocInfoAnalysisGwNcService(file.getAbsolutePath(), file);
+                if (success) {
+                    FileUtilS.copyFileRec(file.getAbsolutePath());
+                    FileUtilS.fileRecDelete(file.getAbsolutePath());
+                }
+            }else if (Objects.equals(FileUtil.getFileSuffix(file.getName()), "txt")) {
+                //todo 鏄惁瑙f瀽宸ヤ綔娴佹搷浣�
+
+            }
+        } catch (Exception e) {
+            log.error("宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", e.getMessage());
+        }
+    }
+
+    /**
+     * 娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽锛堢▼搴忓洖浼狅級
+     * @param file
+     */
+    private void handleSecretDocFile(File file) {
+        log.info("娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", file.getAbsolutePath());
+        try {
+            boolean b= docInfoService.addDocInfoAnalysisSmwNcService(file.getAbsolutePath(), file);
+
+        }catch (Exception e) {
+            log.error("娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", e.getMessage());
+        }
+    }
+
+
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java
new file mode 100644
index 0000000..e6b3d86
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java
@@ -0,0 +1,53 @@
+package org.jeecg.modules.dnc.listener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.boot.web.servlet.ServletContextInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class FileMonitorBootstrap implements ApplicationRunner {
+
+    private MultiPathMonitor monitor;
+
+    @Autowired
+    private FileMonitorConfig config;
+
+    @Autowired
+    private FileListener listener;
+
+    @Bean
+    public MultiPathMonitor fileMonitor() {
+        return new MultiPathMonitor(
+                config.getPaths(),
+                config.getInterval(),
+                listener
+        );
+    }
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        monitor = fileMonitor();
+        monitor.start();
+    }
+
+    // 鍦ㄥ簲鐢ㄥ叧闂椂鍋滄鐩戞帶
+    @Bean
+    public ServletContextInitializer stopMonitorOnShutdown() {
+        return servletContext -> {
+            servletContext.addListener(new javax.servlet.ServletContextListener() {
+                @Override
+                public void contextDestroyed(javax.servlet.ServletContextEvent sce) {
+                    try {
+                        if (monitor != null) {
+                            monitor.stop();
+                        }
+                    } catch (Exception e) {
+                        System.err.println("鍋滄鐩戞帶鏃跺嚭閿�: " + e.getMessage());
+                    }
+                }
+            });
+        };
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java
new file mode 100644
index 0000000..8be5968
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.dnc.listener;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Setter
+@Getter
+@Component
+@ConfigurationProperties(prefix = "file.monitor")
+public class FileMonitorConfig {
+    private List<String> paths = new ArrayList<>();
+    private long interval = 10000L; // 榛樿10绉�
+
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java
new file mode 100644
index 0000000..267dfc8
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java
@@ -0,0 +1,66 @@
+package org.jeecg.modules.dnc.listener;
+import org.apache.commons.io.monitor.FileAlterationMonitor;
+import org.apache.commons.io.monitor.FileAlterationObserver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.util.List;
+
+public class MultiPathMonitor {
+    private static final Logger log = LoggerFactory.getLogger(MultiPathMonitor.class);
+
+    private final List<String> paths;
+    private final FileListener listener;
+    private final long interval;
+    private final FileAlterationMonitor monitor;
+
+    public MultiPathMonitor(List<String> paths, long interval, FileListener listener) {
+        // 楠岃瘉鐩綍
+        DirectoryValidator.validatePaths(paths);
+        this.paths = paths;
+        this.interval = interval;
+        this.listener = listener;
+        this.monitor = new FileAlterationMonitor(interval);
+    }
+
+    public void start() {
+        // 涓烘瘡涓矾寰勫垱寤虹嫭绔嬬殑瑙傚療鑰�
+        paths.forEach(path -> {
+            FileAlterationObserver observer = new FileAlterationObserver(new File(path));
+            observer.addListener(listener);
+            monitor.addObserver(observer);
+            log.info("寮�濮嬬洃鎺х洰褰�: {}", path);
+        });
+
+        try {
+            monitor.start();
+            log.info("鏂囦欢鐩戞帶鍣ㄥ凡鍚姩锛岀洃鎺х洰褰曟暟閲�: {}", paths.size());
+        } catch (Exception e) {
+            log.error("鐩戞帶鍚姩澶辫触", e);
+            throw new RuntimeException("鐩戞帶鍚姩澶辫触", e);
+        }
+    }
+
+    public void stop() throws Exception {
+        if (monitor != null) {
+            monitor.stop();
+            log.info("鏂囦欢鐩戞帶鍣ㄥ凡鍋滄");
+        }
+    }
+
+    // 鍔ㄦ�佹坊鍔犳柊鐩綍
+    public void addMonitorPath(String newPath) {
+        File dir = new File(newPath);
+        if (!dir.exists() || !dir.isDirectory() || !dir.canRead()) {
+            log.error("鏃犳硶娣诲姞鏃犳晥鐩綍: {}", newPath);
+            return;
+        }
+
+        FileAlterationObserver newObserver = new FileAlterationObserver(dir);
+        newObserver.addListener(listener);
+        monitor.addObserver(newObserver);
+        paths.add(newPath);
+        log.info("鏂板鐩戞帶鐩綍: {}", newPath);
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocInfoMapper.xml b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocInfoMapper.xml
index 751da89..f725e8d 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocInfoMapper.xml
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocInfoMapper.xml
@@ -66,6 +66,7 @@
         ,u.doc_status
         ,u.publish_file_id
         ,u.publish_version
+        ,u.doc_dispatch_status
         ,u.description
         ,u.CREATE_TIME
         ,u.create_by
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java
index 6696d49..15990e5 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java
@@ -14,6 +14,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.util.List;
 
 public interface IDocInfoService extends IService<DocInfo> {
@@ -47,6 +48,28 @@
      */
     boolean addDocInfoRec(String pathFile,File fileRec);
 
+    /**
+     * 瑙f瀽NC鏂囨。閫氱敤鏂规硶锛堝伐鎺цВ鏋愭秹瀵嗭級
+     * @param pathFile,fileRec
+     * @return
+     */
+    boolean addDocInfoAnalysisGwNcService(String pathFile,File fileRec) throws FileNotFoundException;
+
+    /**
+     * 绋嬪簭鍥炰紶锛堟秹瀵嗚В鏋愬伐鎺э級
+     * @param pathFile
+     */
+    boolean addDocInfoAnalysisSmwNcService(String pathFile,File fileRec);
+
+    /**
+     * 鏂囨。瑙f瀽
+     * @param equipmentId
+     * @param fileRec
+     * @param fileNameSuffix
+     * @param fileNameNew
+     * @param filePath
+     * @return
+     */
     boolean addDocInfoRecService(String equipmentId,File fileRec,String fileNameSuffix,String fileNameNew,String filePath );
     /**
      * 鍏ュ簱鎿嶄綔 鏂囨。瀵瑰簲鏂囦欢鍗囩増
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java
index 07d23d7..2d1c271 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java
@@ -182,7 +182,18 @@
         List<Cutter> cutterList = extractToolAfterM6(docInfo,list);
         // 淇濆瓨鍒�鍏�
         if (!cutterList.isEmpty()) {
-            this.saveBatch(cutterList);
+            List<Cutter> newCutterList = new ArrayList<>();
+            //楠岃瘉鍒�鍏锋槸鍚﹀凡缁忓瓨鍦�
+            cutterList.forEach(item -> {
+                List<Cutter> otherCuttersWithSameNo = checkCutterNo(item);
+                if (otherCuttersWithSameNo == null || otherCuttersWithSameNo.isEmpty()) {
+                    newCutterList.add(item);
+                }
+            });
+            if (newCutterList.isEmpty()) {
+                return Result.error("鏈彂鐜板垁鍏风殑鍙傛暟淇℃伅娉ㄩ噴锛屾棤娉曟彁鍙栧垁鍏蜂俊鎭�");
+            }
+            this.saveBatch(newCutterList);
             //TODO鍙戦�佸垁鍏风鐞嗘暟鎹�
             return Result.OK("鎻愬彇鍒�鍏蜂俊鎭垚鍔�");
         }else {
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DeviceGroupServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DeviceGroupServiceImpl.java
index 539911d..b6cf3d5 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DeviceGroupServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DeviceGroupServiceImpl.java
@@ -1,27 +1,21 @@
 package org.jeecg.modules.dnc.service.impl;
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.apache.shiro.SecurityUtils;
-import org.jeecg.common.system.vo.LoginUser;
+import org.apache.commons.lang3.StringUtils;
 import org.jeecg.modules.dnc.dto.DeviceGroupExt;
-
+import org.jeecg.modules.dnc.entity.DeviceGroup;
+import org.jeecg.modules.dnc.entity.DeviceGroupPermission;
+import org.jeecg.modules.dnc.entity.DevicePermissionStream;
 import org.jeecg.modules.dnc.exception.ExceptionCast;
 import org.jeecg.modules.dnc.mapper.DeviceGroupMapper;
 import org.jeecg.modules.dnc.response.CommonCode;
 import org.jeecg.modules.dnc.response.DeviceGroupCode;
-import org.jeecg.modules.dnc.response.UcenterCode;
-
-import org.jeecg.modules.dnc.service.*;
-import org.jeecg.modules.dnc.ucenter.Department;
+import org.jeecg.modules.dnc.service.IDeviceGroupPermissionService;
+import org.jeecg.modules.dnc.service.IDeviceGroupService;
+import org.jeecg.modules.dnc.service.IDevicePermissionStreamService;
 import org.jeecg.modules.dnc.utils.ValidateUtil;
-import org.jeecg.modules.dnc.entity.*;
 import org.jeecg.modules.system.entity.SysUser;
-import org.jeecg.modules.dnc.utils.file.FileUtilS;
-import org.apache.commons.lang3.StringUtils;
-
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -36,9 +30,6 @@
     private IDeviceGroupPermissionService groupPermissionService;
     @Autowired
     private IDevicePermissionStreamService devicePermissionStreamService;
-    @Autowired
-    @Lazy
-    private IDeviceInfoService deviceInfoService;
 
 
     //  鏌ヨ鎵�浠ョ埗鑺傜偣
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
index d6de4b9..a32370c 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
@@ -16,6 +16,8 @@
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.dnc.entity.*;
 import org.jeecg.modules.dnc.exception.ExceptionCast;
+import org.jeecg.modules.dnc.ext.NcTxtFilePathInfo;
+import org.jeecg.modules.dnc.listener.FileMonitorConfig;
 import org.jeecg.modules.dnc.mapper.DocInfoMapper;
 import org.jeecg.modules.dnc.request.DocInfoQueryRequest;
 import org.jeecg.modules.dnc.request.DocInfoUploadRequest;
@@ -27,7 +29,9 @@
 import org.jeecg.modules.dncFlow.entity.DispatchFile;
 import org.jeecg.modules.dncFlow.service.IDispatchFileService;
 import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
 import org.jeecg.modules.system.entity.SysParams;
+import org.jeecg.modules.system.service.IMdcProductionService;
 import org.jeecg.modules.system.service.ISysParamsService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,13 +43,22 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Scanner;
 import java.util.stream.Collectors;
 
 @Service
 public class DocInfoServiceImpl extends ServiceImpl<DocInfoMapper, DocInfo> implements IDocInfoService {
+    @Autowired
+    private FileMonitorConfig config;
+    @Autowired
+    private IMdcEquipmentService iMdcEquipmentService;
+    @Autowired
+    private IMdcProductionService iMdcProductionService;
     @Autowired
     private IDocClassificationService docClassificationService;
     @Autowired
@@ -55,11 +68,6 @@
     @Autowired
     @Lazy
     private IDocRelativeService docRelativeService;
-    @Autowired
-    @Lazy
-    private IDeviceInfoService deviceInfoService;
-    @Autowired
-    private IDeviceGroupService deviceGroupService;
     @Autowired
     private IDispatchFileService dispatchFileService;
     @Autowired
@@ -134,28 +142,28 @@
         docInfo.setPublishVersion(docFile.getDocVersion());
         docInfo.setPublishFileId(docFile.getFileId());
         //COPY
-        DeviceInfo deviceInfo= deviceInfoService.getById(uploadRequest.getAttributionId());
-        if (deviceInfo != null) {
-            List<String> strings =  deviceGroupService.findListParentTreeAll(deviceInfo.getGroupId());
+        MdcEquipment mdcEquipment= iMdcEquipmentService.getById(uploadRequest.getAttributionId());
+        if (mdcEquipment != null) {
+            List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
             boolean copyFileNc = false;
             if (strings != null && !strings.isEmpty()) {
                 String path = org.apache.commons.lang3.StringUtils.join(strings.toArray(), "/");
                 copyFileNc = FileUtilS.copyFile(fileUploadResult.getFilePath()+"/" + fileUploadResult.getFileEncodeName(),
-                        path+ "/" + deviceInfo.getDeviceNo() ,fileNameAll);
+                        path+ "/" + mdcEquipment.getEquipmentId() ,fileNameAll);
                 if (!copyFileNc) {
                     ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
                 } else {
-                    FileUtilS.deleteZipFromToSend(path + "/"+ deviceInfo.getDeviceNo(),
+                    FileUtilS.deleteZipFromToSend(path + "/"+ mdcEquipment.getEquipmentId(),
                             docFile.getFileName(),docFile.getFileSuffix());
 
                 }
             } else {
                 copyFileNc =FileUtilS.copyFile(fileUploadResult.getFilePath()+"/" + fileUploadResult.getFileEncodeName(),
-                        deviceInfo.getDeviceNo() ,fileNameAll);
+                        mdcEquipment.getEquipmentId() ,fileNameAll);
                 if (!copyFileNc) {
                     ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
                 } else {
-                    FileUtilS.deleteZipFromToSend(fileUploadResult.getFilePath()+"/" + fileUploadResult.getFileEncodeName() + "/"+ deviceInfo.getDeviceNo(),
+                    FileUtilS.deleteZipFromToSend(fileUploadResult.getFilePath()+"/" + fileUploadResult.getFileEncodeName() + "/"+ mdcEquipment.getEquipmentId(),
                             docFile.getFileName(),docFile.getFileSuffix());
 
                 }
@@ -212,8 +220,8 @@
         if (StringUtils.isEmpty(deviceNo)) {
             return false;
         }
-        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
-        if (deviceInfo == null) {
+        MdcEquipment mdcEquipment = iMdcEquipmentService.findEquipmentNameByEquipmentId(deviceNo);
+        if (mdcEquipment == null) {
             return false;
         }
         String fileName = FileUtilS.getFilenameNonSuffix(file.getOriginalFilename());
@@ -222,7 +230,7 @@
         if(fileUploadResult == null) {
             return false;
         }
-        DocInfo en = findByAttrAndDocName(fileName, 4, deviceInfo.getDeviceId());
+        DocInfo en = findByAttrAndDocName(fileName, 7, mdcEquipment.getId());
         if(en != null) {
             return false;
         }
@@ -235,9 +243,9 @@
         docInfo.setDocStatus(1);
         docInfo.setSyncStatus(2);
         DocRelative docRelative = new DocRelative();
-        docRelative.setAttributionId(deviceInfo.getDeviceId());
+        docRelative.setAttributionId(mdcEquipment.getId());
         docRelative.setDocId(docInfo.getDocId());
-        docRelative.setAttributionType(4);
+        docRelative.setAttributionType(7);
         docRelative.setClassificationId(docClass.getClassificationId());
         boolean b = docRelativeService.save(docRelative);
         if(!b) {
@@ -260,6 +268,84 @@
         return saveBool;
     }
 
+    /**
+     * 瑙f瀽NC鏂囨。閫氱敤鏂规硶
+     * @param pathFile,fileRec
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean addDocInfoAnalysisGwNcService(String pathFile,File file) throws FileNotFoundException {
+        String line;
+        int count = 0;
+        String loFilePath = config.getPaths().get(0)+"/" + file.getName();
+        FileInputStream fis = new FileInputStream(loFilePath);
+        NcTxtFilePathInfo result = new NcTxtFilePathInfo();
+        Scanner sc = new Scanner(fis, "UTF-8");
+        while (count < 8 &&  sc.hasNext()) {
+            line = sc.nextLine();
+            if (count ==0) {
+                result.setFileTxtName(line.trim());
+            } else  if (count ==1) {
+                result.setFileNcName(line.trim());
+            }else  if (count ==2) {
+                result.setOrigFileName(line.trim());
+            }else  if (count ==3) {
+                result.setOrigFileSuffix(line.trim());
+            }else  if (count ==4) {
+                result.setFilePath(line.trim());
+            }else  if (count ==5) {
+                result.setEquipmentId(line.trim());
+            }else  if (count ==6) {
+                result.setFileAddOrDelete(Integer.valueOf(line.trim()));
+            }else  if (count == 7) {
+                result.setFileSize(line.trim());
+            }
+            count++;
+        }
+        sc.close();
+        if (result.getFileAddOrDelete() != null ) {
+            if ( result.getFileAddOrDelete()==1) {
+                String path = config.getPaths().get(0) +"/" + result.getFileNcName()+ ".NC";
+                    if (org.apache.commons.lang3.StringUtils.isNotBlank(result.getFileNcName()) &&
+                            result.getFileNcName().equals("null")) {
+                        //鏂囦欢寰呭鐞�
+                        //澶囦唤鏁版嵁
+                        FileUtilS.deleteFileNewRec(loFilePath);
+                    }
+                File ncFile = new File(path);
+                //宸茬粡瀛樺湪鏂囦欢闇�瑕佸浠�
+                String size = String.valueOf(ncFile.length());
+                if (!size.equals(result.getFileSize())) {
+                    return false;
+                }
+                boolean bool = this.addDocInfoRecService(result.getEquipmentId(),
+                        ncFile,result.getOrigFileSuffix(),
+                        FileUtilS.getFilenameNonSuffix(result.getOrigFileName())
+                        ,result.getFilePath());
+                if (bool) {
+                    FileUtilS.deleteFileNewRec(path);
+                    FileUtilS.deleteFileNewRec(loFilePath);
+                }else {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+
+    /**
+     * 绋嬪簭鍥炰紶锛堟秹瀵嗚В鏋愬伐鎺э級
+     * @param pathFile
+     */
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean addDocInfoAnalysisSmwNcService(String pathFile,File fileRec){
+        //todo 绋嬪簭鍥炰紶
+        return true;
+    }
+
     @Override
     @Transactional(rollbackFor = {Exception.class})
     public boolean addDocInfoRecService(String equipmentId,File fileRec,String fileNameSuffix,String fileNameNew,String filePath ) {
@@ -272,12 +358,11 @@
             ExceptionCast.cast(DocumentCode.DOC_CLASS_ERROR);
         }
         //鏍规嵁璁惧缂栧彿鏌ヨ鏁版嵁
-        String deviceNo = equipmentId;
-        if (StringUtils.isEmpty(deviceNo)) {
+        if (StringUtils.isEmpty(equipmentId)) {
             return false;
         }
-        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
-        if (deviceInfo == null) {
+        MdcEquipment mdcEquipment = iMdcEquipmentService.findEquipmentNameByEquipmentId(equipmentId);
+        if (mdcEquipment == null) {
             return false;
         }
         String fileName = FileUtilS.getFilenameNonSuffix(file.getOriginalFilename());
@@ -286,7 +371,7 @@
         if(fileUploadResult == null) {
             return false;
         }
-        DocInfo en = findByAttrAndDocName(fileName, 4, deviceInfo.getDeviceId());
+        DocInfo en = findByAttrAndDocName(fileName, 7, mdcEquipment.getId());
         if(en != null) {
             return false;
         }
@@ -299,9 +384,9 @@
         docInfo.setDocStatus(1);
         docInfo.setSyncStatus(2);
         DocRelative docRelative = new DocRelative();
-        docRelative.setAttributionId(deviceInfo.getDeviceId());
+        docRelative.setAttributionId(mdcEquipment.getId());
         docRelative.setDocId(docInfo.getDocId());
-        docRelative.setAttributionType(4);
+        docRelative.setAttributionType(7);
         docRelative.setClassificationId(docClass.getClassificationId());
         boolean b = docRelativeService.save(docRelative);
         if(!b) {
@@ -678,7 +763,7 @@
     public boolean deleteByDeviceId(String deviceId) {
         if(!ValidateUtil.validateString(deviceId))
             ExceptionCast.cast(CommonCode.INVALID_PARAM);
-        Integer attrType = 4;
+        Integer attrType = 7;
         /*boolean b = docFileService.deleteByDocAttr(attrType, deviceId);
         if(!b)
             ExceptionCast.cast(CommonCode.FAIL);
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocRelativeServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocRelativeServiceImpl.java
index 0661d61..768e547 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocRelativeServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocRelativeServiceImpl.java
@@ -11,8 +11,6 @@
 import org.jeecg.modules.dnc.mapper.DocInfoMapper;
 import org.jeecg.modules.dnc.mapper.DocRelativeMapper;
 import org.jeecg.modules.dnc.response.CommonCode;
-import org.jeecg.modules.dnc.service.IDeviceGroupService;
-import org.jeecg.modules.dnc.service.IDeviceInfoService;
 import org.jeecg.modules.dnc.service.IDocRelativeService;
 import org.jeecg.modules.dnc.utils.ValidateUtil;
 import org.jeecg.modules.dnc.utils.date.DateUtil;
@@ -31,12 +29,6 @@
 
     @Autowired
     private DocInfoMapper docInfoMapper;
-    @Autowired
-    private IDeviceInfoService deviceInfoService;
-    @Autowired
-    private IDeviceGroupService deviceGroupService;
-//    @Value("${securedoc.localFilePath}")
-//    private String localFilePath;
     @Autowired
     private IMdcEquipmentService iMdcEquipmentService;
     @Autowired
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java
index 1061927..183133e 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java
@@ -83,7 +83,7 @@
         }
 
         // 鎷兼帴瀹屾暣缂栧彿
-        return yearSuffix + code + user.getUsername() + serialSuffix;
+        return yearSuffix+"-"+ code+"-"+ user.getUsername()+"-"+ serialSuffix;
     }
 
     /**
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java
index f033e30..82587b2 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java
@@ -19,6 +19,8 @@
 import org.jeecg.modules.dnc.response.*;
 import org.jeecg.modules.dnc.service.*;
 import org.jeecg.modules.dnc.utils.ValidateUtil;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
 import org.jeecg.modules.system.entity.MdcProduction;
 import org.jeecg.modules.system.entity.SysUser;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,8 +41,7 @@
     @Autowired
     private IProcessSpecVersionService processSpecVersionService;
     @Autowired
-    @Lazy
-    private IDeviceInfoService deviceInfoService;
+    private IMdcEquipmentService mdcEquipmentService;
     @Autowired
     private IPermissionStreamNewService permissionStreamNewService;
     @Autowired
@@ -259,8 +260,8 @@
     public List<ProcessStream> validateDeviceProcessInfo(String pnCode, String deviceNo) {
         if(!ValidateUtil.validateString(pnCode) || !ValidateUtil.validateString(deviceNo))
             ExceptionCast.cast(CommonCode.INVALID_PARAM);
-        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
-        if(deviceInfo == null)
+        MdcEquipment mdcEquipment = mdcEquipmentService.findEquipmentNameByEquipmentId(deviceNo);
+        if(mdcEquipment == null)
             ExceptionCast.cast(DeviceCode.DEVICE_NOT_EXIST);
         PermissionStream stream = componentInfoService.validateComponentOrPartsPnCode(pnCode);
         if(stream == null)
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/AssignFileStreamController.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/AssignFileStreamController.java
index 5b8d49b..26ae973 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/AssignFileStreamController.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/AssignFileStreamController.java
@@ -88,16 +88,6 @@
         return new DataResponseResult<>(CommonCode.SUCCESS, b);
     }
 
-    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵爜浼犺緭绋嬪簭 涓嶇粡杩囧鎵� 鏂囦欢瀛樺湪閲囩敤瑕嗙洊")
-    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵爜浼犺緭绋嬪簭 涓嶇粡杩囧鎵� 鏂囦欢瀛樺湪閲囩敤瑕嗙洊", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵爜浼犺緭绋嬪簭 涓嶇粡杩囧鎵� 鏂囦欢瀛樺湪閲囩敤瑕嗙洊")
-    @PostMapping("/transfer/doc")
-    public ResponseResult transferDocFile(String pnCode, String deviceNo) {
-        boolean b = assignFileStreamService.transferDocFile(pnCode, deviceNo);
-        if(b)
-            return new ResponseResult(CommonCode.SUCCESS);
-        return new ResponseResult(CommonCode.FAIL);
-    }
-
     @GetMapping(value = "/selectVoById")
     public Result<AssignFileStream> selectVoById(@RequestParam(name="id") String id){
         return Result.OK(assignFileStreamService.getAssignFileStreamDetail(id));
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java
index 28cb20d..dc0ef87 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java
@@ -84,12 +84,4 @@
      * @return
      */
     Boolean getFlowableEnable();
-
-    /**
-     * 鎵爜浼犺緭绋嬪簭 涓嶇粡杩囧鎵� 鏂囦欢瀛樺湪閲囩敤瑕嗙洊
-     * @param pnCode
-     * @param deviceNo
-     * @return
-     */
-    boolean transferDocFile(String pnCode, String deviceNo);
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java
index a287e73..70ab35e 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java
@@ -25,7 +25,6 @@
 import org.jeecg.modules.dnc.utils.date.DateUtil;
 import org.jeecg.modules.dnc.utils.file.FileUtilS;
 import org.jeecg.modules.dncFlow.entity.AssignFileStream;
-import org.jeecg.modules.dncFlow.entity.ToEquipmentTask;
 import org.jeecg.modules.dncFlow.ext.AssignFileStreamExt;
 import org.jeecg.modules.dncFlow.mapper.AssignFileStreamMapper;
 import org.jeecg.modules.dncFlow.request.ApproveBatchRequest;
@@ -33,7 +32,6 @@
 import org.jeecg.modules.dncFlow.request.AssignFileStreamQueryRequest;
 import org.jeecg.modules.dncFlow.request.TaskRequest;
 import org.jeecg.modules.dncFlow.service.IAssignFileStreamService;
-import org.jeecg.modules.dncFlow.service.IToEquipmentTaskService;
 import org.jeecg.modules.dncFlow.vo.AssignFlowTaskVo;
 import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
 import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
@@ -73,13 +71,7 @@
     @Autowired
     private IDocInfoService docInfoService;
     @Autowired
-    private IProcessStreamService processStreamService;
-    @Autowired
     private IDocClassificationService classificationService;
-    @Autowired
-    private IToEquipmentTaskService equipmentTaskService;
-    @Autowired
-    private IDeviceInfoService deviceInfoService;
     @Autowired
     private IDocFileService docFileService;
     @Autowired
@@ -107,11 +99,9 @@
     @Autowired
     private IDncPassLogService dncPassLogService;
     @Value("${deploy.deployType}")
-    //宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓哄伐鎺х綉 1涓烘秹瀵嗙綉
-    private String deployType;
+    private String deployType;    //宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓哄伐鎺х綉 1涓烘秹瀵嗙綉
     @Value("${deploy.secretFolder}")
-    //娑夊瘑缃戜紶杈搉c鏂囦欢澶�
-    private String secretFolder;
+    private String secretFolder;    //娑夊瘑缃戜紶杈搉c鏂囦欢澶�
 
     @Override
     @Transactional(rollbackFor = {Exception.class})
@@ -138,7 +128,6 @@
      */
     public String getDeviceSpecialChar(String deviceId, String fileId){
         //鏇挎崲涓簃dc璁惧琛�
-//        DeviceInfo deviceInfo = deviceInfoService.getById(deviceId);
         MdcEquipment mdcEquipment = iMdcEquipmentService.getById(deviceId);
         if(mdcEquipment == null)
             ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE);
@@ -232,6 +221,9 @@
         //鏉冮檺鏍¢獙
         validateParams(stream);
         DocInfo docInfo = getDocInfo(stream);
+        //淇敼鍘熸湁鐘舵��
+        docInfo.setDocDispatchStatus(4);
+        docInfoService.updateById(docInfo);
         MdcEquipment mdcEquipment = getMdcEquipment(stream);
         DocFile docFile = getDocFile(stream);
         DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(stream.getDocId(), 7, stream.getDeviceId());
@@ -344,6 +336,9 @@
             DocFile docFile = docFileService.getById(en.getFileId());
             if(docFile == null)
                 ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
+            //淇敼鍘熸湁鐘舵��
+            docInfo.setDocDispatchStatus(4);
+            docInfoService.updateById(docInfo);
             DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(en.getDocId(),7, en.getDeviceId());
             if(deviceDoc != null) {
                 // 鍒犻櫎 澶囦唤  瑕嗙洊 鍘熸湁鐨�
@@ -487,64 +482,6 @@
         return false;
     }
 
-    @Override
-    @Transactional(rollbackFor = {Exception.class})
-    public boolean transferDocFile(String pnCode, String deviceNo) {
-        List<ProcessStream> streams = processStreamService.validateDeviceProcessInfo(pnCode, deviceNo);
-        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
-        if(deviceInfo == null)
-            ExceptionCast.cast(DeviceCode.DEVICE_NOT_EXIST);
-        //鍒犻櫎鍘熸潵璁惧涓嬬殑鎵�鏈夋枃妗�
-        docRelativeService.deleteByDocAttr(7, deviceInfo.getDeviceId());
-        List<DocInfo> docInfoList = docInfoService.getByProcessIds(streams);
-        if(docInfoList == null || docInfoList.isEmpty())
-            ExceptionCast.cast(DocumentCode.DOC_NOT_EXIST);
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        String userId = user.getId();
-        if(!ValidateUtil.validateString(userId))
-            ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST);
-        for(DocInfo docInfo : docInfoList) {
-            DocFile docFile = docFileService.getById(docInfo.getPublishFileId());
-            if(docFile == null)
-                ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
-            //鎻掑叆鏂囨。鍒拌澶囧彂閫佹枃妗�
-            DocClassification classification = classificationService.getByCode(SEND_CODE);
-            if(classification == null)
-                ExceptionCast.cast(DocumentCode.DOC_CLASS_ERROR);
-            DocRelative docRelative = new DocRelative();
-            docRelative.setDocId(docInfo.getDocId());
-            docRelative.setClassificationId(classification.getClassificationId());
-            docRelative.setAttributionType(7);
-            docRelative.setAttributionId(deviceInfo.getDeviceId());
-            boolean b = docRelativeService.save(docRelative);
-            if(!b)
-                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
-            //鎻掑叆鏂囦欢浼犺緭浠诲姟琛�
-            ToEquipmentTask equipmentTask = new ToEquipmentTask();
-            //涓嶈兘鐩存帴浠巇oc涓嬁fileId 鍜寁ersion  鍙兘浼氬瓨鍦ㄦ枌鏇�
-            //equipmentTask.setFileId(docInfo.getPublishFileId());
-            //equipmentTask.setDocVersion(docInfo.getPublishVersion());
-            equipmentTask.setDocId(docInfo.getDocId());
-            equipmentTask.setSyncFlag(1);
-            equipmentTask.setDeviceNo(deviceInfo.getDeviceNo());
-            equipmentTask.setDeviceId(deviceInfo.getDeviceId());
-            equipmentTask.setDepartId(deviceInfo.getDepartId());
-            //鏂囦欢鐩稿叧淇℃伅
-            equipmentTask.setFileId(docFile.getFileId());
-            equipmentTask.setDocVersion(docFile.getDocVersion());
-            equipmentTask.setFileName(docInfo.getDocName());
-            equipmentTask.setFileEncodeName(docFile.getFileEncodeName());
-            equipmentTask.setFilePath(docFile.getFilePath());
-            equipmentTask.setFileSuffix(docFile.getFileSuffix());
-            equipmentTask.setFileSize(docFile.getFileSize());
-            b = equipmentTaskService.save(equipmentTask);
-            if(!b) {
-                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
-            }
-        }
-        return synchronizedFlagService.updateFlag(1);
-    }
-
     //浼犲弬楠岃瘉
     private void validateParams(AssignFileStream stream) {
         if (stream == null) {
@@ -575,7 +512,7 @@
 
     //鑾峰彇鏂囦欢
     private void handleExistingDeviceDoc(DocFile docFile, MdcEquipment mdcEquipment, String deviceId) {
-        List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getEquipmentId());
+        List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
         if (strings != null && !strings.isEmpty()) {
             String path = StringUtils.join(strings.toArray(), "/");
             boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/" + mdcEquipment.getEquipmentId(),
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 99%
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
index a44565e..6045e70 100644
--- 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
@@ -33,13 +33,13 @@
 import org.jeecg.modules.eam.service.IEamEquipmentService;
 import org.jeecg.modules.eam.service.IEamRepairOrderService;
 import org.jeecg.modules.eam.service.IEamReportRepairService;
+import org.jeecg.modules.eam.util.DateUtils;
 import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
 import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
 import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
 import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
 import org.jeecg.modules.flowable.service.IFlowDefinitionService;
 import org.jeecg.modules.flowable.service.IFlowTaskService;
-import org.jeecg.modules.mdc.util.DateUtils;
 import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
 import org.jeecg.modules.system.service.ISysUserService;
 import org.jeecg.modules.system.vo.UserSelector;
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 57d0f71..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
@@ -140,4 +140,8 @@
     List<MdcEquipment> findByProIdsAndTeamCode(@Param("mdcProductionIds") List<String> mdcProductionIds, @Param("teamCodeList") List<String> teamCodeList);
 
     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 8440226..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
@@ -89,6 +89,20 @@
         </foreach>
     </select>
 
+    <!--鏍规嵁浜х嚎id鏌ヨ璁惧id闆嗗悎-->
+    <select id="getEquipmentList" resultType="org.jeecg.modules.mdc.entity.MdcEquipment">
+        SELECT
+        me.*
+        FROM
+        mdc_equipment me
+        LEFT JOIN mdc_production_equipment mpe ON me.id = mpe.equipment_id
+        WHERE
+        mpe.production_id IN
+        <foreach collection="allProductionIds" index="index" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
     <!--鏌ヨ璁惧鐩戞帶淇℃伅-->
     <select id="checkStatusFromEquipmentIds" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentMonitor">
         SELECT
@@ -340,6 +354,7 @@
             #{equipmentType}
         </foreach>
     </select>
+
     <select id="queryByDepartIdsAndType" resultType="org.jeecg.modules.mdc.entity.MdcEquipment">
         SELECT
             e.*,
@@ -358,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 dce27ed..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
@@ -239,4 +239,13 @@
      * @return
      */
     List<MdcEquipment> findByProIdsAndType(List<String> allProductionIds, List<String> typeList);
+
+    List<String> getEquIdsByProIds(List<String> proIds);
+
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鏌ヨ璁惧鍒楄〃淇℃伅
+     * @return
+     */
+    List<MdcEquipment> getEquipmentList();
 }
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 3964351..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
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
@@ -1042,4 +1043,36 @@
         return this.baseMapper.findByProIdsAndType(allProductionIds, typeList);
     }
 
+    @Override
+    public List<MdcEquipment> getEquipmentList() {
+
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        if (StringUtils.isNotEmpty(user.getEquipmentIds())) {
+            return this.baseMapper.selectList(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA))));
+        }
+        //鑾峰彇鎵�鏈変骇绾挎暟鎹�
+        List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()).orderByAsc(MdcProduction::getProductionOrder));
+        //鏍规嵁鐢ㄦ埛id鑾峰彇鎷ユ湁鐨勪骇绾夸俊鎭泦鍚�
+        List<String> productionIds = mdcUserProductionService.queryProductionIdsByUserId(userId);
+        List<String> allProductionIds = new ArrayList<>();
+        //鎵惧埌鎵�鏈変骇绾縤d鐨勪笂绾d
+        if (productionIds != null && !productionIds.isEmpty()) {
+            for (String productionId : productionIds) {
+                this.getAllProductionIds(productionList, productionId, allProductionIds);
+            }
+        }
+        //鏍规嵁浜х嚎闆嗗悎鏌ユ壘鎵�鏈夎澶噄d
+        if (allProductionIds.isEmpty()) {
+            return null;
+        }
+        List<MdcEquipment> equipmentIds = this.baseMapper.getEquipmentList(allProductionIds);
+        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..909ed5c
--- /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/controller/MdcDowntimeOperatorController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeOperatorController.java
new file mode 100644
index 0000000..e9ea792
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeOperatorController.java
@@ -0,0 +1,85 @@
+package org.jeecg.modules.mdc.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
+import org.jeecg.modules.mdc.entity.MdcDowntime;
+import org.jeecg.modules.mdc.service.IMdcDowntimeOperatorService;
+import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
+import org.jeecg.modules.mdc.vo.SplitDowntimeVo;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 鎿嶄綔宸ュ仠鏈哄緟鏈鸿〃
+ * @Author: lius
+ * @Date: 2025-03-12
+ */
+@Slf4j
+@Api(tags = "鎿嶄綔宸ュ仠鏈哄緟鏈鸿〃")
+@RestController
+@RequestMapping("/mdc/operator/mdcDowntime")
+public class MdcDowntimeOperatorController  extends JeecgController<MdcDowntime, IMdcDowntimeOperatorService> {
+
+
+    @Resource
+    private IMdcDowntimeOperatorService mdcDowntimeService;
+
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param mdcDowntimeVo
+     * @param pageNo
+     * @param pageSize
+     * @return
+     */
+    @AutoLog(value = "寰呮満鍋滄満琛�-鍒嗛〉鍒楄〃鏌ヨ")
+    @ApiOperation(value = "寰呮満鍋滄満琛�-鍒嗛〉鍒楄〃鏌ヨ", notes = "寰呮満鍋滄満琛�-鍒嗛〉鍒楄〃鏌ヨ")
+    @GetMapping(value = "/list")
+    public Result<?> queryPageList(MdcDowntimeVo mdcDowntimeVo,
+                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        Page<MdcDowntimeDto> page = new Page<MdcDowntimeDto>(pageNo, pageSize);
+        IPage<MdcDowntimeDto> pageList = mdcDowntimeService.pageList(mdcDowntimeVo, page);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 缁存姢鍋滄満
+     *
+     * @param mdcDowntimeVo
+     * @return
+     */
+    @AutoLog(value = "寰呮満鍋滄満琛�-缁存姢鍋滄満")
+    @ApiOperation(value = "寰呮満鍋滄満琛�-缁存姢鍋滄満", notes = "寰呮満鍋滄満琛�-缁存姢鍋滄満")
+    @RequestMapping(value = "/updateReason", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> updateReason(@RequestBody MdcDowntimeVo mdcDowntimeVo) {
+        mdcDowntimeService.updateReason(mdcDowntimeVo);
+        return Result.OK("缂栬緫鎴愬姛!");
+    }
+
+    /**
+     * 鍋滄満鎷嗗垎
+     *
+     * @param splitDowntimeVo
+     * @return
+     */
+    @AutoLog(value = "寰呮満鍋滄満琛�-鍋滄満鎷嗗垎")
+    @ApiOperation(value = "寰呮満鍋滄満琛�-鍋滄満鎷嗗垎", notes = "寰呮満鍋滄満琛�-鍋滄満鎷嗗垎")
+    @RequestMapping(value = "/splitDowntime", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> splitDowntime(@RequestBody SplitDowntimeVo splitDowntimeVo) {
+        mdcDowntimeService.splitDowntime(splitDowntimeVo);
+        return Result.OK("鎷嗗垎鎴愬姛!");
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeReasonController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeReasonController.java
index 2bfc351..6c65a0b 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeReasonController.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeReasonController.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.beust.jcommander.internal.Lists;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -10,9 +11,9 @@
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.mdc.dto.OptionsDto;
 import org.jeecg.modules.mdc.entity.MdcDowntimeReason;
 import org.jeecg.modules.mdc.service.IMdcDowntimeReasonService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
@@ -166,4 +167,24 @@
         return Result.OK(result);
     }
 
+    /**
+     * 鍋滄満鍘熷洜涓嬫媺閫夋嫨
+     *
+     * @return
+     */
+    @AutoLog(value = "鍋滄満鍘熷洜琛�-鍋滄満鍘熷洜涓嬫媺閫夋嫨")
+    @ApiOperation(value = "鍋滄満鍘熷洜琛�-鍋滄満鍘熷洜涓嬫媺閫夋嫨", notes = "鍋滄満鍘熷洜琛�-鍋滄満鍘熷洜涓嬫媺閫夋嫨")
+    @GetMapping(value = "/reasonList")
+    public Result<List<OptionsDto>> reasonList() {
+        List<MdcDowntimeReason> result = mdcDowntimeReasonService.list();
+        List<OptionsDto> list = Lists.newArrayList();
+        result.forEach(mdcDowntimeReason -> {
+            OptionsDto optionsDto = new OptionsDto();
+            optionsDto.setValue(mdcDowntimeReason.getId());
+            optionsDto.setLabel(mdcDowntimeReason.getDowntimeDescription());
+            list.add(optionsDto);
+        });
+        return Result.OK(list);
+    }
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java
index 69a1a9f..5c1e872 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java
@@ -111,6 +111,17 @@
     }
 
     /**
+     * 鏍规嵁鐢ㄦ埛鏌ヨ璁惧鍒楄〃淇℃伅
+     */
+    @AutoLog(value = "璁惧琛�-鏍规嵁鐢ㄦ埛鏌ヨ璁惧鍒楄〃淇℃伅")
+    @ApiOperation(value = "璁惧琛�-鏍规嵁鐢ㄦ埛鏌ヨ璁惧鍒楄〃淇℃伅", notes = "璁惧琛�-鏍规嵁鐢ㄦ埛鏌ヨ璁惧鍒楄〃淇℃伅")
+    @GetMapping(value = "/getEquipmentList")
+    public Result<List<MdcEquipment>> getEquipmentList() {
+        List<MdcEquipment> list = mdcEquipmentService.getEquipmentList();
+        return Result.OK(list);
+    }
+
+    /**
      * 璁惧鐩戞帶鍒楄〃
      */
     @AutoLog(value = "璁惧琛�-璁惧鐩戞帶鍒楄〃")
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcDowntime.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcDowntime.java
index cefff4d..b931cea 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcDowntime.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcDowntime.java
@@ -81,5 +81,18 @@
     @Excel(name = "澶囨敞", width = 15)
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
+    /**
+     * 褰曞叆绫诲瀷
+     */
+    @Excel(name = "褰曞叆绫诲瀷", width = 15)
+    @ApiModelProperty(value = "褰曞叆绫诲瀷")
+    @Dict(dicCode = "enter_type")
+    private Integer enterType;
+    /**
+     * 鍋滄満鏃堕暱
+     */
+    @Excel(name = "鍋滄満鏃堕暱", width = 15)
+    @ApiModelProperty(value = "鍋滄満鏃堕暱")
+    private Integer shutdownDuration;
 
 }
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/ScanDowntimeJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ScanDowntimeJob.java
index eafa8fc..b40b9be 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ScanDowntimeJob.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ScanDowntimeJob.java
@@ -90,6 +90,7 @@
                     downtime.setTheDate(finalDate);
                     downtime.setStartDate(mdcEquipmentWaitSectionDto.getStartTime());
                     downtime.setEndDate(mdcEquipmentWaitSectionDto.getEndTime());
+                    downtime.setShutdownDuration(DateUtils.differentMinutes(downtime.getStartDate(), downtime.getEndDate()));
                     return downtime;
                 }).collect(Collectors.toList());
                 if (!downtimeList.isEmpty()) {
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/MdcDowntimeOperatorMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeOperatorMapper.java
new file mode 100644
index 0000000..bc7b4a8
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeOperatorMapper.java
@@ -0,0 +1,23 @@
+package org.jeecg.modules.mdc.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
+import org.jeecg.modules.mdc.entity.MdcDowntime;
+import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
+
+import java.util.List;
+
+/**
+ * @Description: 鎿嶄綔宸ュ緟鏈哄仠鏈鸿〃
+ * @Author: lius
+ * @Date: 2025-03-12
+ */
+public interface MdcDowntimeOperatorMapper extends BaseMapper<MdcDowntime> {
+
+    IPage<MdcDowntimeDto> page(Page<MdcDowntimeDto> page, @Param(Constants.WRAPPER) QueryWrapper<MdcDowntimeDto> queryWrapper);
+}
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/MdcDowntimeOperatorMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml
new file mode 100644
index 0000000..db58e0e
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!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.MdcDowntimeOperatorMapper">
+
+    <select id="page" resultType="org.jeecg.modules.mdc.dto.MdcDowntimeDto">
+        SELECT
+            t1.* ,
+            t2.downtime_type downtimeType,
+            t2.downtime_description downtimeDescription
+        FROM mdc_downtime t1 LEFT JOIN mdc_downtime_reason t2 ON t1.reason_id = t2.id
+        ${ew.customSqlSegment}
+        ORDER BY t1.create_time 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/IMdcDowntimeOperatorService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeOperatorService.java
new file mode 100644
index 0000000..5723186
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeOperatorService.java
@@ -0,0 +1,23 @@
+package org.jeecg.modules.mdc.service;
+
+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.mdc.dto.MdcDowntimeDto;
+import org.jeecg.modules.mdc.entity.MdcDowntime;
+import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
+import org.jeecg.modules.mdc.vo.SplitDowntimeVo;
+
+/**
+ * @Description: 鎿嶄綔宸ュ緟鏈哄仠鏈鸿〃
+ * @Author: lius
+ * @Date: 2025-03-12
+ */
+public interface IMdcDowntimeOperatorService extends IService<MdcDowntime> {
+
+    IPage<MdcDowntimeDto> pageList(MdcDowntimeVo mdcDowntimeVo, Page<MdcDowntimeDto> page);
+
+    void updateReason(MdcDowntimeVo mdcDowntimeVo);
+
+    void splitDowntime(SplitDowntimeVo splitDowntimeVo);
+}
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/MdcDowntimeServiceOperatorImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceOperatorImpl.java
new file mode 100644
index 0000000..cdb8268
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceOperatorImpl.java
@@ -0,0 +1,171 @@
+
+package org.jeecg.modules.mdc.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.beust.jcommander.internal.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
+import org.jeecg.modules.mdc.entity.MdcDowntime;
+import org.jeecg.modules.mdc.mapper.MdcDowntimeOperatorMapper;
+import org.jeecg.modules.mdc.service.IMdcDowntimeOperatorService;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
+import org.jeecg.modules.mdc.vo.SplitDowntimeVo;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @Description: 鎿嶄綔宸ュ緟鏈哄仠鏈鸿〃
+ * @Author: lius
+ * @Date: 2025-03-12
+ */
+@Service
+public class MdcDowntimeServiceOperatorImpl extends ServiceImpl<MdcDowntimeOperatorMapper, MdcDowntime> implements IMdcDowntimeOperatorService {
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+
+    @Override
+    public IPage<MdcDowntimeDto> pageList(MdcDowntimeVo mdcDowntimeVo, Page<MdcDowntimeDto> page) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        // 鑾峰彇璁惧ID鍒楄〃
+        List<String> equipmentIds = Lists.newArrayList();
+        if (StringUtils.isNotBlank(user.getEquipmentIds())) {
+            equipmentIds = Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA));
+        }else {
+            equipmentIds = getEquipmentIds(userId, mdcDowntimeVo);
+        }
+
+        // 濡傛灉璁惧ID鍒楄〃涓虹┖锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
+        if (equipmentIds == null || equipmentIds.isEmpty()) {
+            return new Page<>(page.getCurrent(), page.getSize(), 0);
+        }
+
+        QueryWrapper<MdcDowntimeDto> queryWrapper = Wrappers.query();
+        if (CollectionUtils.isNotEmpty(equipmentIds)) {
+            queryWrapper.in("t1.equipment_id", equipmentIds);
+        }
+        if (StringUtils.isNotBlank(mdcDowntimeVo.getEquipmentId())) {
+            queryWrapper.eq("t1.equipment_id", mdcDowntimeVo.getEquipmentId());
+        }
+        if (Objects.nonNull(mdcDowntimeVo.getStartDate())) {
+            queryWrapper.ge("t1.start_date", mdcDowntimeVo.getStartDate());
+        }
+        if (Objects.nonNull(mdcDowntimeVo.getEndDate())) {
+            queryWrapper.le("t1.end_date", mdcDowntimeVo.getEndDate());
+        }
+        if (StringUtils.isNotBlank(mdcDowntimeVo.getDowntimeDescription())) {
+            queryWrapper.eq("t2.id", mdcDowntimeVo.getDowntimeDescription());
+        }
+
+        return this.baseMapper.page(page, queryWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public void updateReason(MdcDowntimeVo mdcDowntimeVo) {
+        if (StringUtils.isEmpty(mdcDowntimeVo.getDownTimeIds())) {
+            throw new JeecgBootException("璇烽�夋嫨闇�瑕佺淮鎶ゅ仠鏈虹殑鏁版嵁");
+        }
+
+        List<MdcDowntime> mdcDowntimeList = this.listByIds(Arrays.asList(mdcDowntimeVo.getDownTimeIds().split(StringPool.COMMA)));
+        mdcDowntimeList.forEach(mdcDowntime -> {
+            mdcDowntime.setReasonId(mdcDowntimeVo.getReasonId());
+        });
+        this.updateBatchById(mdcDowntimeList);
+    }
+
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public void splitDowntime(SplitDowntimeVo splitDowntimeVo) {
+        if (StringUtils.isBlank(splitDowntimeVo.getId())) {
+            throw new JeecgBootException("璇烽�夋嫨闇�瑕佹媶鍒嗗仠鏈虹殑鏁版嵁");
+        }
+
+        MdcDowntime mdcDowntime = this.getById(splitDowntimeVo.getId());
+
+        if (StringUtils.isNotBlank(mdcDowntime.getReasonId())) {
+            throw new JeecgBootException("宸茶缃仠鏈哄師鍥狅紝鏃犳硶鎷嗗垎鍋滄満");
+        }
+
+        //姣旇緝鎷嗗垎涓�娈电殑鏃ユ湡鏄惁鍐嶅尯闂磋寖鍥村唴锛堝紑濮嬫椂闂达細startTime 缁撴潫鏃堕棿锛氬叆鏃犱簩娈垫椂闂达紝鍒欏彇endTime锛�
+        if (Objects.nonNull(splitDowntimeVo.getFirstMiddleTime())) {
+
+            //鏍¢獙涓�娈垫棩鏈熸槸鍚﹀ぇ浜巗tartTime锛屽惁锛屾姏鍑哄紓甯�
+            if (Objects.isNull(splitDowntimeVo.getSecondMiddleTime())) {
+                if (splitDowntimeVo.getStartDate().compareTo(splitDowntimeVo.getFirstMiddleTime()) != -1 || splitDowntimeVo.getFirstMiddleTime().compareTo(splitDowntimeVo.getEndDate()) != -1) {
+                    throw new JeecgBootException("鎷嗗垎涓�娈垫椂闂存湭鍦ㄥ紑濮嬫椂闂村拰缁撴潫鏃堕棿涔嬪唴锛岃妫�鏌ワ紒");
+                }
+            }else {
+                if (splitDowntimeVo.getStartDate().compareTo(splitDowntimeVo.getFirstMiddleTime()) != -1 || splitDowntimeVo.getFirstMiddleTime().compareTo(splitDowntimeVo.getSecondMiddleTime()) != -1) {
+                    throw new JeecgBootException("鎷嗗垎涓�娈垫椂闂存湭鍦ㄥ紑濮嬫椂闂村拰鎷嗗垎浜屾缁撴潫鏃堕棿涔嬪唴锛岃妫�鏌ワ紒");
+                }
+            }
+
+        }else {
+            throw new JeecgBootException("璇风淮鎶ゆ媶鍒嗕竴娈电粨鏉熸椂闂�");
+        }
+
+        if (Objects.nonNull(splitDowntimeVo.getSecondMiddleTime())) {
+            //鏍¢獙浜屾鏃ユ湡鏄惁瀛樺湪浜庝竴娈垫棩鏈熷拰endTime涔嬮棿
+
+            if (splitDowntimeVo.getFirstMiddleTime().compareTo(splitDowntimeVo.getSecondMiddleTime()) != -1 || splitDowntimeVo.getSecondMiddleTime().compareTo(splitDowntimeVo.getEndDate()) != -1) {
+                throw new JeecgBootException("鎷嗗垎浜屾鏃堕棿鏈湪鎷嗗垎涓�娈电粨鏉熸椂闂村拰缁撴潫鏃堕棿涔嬪唴锛岃妫�鏌ワ紒");
+            }
+        }
+
+        List<MdcDowntime> list = Lists.newArrayList();
+
+        //璁剧疆鎷嗗垎1娈�
+        if (Objects.nonNull(splitDowntimeVo.getFirstMiddleTime())) {
+            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getStartDate(), splitDowntimeVo.getFirstMiddleTime(), splitDowntimeVo.getFirstDowntimeDescription()));
+        }
+
+        //璁剧疆鎷嗗垎2娈碉紝浜屾涓嶅瓨鍦ㄥ垯灏唀ndDate浣滀负鎷嗗垎浜屾
+        if (Objects.nonNull(splitDowntimeVo.getSecondMiddleTime())) {
+            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getFirstMiddleTime(), splitDowntimeVo.getSecondMiddleTime(), splitDowntimeVo.getSecondDowntimeDescription()));
+            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getSecondMiddleTime(), splitDowntimeVo.getEndDate(), splitDowntimeVo.getThirdDowntimeDescription()));
+        }else {
+            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getFirstMiddleTime(), splitDowntimeVo.getEndDate(), splitDowntimeVo.getThirdDowntimeDescription()));
+        }
+        //淇濆瓨鎷嗗垎鏁版嵁骞跺垹闄ゅ師鏈夋暟鎹�
+        if (this.saveBatch(list)) {
+            this.removeById(mdcDowntime);
+        }
+    }
+
+    private MdcDowntime checkMdcDowntime(MdcDowntime mdcDowntime, Date startDate, Date endDate, String downtimeDescription) {
+        MdcDowntime mdcDowntimeInfo = new MdcDowntime();
+        BeanUtil.copyProperties(mdcDowntime, mdcDowntimeInfo);
+        mdcDowntimeInfo.setId(IdWorker.getIdStr());
+        mdcDowntimeInfo.setStartDate(startDate);
+        mdcDowntimeInfo.setEndDate(endDate);
+        mdcDowntimeInfo.setShutdownDuration(DateUtils.differentMinutes(startDate, endDate));
+        mdcDowntimeInfo.setEnterType(2);
+        mdcDowntimeInfo.setReasonId(StringUtils.isNotBlank(downtimeDescription) ? downtimeDescription : StringPool.EMPTY);
+        return mdcDowntimeInfo;
+    }
+
+    private List<String> getEquipmentIds(String userId, MdcDowntimeVo mdcDowntimeVo) {
+        if (StringUtils.isNotEmpty(mdcDowntimeVo.getEquipmentId())) {
+            return Collections.singletonList(mdcDowntimeVo.getEquipmentId());
+        }
+        return mdcEquipmentService.getEquipmentIdsProduction(userId, null);
+    }
+}
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-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDowntimeVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDowntimeVo.java
index 97cc304..80ff720 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDowntimeVo.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDowntimeVo.java
@@ -31,6 +31,16 @@
     private String parentId;
 
     /**
+     * 鍋滄満鍘熷洜
+     */
+    private String downtimeDescription;
+
+    /**
+     * 鍋滄満ids
+     */
+    private String downTimeIds;
+
+    /**
      * 璁惧ids
      */
     private List<String> equipmentIdList;
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/SplitDowntimeVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/SplitDowntimeVo.java
new file mode 100644
index 0000000..407df54
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/SplitDowntimeVo.java
@@ -0,0 +1,70 @@
+package org.jeecg.modules.mdc.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 鍋滄満鎷嗗垎鎿嶄綔鍏ュ弬
+ */
+@Data
+public class SplitDowntimeVo {
+
+    /**
+     * 鍋滄満鎷嗗垎id
+     */
+    private String id;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private Date startDate;
+
+    /**
+     * 鎷嗗垎1娈电粨鏉熸椂闂�
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鎷嗗垎1娈靛紑濮嬫椂闂�")
+    private Date firstMiddleTime;
+
+    /**
+     * 鎷嗗垎1娈靛仠鏈哄師鍥�
+     */
+    @ApiModelProperty(value = "鎷嗗垎1娈靛仠鏈哄師鍥�")
+    private String firstDowntimeDescription;
+
+    /**
+     * 鎷嗗垎2娈电粨鏉熸椂闂�
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鎷嗗垎2娈靛紑濮嬫椂闂�")
+    private Date secondMiddleTime;
+
+    /**
+     * 鎷嗗垎2娈靛仠鏈哄師鍥�
+     */
+    @ApiModelProperty(value = "鎷嗗垎2娈靛仠鏈哄師鍥�")
+    private String secondDowntimeDescription;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    private Date endDate;
+
+    /**
+     * 鎷嗗垎3娈靛仠鏈哄師鍥�
+     */
+    @ApiModelProperty(value = "鎷嗗垎3娈靛仠鏈哄師鍥�")
+    private String thirdDowntimeDescription;
+}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java
index 4b271a6..c1e760d 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java
@@ -74,7 +74,7 @@
 			log.info("-------token----username---"+principal);
 		    //1. 鏍¢獙鐢ㄦ埛鏄惁鏈夋晥
 	  		SysUser sysUser = sysUserService.getUserByName(principal);
-	  		result = sysUserService.checkUserIsEffective(sysUser);
+	  		result = sysUserService.checkUserIsEffective(sysUser, null);
 	  		if(!result.isSuccess()) {
 	  			return result;
 	  		}
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/controller/LoginController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
index 3e7dff6..e577cb7 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
@@ -121,7 +121,7 @@
 		}
 		SysUser sysUser = sysUserService.getOne(queryWrapper);
 		//update-end-author:wangshuai date:20200601 for: 鐧诲綍浠g爜楠岃瘉鐢ㄦ埛鏄惁娉ㄩ攢bug锛宨f鏉′欢姘歌繙涓篺alse
-		result = sysUserService.checkUserIsEffective(sysUser);
+		result = sysUserService.checkUserIsEffective(sysUser, loginType);
 		if(!result.isSuccess()) {
 			return result;
 		}
@@ -397,7 +397,7 @@
 			}else {
 				//鐧诲綍妯″紡锛屾牎楠岀敤鎴锋湁鏁堟��
 				SysUser sysUser = sysUserService.getUserByPhone(mobile);
-				result = sysUserService.checkUserIsEffective(sysUser);
+				result = sysUserService.checkUserIsEffective(sysUser, null);
 				if(!result.isSuccess()) {
 					String message = result.getMessage();
 					String userNotExist="璇ョ敤鎴蜂笉瀛樺湪锛岃娉ㄥ唽";
@@ -458,7 +458,7 @@
 
 		//鏍¢獙鐢ㄦ埛鏈夋晥鎬�
 		SysUser sysUser = sysUserService.getUserByPhone(phone);
-		result = sysUserService.checkUserIsEffective(sysUser);
+		result = sysUserService.checkUserIsEffective(sysUser, null);
 		if(!result.isSuccess()) {
 			return result;
 		}
@@ -626,7 +626,7 @@
 
 		//1. 鏍¢獙鐢ㄦ埛鏄惁鏈夋晥
 		SysUser sysUser = sysUserService.getUserByName(username);
-		result = sysUserService.checkUserIsEffective(sysUser);
+		result = sysUserService.checkUserIsEffective(sysUser, null);
 		if(!result.isSuccess()) {
 			return result;
 		}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java
index 9e8a0f6..8337273 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java
@@ -218,7 +218,7 @@
 
 		//1. 鏍¢獙鐢ㄦ埛鏄惁鏈夋晥
 		SysUser sysUser = sysUserService.getUserByName(username);
-		result = sysUserService.checkUserIsEffective(sysUser);
+		result = sysUserService.checkUserIsEffective(sysUser, null);
 		if(!result.isSuccess()) {
 			return result;
 		}
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/ISysUserService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
index 48fad04..103f93a 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
@@ -221,7 +221,7 @@
 	 * @param sysUser
 	 * @return
 	 */
-	Result checkUserIsEffective(SysUser sysUser);
+	Result checkUserIsEffective(SysUser sysUser, String loginType);
 
 	/**
 	 * 鏌ヨ琚�昏緫鍒犻櫎鐨勭敤鎴�
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);
+    }
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
index 37f72de..8d9799b 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -440,7 +440,7 @@
 	 * @return
 	 */
 	@Override
-	public Result<?> checkUserIsEffective(SysUser sysUser) {
+	public Result<?> checkUserIsEffective(SysUser sysUser, String loginType) {
 		Result<?> result = new Result<Object>();
 		//鎯呭喌1锛氭牴鎹敤鎴蜂俊鎭煡璇紝璇ョ敤鎴蜂笉瀛樺湪
 		if (sysUser == null) {
@@ -464,7 +464,7 @@
 		}
 		//鎯呭喌4锛氭牴鎹敤鎴蜂俊鎭煡璇紝璇ョ敤鎴峰瘑鐮佺郴棣栨浣跨敤锛岄渶淇敼瀵嗙爜
 		List<DictModel> dictList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_USER_FIRST_LOGIN);
-		if (dictList != null && !dictList.isEmpty()) {
+		if (!"terminal".equals(loginType) && dictList != null && !dictList.isEmpty()) {
 			if (CommonConstant.DEL_FLAG_1.equals(Integer.valueOf(dictList.get(0).getValue())) && CommonConstant.DEL_FLAG_1.equals(sysUser.getPasswordFlag())) {
 				baseCommonService.addLog("鐢ㄦ埛鐧诲綍澶辫触锛岀敤鎴峰悕:" + sysUser.getUsername() + "绯婚娆$櫥褰曠郴缁燂紝璇烽噸缃瘑鐮侊紒", CommonConstant.LOG_TYPE_1, null);
 				result.setCode(5001);
diff --git a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
index d79ea82..5b27cd5 100644
--- a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
+++ b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
@@ -311,7 +311,13 @@
 deploy:
     #宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓烘秹瀵嗙綉 1涓哄伐鎺х綉
     deployType: 0
-    #娑夊瘑缃戜紶杈搉c鏂囦欢澶�
-    secretFolder: D:\\hy_test\\a
-    #宸ユ帶缃戠洃鎺c鏂囦欢澶�
-    workFolder: D:\\hy_test\\b
+    #娑夊瘑缃戜紶杈撳伐鎺х綉nc鏂囦欢澶�(鎸囨淳璁惧nc鏂囦欢)    宸ユ帶缃戜紶杈撴秹瀵嗙綉nc鏂囦欢澶�(瑙f瀽鍥炰紶鍚庣殑nc鏂囦欢)
+    secretFolder: D:\\test\\a
+file:
+  monitor:
+    # 涓変釜鐩戞帶鐩綍閰嶇疆
+    paths:
+      - D:\\hy_test\\ncFile #宸ユ帶璐熻矗瑙f瀽閲岄潰鐨勬枃浠�;娑夊瘑缃戣繘琛岃В鏋愬洖浼犵殑鎿嶄綔
+      - D:\\hy_test\\b
+      - D:\\hy_test\\c
+    interval: 10000  # 鐩戞帶闂撮殧(ms)
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java
index 38db085..c259364 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java
@@ -1,5 +1,8 @@
 package org.jeecg.modules.tms.controller;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
 import java.util.Arrays;
 import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
@@ -7,6 +10,8 @@
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.tms.entity.*;
@@ -575,4 +580,98 @@
 		 IPage<SharpeeningVo> resultPage = baseToolsService.pageWithSharpedAndConfig(page, queryWrapper);
 		 return Result.OK(resultPage);
 	 }
+
+
+	 /**
+	  * 瀵煎叆妯℃澘涓嬭浇
+	  *
+	  */
+	 @RequestMapping(value = "/loadTemplate")
+	 public void loadTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException {
+
+		 Map<String,String[]> req = request.getParameterMap();
+		 String paraTypeFlag = "";
+		 if(req.get("paraTypeFlag") != null){
+			 paraTypeFlag = req.get("paraTypeFlag")[0];
+		 }
+		 if("1".equals(paraTypeFlag)){
+			 Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\鍒�鍏蜂俊鎭鍏ユā鏉�-閫氱敤鍙傛暟.xlsx"));
+			 //瀵煎嚭Workbook
+			 //璁剧疆鍝嶅簲澶�
+			 String fileName = "鍒�鍏蜂俊鎭鍏ユā鏉�-閫氱敤鍙傛暟.xlsx";
+			 // 瀵规枃浠跺悕杩涜URL缂栫爜锛岄槻姝腑鏂囦贡鐮�
+			 String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+			 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+			 response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
+			 // 灏哤orkbook鍐欏叆鍝嶅簲杈撳嚭娴�
+			 try { // try-with-resources鑷姩鍏抽棴璧勬簮
+				 workbook.write(response.getOutputStream());
+				 response.flushBuffer();
+			 } catch (IOException e) {
+				 // 寮傚父澶勭悊锛堝璁板綍鏃ュ織锛�
+				 throw new IOException("涓嬭浇妯℃澘澶辫触", e);
+			 }
+		 }else if("2".equals(paraTypeFlag)){
+			 Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\鍒�鍏蜂俊鎭鍏ユā鏉�-瀛斿姞宸ュ伐鍏�.xlsx"));
+			 String fileName = "鍒�鍏蜂俊鎭鍏ユā鏉�-瀛斿姞宸ュ伐鍏�.xlsx";
+			 String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+			 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+			 response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
+			 try {
+				 workbook.write(response.getOutputStream());
+				 response.flushBuffer();
+			 } catch (IOException e) {
+				 throw new IOException("涓嬭浇妯℃澘澶辫触", e);
+			 }
+		 }else if("3".equals(paraTypeFlag)){
+			 Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\鍒�鍏蜂俊鎭鍏ユā鏉�-铻虹汗宸ュ叿.xlsx"));
+			 String fileName = "鍒�鍏蜂俊鎭鍏ユā鏉�-铻虹汗宸ュ叿.xlsx";
+			 String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+			 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+			 response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
+			 try {
+				 workbook.write(response.getOutputStream());
+				 response.flushBuffer();
+			 } catch (IOException e) {
+				 throw new IOException("涓嬭浇妯℃澘澶辫触", e);
+			 }
+		 }else if("4".equals(paraTypeFlag)){
+			 Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\鍒�鍏蜂俊鎭鍏ユā鏉�-閾e墛宸ュ叿.xlsx"));
+			 String fileName = "鍒�鍏蜂俊鎭鍏ユā鏉�-閾e墛宸ュ叿.xlsx";
+			 String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+			 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+			 response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
+			 try {
+				 workbook.write(response.getOutputStream());
+				 response.flushBuffer();
+			 } catch (IOException e) {
+				 throw new IOException("涓嬭浇妯℃澘澶辫触", e);
+			 }
+		 }else if("5".equals(paraTypeFlag)){
+			 Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\鍒�鍏蜂俊鎭鍏ユā鏉�-杞﹀墛宸ュ叿.xlsx"));
+			 String fileName = "鍒�鍏蜂俊鎭鍏ユā鏉�-杞﹀墛宸ュ叿.xlsx";
+			 String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+			 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+			 response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
+			 try {
+				 workbook.write(response.getOutputStream());
+				 response.flushBuffer();
+			 } catch (IOException e) {
+				 throw new IOException("涓嬭浇妯℃澘澶辫触", e);
+			 }
+		 }else if("6".equals(paraTypeFlag)){
+			 Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\鍒�鍏蜂俊鎭鍏ユā鏉�-鍒�鐗�.xlsx"));
+			 String fileName = "鍒�鍏蜂俊鎭鍏ユā鏉�-鍒�鐗�.xlsx";
+			 String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+			 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+			 response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
+			 try {
+				 workbook.write(response.getOutputStream());
+				 response.flushBuffer();
+			 } catch (IOException e) {
+				 throw new IOException("涓嬭浇妯℃澘澶辫触", e);
+			 }
+		 }
+
+	 }
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/BaseTools.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/BaseTools.java
index aaa61bf..d99691d 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/BaseTools.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/BaseTools.java
@@ -108,4 +108,9 @@
     @DateTimeFormat(pattern="yyyy-MM-dd")
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
     private Date updateTime;
+
+    /**宸ュ叿鍥剧墖*/
+    @Excel(name = "宸ュ叿鍥剧墖", width = 15)
+    @ApiModelProperty(value = "宸ュ叿鍥剧墖")
+    private String toolPicture;
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java
index 0ce3390..feab8e2 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java
@@ -163,4 +163,7 @@
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
 
+    @ApiModelProperty(value = "宸ュ叿鍥剧墖")
+    private String toolPicture;
+
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java
index 1cfa455..a01e7d7 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java
@@ -94,4 +94,7 @@
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
 
+    @ApiModelProperty(value = "宸ュ叿鍥剧墖")
+    private String toolPicture;
+
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java
index 59dbf3c..45ce3ff 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java
@@ -188,4 +188,7 @@
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
 
+    @ApiModelProperty(value = "宸ュ叿鍥剧墖")
+    private String toolPicture;
+
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java
index 8315462..e8b4d74 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java
@@ -191,4 +191,7 @@
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
 
+    @ApiModelProperty(value = "宸ュ叿鍥剧墖")
+    private String toolPicture;
+
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java
index b2a9781..ddae238 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java
@@ -160,4 +160,7 @@
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
 
+    @ApiModelProperty(value = "宸ュ叿鍥剧墖")
+    private String toolPicture;
+
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java
index 304fcc5..00f3d00 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java
@@ -198,4 +198,7 @@
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
 
+    @ApiModelProperty(value = "宸ュ叿鍥剧墖")
+    private String toolPicture;
+
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
index 5b34e8c..c6df81e 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
@@ -13,6 +13,7 @@
             t.standard_code standardCode,
             t.tool_model toolModel,
             t.parama_table_name paramaTableName,
+            t.tool_picture toolPicture,
             t1.application_type applicationType,
             t1.supplier_id supplierId,
             t1.province_city provinceCity,
@@ -81,6 +82,7 @@
             t.standard_code standardCode,
             t.tool_model toolModel,
             t.parama_table_name paramaTableName,
+            t.tool_picture toolPicture,
             t1.application_type applicationType,
             t1.supplier_id supplierId,
             t1.province_city provinceCity,
@@ -113,6 +115,7 @@
             t.standard_code standardCode,
             t.tool_model toolModel,
             t.parama_table_name paramaTableName,
+            t.tool_picture toolPicture,
             t1.application_type applicationType,
             t1.supplier_id supplierId,
             t1.province_city provinceCity,
@@ -171,6 +174,7 @@
             t.standard_code standardCode,
             t.tool_model toolModel,
             t.parama_table_name paramaTableName,
+            t.tool_picture toolPicture,
             t1.application_type applicationType,
             t1.supplier_id supplierId,
             t1.province_city provinceCity,
@@ -238,6 +242,7 @@
             t.standard_code standardCode,
             t.tool_model toolModel,
             t.parama_table_name paramaTableName,
+            t.tool_picture toolPicture,
             t1.application_type applicationType,
             t1.supplier_id supplierId,
             t1.province_city provinceCity,
@@ -309,6 +314,7 @@
             t.standard_code standardCode,
             t.tool_model toolModel,
             t.parama_table_name paramaTableName,
+            t.tool_picture toolPicture,
             t1.application_type applicationType,
             t1.supplier_id supplierId,
             t1.province_city provinceCity,
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java
index ad52aa3..36f8868 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java
@@ -262,6 +262,7 @@
                         num++;
                         //杞崲鍥炲瓧绗︿覆骞朵繚鐣欏墠瀵奸浂
                         String result = String.format("%0" + currentCode.length() + "d", num);
+                        //鎵撳嵃浜岀淮鐮�
                         //淇濆瓨鍏ュ簱娴佹按
                         InStoreDetail inStoreDetail = new InStoreDetail();
                         inStoreDetail.setInboundTime(inboundTime);

--
Gitblit v1.9.3