From 996e6ef3e621a7c4dfb271bb181c737bd2980630 Mon Sep 17 00:00:00 2001
From: lyh <925863403@qq.com>
Date: 星期四, 12 六月 2025 11:46:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeMapper.java                                    |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml                 |   30 
 lxzn-module-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-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java                                           |  164 ++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRate.java                                            |   20 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java                           |   21 
 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-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java                                       |    2 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrder.java                     |    0 
 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-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java                                     |    3 
 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                            |    2 
 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-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java                      |   70 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamInspectionOrderDetail.java                      |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOeeInfoMapper.java                                     |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java                   |  234 ++
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java               |    0 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamReportRepairService.java                      |    0 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java                         |    3 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java                    |  235 ++
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamReportRepairMapper.java                         |    0 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderMapper.xml                            |   29 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java                                              |   26 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java                                     |   14 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java                               |   98 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java         |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java                           |  368 ++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/PreparationOrderAndDetailDto.java                     |   61 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java                 |    5 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrder.java                      |    0 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml                            |   18 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java                                  |    3 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderDetailService.java                      |   27 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrder.java                                     |  111 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/PreparationOrderStatus.java                                |   56 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java                                    |   52 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java                          |   89 +
 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-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java                       |  326 ++++
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/PreparationOrderConvert.java                             |   25 
 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-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java                        |    2 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml                         |   15 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java                       |   21 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOeeInfoMapper.xml                                  |   13 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOeeMonth.java                                            |   20 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java                     |   20 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java                                  |   15 
 lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java                                       |   25 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml                       |    0 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java         |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java                             |   44 
 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/board/mapper/DtBoardMapper.java                                      |   17 
 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-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java                                |   10 
 lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java                                      |   12 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamReportRepairQuery.java                         |    0 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderMapper.java                               |   24 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java                          |    5 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderDetailServiceImpl.java              |   43 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java                            |    6 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java                         |    1 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml                           |   42 
 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-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java                            |   43 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java                  |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java                                   |   32 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportRepairMapper.xml                      |    0 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentMapper.java                               |   14 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquDowntimeInfo.java                                        |   23 
 lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java                                            |    1 
 lxzn-module-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-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderDetailMapper.xml                      |   93 +
 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-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-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderDetailMapper.java                         |   40 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml                                  |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeService.java                                 |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml                                   |   27 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java                              |   96 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundOrder.java                                        |   39 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/util/DateUtils.java                                       | 1089 +++++++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRunInfo.java                                             |   24 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java                                    |  145 +
 /dev/null                                                                                                            |   62 
 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-mdc/src/main/java/org/jeecg/modules/board/vo/EquAlarm.java                                               |   21 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java                              |   18 
 116 files changed, 4,602 insertions(+), 108 deletions(-)

diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
index 2343268..a258837 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
@@ -598,6 +598,11 @@
     String DICT_MDC_STAFF_TEAM = "mdc_staff_team";
 
     /**
+     * 椹卞姩鍙傛暟鍗曚綅瀛楀吀缂栧彿
+     */
+    String DICT_EQUIPMENT_RUN_UNIT = "equipment_run_unit";
+
+    /**
      * 鍔犵彮鏁版嵁 鑷姩璁$畻鏍囪瘑 1(鏄�) 2(鍚�)
      */
     Integer AUTO_FLAG_Y = 1;
@@ -612,8 +617,11 @@
      */
     String CLOSE_TYPE_0 = "0";
     String CLOSE_TYPE_1 = "1";
-
-    String ORG_TYPE = "3";
+    /**
+     * 浜х嚎绫诲瀷 1涓�绾ч儴闂� 2瀛愰儴闂� 3瀛愰儴闂�
+     */
+    String ORG_TYPE_2 = "2";
+    String ORG_TYPE_3 = "3";
 
     Integer SHIFT_TYPE_1 = 1;
     Integer SHIFT_TYPE_2 = 2;
diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java b/lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java
index 55417e1..bfbd96a 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java
@@ -14,6 +14,7 @@
 
 /**
  * websocket 鍓嶇灏唗oken鏀惧埌瀛愬崗璁噷浼犲叆 涓庡悗绔缓绔嬭繛鎺ユ椂闇�瑕佺敤鍒癶ttp鍗忚锛屾澶勭敤浜庢牎楠宼oken鐨勬湁鏁堟��
+ *
  * @Author taoYan
  * @Date 2022/4/21 17:01
  **/
@@ -34,20 +35,22 @@
         if (redisUtil == null) {
             redisUtil = SpringContextUtils.getBean(RedisUtil.class);
         }
-        HttpServletRequest request = (HttpServletRequest)servletRequest;
-        String token = request.getHeader(TOKEN_KEY);
+        HttpServletRequest request = (HttpServletRequest) servletRequest;
+        if (request.getHeader(TOKEN_KEY) != null) {
+            String token = request.getHeader(TOKEN_KEY);
 
-        log.debug("Websocket杩炴帴 Token瀹夊叏鏍¢獙锛孭ath = {}锛宼oken:{}", request.getRequestURI(), token);
+            log.debug("Websocket杩炴帴 Token瀹夊叏鏍¢獙锛孭ath = {}锛宼oken:{}", request.getRequestURI(), token);
 
-        try {
-            TokenUtils.verifyToken(token, commonApi, redisUtil);
-        } catch (Exception exception) {
-            //log.error("Websocket杩炴帴 Token瀹夊叏鏍¢獙澶辫触锛孖P:{}, Token:{}, Path = {}锛屽紓甯革細{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
-            log.debug("Websocket杩炴帴 Token瀹夊叏鏍¢獙澶辫触锛孖P:{}, Token:{}, Path = {}锛屽紓甯革細{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
-            return;
+            try {
+                TokenUtils.verifyToken(token, commonApi, redisUtil);
+            } catch (Exception exception) {
+                //log.error("Websocket杩炴帴 Token瀹夊叏鏍¢獙澶辫触锛孖P:{}, Token:{}, Path = {}锛屽紓甯革細{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
+                log.debug("Websocket杩炴帴 Token瀹夊叏鏍¢獙澶辫触锛孖P:{}, Token:{}, Path = {}锛屽紓甯革細{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
+                return;
+            }
+            HttpServletResponse response = (HttpServletResponse) servletResponse;
+            response.setHeader(TOKEN_KEY, token);
         }
-        HttpServletResponse response = (HttpServletResponse)servletResponse;
-        response.setHeader(TOKEN_KEY, token);
         filterChain.doFilter(servletRequest, servletResponse);
     }
 
diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
index 982587e..93a33b0 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@@ -99,6 +99,7 @@
         filterChainDefinitionMap.put("/sys/getQrcodeToken/**", "anon"); //鐩戝惉鎵爜
         filterChainDefinitionMap.put("/sys/checkAuth", "anon"); //鎺堟潈鎺ュ彛鎺掗櫎
         filterChainDefinitionMap.put("/msi/**", "anon"); //闆嗘垚鎺ュ彛
+        filterChainDefinitionMap.put("/board/dtBoard/**", "anon"); //鏁板瓧瀛敓鐪嬫澘鎺ュ彛鎺掗櫎
 
         filterChainDefinitionMap.put("/", "anon");
         filterChainDefinitionMap.put("/doc.html", "anon");
diff --git a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java
index e588f05..0cae0d9 100644
--- a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java
@@ -100,8 +100,28 @@
                 }
                 break;
             case SECOND_MAINTENANCE:
+                if (result instanceof EamSecondMaintenanceOrder) {
+                    EamSecondMaintenanceOrder order = (EamSecondMaintenanceOrder) result;
+                    if (SecondMaintenanceStatusEnum.COMPLETE.name().equals(order.getMaintenanceStatus())) {
+                        log.setEquipmentId(order.getEquipmentId());
+                        log.setBusinessId(order.getId());
+                        log.setOperator(order.getOperator());
+                        log.setDescription(order.getConfirmComment());
+                        log.setCreateTime(order.getActualEndTime());
+                    }
+                }
                 break;
             case THIRD_MAINTENANCE:
+                if (result instanceof EamThirdMaintenanceOrder) {
+                    EamThirdMaintenanceOrder order = (EamThirdMaintenanceOrder) result;
+                    if (ThirdMaintenanceStatusEnum.COMPLETE.name().equals(order.getMaintenanceStatus())) {
+                        log.setEquipmentId(order.getEquipmentId());
+                        log.setBusinessId(order.getId());
+                        log.setOperator(order.getOperator());
+                        log.setDescription(order.getLeaderConfirmComment());
+                        log.setCreateTime(order.getActualEndTime());
+                    }
+                }
                 break;
             case REPORT_REPAIR:
                 if (result instanceof EamReportRepair) {
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/EamSecondMaintenanceOrder.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrder.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrder.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrder.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/EamThirdMaintenanceOrder.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrder.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrder.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrder.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 e0e0e88..0a71450 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
@@ -141,5 +141,7 @@
 
     List<MdcEquipment> findByProIdsAndType(@Param("mdcProductionIds") List<String> mdcProductionIds, @Param("typeList") List<String> typeList);
 
+    List<String> getEquIdsByProIds(@Param("proIds") List<String> proIds);
+
     List<MdcEquipment> getEquipmentList(@Param("allProductionIds") List<String> allProductionIds);
 }
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml
index b504640..126990b 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml
@@ -2,4 +2,22 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.mdc.mapper.EquipmentMapper">
 
+    <select id="listByProds" resultType="org.jeecg.modules.mdc.entity.Equipment">
+        SELECT
+            t1.*
+        FROM
+            Equipment t1
+            LEFT JOIN mdc_equipment t2 ON t1.EquipmentID = t2.equipment_id
+            LEFT JOIN mdc_production_equipment t3 ON t2.id = t3.equipment_id
+        <where>
+            t3.production_id IN
+            <foreach collection="proIds" index="index" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+    </select>
+
+    <select id="findByEquId" resultType="org.jeecg.modules.mdc.entity.Equipment">
+        SELECT TOP 1 * FROM Equipment WHERE EquipmentID = #{equipmentId}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
index 80df077..3d0755f 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
@@ -354,6 +354,7 @@
             #{equipmentType}
         </foreach>
     </select>
+
     <select id="queryByDepartIdsAndType" resultType="org.jeecg.modules.mdc.entity.MdcEquipment">
         SELECT
             e.*,
@@ -372,4 +373,18 @@
         </foreach>
     </select>
 
+    <select id="getEquIdsByProIds" resultType="java.lang.String">
+        SELECT
+        t1.equipment_id
+        FROM
+        mdc_equipment t1
+        LEFT JOIN mdc_production_equipment t2 ON t1.id = t2.equipment_id
+        <where>
+            t2.production_id IN
+            <foreach collection="proIds" index="index" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+    </select>
+
 </mapper>
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java
index 8dfe74b..9649a2c 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.mdc.entity.Equipment;
 
+import java.util.List;
+
 /**
  * @Description: 閲囬泦璁惧琛�
  * @Author: liuS
@@ -48,4 +50,8 @@
      * @param day
      */
     void insertNoTableData(String backupTableName, String tableName, String day);
+
+    List<Equipment> listByProds(List<String> proIds);
+
+    Equipment findByEquId(String equipmentId);
 }
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java
index aee61dc..2b65899 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java
@@ -11,4 +11,5 @@
  */
 public interface IMdcAlarmInfoService extends IService<MdcAlarmInfo> {
 
+    MdcAlarmInfo findAlarmContent(String alarmNo, String equipmentId);
 }
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
index e4e1ba3..f3493f9 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
@@ -240,6 +240,9 @@
      */
     List<MdcEquipment> findByProIdsAndType(List<String> allProductionIds, List<String> typeList);
 
+    List<String> getEquIdsByProIds(List<String> proIds);
+
+
     /**
      * 鏍规嵁鐢ㄦ埛鏌ヨ璁惧鍒楄〃淇℃伅
      * @return
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java
index 3db46bc..03126fb 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java
@@ -6,6 +6,9 @@
 import org.jeecg.modules.mdc.service.IEquipmentService;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
  * @Description: 閲囬泦璁惧琛�
  * @Author: liuS
@@ -39,4 +42,14 @@
     public void insertNoTableData(String backupTableName, String tableName, String day) {
         this.baseMapper.insertNoTableData(backupTableName, tableName, day);
     }
+
+    @Override
+    public List<Equipment> listByProds(List<String> proIds) {
+        return this.baseMapper.listByProds(proIds);
+    }
+
+    @Override
+    public Equipment findByEquId(String equipmentId) {
+        return this.baseMapper.findByEquId(equipmentId);
+    }
 }
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
index 9f09066..c4d6284 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
@@ -1070,4 +1070,9 @@
         return equipmentIds;
     }
 
+    @Override
+    public List<String> getEquIdsByProIds(List<String> proIds) {
+        return this.baseMapper.getEquIdsByProIds(proIds);
+    }
+
 }
diff --git a/lxzn-module-mdc/pom.xml b/lxzn-module-mdc/pom.xml
index bfb2188..51cc508 100644
--- a/lxzn-module-mdc/pom.xml
+++ b/lxzn-module-mdc/pom.xml
@@ -25,6 +25,11 @@
             <artifactId>lxzn-module-mdc-common</artifactId>
             <version>3.4.3</version>
         </dependency>
+        <dependency>
+            <groupId>org.jeecgframework.boot</groupId>
+            <artifactId>lxzn-module-eam-common</artifactId>
+            <version>3.4.3</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
new file mode 100644
index 0000000..f238759
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
@@ -0,0 +1,96 @@
+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("/equRepairList")
+    public Result<?> equRepairList(@ApiParam(value = "productionId", required = true) String productionId) {
+        List<EquRepair> result = dtBoardService.equRepairList(productionId);
+        return Result.OK(result);
+    }
+
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java
new file mode 100644
index 0000000..12e64b6
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.board.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.board.vo.EquRepair;
+
+import java.util.List;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-11
+ * @Description:
+ */
+@Mapper
+public interface DtBoardMapper {
+    List<EquRepair> equRepairList(@Param("equipmentIdList") List<String> equipmentIdList, @Param("date") String date);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml
new file mode 100644
index 0000000..566cd4b
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml
@@ -0,0 +1,27 @@
+<?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.board.mapper.DtBoardMapper">
+
+    <select id="equRepairList" resultType="org.jeecg.modules.board.vo.EquRepair">
+        SELECT
+            t3.equipment_code equipmentId,
+            COUNT(*) faultNum,
+            ROUND(
+                    SUM(DATEDIFF(MINUTE, t2.fault_start_time, t1.actual_end_time)) / 60.0,
+                    2
+            ) faultTime
+        FROM
+            eam_repair_order t1
+                LEFT JOIN eam_report_repair t2 ON t1.report_id = t2.id
+                LEFT JOIN eam_equipment t3 ON t1.equipment_id = t3.id
+        WHERE
+            t1.repair_status = 'COMPLETE'
+            AND t2.fault_start_time > #{date}
+            AND t3.equipment_code IN
+            <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
+                #{ id }
+            </foreach>
+        GROUP BY
+            t3.equipment_code
+    </select>
+</mapper>
\ No newline at end of file
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..be4172a
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
@@ -0,0 +1,32 @@
+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);
+
+    List<EquRepair> equRepairList(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..ebea97e
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
@@ -0,0 +1,368 @@
+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.mapper.DtBoardMapper;
+import org.jeecg.modules.board.service.IDtBoardService;
+import org.jeecg.modules.board.vo.*;
+import org.jeecg.modules.eam.service.IEamRepairOrderService;
+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.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+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;
+
+    @Resource
+    private DtBoardMapper dtBoardMapper;
+
+    /**
+     * 杞﹂棿淇℃伅
+     */
+    @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;
+    }
+
+    /**
+     * 璁惧鏁呴殰
+     * @param productionId
+     * @return
+     */
+    @Override
+    public List<EquRepair> equRepairList(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;
+        }
+        LocalDateTime currentDate = LocalDate.now().minusMonths(1).atStartOfDay();
+        String format = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        List<EquRepair> result = dtBoardMapper.equRepairList(equipmentIdList, format);
+        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/EquRepair.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java
new file mode 100644
index 0000000..8122dfc
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java
@@ -0,0 +1,26 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-10
+ * @Description: 璁惧鏁呴殰
+ */
+@Data
+public class EquRepair {
+    /**
+     * 璁惧缂栧彿
+     */
+    private String equipmentId;
+    /**
+     *  鏁呴殰娆℃暟
+     */
+    private BigDecimal faultNum;
+    /**
+     * 鏁呴殰鏃堕暱
+     */
+    private BigDecimal faultTime;
+}
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/AndonOrderController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java
new file mode 100644
index 0000000..a9a33ee
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java
@@ -0,0 +1,44 @@
+package org.jeecg.modules.mdc.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+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.modules.mdc.entity.AndonOrder;
+import org.jeecg.modules.mdc.service.IAndonOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+ /**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+@Api(tags="andon_order")
+@RestController
+@RequestMapping("/AndonOrder/andonOrder")
+@Slf4j
+public class AndonOrderController extends JeecgController<AndonOrder, IAndonOrderService> {
+	@Autowired
+	private IAndonOrderService andonOrderService;
+
+	 /**
+	  * 绋嬪簭鍛煎彨
+	  *
+	  * @param andonOrder
+	  * @return
+	  */
+	 @AutoLog(value = "瀹夌伅宸ュ崟-绋嬪簭鍛煎彨")
+	 @ApiOperation(value = "瀹夌伅宸ュ崟-绋嬪簭鍛煎彨", notes = "瀹夌伅宸ュ崟-绋嬪簭鍛煎彨")
+	 @PostMapping(value = "/procedureCall")
+	 public Result<?> procedureCall(@RequestBody AndonOrder andonOrder) {
+		 andonOrderService.procedureCall(andonOrder);
+		 return Result.OK("鍛煎彨鎴愬姛锛�");
+	 }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java
new file mode 100644
index 0000000..482612f
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java
@@ -0,0 +1,70 @@
+package org.jeecg.modules.mdc.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+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.modules.mdc.entity.MdcEquipmentPunch;
+import org.jeecg.modules.mdc.service.IMdcEquipmentPunchService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Api(tags="涓婁笅鐝墦鍗¤褰曡〃")
+@RestController
+@RequestMapping("/mdcEquipmentPunch")
+@Slf4j
+public class MdcEquipmentPunchController extends JeecgController<MdcEquipmentPunch, IMdcEquipmentPunchService> {
+	@Autowired
+	private IMdcEquipmentPunchService mdcEquipmentPunchService;
+
+	private static final String msg = "鎵撳崱鎴愬姛锛�";
+	
+	/**
+	 * 鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌
+	 *
+	 * @return
+	 */
+	@ApiOperation(value="鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌", notes="鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌")
+	@GetMapping(value = "/list")
+	public Result<List<MdcEquipmentPunch>> queryList() {
+		return Result.OK(mdcEquipmentPunchService.queryList());
+	}
+
+	/**
+	 *   涓婄彮鎵撳崱
+	 *
+	 * @param mdcEquipmentPunch
+	 * @return
+	 */
+	@AutoLog(value = "涓婄彮鎵撳崱")
+	@ApiOperation(value="涓婄彮鎵撳崱", notes="涓婄彮鎵撳崱")
+	@PostMapping(value = "/workUp")
+	public Result<String> workUp(@RequestBody MdcEquipmentPunch mdcEquipmentPunch) {
+		mdcEquipmentPunchService.workUp(mdcEquipmentPunch);
+		return Result.OK(msg);
+	}
+
+	/**
+	 *   涓嬬彮鎵撳崱
+	 *
+	 * @param mdcEquipmentPunch
+	 * @return
+	 */
+	@AutoLog(value = "涓嬬彮鎵撳崱")
+	@ApiOperation(value="涓嬬彮鎵撳崱", notes="涓嬬彮鎵撳崱")
+	@PostMapping(value = "/workDown")
+	public Result<String> workDown(@RequestBody MdcEquipmentPunch mdcEquipmentPunch) {
+		mdcEquipmentPunchService.workDown(mdcEquipmentPunch);
+		return Result.OK(msg);
+	}
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java
new file mode 100644
index 0000000..5321b7a
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java
@@ -0,0 +1,164 @@
+package org.jeecg.modules.mdc.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import cn.hutool.core.date.DatePattern;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date: 2025-06-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("andon_order")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "andon_order瀵硅薄", description = "andon_order")
+public class AndonOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**
+     * 璁惧缂栧彿
+     */
+    @Excel(name = "璁惧缂栧彿", width = 15)
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String equipmentId;
+    /**
+     * 鎵�灞炲巶鎴�
+     */
+    @Excel(name = "鎵�灞炲巶鎴�", width = 15)
+    @ApiModelProperty(value = "鎵�灞炲巶鎴�")
+    private String plantName;
+    /**
+     * 瀹夌伅绫诲瀷
+     */
+    @Excel(name = "瀹夌伅绫诲瀷", width = 15)
+    @ApiModelProperty(value = "瀹夌伅绫诲瀷")
+    private String andonType;
+    /**
+     * 瀹夌伅浜�(鍛煎彨浜�)
+     */
+    @Excel(name = "瀹夌伅浜�", width = 15)
+    @ApiModelProperty(value = "瀹夌伅浜�")
+    private String operator;
+    /**
+     * 鍛煎彨鍘熷洜
+     */
+    @Excel(name = "鍛煎彨鍘熷洜", width = 15)
+    @ApiModelProperty(value = "鍛煎彨鍘熷洜")
+    private String callReason;
+    /**
+     * 瀹夌伅鏃堕棿
+     */
+    @Excel(name = "瀹夌伅鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "瀹夌伅鏃堕棿")
+    private Date operateTime;
+    /**
+     * 鍝嶅簲浜�(璐d换浜�)
+     */
+    @Excel(name = "鍝嶅簲浜�", width = 15)
+    @ApiModelProperty(value = "鍝嶅簲浜�")
+    private String responder;
+    /**
+     * 鍝嶅簲鏃堕棿
+     */
+    @Excel(name = "鍝嶅簲鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鍝嶅簲鏃堕棿")
+    private Date responseTime;
+    /**
+     * 澶勭悊浜�
+     */
+    @Excel(name = "澶勭悊浜�", width = 15)
+    @ApiModelProperty(value = "澶勭悊浜�")
+    private String processor;
+    /**
+     * 澶勭悊瀹屾垚鏃堕棿
+     */
+    @Excel(name = "澶勭悊瀹屾垚鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "澶勭悊瀹屾垚鏃堕棿")
+    private Date processTime;
+    /**
+     * 瀹夌伅鐘舵��;寰呭搷搴斻�佸緟澶勭悊銆佸凡瀹屾垚
+     */
+    @Excel(name = "瀹夌伅鐘舵��;寰呭搷搴斻�佸緟澶勭悊銆佸凡瀹屾垚", width = 15)
+    @ApiModelProperty(value = "瀹夌伅鐘舵��;寰呭搷搴斻�佸緟澶勭悊銆佸凡瀹屾垚")
+    private String orderStatus;
+    /**
+     * 闂鎻忚堪
+     */
+    @Excel(name = "闂鎻忚堪", width = 15)
+    @ApiModelProperty(value = "闂鎻忚堪")
+    private String problemDescreption;
+    /**
+     * 澶勭悊缁撴灉鎻忚堪
+     */
+    @Excel(name = "澶勭悊缁撴灉鎻忚堪", width = 15)
+    @ApiModelProperty(value = "澶勭悊缁撴灉鎻忚堪")
+    private String resolutionDescreption;
+    /**
+     * 澶勭悊缁撴灉鍥剧墖
+     */
+    @Excel(name = "澶勭悊缁撴灉鍥剧墖", width = 15)
+    @ApiModelProperty(value = "澶勭悊缁撴灉鍥剧墖")
+    private String imageFiles;
+    /**
+     * 鍒犻櫎鏍囪
+     */
+    @Excel(name = "鍒犻櫎鏍囪", width = 15)
+    @ApiModelProperty(value = "鍒犻櫎鏍囪")
+    @TableLogic
+    private Integer delFlag;
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java
new file mode 100644
index 0000000..b64bcc4
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java
@@ -0,0 +1,145 @@
+package org.jeecg.modules.mdc.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import cn.hutool.core.date.DatePattern;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date: 2025-06-09
+ * @Version: V1.0
+ */
+@Data
+@TableName("mdc_equipment_punch")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "mdc_equipment_punch瀵硅薄", description = "mdc_equipment_punch")
+public class MdcEquipmentPunch implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "id")
+    private String id;
+    /**
+     * 璁惧缂栧彿
+     */
+    @Excel(name = "璁惧缂栧彿", width = 15)
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String equipmentId;
+    /**
+     * 鎵撳崱鐢ㄦ埛
+     */
+    @Excel(name = "鎵撳崱鐢ㄦ埛", width = 15)
+    @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛")
+    private String punchUser;
+    /**
+     * 鎵撳崱鐢ㄦ埛璐﹀彿
+     */
+    @Excel(name = "鎵撳崱鐢ㄦ埛璐﹀彿", width = 15)
+    @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛璐﹀彿")
+    @TableField(exist = false)
+    private String punchUserRealName;
+    /**
+     * 鎵撳崱鐢ㄦ埛鍚嶇О
+     */
+    @Excel(name = "鎵撳崱鐢ㄦ埛鍚嶇О", width = 15)
+    @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛鍚嶇О")
+    @TableField(exist = false)
+    private String punchUserUserName;
+    /**
+     * 涓婄彮鏃堕棿
+     */
+    @Excel(name = "涓婄彮鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "涓婄彮鏃堕棿")
+    private Date checkInTime;
+    /**
+     * 涓嬬彮鏃堕棿
+     */
+    @Excel(name = "涓嬬彮鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "涓嬬彮鏃堕棿")
+    private Date checkOutTime;
+    /**
+     * 璁板綍鏃ユ湡
+     */
+    @Excel(name = "璁板綍鏃ユ湡", width = 15)
+    @ApiModelProperty(value = "璁板綍鏃ユ湡")
+    private String recordDate;
+    /**
+     * 鐝
+     */
+    @Excel(name = "鐝", width = 15)
+    @ApiModelProperty(value = "鐝")
+    @Dict(dicCode = "shift_schedule")
+    private Integer shiftSchedule;
+    /**
+     * 鐝鍚嶇О
+     */
+    @Excel(name = "鐝鍚嶇О", width = 15)
+    @ApiModelProperty(value = "鐝鍚嶇О")
+    @TableField(exist = false)
+    private String shiftScheduleName;
+    /**
+     * 鏄惁缂哄崱
+     */
+    @Excel(name = "鏄惁缂哄崱", width = 15)
+    @ApiModelProperty(value = "鏄惁缂哄崱")
+    private Integer isAbsent;
+    /**
+     * 鏄惁杩熷埌
+     */
+    @Excel(name = "鏄惁杩熷埌", width = 15)
+    @ApiModelProperty(value = "鏄惁杩熷埌")
+    private Integer isLate;
+    /**
+     * 鏄惁鏃╅��
+     */
+    @Excel(name = "鏄惁鏃╅��", width = 15)
+    @ApiModelProperty(value = "鏄惁鏃╅��")
+    private Integer isEarly;
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOverallEquipmentEfficiencyJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOverallEquipmentEfficiencyJob.java
deleted file mode 100644
index 304cc7b..0000000
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOverallEquipmentEfficiencyJob.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.jeecg.modules.mdc.job;
-
-import lombok.extern.slf4j.Slf4j;
-import org.jeecg.common.util.DateUtils;
-import org.jeecg.modules.mdc.service.IMdcOverallEquipmentEfficiencyService;
-import org.jeecg.modules.mdc.util.ThrowableUtil;
-import org.jeecg.modules.quartz.entity.QuartzJob;
-import org.jeecg.modules.quartz.entity.SysQuartzLog;
-import org.jeecg.modules.quartz.service.IQuartzJobService;
-import org.jeecg.modules.quartz.service.ISysQuartzLogService;
-import org.jeecg.modules.system.service.ISysAnnouncementService;
-import org.quartz.*;
-
-import javax.annotation.Resource;
-import java.util.Date;
-import java.util.List;
-
-/**
- * @Description: 瀹氭椂璁$畻璁惧缁煎悎鏁堢巼OEE浠诲姟
- * @author: LiuS
- * @create: 2023-07-24 10:26
- */
-@PersistJobDataAfterExecution
-@DisallowConcurrentExecution
-@Slf4j
-public class RunningOverallEquipmentEfficiencyJob implements Job {
-
-    /**
-     * 鑻ュ弬鏁板彉閲忓悕淇敼 QuartzJobController涓篃闇�瀵瑰簲淇敼  鏃堕棿锛� yyyyMMdd 渚嬶細 20230414
-     */
-    private String parameter;
-
-    public void setParameter(String parameter) {
-        this.parameter = parameter;
-    }
-
-    @Resource
-    private IQuartzJobService quartzJobService;
-
-    @Resource
-    private ISysAnnouncementService sysAnnouncementService;
-
-    @Resource
-    private ISysQuartzLogService sysQuartzLogService;
-
-    @Resource
-    private IMdcOverallEquipmentEfficiencyService mdcOverallEquipmentEfficiencyService;
-
-    @Override
-    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        SysQuartzLog quartzLog = new SysQuartzLog();
-        quartzLog.setCreateTime(new Date());
-        List<QuartzJob> byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName());
-        if (byJobClassName != null && !byJobClassName.isEmpty()) {
-            quartzLog.setJobId(byJobClassName.get(0).getId());
-        }
-        quartzLog.setParams(this.parameter);
-        log.info("瀹氭椂璁$畻璁惧缁煎悎鏁堢巼OEE浠诲姟 RunningOverallEquipmentEfficiencyJob start!  鏃堕棿:" + DateUtils.now(), this.parameter);
-        long startTime = System.currentTimeMillis();
-        try {
-            mdcOverallEquipmentEfficiencyService.runningOverallEquipmentEfficiency(this.parameter);
-            quartzLog.setIsSuccess(0);
-        } catch (Exception e) {
-            quartzLog.setIsSuccess(-1);
-            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
-            // 鍙戦�佹秷鎭�氱煡
-            sysAnnouncementService.jobSendMessage("瀹氭椂缁熻娈垫椂闂翠换鍔�", quartzLog.getExceptionDetail());
-        }
-        long endTime = System.currentTimeMillis();
-        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
-        sysQuartzLogService.save(quartzLog);
-    }
-
-}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/WebsocketPushEquStatusJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/WebsocketPushEquStatusJob.java
new file mode 100644
index 0000000..b0a70c8
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/WebsocketPushEquStatusJob.java
@@ -0,0 +1,108 @@
+package org.jeecg.modules.mdc.job;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.constant.WebsocketConst;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.modules.board.vo.EquStatus;
+import org.jeecg.modules.mdc.entity.Equipment;
+import org.jeecg.modules.mdc.service.IEquipmentService;
+import org.jeecg.modules.mdc.util.ThrowableUtil;
+import org.jeecg.modules.message.websocket.WebSocket;
+import org.jeecg.modules.quartz.entity.QuartzJob;
+import org.jeecg.modules.quartz.entity.SysQuartzLog;
+import org.jeecg.modules.quartz.service.IQuartzJobService;
+import org.jeecg.modules.quartz.service.ISysQuartzLogService;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.quartz.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-05
+ * @Description: websocket鎺ㄩ�佽澶囩姸鎬佷换鍔�
+ */
+@DisallowConcurrentExecution
+@Slf4j
+public class WebsocketPushEquStatusJob implements Job {
+
+    @Resource
+    private IQuartzJobService quartzJobService;
+
+    @Resource
+    private ISysQuartzLogService sysQuartzLogService;
+
+    @Resource
+    private RedisUtil redisUtil;
+
+    @Resource
+    private WebSocket webSocket;
+
+    @Resource
+    private IEquipmentService equipmentService;
+
+    @Resource
+    private IMdcProductionService mdcProductionService;
+
+    final private static String redisKey = "board:equipment:status:";
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        SysQuartzLog quartzLog = new SysQuartzLog();
+        quartzLog.setCreateTime(new Date());
+        List<QuartzJob> byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName());
+        if (byJobClassName != null && !byJobClassName.isEmpty()) {
+            quartzLog.setJobId(byJobClassName.get(0).getId());
+        }
+        long startTime = System.currentTimeMillis();
+        try {
+            List<Equipment> equipmentList = equipmentService.list();
+            if (equipmentList != null && !equipmentList.isEmpty()) {
+                List<EquStatus> equStatusList = new ArrayList<>();
+                for (Equipment equipment : equipmentList) {
+                    if (equipment.getOporation() == null) {
+                        equipment.setOporation(0);
+                    }
+                    String key = redisKey + equipment.getEquipmentid();
+                    if (redisUtil.hasKey(key)) {
+                        Integer status = (Integer) redisUtil.get(key);
+                        if (!status.equals(equipment.getOporation())) {
+                            EquStatus equStatus = new EquStatus();
+                            equStatus.setEquipmentId(equipment.getEquipmentid());
+                            equStatus.setState(equipment.getOporation());
+                            // 閫氳繃equipmentId鑾峰彇璁惧杞﹂棿鍚嶇О
+                            String productionName = mdcProductionService.findProName(equipment.getEquipmentid());
+                            equStatus.setPlantName(productionName);
+                            equStatusList.add(equStatus);
+                            redisUtil.set(key, equipment.getOporation());
+                        }
+                    } else {
+                        EquStatus equStatus = new EquStatus();
+                        equStatus.setEquipmentId(equipment.getEquipmentid());
+                        equStatus.setState(equipment.getOporation());
+                        // 閫氳繃equipmentId鑾峰彇璁惧杞﹂棿鍚嶇О
+                        String productionName = mdcProductionService.findProName(equipment.getEquipmentid());
+                        equStatus.setPlantName(productionName);
+                        equStatusList.add(equStatus);
+                        redisUtil.set(key, equipment.getOporation());
+                    }
+                }
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put(WebsocketConst.MSG_CMD, "equStatus");
+                jsonObject.put("data", equStatusList);
+                webSocket.sendMessage(jsonObject.toJSONString());
+            }
+            quartzLog.setIsSuccess(0);
+        } catch (Exception e) {
+            quartzLog.setIsSuccess(-1);
+            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
+        }
+        long endTime = System.currentTimeMillis();
+        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
+        sysQuartzLogService.save(quartzLog);
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java
new file mode 100644
index 0000000..c624816
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.mdc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+public interface AndonOrderMapper extends BaseMapper<AndonOrder> {
+
+}
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/MdcEquipmentPunchMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java
new file mode 100644
index 0000000..3b45151
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java
@@ -0,0 +1,18 @@
+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.MdcEquipmentPunch;
+
+import java.util.List;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface MdcEquipmentPunchMapper extends BaseMapper<MdcEquipmentPunch> {
+
+    List<MdcEquipmentPunch> list(@Param("equipmentIds") List<String> equipmentIds, @Param("date") String date);
+}
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/AndonOrderMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml
new file mode 100644
index 0000000..cd37885
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml
@@ -0,0 +1,5 @@
+<?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.AndonOrderMapper">
+
+</mapper>
\ No newline at end of file
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/MdcEquipmentPunchMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml
new file mode 100644
index 0000000..48cc0e8
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml
@@ -0,0 +1,42 @@
+<?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.MdcEquipmentPunchMapper">
+
+    <select id="list" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentPunch">
+        SELECT
+          p.id,
+          p.equipment_id,
+          p.punch_user,
+          p.check_in_time,
+          p.check_out_time,
+          p.record_date,
+          p.is_absent,
+          p.is_late,
+          p.is_early,
+          p.create_by,
+          p.create_time,
+          p.update_by,
+          p.update_time,
+          p.shift_schedule,
+          u.realname punchUserRealName,
+          u.username punchUserUserName,
+          d1.item_text shiftScheduleName
+        FROM
+          mdc_equipment_punch p
+          INNER JOIN sys_user u ON u.id = p.punch_user
+          INNER JOIN (SELECT i1.item_text, i1.item_value
+                      FROM sys_dict_item i1
+                          LEFT JOIN sys_dict i2 ON i2.id = i1.dict_id
+                      WHERE i2.dict_code = 'shift_schedule') d1
+              ON d1.item_value = CAST (p.shift_schedule AS nvarchar)
+        where 1=1
+        AND p.equipment_id IN
+        <foreach collection="equipmentIds" item="equipmentId" open="(" close=")" separator=",">
+            #{equipmentId}
+        </foreach>
+        <if test="date != null and date != ''">
+            AND p.record_date = #{date}
+        </if>
+        order by p.equipment_id desc, p.shift_schedule asc
+    </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/IAndonOrderService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java
new file mode 100644
index 0000000..c0ae7dd
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java
@@ -0,0 +1,15 @@
+package org.jeecg.modules.mdc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+public interface IAndonOrderService extends IService<AndonOrder> {
+
+    void procedureCall(AndonOrder andonOrder);
+}
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/IMdcEquipmentPunchService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java
new file mode 100644
index 0000000..79be14a
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java
@@ -0,0 +1,21 @@
+package org.jeecg.modules.mdc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunch;
+
+import java.util.List;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface IMdcEquipmentPunchService extends IService<MdcEquipmentPunch> {
+
+    List<MdcEquipmentPunch> queryList();
+
+    void workUp(MdcEquipmentPunch mdcEquipmentPunch);
+
+    void workDown(MdcEquipmentPunch mdcEquipmentPunch);
+}
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/AndonOrderServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java
new file mode 100644
index 0000000..813d192
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java
@@ -0,0 +1,89 @@
+package org.jeecg.modules.mdc.service.impl;
+
+import cn.hutool.core.date.DatePattern;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.compress.utils.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.constant.WebsocketConst;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.mdc.dto.MdcEquProDto;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+import org.jeecg.modules.mdc.mapper.AndonOrderMapper;
+import org.jeecg.modules.mdc.service.IAndonOrderService;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.mdc.vo.AndonOrderWebSocketVo;
+import org.jeecg.modules.message.websocket.WebSocket;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+@Service
+public class AndonOrderServiceImpl extends ServiceImpl<AndonOrderMapper, AndonOrder> implements IAndonOrderService {
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+    @Resource
+    private WebSocket webSocket;
+    @Resource
+    private ISysUserService userService;
+    @Override
+    public void procedureCall(AndonOrder andonOrder) {
+        if (StringUtils.isBlank(andonOrder.getEquipmentId())) {
+            throw new JeecgBootException("璇烽�夋嫨璁惧锛�");
+        }
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        List<String> equipmentIds = Arrays.asList(andonOrder.getEquipmentId().split(StringPool.COMMA));
+
+        List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(equipmentIds);
+        Map<String, MdcEquProDto> equipmentIdToProductionIdMap = equipmentList.stream().collect(Collectors.toMap(MdcEquProDto::getEquipmentId, comRateDto -> comRateDto));
+        List<AndonOrder> list = Lists.newArrayList();
+        for (String equipmentId : equipmentIds) {
+            AndonOrder andonOrderInfo = new AndonOrder();
+            andonOrderInfo.setEquipmentId(equipmentId);
+            andonOrderInfo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(equipmentId) ? equipmentIdToProductionIdMap.get(equipmentId).getId() : null);
+            andonOrderInfo.setAndonType(StringPool.ONE);
+            andonOrderInfo.setOperator(andonOrder.getOperator());
+            andonOrderInfo.setOperateTime(new Date());
+            andonOrderInfo.setResponder(userId);
+            andonOrderInfo.setCallReason(andonOrder.getCallReason());
+            list.add(andonOrderInfo);
+        }
+
+        if (this.saveBatch(list)) {
+            List<AndonOrderWebSocketVo> andonOrderWebSocketVoList = Lists.newArrayList();
+            //璁剧疆websocket璇锋眰娑堟伅鏁版嵁
+            for (AndonOrder order : list) {
+                AndonOrderWebSocketVo andonOrderWebSocketVo = new AndonOrderWebSocketVo();
+                andonOrderWebSocketVo.setEquipmentId(order.getEquipmentId());
+                andonOrderWebSocketVo.setCallPersonnel(userService.getById(order.getOperator()).getRealname());
+                andonOrderWebSocketVo.setCallTime(DateUtils.format(order.getOperateTime(), DatePattern.NORM_DATE_PATTERN));
+                andonOrderWebSocketVo.setCallReason(order.getCallReason());
+                andonOrderWebSocketVo.setAndonType("绋嬪簭鍛煎彨");
+                andonOrderWebSocketVo.setPersonResponsible(user.getRealname());
+                andonOrderWebSocketVo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(order.getEquipmentId()) ? equipmentIdToProductionIdMap.get(order.getEquipmentId()).getProductionName() : null);
+                andonOrderWebSocketVoList.add(andonOrderWebSocketVo);
+            }
+
+            //鍙戦�亀ebsocket璇锋眰
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put(WebsocketConst.MSG_CMD, "andon");
+            jsonObject.put("data", andonOrderWebSocketVoList);
+            webSocket.sendMessage(jsonObject.toJSONString());
+        }
+    }
+}
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/MdcEquipmentPunchServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java
new file mode 100644
index 0000000..8b79829
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java
@@ -0,0 +1,234 @@
+package org.jeecg.modules.mdc.service.impl;
+
+
+import cn.hutool.core.date.DatePattern;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.compress.utils.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.entity.MdcEquipmentPunch;
+import org.jeecg.modules.mdc.mapper.MdcEquipmentPunchMapper;
+import org.jeecg.modules.mdc.service.IMdcEquipmentPunchService;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Service
+public class MdcEquipmentPunchServiceImpl extends ServiceImpl<MdcEquipmentPunchMapper, MdcEquipmentPunch> implements IMdcEquipmentPunchService {
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+
+    /**
+     * 鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌
+     * @return
+     */
+    @Override
+    public List<MdcEquipmentPunch> queryList() {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        List<String> equipmentIds = Lists.newArrayList();
+        if (StringUtils.isNotBlank(user.getEquipmentIds())) {
+            equipmentIds = Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA));
+        }else {
+            equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null);
+        }
+
+        if (CollectionUtils.isEmpty(equipmentIds)) {
+            return Lists.newArrayList();
+        }
+
+        if (StringUtils.isBlank(userId)) {
+            return Lists.newArrayList();
+        }
+
+        //鏍规嵁璁惧銆佸綋鍓嶆棩鏈熸煡璇㈡墦鍗¤褰�
+        List<MdcEquipmentPunch> mdcEquipmentPunches = this.baseMapper.list(equipmentIds, DateUtils.format(new Date(), DatePattern.PURE_DATE_PATTERN));
+        return mdcEquipmentPunches;
+    }
+
+    /**
+     * 涓婄彮鎵撳崱
+     * @param mdcEquipmentPunch
+     */
+    @Override
+    public void workUp(MdcEquipmentPunch mdcEquipmentPunch) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+
+        if (StringUtils.isBlank(mdcEquipmentPunch.getEquipmentId())) {
+            throw new JeecgBootException("璇烽�夋嫨鎵撳崱璁惧锛�");
+        }
+
+        /**
+         * 鏍¢獙鏄惁鍦ㄦ湁鏁堟墦鍗¤寖鍥翠箣鍐�
+         *      鏃╃彮涓婄彮鍗℃湁鏁堣寖鍥翠负锛�00:00:00 ~ 17:30:00
+         *      鏅氱彮涓婄彮鍗℃湁鏁堣寖鍥翠负锛�00:00:00 ~ 23:00:00
+         */
+        Date startDate = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 00:00:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        Date endDate = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 17:30:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        if (mdcEquipmentPunch.getShiftSchedule() == 2) {
+            //鏅氱彮鏃犳晥鎵撳崱鏃堕棿鑼冨洿
+            endDate = DateUtils.getFormatDate(
+                    DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 23:00:00",
+                    DatePattern.NORM_DATETIME_PATTERN
+            );
+        }
+
+        if (startDate.compareTo(mdcEquipmentPunch.getCheckInTime()) == 1 || endDate.compareTo(mdcEquipmentPunch.getCheckInTime()) == -1) {
+            throw new JeecgBootException("鏈湪鏈夋晥涓婄彮鎵撳崱鏃堕棿鍐咃紝涓嶈兘鎵撳崱锛�");
+        }
+
+        //鏌ヨ鎵�閫夎澶囧綋澶╂槸鍚﹀凡鎵撲笂鐝崱
+        List<String> equipmentIdList = Arrays.asList(mdcEquipmentPunch.getEquipmentId().split(StringPool.COMMA));
+        String currentDate = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.PURE_DATE_PATTERN);
+
+        //鏃╃彮涓婄彮姝e父鏈�鏅氭墦鍗℃椂闂�
+        String checkInTime = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 08:30:00";
+
+        //鏌ヨ褰撳墠璁惧銆佸綋鍓嶆墦鍗$被鍨嬫墦鍗¤褰�
+        List<MdcEquipmentPunch> equipmentPunchList = this.list(new LambdaQueryWrapper<MdcEquipmentPunch>()
+                .eq(MdcEquipmentPunch::getShiftSchedule, mdcEquipmentPunch.getShiftSchedule())
+                .eq(MdcEquipmentPunch::getRecordDate, currentDate)
+                .in(MdcEquipmentPunch::getEquipmentId, equipmentIdList));
+        List<MdcEquipmentPunch> mdcEquipmentPunchList = equipmentPunchList.stream().filter(equipmentPunch -> Objects.nonNull(equipmentPunch.getCheckInTime())).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(mdcEquipmentPunchList)) {
+            List<String> equipmentIds = equipmentPunchList.stream()
+                    .filter(mdcEquipmentPunchInfo -> Objects.nonNull(mdcEquipmentPunchInfo.getCheckInTime()))
+                    .map(MdcEquipmentPunch::getEquipmentId)
+                    .distinct()
+                    .collect(Collectors.toList());
+            throw new JeecgBootException("璁惧[" + StringUtils.join(equipmentIds, StringPool.COMMA) + "]宸叉墦鍗★紝鏃犻渶閲嶅鎵撳崱");
+        }
+
+        List<MdcEquipmentPunch> list = Lists.newArrayList();
+
+        //鐗规畩澶勭悊鏅氱彮涓婄彮鍗�
+        if (mdcEquipmentPunch.getShiftSchedule() == 2) {
+            //鏅氱彮姝e父涓婄彮鍗℃渶鏅氭墦鍗℃椂闂�
+            checkInTime = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 17:00:00";
+        }
+
+
+        for (String equipment : equipmentIdList) {
+            Optional<MdcEquipmentPunch> first = equipmentPunchList.stream().filter(equipmentPunch -> Objects.isNull(equipmentPunch.getCheckInTime()) && equipment.equals(equipmentPunch.getEquipmentId())).findFirst();
+            MdcEquipmentPunch equipmentPunch = new MdcEquipmentPunch();
+            if (first.isPresent()) {
+                equipmentPunch = first.get();
+            }else {
+                equipmentPunch.setEquipmentId(equipment);
+                equipmentPunch.setPunchUser(userId);
+                equipmentPunch.setRecordDate(currentDate);
+                equipmentPunch.setShiftSchedule(mdcEquipmentPunch.getShiftSchedule());
+                equipmentPunch.setIsAbsent(0);
+                equipmentPunch.setIsEarly(0);
+            }
+            equipmentPunch.setCheckInTime(mdcEquipmentPunch.getCheckInTime());
+            //鎵撳崱鏃堕棿澶т簬8锛�30/17:00鏃朵负杩熷埌鎵撳崱
+            equipmentPunch.setIsLate(mdcEquipmentPunch.getCheckInTime().compareTo(DateUtils.getFormatDate(checkInTime, DatePattern.NORM_DATETIME_PATTERN)) == 1 ? 1 : 0);
+
+            list.add(equipmentPunch);
+        }
+        this.saveOrUpdateBatch(list);
+    }
+
+    @Override
+    public void workDown(MdcEquipmentPunch mdcEquipmentPunch) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+
+        if (StringUtils.isBlank(mdcEquipmentPunch.getEquipmentId())) {
+            throw new JeecgBootException("璇烽�夋嫨鎵撳崱璁惧锛�");
+        }
+
+        /**
+         * 鏍¢獙褰撳墠涓嬬彮鍗℃槸鍚﹀湪鏈夋晥涓嬬彮鎵撳崱鑼冨洿涔嬪唴
+         *      鏃╃彮涓嬬彮鏃犳晥鎵撳崱鏃堕棿鑼冨洿涓�00:00:00 ~ 08:30:00
+         *      鏅氱彮涓嬬彮鏃犳晥鎵撳崱鏃堕棿鑼冨洿涓�00:00:00 ~ 17:00:00
+         */
+        Date startDate = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 00:00:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        Date endDate = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 08:30:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        Date checkOutTime = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 17:30:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        if (mdcEquipmentPunch.getShiftSchedule() == 2) {
+            //鏅氱彮鏃犳晥鎵撳崱鏃堕棿鑼冨洿
+            endDate = DateUtils.getFormatDate(
+                    DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 17:00:00",
+                    DatePattern.NORM_DATETIME_PATTERN
+            );
+            //鏅氱彮姝e父涓嬬彮鏈�鏃╂墦鍗℃椂闂�
+            checkOutTime = DateUtils.getFormatDate(
+                    DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 23:00:00",
+                    DatePattern.NORM_DATETIME_PATTERN
+            );
+        }
+
+        if (startDate.compareTo(mdcEquipmentPunch.getCheckOutTime()) == 1
+                || endDate.compareTo(mdcEquipmentPunch.getCheckOutTime()) == 1) {
+            throw new JeecgBootException("鏈湪鏈夋晥涓嬬彮鎵撳崱鏃堕棿鍐咃紝涓嶈兘鎵撳崱锛�");
+        }
+
+        //鏌ヨ褰撳墠鎵�閫夎澶囨槸鍚﹀瓨鍦ㄤ笂鐝墦鍗¤褰�
+        List<String> equipmentIdList = Arrays.asList(mdcEquipmentPunch.getEquipmentId().split(StringPool.COMMA));
+        String currentDate = DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.PURE_DATE_PATTERN);
+        List<MdcEquipmentPunch> equipmentPunchList = this.list(new LambdaQueryWrapper<MdcEquipmentPunch>()
+                .eq(MdcEquipmentPunch::getShiftSchedule, mdcEquipmentPunch.getShiftSchedule())
+                .eq(MdcEquipmentPunch::getRecordDate, currentDate)
+                .in(MdcEquipmentPunch::getEquipmentId, equipmentIdList));
+
+        List<MdcEquipmentPunch> list = Lists.newArrayList();
+
+        for (String equipmentId : equipmentIdList) {
+            Optional<MdcEquipmentPunch> mdcEquipmentPunchOptional = equipmentPunchList.stream()
+                    .filter(mdcEquipmentPunch1 -> mdcEquipmentPunch1.getEquipmentId().equals(equipmentId))
+                    .findFirst();
+            MdcEquipmentPunch equipmentPunch = new MdcEquipmentPunch();
+            if (mdcEquipmentPunchOptional.isPresent()) {
+                equipmentPunch = mdcEquipmentPunchOptional.get();
+            }else {
+                equipmentPunch.setIsAbsent(1);
+                equipmentPunch.setIsLate(0);
+                equipmentPunch.setEquipmentId(equipmentId);
+                equipmentPunch.setShiftSchedule(mdcEquipmentPunch.getShiftSchedule());
+                equipmentPunch.setPunchUser(userId);
+                equipmentPunch.setRecordDate(currentDate);
+            }
+            equipmentPunch.setCheckOutTime(mdcEquipmentPunch.getCheckOutTime());
+
+            //涓嬬彮鎵撳崱鏃堕棿鏃╀簬17:30/23:00鍒欎负鏃╅��
+            equipmentPunch.setIsEarly(checkOutTime.compareTo(mdcEquipmentPunch.getCheckOutTime()) == 1 ? 1 : 0);
+            list.add(equipmentPunch);
+        }
+
+        this.saveOrUpdateBatch(list);
+    }
+}
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/AndonOrderWebSocketVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java
new file mode 100644
index 0000000..411a4ec
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java
@@ -0,0 +1,52 @@
+package org.jeecg.modules.mdc.vo;
+
+import lombok.Data;
+
+@Data
+public class AndonOrderWebSocketVo {
+
+    /**
+     * 璁惧缂栧彿
+     */
+    private String equipmentId;
+
+    /**
+     * 鍛煎彨浜哄憳
+     */
+    private String callPersonnel;
+
+    /**
+     * 瀹夌伅绫诲瀷
+     */
+    private String andonType;
+
+    /**
+     * 鍛煎彨鏃堕棿
+     */
+    private String callTime;
+
+    /**
+     * 鍛煎彨鍘熷洜
+     */
+    private String callReason;
+
+    /**
+     * 璐d换浜�
+     */
+    private String personResponsible;
+
+    /**
+     * 鎶ヤ慨鏃堕棿
+     */
+    private String repairTime;
+
+    /**
+     * 鏁呴殰鎻忚堪
+     */
+    private String faultInfo;
+
+    /**
+     * 鎵�灞炲巶鎴�
+     */
+    private String plantName;
+}
diff --git a/lxzn-module-msi/src/main/java/org/jeecg/modules/msi/utils/WebServiceUtil.java b/lxzn-module-msi/src/main/java/org/jeecg/modules/msi/utils/WebServiceUtil.java
deleted file mode 100644
index a104726..0000000
--- a/lxzn-module-msi/src/main/java/org/jeecg/modules/msi/utils/WebServiceUtil.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.jeecg.modules.msi.utils;
-
-
-import org.apache.cxf.endpoint.Client;
-import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
-import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
-
-
-public class WebServiceUtil {
-    /**
-     * 1.浠g悊绫诲伐鍘傜殑鏂瑰紡,闇�瑕佹嬁鍒板鏂圭殑鎺ュ彛鍦板潃, 鍚屾椂闇�瑕佸紩鍏ユ帴鍙�
-     */
-    public static void invokeService_1(String address, Class<?> tClass){
-        // 鎺ュ彛鍦板潃
-        //String address = "http://localhost:8080/services/ws/api?wsdl";
-        // 浠g悊宸ュ巶
-        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
-        // 璁剧疆浠g悊鍦板潃
-        jaxWsProxyFactoryBean.setAddress(address);
-        // 璁剧疆鎺ュ彛绫诲瀷
-        jaxWsProxyFactoryBean.setServiceClass(tClass);
-        // 鍒涘缓涓�涓唬鐞嗘帴鍙e疄鐜�
-        Object us = jaxWsProxyFactoryBean.create();
-        // 鏁版嵁鍑嗗
-        String data = "hello world";
-        // 璋冪敤浠g悊鎺ュ彛鐨勬柟娉曡皟鐢ㄥ苟杩斿洖缁撴灉
-        //String result = us.emrService(data);
-        //System.out.println("杩斿洖缁撴灉:" + result);
-    }
-
-    /**
-     * 3. 鍔ㄦ�佽皟鐢�
-     */
-    public static String invokeService(String uri, String data, String method)
-    {
-        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
-        Client client = dcf.createClient(uri);
-        Object[] objects = new Object[0];
-        try {
-            objects = client.invoke(method, data);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return String.valueOf(objects[0]);
-    }
-
-    /**
-     * 2. 鍔ㄦ�佽皟鐢�
-     */
-    public static String invokeServiceObJect(String uri,Object[] datas, String method)
-    {
-        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
-        Client client = dcf.createClient(uri);
-        Object[] objects = new Object[0];
-        try {
-            objects = client.invoke(method, datas);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return String.valueOf(objects[0]);
-    }
-}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
index b2ccf23..35d7d6d 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
@@ -2,6 +2,9 @@
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 import javax.annotation.Resource;
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
@@ -23,7 +26,7 @@
 @Slf4j
 @ServerEndpoint("/websocket/{userId}")
 public class WebSocket {
-    
+
     /**绾跨▼瀹夊叏Map*/
     private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
 
@@ -34,14 +37,23 @@
     @Resource
     private JeecgRedisClient jeecgRedisClient;
 
+    private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 
     //==========銆恮ebsocket鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�========================================================================================
+
     @OnOpen
     public void onOpen(Session session, @PathParam(value = "userId") String userId) {
         try {
             sessionPool.put(userId, session);
             log.info("銆愮郴缁� WebSocket銆戞湁鏂扮殑杩炴帴锛屾�绘暟涓�:" + sessionPool.size());
+
+            // 鍚姩蹇冭烦浠诲姟锛屾瘡鍒嗛挓鍙戦�佷竴娆″績璺虫秷鎭�
+//            scheduler.scheduleAtFixedRate(() -> {
+//                pushMessage(userId, "{\"cmd\":\"" + WebsocketConst.CMD_USER + "\",\"txt\":\"" + "蹇冭烦鍝嶅簲" + "\"}");
+//            }, 0, 1, TimeUnit.MINUTES);
+
         } catch (Exception e) {
+            log.error("銆愮郴缁� WebSocket銆憃nOpen 寮傚父", e);
         }
     }
 
@@ -50,6 +62,8 @@
         try {
             sessionPool.remove(userId);
             log.info("銆愮郴缁� WebSocket銆戣繛鎺ユ柇寮�锛屾�绘暟涓�:" + sessionPool.size());
+            // 鍙栨秷蹇冭烦浠诲姟
+            scheduler.shutdown();
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -93,12 +107,11 @@
                     log.error(e.getMessage(), e);
                 }
             }
-            log.info("銆愮郴缁� WebSocket銆戠兢鍙戞秷鎭�:" + message);
+            log.info("銆�3D瀹炴椂鏁版嵁 WebSocket銆戞秷鎭�" );
         } catch (Exception e) {
             log.error(e.getMessage(), e);
         }
     }
-
 
     /**
      * ws鎺ュ彈瀹㈡埛绔秷鎭�
@@ -110,14 +123,14 @@
         }else{
             log.debug("銆愮郴缁� WebSocket銆戞敹鍒板鎴风娑堟伅:" + message);
         }
-        
+
         //------------------------------------------------------------------------------
-        JSONObject obj = new JSONObject();
-        //涓氬姟绫诲瀷
-        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
-        //娑堟伅鍐呭
-        obj.put(WebsocketConst.MSG_TXT, "蹇冭烦鍝嶅簲");
-        this.pushMessage(userId, obj.toJSONString());
+//        JSONObject obj = new JSONObject();
+//        //涓氬姟绫诲瀷
+//        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
+//        //娑堟伅鍐呭
+//        obj.put(WebsocketConst.MSG_TXT, "蹇冭烦鍝嶅簲");
+//        this.pushMessage(userId, obj.toJSONString());
         //------------------------------------------------------------------------------
     }
 
@@ -129,11 +142,11 @@
      */
     @OnError
     public void onError(Session session, Throwable t) {
-        log.warn("銆愮郴缁� WebSocket銆戞秷鎭嚭鐜伴敊璇�");
+        log.warn("銆愮郴缁� WebSocket銆戞秷鎭嚭鐜伴敊璇�",t);
         //t.printStackTrace();
     }
     //==========銆愮郴缁� WebSocket鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�========================================================================================
-    
+
 
     //==========銆愰噰鐢╮edis鍙戝竷璁㈤槄妯″紡鈥斺�旀帹閫佹秷鎭��========================================================================================
     /**
@@ -187,5 +200,5 @@
         }
     }
     //=======銆愰噰鐢╮edis鍙戝竷璁㈤槄妯″紡鈥斺�旀帹閫佹秷鎭��==========================================================================================
-    
+
 }
\ No newline at end of file
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
index f53d482..fe64c7a 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
@@ -61,4 +61,8 @@
     List<String> findTeamValue(@Param("userId") String userId, @Param("productionList") List<String> productionList);
 
     List<String> findProIdsByUId(@Param("userId") String userId, @Param("allProductionIds") List<String> allProductionIds);
+
+    List<String> findChildByProId(@Param("productionId") String productionId);
+
+    String findProName(@Param("equipmentId") String equipmentId);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
index 7d0b8f2..ae5f5d3 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
@@ -138,4 +138,67 @@
             </foreach>
           AND user_id = #{userId}
     </select>
+
+    <select id="findChildByProId" resultType="java.lang.String">
+        WITH temp ( id ) AS (
+            SELECT
+                id
+            FROM
+                mdc_production
+            WHERE
+                id = #{ productionId }
+              AND mdc_flag = '1' UNION ALL
+            SELECT
+                a.id
+            FROM
+                mdc_production a
+                    INNER JOIN temp ON a.parent_id = temp.id
+            WHERE
+                a.mdc_flag = '1'
+        ) SELECT
+            *
+        FROM
+            temp
+    </select>
+
+    <select id="findProName" resultType="java.lang.String">
+        WITH production_hierarchy AS (
+            SELECT
+                t3.id,
+                t3.parent_id,
+                t3.production_name,
+                t3.org_type,
+                0 AS level
+            FROM
+                mdc_equipment t1
+                    JOIN
+                mdc_production_equipment t2 ON t1.id = t2.equipment_id
+                    JOIN
+                mdc_production t3 ON t2.production_id = t3.id
+            WHERE
+                t1.equipment_id = #{equipmentId}
+
+            UNION ALL
+            SELECT
+                t4.id,
+                t4.parent_id,
+                t4.production_name,
+                t4.org_type,
+                ph.level + 1
+            FROM
+                production_hierarchy ph
+                    JOIN
+                mdc_production t4 ON ph.parent_id = t4.id
+            WHERE
+                ph.parent_id IS NOT NULL
+        )
+        SELECT TOP 1
+            production_name
+        FROM
+            production_hierarchy
+        WHERE
+            org_type = 2
+        ORDER BY
+            level ASC
+    </select>
 </mapper>
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
index 104a9db..d5d6e64 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
@@ -175,4 +175,14 @@
      * @return
      */
     List<String> findProIdsByUId(String userId, List<String> allProductionIds);
+
+    /**
+     *
+     * @param productionId
+     * @return
+     */
+    List<String> findChildByProId(String productionId);
+
+
+    String findProName(String equipmentId);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
index c502486..a3128e2 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
@@ -627,4 +627,14 @@
             super.update(updateWrapper);
         }
     }
+
+    @Override
+    public List<String> findChildByProId(String productionId) {
+        return this.baseMapper.findChildByProId(productionId);
+    }
+
+    @Override
+    public String findProName(String equipmentId) {
+        return this.baseMapper.findProName(equipmentId);
+    }
 }
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/controller/PreparationOrderController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java
new file mode 100644
index 0000000..0a84ad8
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java
@@ -0,0 +1,326 @@
+package org.jeecg.modules.tms.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import org.jeecg.common.system.query.QueryGenerator;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.tms.entity.dto.PreparationOrderAndDetailDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.web.servlet.ModelAndView;
+import java.util.Arrays;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.tms.entity.PreparationOrderDetail;
+import org.jeecg.modules.tms.entity.PreparationOrder;
+import org.jeecg.modules.tms.service.IPreparationOrderService;
+import org.jeecg.modules.tms.service.IPreparationOrderDetailService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 鍒�鍏峰噯澶囧崟
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Api(tags="鍒�鍏峰噯澶囧崟")
+@RestController
+@RequestMapping("/tms/preparationOrder")
+@Slf4j
+public class PreparationOrderController extends JeecgController<PreparationOrder, IPreparationOrderService> {
+
+    @Autowired
+    private IPreparationOrderService preparationOrderService;
+
+    @Autowired
+    private IPreparationOrderDetailService preparationOrderDetailService;
+
+
+    /*---------------------------------涓昏〃澶勭悊-begin-------------------------------------*/
+
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     * @param preparationOrder
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    //@AutoLog(value = "鍒�鍏峰噯澶囧崟-鍒嗛〉鍒楄〃鏌ヨ")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟-鍒嗛〉鍒楄〃鏌ヨ", notes="鍒�鍏峰噯澶囧崟-鍒嗛〉鍒楄〃鏌ヨ")
+    @GetMapping(value = "/list")
+    public Result<IPage<PreparationOrder>> queryPageList(PreparationOrder preparationOrder,
+                                                         @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+                                                         @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+                                                         HttpServletRequest req) {
+        Map<String, String[]> parameterMap = req.getParameterMap();
+        QueryWrapper<PreparationOrder> queryWrapper = QueryGenerator.initQueryWrapper(preparationOrder, parameterMap);
+        Page<PreparationOrder> page = new Page<PreparationOrder>(pageNo, pageSize);
+        IPage<PreparationOrder> pageList = preparationOrderService.queryPageList(page, parameterMap);
+        return Result.OK(pageList);
+    }
+
+    /**
+     *   娣诲姞
+     * @param preparationOrder
+     * @return
+     */
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟-娣诲姞")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟-娣诲姞", notes="鍒�鍏峰噯澶囧崟-娣诲姞")
+    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:add")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody PreparationOrder preparationOrder) {
+        preparationOrderService.save(preparationOrder);
+        return Result.OK("娣诲姞鎴愬姛锛�");
+    }
+
+    /**
+     *  缂栬緫
+     * @param preparationOrder
+     * @return
+     */
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟-缂栬緫")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟-缂栬緫", notes="鍒�鍏峰噯澶囧崟-缂栬緫")
+    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:edit")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+    public Result<String> edit(@RequestBody PreparationOrder preparationOrder) {
+        preparationOrderService.updateById(preparationOrder);
+        return Result.OK("缂栬緫鎴愬姛!");
+    }
+
+
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟-纭瀹屾垚")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟-璋冩満鍛樹慨姝g‘璁�", notes = "鍒�鍏峰噯澶囧崟-璋冩満鍛樹慨姝g‘璁�")
+    @RequestMapping(value = "/editTotal", method = {RequestMethod.PUT,RequestMethod.POST})
+    public Result<String> editTotal(@RequestBody PreparationOrderAndDetailDto preparationOrderAndDetailDto) {
+        preparationOrderService.editTotal(preparationOrderAndDetailDto);
+        return Result.OK("纭瀹屾垚锛�");
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟-閫氳繃id鍒犻櫎鍑嗗鍗曞強鏄庣粏")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟-閫氳繃id鍒犻櫎鍑嗗鍗曞強鏄庣粏", notes="鍒�鍏峰噯澶囧崟-閫氳繃id鍒犻櫎鍑嗗鍗曞強鏄庣粏")
+    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:delete")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+        preparationOrderService.delMain(id);
+        return Result.OK("鍒犻櫎鎴愬姛!");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟-鎵归噺鍒犻櫎")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟-鎵归噺鍒犻櫎", notes="鍒�鍏峰噯澶囧崟-鎵归噺鍒犻櫎")
+    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:deleteBatch")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+        preparationOrderService.delBatchMain(Arrays.asList(ids.split(",")));
+        return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+    }
+
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟-杞嚭搴撶敵璇峰崟")
+    @ApiOperation(value = "鍒�鍏峰噯澶囧崟-杞嚭搴撶敵璇峰崟", notes = "鍒�鍏峰噯澶囧崟-杞嚭搴撶敵璇峰崟")
+    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:convert")
+    @PostMapping(value = "/convertToOutboundOrder")
+    public Result<String> convertToOutboundOrder(@RequestBody List<String> preparationOrderIds) {
+        List<String> result = preparationOrderService.convertToOutboundOrder(preparationOrderIds);
+        return Result.OK(JSONObject.toJSONString(result));
+    }
+
+    /**
+     * 瀵煎嚭
+     * @return
+     */
+    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, PreparationOrder preparationOrder) {
+        return super.exportXls(request, preparationOrder, PreparationOrder.class, "鍒�鍏峰噯澶囧崟");
+    }
+
+    /**
+     * 瀵煎叆
+     * @return
+     */
+    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, PreparationOrder.class);
+    }
+    /*---------------------------------涓昏〃澶勭悊-end-------------------------------------*/
+
+
+    /*--------------------------------瀛愯〃澶勭悊-鍒�鍏峰噯澶囧崟鏄庣粏-begin----------------------------------------------*/
+    /**
+     * 閫氳繃涓昏〃ID鏌ヨ
+     * @return
+     */
+    //@AutoLog(value = "鍒�鍏峰噯澶囧崟鏄庣粏-閫氳繃涓昏〃ID鏌ヨ")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟鏄庣粏-閫氳繃涓昏〃ID鏌ヨ", notes="鍒�鍏峰噯澶囧崟鏄庣粏-閫氳繃涓昏〃ID鏌ヨ")
+    @GetMapping(value = "/listPreparationOrderDetailByMainId")
+    public Result<IPage<PreparationOrderDetail>> listPreparationOrderDetailByMainId(PreparationOrderDetail preparationOrderDetail,
+                                                                                    @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                                    HttpServletRequest req) {
+        Map<String, String[]> parameterMap = req.getParameterMap();
+        QueryWrapper<PreparationOrderDetail> queryWrapper = QueryGenerator.initQueryWrapper(preparationOrderDetail, parameterMap);
+        Page<PreparationOrderDetail> page = new Page<PreparationOrderDetail>(pageNo, pageSize);
+        IPage<PreparationOrderDetail> pageList = preparationOrderDetailService.queryPageList(page, parameterMap);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 娣诲姞
+     * @param preparationOrderDetail
+     * @return
+     */
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟鏄庣粏-娣诲姞")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟鏄庣粏-娣诲姞", notes="鍒�鍏峰噯澶囧崟鏄庣粏-娣诲姞")
+    @PostMapping(value = "/addPreparationOrderDetail")
+    public Result<String> addPreparationOrderDetail(@RequestBody PreparationOrderDetail preparationOrderDetail) {
+        preparationOrderDetailService.save(preparationOrderDetail);
+        return Result.OK("娣诲姞鎴愬姛锛�");
+    }
+
+    /**
+     * 缂栬緫
+     * @param preparationOrderDetail
+     * @return
+     */
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟鏄庣粏-缂栬緫")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟鏄庣粏-缂栬緫", notes="鍒�鍏峰噯澶囧崟鏄庣粏-缂栬緫")
+    @RequestMapping(value = "/editPreparationOrderDetail", method = {RequestMethod.PUT,RequestMethod.POST})
+    public Result<String> editPreparationOrderDetail(@RequestBody PreparationOrderDetail preparationOrderDetail) {
+        preparationOrderDetailService.updateById(preparationOrderDetail);
+        return Result.OK("缂栬緫鎴愬姛!");
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟鏄庣粏-閫氳繃id鍒犻櫎")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟鏄庣粏-閫氳繃id鍒犻櫎", notes="鍒�鍏峰噯澶囧崟鏄庣粏-閫氳繃id鍒犻櫎")
+    @DeleteMapping(value = "/deletePreparationOrderDetail")
+    public Result<String> deletePreparationOrderDetail(@RequestParam(name="id",required=true) String id) {
+        preparationOrderDetailService.removeById(id);
+        return Result.OK("鍒犻櫎鎴愬姛!");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟鏄庣粏-鎵归噺鍒犻櫎")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟鏄庣粏-鎵归噺鍒犻櫎", notes="鍒�鍏峰噯澶囧崟鏄庣粏-鎵归噺鍒犻櫎")
+    @DeleteMapping(value = "/deleteBatchPreparationOrderDetail")
+    public Result<String> deleteBatchPreparationOrderDetail(@RequestParam(name="ids",required=true) String ids) {
+        this.preparationOrderDetailService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+    }
+
+    /**
+     * 瀵煎嚭
+     * @return
+     */
+    @RequestMapping(value = "/exportPreparationOrderDetail")
+    public ModelAndView exportPreparationOrderDetail(HttpServletRequest request, PreparationOrderDetail preparationOrderDetail) {
+        // Step.1 缁勮鏌ヨ鏉′欢
+        QueryWrapper<PreparationOrderDetail> queryWrapper = QueryGenerator.initQueryWrapper(preparationOrderDetail, request.getParameterMap());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        // Step.2 鑾峰彇瀵煎嚭鏁版嵁
+        List<PreparationOrderDetail> pageList = preparationOrderDetailService.list(queryWrapper);
+        List<PreparationOrderDetail> exportList = null;
+
+        // 杩囨护閫変腑鏁版嵁
+        String selections = request.getParameter("selections");
+        if (oConvertUtils.isNotEmpty(selections)) {
+            List<String> selectionList = Arrays.asList(selections.split(","));
+            exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
+        } else {
+            exportList = pageList;
+        }
+
+        // Step.3 AutoPoi 瀵煎嚭Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        //姝ゅ璁剧疆鐨刦ilename鏃犳晥,鍓嶇浼氶噸鏇存柊璁剧疆涓�涓�
+        mv.addObject(NormalExcelConstants.FILE_NAME, "鍒�鍏峰噯澶囧崟鏄庣粏");
+        mv.addObject(NormalExcelConstants.CLASS, PreparationOrderDetail.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("鍒�鍏峰噯澶囧崟鏄庣粏鎶ヨ〃", "瀵煎嚭浜�:" + sysUser.getRealname(), "鍒�鍏峰噯澶囧崟鏄庣粏"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+        return mv;
+    }
+
+    /**
+     * 瀵煎叆
+     * @return
+     */
+    @RequestMapping(value = "/importPreparationOrderDetail/{mainId}")
+    public Result<?> importPreparationOrderDetail(HttpServletRequest request, HttpServletResponse response, @PathVariable("mainId") String mainId) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            // 鑾峰彇涓婁紶鏂囦欢瀵硅薄
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<PreparationOrderDetail> list = ExcelImportUtil.importExcel(file.getInputStream(), PreparationOrderDetail.class, params);
+                for (PreparationOrderDetail temp : list) {
+                    temp.setPreparationOrderId(mainId);
+                }
+                long start = System.currentTimeMillis();
+                preparationOrderDetailService.saveBatch(list);
+                log.info("娑堣�楁椂闂�" + (System.currentTimeMillis() - start) + "姣");
+                return Result.OK("鏂囦欢瀵煎叆鎴愬姛锛佹暟鎹鏁帮細" + list.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("鏂囦欢瀵煎叆澶辫触:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.error("鏂囦欢瀵煎叆澶辫触锛�");
+    }
+
+    /*--------------------------------瀛愯〃澶勭悊-鍒�鍏峰噯澶囧崟鏄庣粏-end----------------------------------------------*/
+
+
+
+
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java
index 96d0f66..f369fd9 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java
@@ -2,17 +2,25 @@
 
 import org.jeecg.modules.tms.entity.OutboundOrder;
 import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
+import org.mapstruct.BeanMapping;
 import org.mapstruct.Mapper;
+import org.mapstruct.NullValuePropertyMappingStrategy;
+import org.mapstruct.ReportingPolicy;
 import org.mapstruct.factory.Mappers;
 
 /**
  * 浣跨敤 MapStruct 鏂瑰紡杩涜灞炴�у鍒�
  * 娉ㄦ剰涓嶈兘鏀惧湪 mybatis鎵弿鐨刴apper鍖呬笅闈紝鍚﹀垯浼氭姤閿�
  */
-@Mapper
+@Mapper(
+        unmappedTargetPolicy = ReportingPolicy.IGNORE, // 蹇界暐鐩爣涓湭琚槧灏勭殑瀛楁
+        componentModel = "spring" // 濡傛灉浣跨敤 Spring锛屽彲鐢熸垚 Spring 绠$悊鐨� Bean
+)
 public interface OutboundOrderConvert {
+
 
     OutboundOrderConvert INSTANCE = Mappers.getMapper(OutboundOrderConvert.class);
 
+    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)// 蹇界暐 null 瀛楁
     OutboundOrder convert(OutboundOrderAndDetailDto dto);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/PreparationOrderConvert.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/PreparationOrderConvert.java
new file mode 100644
index 0000000..8e88a03
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/PreparationOrderConvert.java
@@ -0,0 +1,25 @@
+package org.jeecg.modules.tms.convert;
+
+import org.jeecg.modules.tms.entity.PreparationOrder;
+import org.jeecg.modules.tms.entity.dto.PreparationOrderAndDetailDto;
+import org.mapstruct.BeanMapping;
+import org.mapstruct.Mapper;
+import org.mapstruct.NullValuePropertyMappingStrategy;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * 浣跨敤 MapStruct 鏂瑰紡杩涜灞炴�у鍒�
+ * 娉ㄦ剰涓嶈兘鏀惧湪 mybatis鎵弿鐨刴apper鍖呬笅闈紝鍚﹀垯浼氭姤閿�
+ */
+@Mapper(
+        unmappedTargetPolicy = ReportingPolicy.IGNORE, // 蹇界暐鐩爣涓湭琚槧灏勭殑瀛楁
+        componentModel = "spring" // 濡傛灉浣跨敤 Spring锛屽彲鐢熸垚 Spring 绠$悊鐨� Bean
+)
+public interface PreparationOrderConvert {
+
+    PreparationOrderConvert INSTANCE = Mappers.getMapper(PreparationOrderConvert.class);
+
+    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)// 蹇界暐 null 瀛楁
+    PreparationOrder convert(PreparationOrderAndDetailDto dto);
+}
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/OutboundDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java
index 23b6d36..b821f7e 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.experimental.Accessors;
 import org.jeecg.common.aspect.annotation.Dict;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -22,6 +23,7 @@
  * @Version: V1.0
  */
 @Data
+@Accessors(chain = true)
 @TableName("tms_outbound_detail")
 @ApiModel(value="tms_outbound_detail瀵硅薄", description="鍑哄簱鐢宠鍗曟槑缁�")
 public class OutboundDetail implements Serializable {
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundOrder.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundOrder.java
index 4520bf9..d8c9232 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundOrder.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundOrder.java
@@ -5,6 +5,8 @@
 import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.*;
+import liquibase.pro.packaged.E;
+import lombok.experimental.Accessors;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -20,6 +22,7 @@
  * @Version: V1.0
  */
 @Data
+@Accessors(chain = true)
 @TableName("tms_outbound_order")
 @ApiModel(value="tms_outbound_order瀵硅薄", description="tms_outbound_order")
 public class OutboundOrder implements Serializable {
@@ -98,6 +101,42 @@
     @Excel(name = "澶囨敞", width = 15)
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
+    /**鍑嗗鍗曠紪鍙�*/
+    @Excel(name = "鍑嗗鍗曠紪鍙�", width = 15)
+    @ApiModelProperty(value = "鍑嗗鍗曠紪鍙�")
+    private String preparationOrderId;
+    /**闆朵欢鍥惧彿*/
+    @Excel(name = "闆朵欢鍥惧彿", width = 15)
+    @ApiModelProperty(value = "闆朵欢鍥惧彿")
+    private String partDrawingNo;
+    /**闆朵欢鍚嶇О*/
+    @Excel(name = "闆朵欢鍚嶇О", width = 15)
+    @ApiModelProperty(value = "闆朵欢鍚嶇О")
+    private String partName;
+    /**闆朵欢鏉愭枡*/
+    @Excel(name = "闆朵欢鏉愭枡", width = 15)
+    @ApiModelProperty(value = "闆朵欢鏉愭枡")
+    private String partMaterial;
+    /**鍔犲伐鎵规*/
+    @Excel(name = "宸ュ簭锛堝伐姝ュ彿锛�", width = 15)
+    @ApiModelProperty(value = "宸ュ簭锛堝伐姝ュ彿锛�")
+    private String productionProcessesNo;
+    /**鍔犲伐鎵规*/
+    @Excel(name = "鍔犲伐鎵规", width = 15)
+    @ApiModelProperty(value = "鍔犲伐鎵规")
+    private String batchCode;
+    /**鍔犲伐鏁伴噺*/
+    @Excel(name = "鍔犲伐鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鍔犲伐鏁伴噺")
+    private String machiningCount;
+    /**鍔犲伐璁惧*/
+    @Excel(name = "鍔犲伐璁惧", width = 15)
+    @ApiModelProperty(value = "鍔犲伐璁惧")
+    private String equipmentCode;
+    /**绋嬪簭鍚�*/
+    @Excel(name = "绋嬪簭鍚�", width = 15)
+    @ApiModelProperty(value = "绋嬪簭鍚�")
+    private String ncName;
 	/**绉熸埛鍙�*/
     @Excel(name = "绉熸埛鍙�", width = 15)
     @ApiModelProperty(value = "绉熸埛鍙�")
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrder.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrder.java
new file mode 100644
index 0000000..6f2e2b9
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrder.java
@@ -0,0 +1,111 @@
+package org.jeecg.modules.tms.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 鍒�鍏峰噯澶囧崟
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Data
+@Accessors(chain = true)
+@TableName("tms_preparation_order")
+@ApiModel(value="tms_preparation_order瀵硅薄", description="鍒�鍏峰噯澶囧崟")
+public class PreparationOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**涓婚敭*/
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**鍑嗗鍗曠紪鍙�*/
+    @Excel(name = "鍑嗗鍗曠紪鍙�", width = 15)
+    @ApiModelProperty(value = "鍑嗗鍗曠紪鍙�")
+    private String preparationOrderNum;
+    /**闆朵欢鍥惧彿*/
+    @Excel(name = "闆朵欢鍥惧彿", width = 15)
+    @ApiModelProperty(value = "闆朵欢鍥惧彿")
+    private String partDrawingNo;
+    /**闆朵欢鍚嶇О*/
+    @Excel(name = "闆朵欢鍚嶇О", width = 15)
+    @ApiModelProperty(value = "闆朵欢鍚嶇О")
+    private String partName;
+    /**闆朵欢鏉愭枡*/
+    @Excel(name = "闆朵欢鏉愭枡", width = 15)
+    @ApiModelProperty(value = "闆朵欢鏉愭枡")
+    private String partMaterial;
+    /**宸ュ簭锛堝伐姝ュ彿锛�*/
+    @Excel(name = "宸ュ簭锛堝伐姝ュ彿锛�", width = 15)
+    @ApiModelProperty(value = "宸ュ簭锛堝伐姝ュ彿锛�")
+    private String productionProcessesNo;
+    /**鍔犲伐鎵规*/
+    @Excel(name = "鍔犲伐鎵规", width = 15)
+    @ApiModelProperty(value = "鍔犲伐鎵规")
+    private String batchCode;
+    /**鍔犲伐鏁伴噺*/
+    @Excel(name = "鍔犲伐鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鍔犲伐鏁伴噺")
+    private String machiningCount;
+    /**鍔犲伐璁惧*/
+    @Excel(name = "鍔犲伐璁惧", width = 15)
+    @ApiModelProperty(value = "鍔犲伐璁惧")
+    private String equipmentCode;
+    /**绋嬪簭鍚�*/
+    @Excel(name = "绋嬪簭鍚�", width = 15)
+    @ApiModelProperty(value = "绋嬪簭鍚�")
+    private String ncName;
+    /**鍑嗗鍗曞嚭搴撴暟閲�*/
+    @Excel(name = "鍑嗗鍗曞嚭搴撴暟閲�", width = 15)
+    @ApiModelProperty(value = "鍑嗗鍗曞嚭搴撴暟閲�")
+    private java.math.BigDecimal outboundQuantity;
+    /**鍗曞瓙鐘舵��;1.鏈鏍革紱2.璋冩満鍛樺凡瀹℃牳锛�3.宸茶浆鍑哄簱鐢宠*/
+    @Dict(dicCode = "preparation_order_status")
+    @Excel(name = "鍗曞瓙鐘舵��;1.鏈鏍革紱2.璋冩満鍛樺凡瀹℃牳锛�3.宸茶浆鍑哄簱鐢宠", width = 15)
+    @ApiModelProperty(value = "鍗曞瓙鐘舵��;1.鏈鏍革紱2.璋冩満鍛樺凡瀹℃牳锛�3.宸茶浆鍑哄簱鐢宠")
+    private String orderStatus;
+    /**鍑嗗鍗曟彁浜ゆ椂闂�;鎻愪氦鑷冲嚭搴撶敵璇峰崟鐨勬椂闂�*/
+    @Excel(name = "鍑嗗鍗曟彁浜ゆ椂闂�;鎻愪氦鑷冲嚭搴撶敵璇峰崟鐨勬椂闂�", width = 15, format = "yyyy-MM-dd HH:mm")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+    @ApiModelProperty(value = "鍑嗗鍗曟彁浜ゆ椂闂�;鎻愪氦鑷冲嚭搴撶敵璇峰崟鐨勬椂闂�")
+    private Date outboundTime;
+    /**澶囨敞*/
+    @Excel(name = "澶囨敞", width = 15)
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+    /**绉熸埛鍙�*/
+    @Excel(name = "绉熸埛鍙�", width = 15)
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+    /**鍒涘缓浜�*/
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**鍒涘缓鏃堕棿;DNC鎺ㄩ�佹暟鎹椂闂�*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿;DNC鎺ㄩ�佹暟鎹椂闂�")
+    private Date createTime;
+    /**鏇存柊浜�*/
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**鏇存柊鏃堕棿*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java
new file mode 100644
index 0000000..99f9164
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java
@@ -0,0 +1,98 @@
+package org.jeecg.modules.tms.entity;
+
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import java.util.Date;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 鍒�鍏峰噯澶囧崟鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Data
+@TableName("tms_preparation_order_detail")
+@ApiModel(value="tms_preparation_order_detail瀵硅薄", description="鍒�鍏峰噯澶囧崟鏄庣粏")
+public class PreparationOrderDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**涓婚敭*/
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**鍑嗗鍗曞彿*/
+    @ApiModelProperty(value = "鍑嗗鍗曞彿")
+    private String preparationOrderId;
+    /**鍒�鍏风紪鐮�*/
+    @Excel(name = "鍒�鍏风紪鐮�", width = 15)
+    @ApiModelProperty(value = "鍒�鍏风紪鐮�(tms_base_tool琛╥d瀛楁)")
+    private String toolCode;
+    /**鍒�鍏风紪鍙�*/
+    @Excel(name = "鍒�鍏风紪鍙�", width = 15)
+    @ApiModelProperty(value = "鍒�鍏风紪鍙�")
+    private String toolId;
+    /**鐢宠鍑哄簱鏁伴噺*/
+    @Excel(name = "鐢宠鍑哄簱鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鐢宠鍑哄簱鏁伴噺")
+    private java.math.BigDecimal outboundQuantity;
+    /**绉熸埛鍙�*/
+    @Excel(name = "绉熸埛鍙�", width = 15)
+    @ApiModelProperty(value = "绉熸埛鍙�")
+    private String tenantId;
+    /**鍒涘缓浜�*/
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**鍒涘缓鏃堕棿*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**鏇存柊浜�*/
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**鏇存柊鏃堕棿*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+
+    /**鍒�鍏风紪鐮�(tms_base_tool琛╰ool_code瀛楁)*/
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍒�鍏风紪鐮�(tms_base_tool琛╰ool_code瀛楁)")
+    private String toolNum;
+    /**涓枃鍚嶇О*/
+    @TableField(exist = false)
+    @ApiModelProperty(value = "涓枃鍚嶇О")
+    private String chineseName;
+    /**鍨嬪彿/鍥惧彿*/
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍨嬪彿/鍥惧彿")
+    private String toolModel;
+    /**宸ュ叿绫诲瀷*/
+    @TableField(exist = false)
+    @ApiModelProperty(value = "宸ュ叿绫诲瀷")
+    @Dict(dicCode = "application_type")
+    private String applicationType;
+    /**鍒�鍏锋潗鏂�*/
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍒�鍏锋潗鏂�")
+    private String toolMaterial;
+    /**闆朵欢鏉愭枡*/
+    @TableField(exist = false)
+    @ApiModelProperty(value = "闆朵欢鏉愭枡")
+    private String partMaterial;
+    /**鍘傚*/
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍘傚")
+    private String supplierId;
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/PreparationOrderAndDetailDto.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/PreparationOrderAndDetailDto.java
new file mode 100644
index 0000000..3ee4e94
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/PreparationOrderAndDetailDto.java
@@ -0,0 +1,61 @@
+package org.jeecg.modules.tms.entity.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecg.modules.tms.entity.PreparationOrderDetail;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class PreparationOrderAndDetailDto {
+
+    /**涓婚敭*/
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**鍑嗗鍗曠紪鍙�*/
+    @ApiModelProperty(value = "鍑嗗鍗曠紪鍙�")
+    private String preparationOrderNum;
+    /**闆朵欢鍥惧彿*/
+    @ApiModelProperty(value = "闆朵欢鍥惧彿")
+    private String partDrawingNo;
+    /**闆朵欢鍚嶇О*/
+    @ApiModelProperty(value = "闆朵欢鍚嶇О")
+    private String partName;
+    /**闆朵欢鏉愭枡*/
+    @ApiModelProperty(value = "闆朵欢鏉愭枡")
+    private String partMaterial;
+    /**宸ュ簭锛堝伐姝ュ彿锛�*/
+    @ApiModelProperty(value = "宸ュ簭锛堝伐姝ュ彿锛�")
+    private String productionProcessesNo;
+    /**鍔犲伐鎵规*/
+    @ApiModelProperty(value = "鍔犲伐鎵规")
+    private String batchCode;
+    /**鍔犲伐鏁伴噺*/
+    @ApiModelProperty(value = "鍔犲伐鏁伴噺")
+    private String machiningCount;
+    /**鍔犲伐璁惧*/
+    @ApiModelProperty(value = "鍔犲伐璁惧")
+    private String equipmentCode;
+    /**绋嬪簭鍚�*/
+    @ApiModelProperty(value = "绋嬪簭鍚�")
+    private String ncName;
+    /**鍑嗗鍗曞嚭搴撴暟閲�*/
+    @ApiModelProperty(value = "鍑嗗鍗曞嚭搴撴暟閲�")
+    private java.math.BigDecimal outboundQuantity;
+    /**鍗曞瓙鐘舵��;1.鏈鏍革紱2.璋冩満鍛樺凡瀹℃牳锛�3.宸茶浆鍑哄簱鐢宠*/
+    @ApiModelProperty(value = "鍗曞瓙鐘舵��;1.鏈鏍革紱2.璋冩満鍛樺凡瀹℃牳锛�3.宸茶浆鍑哄簱鐢宠")
+    private String orderStatus;
+    /**鍑嗗鍗曟彁浜ゆ椂闂�;鎻愪氦鑷冲嚭搴撶敵璇峰崟鐨勬椂闂�*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+    @ApiModelProperty(value = "鍑嗗鍗曟彁浜ゆ椂闂�;鎻愪氦鑷冲嚭搴撶敵璇峰崟鐨勬椂闂�")
+    private Date outboundTime;
+    /**澶囨敞*/
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+    /**鍒�鍏峰噯澶囧崟鏄庣粏*/
+    @ApiModelProperty(value = "鍒�鍏峰噯澶囧崟鏄庣粏")
+    private List<PreparationOrderDetail> preparationOrderDetailList;
+}
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/enums/OutStorehouseType.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java
index e8e8165..274955b 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java
@@ -8,7 +8,8 @@
     TOOL_BORROW("1", "宸ュ叿鍊熺敤"),
     MAINTENANCE_OUTBOUND("2", "缁翠慨鍑哄簱"),
     CALIBRATION_OUTBOUND("3", "妫�瀹氬嚭搴�"),
-    GRINDING_OUTBOUND("4", "鍒冪(鍑哄簱");
+    GRINDING_OUTBOUND("4", "鍒冪(鍑哄簱"),
+    PREPARATION_OUTBOUND("5", "鍑嗗鍗曞嚭搴�");
 
     private final String value;
     private final String description;
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/PreparationOrderStatus.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/PreparationOrderStatus.java
new file mode 100644
index 0000000..7335ee4
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/PreparationOrderStatus.java
@@ -0,0 +1,56 @@
+package org.jeecg.modules.tms.enums;
+
+
+import lombok.Getter;
+
+import java.util.Objects;
+
+/**
+ * 鍒�鍏峰噯澶囧崟鐘舵�佹灇涓剧被
+ */
+@Getter
+public enum PreparationOrderStatus {
+    /**
+     * 寰呭鏍哥姸鎬侊紝鍊间负1
+     */
+    PENDING_AUDIT("1", "鏈鏍�"),
+
+    /**
+     * 瀹℃牳閫氳繃鐘舵�侊紝鍊间负2
+     */
+    AUDITED("2", "璋冩満鍛樺凡瀹℃牳"),
+
+    /**
+     * 杞嚭搴撶敵璇风姸鎬侊紝鍊间负3
+     */
+    CONVERT("3", "宸茶浆鍑哄簱鐢宠");
+
+    private final String value;
+    private final String description;
+
+    /**
+     * 鏋勯�犳柟娉�
+     *
+     * @param value       鐘舵�佸��
+     * @param description 鐘舵�佹弿杩�
+     */
+    PreparationOrderStatus(String value, String description) {
+        this.value = value;
+        this.description = description;
+    }
+
+    /**
+     * 鏍规嵁鐘舵�佸�艰幏鍙栧搴旂殑鏋氫妇瀹炰緥
+     *
+     * @param value 鐘舵�佸��
+     * @return 瀵瑰簲鐨勬灇涓惧疄渚嬶紝濡傛灉鎵句笉鍒板尮閰嶇殑鍊煎垯杩斿洖null
+     */
+    public static PreparationOrderStatus fromValue(String value) {
+        for (PreparationOrderStatus status : values()) {
+            if (Objects.equals(status.getValue(), value)) {
+                return status;
+            }
+        }
+        return null;
+    }
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderDetailMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderDetailMapper.java
new file mode 100644
index 0000000..e521471
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderDetailMapper.java
@@ -0,0 +1,40 @@
+package org.jeecg.modules.tms.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.PreparationOrderDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Description: 鍒�鍏峰噯澶囧崟鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface PreparationOrderDetailMapper extends BaseMapper<PreparationOrderDetail> {
+
+    /**
+     * 閫氳繃涓昏〃id鍒犻櫎瀛愯〃鏁版嵁
+     *
+     * @param mainId 涓昏〃id
+     * @return boolean
+     */
+    public boolean deleteByMainId(@Param("mainId") String mainId);
+
+    /**
+     * 閫氳繃涓昏〃id鏌ヨ瀛愯〃鏁版嵁
+     *
+     * @param mainId 涓昏〃id
+     * @return List<PreparationOrderDetail>
+     */
+    public List<PreparationOrderDetail> selectByMainId(@Param("mainId") String mainId);
+
+    IPage<PreparationOrderDetail> queryPageList(Page<PreparationOrderDetail> page,
+                                                @Param(Constants.WRAPPER) Wrapper<PreparationOrderDetail> queryWrapper);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderMapper.java
new file mode 100644
index 0000000..5965d11
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderMapper.java
@@ -0,0 +1,24 @@
+package org.jeecg.modules.tms.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.tms.entity.PreparationOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 鍒�鍏峰噯澶囧崟
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface PreparationOrderMapper extends BaseMapper<PreparationOrder> {
+
+    IPage<PreparationOrder> queryPageList(Page<PreparationOrder> page,
+                                          @Param(Constants.WRAPPER) Wrapper<PreparationOrder> queryWrapper);
+}
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/mapper/xml/PreparationOrderDetailMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderDetailMapper.xml
new file mode 100644
index 0000000..4f99dc4
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderDetailMapper.xml
@@ -0,0 +1,93 @@
+<?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.tms.mapper.PreparationOrderDetailMapper">
+
+    <delete id="deleteByMainId" parameterType="java.lang.String">
+        DELETE
+        FROM  tms_preparation_order_detail
+        WHERE
+            preparation_order_id = #{mainId}
+    </delete>
+
+    <select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.tms.entity.PreparationOrderDetail">
+        SELECT *
+        FROM  tms_preparation_order_detail
+        WHERE
+            preparation_order_id = #{mainId}
+    </select>
+    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.PreparationOrderDetail">
+        SELECT
+            t1.id id,
+            t1.preparation_order_id preparationOrderId,
+            t1.tool_code toolCode,
+            t1.outbound_quantity outboundQuantity,
+            t1.tenant_id tenantId,
+            t1.create_by createBy,
+            t1.create_time createTime,
+            t1.update_by updateBy,
+            t1.update_time updateTime,
+            t2.tool_code toolNum,
+            t2.chinese_name chineseName,
+            t2.tool_model toolModel,
+            t2.parama_table_name paramaTableName,
+            t3.application_type applicationType,
+            t3.supplier_id supplierId,
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                t4.tool_material toolMaterial,
+                t4.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                t5.tool_material toolMaterial,
+                t5.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                t6.tool_material toolMaterial,
+                t6.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                t7.tool_material toolMaterial,
+                t7.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                t8.tool_material toolMaterial,
+                t8.part_material partMaterial
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                t9.tool_material toolMaterial,
+                t9.part_material partMaterial
+            </when>
+            <otherwise>
+                t10.tool_material toolMaterial,
+                t10.part_material partMaterial
+            </otherwise>
+        </choose>
+        FROM tms_preparation_order_detail t1
+        LEFT JOIN tms_base_tools t2 on t1.tool_code = t2.id
+        LEFT JOIN tms_tools_config_property t3 on t3.tool_code = t2.id
+        <choose>
+            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
+                LEFT JOIN tms_para_common_tool t4 on t4.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
+                LEFT JOIN tms_para_hole_tools t5 on t5.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
+                LEFT JOIN tms_para_threading_tool t6 on t6.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
+                LEFT JOIN tms_para_mill_tool t7 on t7.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
+                LEFT JOIN tms_para_turning_tools t8 on t8.tool_code = t2.id
+            </when>
+            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
+                LEFT JOIN tms_para_blade t9 on t9.tool_code = t2.id
+            </when>
+            <otherwise>
+                LEFT JOIN tms_para_common_tool t10 on t10.tool_code = t2.id
+            </otherwise>
+        </choose>
+        ${ew.customSqlSegment}
+    </select>
+</mapper>
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderMapper.xml
new file mode 100644
index 0000000..b610ad3
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderMapper.xml
@@ -0,0 +1,29 @@
+<?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.tms.mapper.PreparationOrderMapper">
+
+    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.PreparationOrder">
+        SELECT
+            t.id AS id,
+            t.preparation_order_num AS preparationOrderNum,
+            t.part_drawing_no AS partDrawingNo,
+            t.part_name AS partName,
+            t.part_material AS partMaterial,
+            t.production_processes_no AS productionProcessesNo,
+            t.batch_code AS batchCode,
+            t.machining_count AS machiningCount,
+            t.equipment_code AS equipmentCode,
+            t.nc_name AS ncName,
+            t.outbound_quantity AS outboundQuantity,
+            t.order_status AS orderStatus,
+            t.outbound_time AS outboundTime,
+            t.remark AS remark,
+            t.tenant_id AS tenantId,
+            t.create_by AS createBy,
+            t.create_time AS createTime,
+            t.update_by AS updateBy,
+            t.update_time AS updateTime
+        FROM tms_preparation_order t
+        ${ew.customSqlSegment}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderDetailService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderDetailService.java
new file mode 100644
index 0000000..81b2380
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderDetailService.java
@@ -0,0 +1,27 @@
+package org.jeecg.modules.tms.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.PreparationOrderDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 鍒�鍏峰噯澶囧崟鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface IPreparationOrderDetailService extends IService<PreparationOrderDetail> {
+
+  /**
+   * 閫氳繃涓昏〃id鏌ヨ瀛愯〃鏁版嵁
+   *
+   * @param mainId
+   * @return List<PreparationOrderDetail>
+   */
+	public List<PreparationOrderDetail> selectByMainId(String mainId);
+
+    IPage<PreparationOrderDetail> queryPageList(Page<PreparationOrderDetail> page, Map<String, String[]> parameterMap);
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java
new file mode 100644
index 0000000..3c2026c
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java
@@ -0,0 +1,43 @@
+package org.jeecg.modules.tms.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.PreparationOrderDetail;
+import org.jeecg.modules.tms.entity.PreparationOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.dto.PreparationOrderAndDetailDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 鍒�鍏峰噯澶囧崟
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface IPreparationOrderService extends IService<PreparationOrder> {
+
+	/**
+	 * 鍒犻櫎涓�瀵瑰
+	 *
+	 * @param id
+	 */
+	public void delMain (String id);
+	
+	/**
+	 * 鎵归噺鍒犻櫎涓�瀵瑰
+	 *
+	 * @param idList
+	 */
+	public void delBatchMain (Collection<? extends Serializable> idList);
+
+
+	void editTotal(PreparationOrderAndDetailDto preparationOrderAndDetailDto);
+
+	List<String> convertToOutboundOrder(List<String> preparationOrderIds);
+
+	IPage<PreparationOrder> queryPageList(Page<PreparationOrder> page, Map<String, String[]> parameterMap);
+}
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);
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
index 936e09c..3befbbf 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
@@ -83,6 +83,8 @@
 	private OutboundOrderMapper outboundOrderMapper;
 	@Autowired
 	private OutboundDetailMapper outboundDetailMapper;
+	@Autowired
+	private OutboundOrderConvert outboundOrderConvert;
 	
 	@Override
 	@Transactional(rollbackFor = Exception.class)
@@ -103,7 +105,7 @@
     @Override
 	@Transactional(rollbackFor = Exception.class)
     public void addTotal(OutboundOrderAndDetailDto outboundOrder) {
-		OutboundOrder order = OutboundOrderConvert.INSTANCE.convert(outboundOrder);
+		OutboundOrder order = outboundOrderConvert.convert(outboundOrder);
 		order.setHandler(Objects.requireNonNull(getCurrentUser()).getId());
 		order.setOutNum(businessCodeRuleService.generateBusinessCodeSeq("outBoundOrder"));
 		order.setOrderStatus(OutBillStatus.DRAFT.getValue());
@@ -155,7 +157,7 @@
 		//鍒犻櫎鎵�鏈夋槑缁�
 		outboundDetailService.remove(new LambdaQueryWrapper<OutboundDetail>()
 				.eq(OutboundDetail::getOutStorehouseId, outboundOrder.getId()));
-		OutboundOrder outboundOrderUpdate = BeanUtil.copyProperties(outboundOrder, OutboundOrder.class);
+		OutboundOrder outboundOrderUpdate = outboundOrderConvert.convert(outboundOrder);
 		outboundOrderMapper.updateById(outboundOrderUpdate);
 		List<OutboundDetail> detailList = CollectionUtil.newArrayList();
 		outboundOrder.getOutboundDetailList().forEach(item->{
@@ -175,13 +177,14 @@
 		if (!Objects.equals(outboundOrder.getOrderStatus(), OutBillStatus.DRAFT.getValue())) {
 			throw new JeecgBootException("鏃犳硶鎻愪氦闈炶崏绋跨姸鎬佺殑鍑哄簱鐢宠鍗曪紒");
 		}
-		//閿佸畾鐢宠鍗曟槑缁嗕腑宸ュ叿搴撳瓨
-		if (lockOutboundStock(id)) {
-			//鍚姩娴佺▼
-			if (triggerProcess(outboundOrder)) {
-				outboundOrder.setOrderStatus(OutBillStatus.SUBMITTED.getValue());
-				updateById(outboundOrder);
-			}
+		if (!OutStorehouseType.PREPARATION_OUTBOUND.getValue().equals(outboundOrder.getOutStorehouseType())) {
+			//涓嶆槸浠庡噯澶囧崟杞叆鐨勫嚭搴撶敵璇凤紝鎵ц閿佸簱
+			lockOutboundStock(id);
+		}
+		//鍚姩娴佺▼
+		if (triggerProcess(outboundOrder)) {
+			outboundOrder.setOrderStatus(OutBillStatus.SUBMITTED.getValue());
+			updateById(outboundOrder);
 		}
     }
 
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderDetailServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderDetailServiceImpl.java
new file mode 100644
index 0000000..f904465
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderDetailServiceImpl.java
@@ -0,0 +1,43 @@
+package org.jeecg.modules.tms.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.tms.entity.PreparationOrderDetail;
+import org.jeecg.modules.tms.mapper.PreparationOrderDetailMapper;
+import org.jeecg.modules.tms.service.IPreparationOrderDetailService;
+import org.springframework.stereotype.Service;
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @Description: 鍒�鍏峰噯澶囧崟鏄庣粏
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Service
+public class PreparationOrderDetailServiceImpl extends ServiceImpl<PreparationOrderDetailMapper, PreparationOrderDetail> implements IPreparationOrderDetailService {
+	
+	@Autowired
+	private PreparationOrderDetailMapper preparationOrderDetailMapper;
+	
+	@Override
+	public List<PreparationOrderDetail> selectByMainId(String mainId) {
+		return preparationOrderDetailMapper.selectByMainId(mainId);
+	}
+
+	@Override
+	public IPage<PreparationOrderDetail> queryPageList(Page<PreparationOrderDetail> page, Map<String, String[]> parameterMap) {
+		QueryWrapper<PreparationOrderDetail> queryWrapper = Wrappers.query();
+		String[] preparationOrderIds = parameterMap.get("preparationOrderId");
+		if (preparationOrderIds != null && preparationOrderIds.length > 0) {
+			queryWrapper.eq("t1.preparation_order_id", preparationOrderIds[0]);
+		}
+		return this.baseMapper.queryPageList(page, queryWrapper);
+	}
+}
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java
new file mode 100644
index 0000000..6bb0dfc
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java
@@ -0,0 +1,235 @@
+package org.jeecg.modules.tms.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
+import org.jeecg.modules.tms.convert.PreparationOrderConvert;
+import org.jeecg.modules.tms.entity.*;
+import org.jeecg.modules.tms.entity.dto.PreparationOrderAndDetailDto;
+import org.jeecg.modules.tms.enums.*;
+import org.jeecg.modules.tms.mapper.PreparationOrderDetailMapper;
+import org.jeecg.modules.tms.mapper.PreparationOrderMapper;
+import org.jeecg.modules.tms.service.*;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 鍒�鍏峰噯澶囧崟
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Service
+public class PreparationOrderServiceImpl extends ServiceImpl<PreparationOrderMapper, PreparationOrder> implements IPreparationOrderService {
+
+	@Autowired
+	private PreparationOrderMapper preparationOrderMapper;
+	@Autowired
+	private PreparationOrderDetailMapper preparationOrderDetailMapper;
+	@Autowired
+	private IPreparationOrderDetailService preparationOrderDetailService;
+	@Autowired
+	private IToolLedgerService toolLedgerService;
+	@Autowired
+	private IToolLedgerDetailService toolLedgerDetailService;
+	@Autowired
+	private IOutboundOrderService outboundOrderService;
+	@Autowired
+	private IOutboundDetailService outboundDetailService;
+	@Autowired
+	private ISysBusinessCodeRuleService businessCodeRuleService;
+	@Autowired
+	private IBaseToolsService baseToolsService;
+	@Autowired
+	private PreparationOrderConvert preparationOrderConvert;
+	
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void delMain(String id) {
+		preparationOrderDetailMapper.deleteByMainId(id);
+		preparationOrderMapper.deleteById(id);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void delBatchMain(Collection<? extends Serializable> idList) {
+		for(Serializable id:idList) {
+			preparationOrderDetailMapper.deleteByMainId(id.toString());
+			preparationOrderMapper.deleteById(id);
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void editTotal(PreparationOrderAndDetailDto preparationOrderAndDetailDto) {
+		//鍏堝垹闄ゆ墍鏈夋槑缁�
+		preparationOrderDetailMapper.delete(new LambdaQueryWrapper<PreparationOrderDetail>()
+				.eq(PreparationOrderDetail::getPreparationOrderId, preparationOrderAndDetailDto.getId()));
+		PreparationOrder preparationOrder = preparationOrderConvert.convert(preparationOrderAndDetailDto);
+		updateById(preparationOrder);
+		List<PreparationOrderDetail> detailUpdateList = CollectionUtil.newArrayList();
+		preparationOrderAndDetailDto.getPreparationOrderDetailList().forEach(item->{
+			item.setPreparationOrderId(preparationOrder.getId());
+			detailUpdateList.add(item);
+		});
+		preparationOrderDetailService.saveBatch(detailUpdateList);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public List<String> convertToOutboundOrder(List<String> preparationOrderIds) {
+		List<String> resultMessage = CollectionUtil.newArrayList();
+		List<PreparationOrder> preparationOrderList = listByIds(preparationOrderIds);
+		//鏍¢獙鍑嗗鍗曟槑缁嗕腑鐨勬暟閲�
+		for (PreparationOrder preparationOrder : preparationOrderList) {
+			if (PreparationOrderStatus.PENDING_AUDIT.getValue().equals(preparationOrder.getOrderStatus())) {
+				resultMessage.add("鍑嗗鍗曘��" + preparationOrder.getPreparationOrderNum() + "銆戞湭瀹℃牳锛屾棤娉曡浆鍑哄簱鐢宠锛�");
+				continue;
+			}
+			if (PreparationOrderStatus.CONVERT.getValue().equals(preparationOrder.getOrderStatus())) {
+				resultMessage.add("鍑嗗鍗曘��" + preparationOrder.getPreparationOrderNum() + "銆戝凡缁忚浆鍑猴紝璇峰嬁閲嶅鎻愪氦锛�");
+				continue;
+			}
+			List<PreparationOrderDetail> preparationOrderDetailList = preparationOrderDetailService.list(new LambdaQueryWrapper<PreparationOrderDetail>()
+					.eq(PreparationOrderDetail::getPreparationOrderId, preparationOrder.getId()));
+			Map<String, BigDecimal> preparationOrderToolCodeMap = preparationOrderDetailList.stream().collect(Collectors.toMap(PreparationOrderDetail::getToolCode,
+					PreparationOrderDetail::getOutboundQuantity, (k1, k2) -> k1));
+			List<ToolLedgerDetail> toolLedgerDetailList = toolLedgerDetailService.list(new LambdaQueryWrapper<ToolLedgerDetail>()
+					.in(ToolLedgerDetail::getToolCode, preparationOrderToolCodeMap.keySet())
+					.eq(ToolLedgerDetail::getQuantity, BigDecimal.ONE)
+					.eq(ToolLedgerDetail::getStatus, ToolCirculationStatus.IN_STOCK.getValue()));
+			Map<String, List<ToolLedgerDetail>> ledgerDetailToolCodeMap = toolLedgerDetailList.stream().collect(Collectors.groupingBy(ToolLedgerDetail::getToolCode));
+
+			List<OutboundDetail> outboundDetailList = CollectionUtil.newArrayList();
+			for (PreparationOrderDetail preparationOrderDetail : preparationOrderDetailList) {
+				String toolCode = preparationOrderDetail.getToolCode();
+				BigDecimal needQuantity = preparationOrderDetail.getOutboundQuantity();
+				List<ToolLedgerDetail> toolLedgerDetails = ledgerDetailToolCodeMap.get(toolCode);
+				BigDecimal stockQuantity = Optional.ofNullable(toolLedgerDetails).orElse(Collections.emptyList()).stream()
+						.map(ToolLedgerDetail::getQuantity)
+						.reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (CollectionUtil.isEmpty(toolLedgerDetails) || stockQuantity.compareTo(needQuantity) < 0) {
+					BaseTools tools = baseToolsService.getById(toolCode);
+					resultMessage.add("鍑嗗鍗曘��" + preparationOrder.getPreparationOrderNum() +"銆戜腑锛岀紪鐮佷负銆�" + tools.getToolCode() + "銆戠殑宸ュ叿锛屽簱瀛樹笉瓒筹紝杞嚭搴撶敵璇峰崟澶辫触锛�");
+					break;
+				} else {
+					//浠庡簱瀛樻槑缁嗕腑鍙栧嚭闇�瑕佺殑鏁伴噺锛屾寚瀹氬埌鎶�
+					List<ToolLedgerDetail> selectedTools = toolLedgerDetails.subList(0, needQuantity.intValue());
+					//鐢熸垚鐢宠鍗曟槑缁�
+					selectedTools.forEach(item->{
+						OutboundDetail detail = new OutboundDetail()
+								.setToolCode(item.getToolCode())
+								.setToolId(item.getToolId())
+								.setOutboundQuantity(item.getQuantity())
+								.setStorageLocation(item.getWarehouseId())
+								.setOutboundLocation(item.getPositionCode())
+								.setStatus(OutBoundStatusEnum.NOT_OUTBOUND.getValue())
+								.setCreateBy(Objects.requireNonNull(getCurrentUser()).getUsername())
+								.setCreateTime(new Date());
+						outboundDetailList.add(detail);
+					});
+				}
+			}
+			BigDecimal totalOutboundQuantity = preparationOrderDetailList.stream()
+					.map(detail -> Optional.ofNullable(detail.getOutboundQuantity()).orElse(BigDecimal.ZERO))
+					.reduce(BigDecimal.ZERO, BigDecimal::add);
+			if (outboundDetailList.size() == totalOutboundQuantity.intValue()) {
+				//鎸囧畾鍒版妸鐨勬暟閲忎笌闇�姹傛暟閲忎竴鑷达紝婊¤冻杞嚭搴撶敵璇峰崟鐨勬潯浠讹紝鐢熸垚鍑哄簱鐢宠鍗�
+				OutboundOrder order = new OutboundOrder()
+						.setOutNum(businessCodeRuleService.generateBusinessCodeSeq("outBoundOrder"))
+						.setOutStorehouseType(OutStorehouseType.PREPARATION_OUTBOUND.getValue())
+						.setHandler(Objects.requireNonNull(getCurrentUser()).getId())
+						.setReviewer(Objects.requireNonNull(getCurrentUser()).getUsername())
+						.setOrderStatus(OutBillStatus.DRAFT.getValue())
+						.setSubjectMatter("鍒�鍏峰噯澶囧崟杞叆")
+						.setPreparationOrderId(preparationOrder.getId())
+						.setPartDrawingNo(preparationOrder.getPartDrawingNo())
+						.setPartName(preparationOrder.getPartName())
+						.setPartMaterial(preparationOrder.getPartMaterial())
+						.setProductionProcessesNo(preparationOrder.getProductionProcessesNo())
+						.setBatchCode(preparationOrder.getBatchCode())
+						.setMachiningCount(preparationOrder.getMachiningCount())
+						.setEquipmentCode(preparationOrder.getEquipmentCode())
+						.setNcName(preparationOrder.getNcName())
+						.setCreateBy(Objects.requireNonNull(getCurrentUser()).getUsername())
+						.setCreateTime(new Date());
+				outboundOrderService.save(order);
+				outboundDetailList.forEach(item -> item.setOutStorehouseId(order.getId()));
+				outboundDetailService.saveBatch(outboundDetailList);
+				//閿佸畾搴撳瓨鍙拌处鏄庣粏搴撳瓨
+				LambdaQueryWrapper<ToolLedgerDetail> queryWrapper = new LambdaQueryWrapper<>();
+				String codeIdString = outboundDetailList.stream()
+						.map(detail -> "'" + detail.getToolCode() + ":" + detail.getToolId() + "'")
+						.collect(Collectors.joining(","));
+				String sql = "(tool_code + ':' + tool_id) IN (" + codeIdString + ")";
+				queryWrapper.apply(sql);
+				toolLedgerDetailService.update(new ToolLedgerDetail().setQuantity(BigDecimal.ZERO), queryWrapper);
+				//閿佸畾搴撳瓨鍙拌处涓昏〃
+				List<ToolLedger> toolLedgerList = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>()
+						.in(ToolLedger::getToolId, preparationOrderToolCodeMap.keySet()));
+				toolLedgerList.forEach(item -> {
+					BigDecimal outboundQuantity = preparationOrderToolCodeMap.getOrDefault(item.getToolId(), BigDecimal.ZERO);
+					item.setAvailableCount(Optional.ofNullable(item.getAvailableCount()).orElse(BigDecimal.ZERO).subtract(outboundQuantity));
+				});
+				toolLedgerService.updateBatchById(toolLedgerList);
+				//鏇存柊鍑嗗鍗曠姸鎬�
+				updateById(new PreparationOrder()
+						.setId(preparationOrder.getId())
+						.setOutboundTime(new Date())
+						.setOrderStatus(PreparationOrderStatus.CONVERT.getValue()));//3.宸茶浆鍑哄簱鐢宠
+				resultMessage.add("鍑嗗鍗曘��" + preparationOrder.getPreparationOrderNum() + "銆戣浆鍑哄簱鐢宠鍗曟垚鍔燂紒");
+			}
+		}
+		return resultMessage;
+	}
+
+	@Override
+	public IPage<PreparationOrder> queryPageList(Page<PreparationOrder> page, Map<String, String[]> parameterMap) {
+		QueryWrapper<PreparationOrder> queryWrapper = Wrappers.query();
+		String[] preparationOrderNums = parameterMap.get("preparationOrderNum");
+		if (preparationOrderNums != null && preparationOrderNums.length > 0) {
+			queryWrapper.like("t.preparation_order_num", preparationOrderNums[0]);
+		}
+		String[] orderStatuses = parameterMap.get("orderStatus");
+		if (orderStatuses != null && orderStatuses.length > 0) {
+			queryWrapper.eq("t.order_status", orderStatuses[0]);
+		}
+		String[] beginTimes = parameterMap.get("beginTime");
+		if (beginTimes != null && beginTimes.length > 0) {
+			queryWrapper.ge("t.create_time", beginTimes[0]);
+		}
+		String[] endTimes = parameterMap.get("endTime");
+		if (endTimes != null && endTimes.length > 0) {
+			queryWrapper.le("t.create_time", endTimes[0]);
+		}
+		queryWrapper.orderByAsc("t.create_time");
+		return this.baseMapper.queryPageList(page, queryWrapper);
+	}
+
+	private LoginUser getCurrentUser() {
+		// 鑾峰彇褰撳墠璁よ瘉鐨勭櫥褰曠敤鎴蜂俊鎭�
+		Subject currentUser = SecurityUtils.getSubject();
+		if (currentUser != null && currentUser.isAuthenticated()) {
+			Object principal = currentUser.getPrincipal();
+			if (principal instanceof LoginUser) {
+				return (LoginUser) principal;
+			}
+		}
+		return null;
+	}
+
+}

--
Gitblit v1.9.3