From be3aa0812cb43be7484e162b4fece5344e9eb5c8 Mon Sep 17 00:00:00 2001
From: qushaowei <qushaowei@163.com>
Date: 星期四, 14 三月 2024 11:12:43 +0800
Subject: [PATCH] Merge branch 'master' of http://117.34.109.166:18448/r/mdc_430 into develop

---
 lxzn-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java                                            |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml                                  |   42 +
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementSendMapper.xml     |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcMessageApprovalController.java                       |  212 ++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOvertimeDurationJob.java                                |    8 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java         |    8 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcMessageApprovalMapper.java                               |   22 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOverrunAlarmMapper.java                                  |   27 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcMessageApprovalService.java                            |   22 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java           |   14 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningMonitoringSpeedJob.java                                 |  154 ++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcOverrunAlarm.java                                        |   54 +
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java              |   13 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentRunningSection.java                             |   17 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverrunAlarmServiceImpl.java                       |   28 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml           |   24 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcCommonVo.java                                                |   13 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcOverrunAlarmController.java                          |  155 ++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java            |   56 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java                             |   18 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java                    |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOverrunAlarmService.java                               |   30 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentWorkLineServiceImpl.java                  |   76 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentLogServiceImpl.java                          |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcMessageApprovalServiceImpl.java                    |   43 +
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcProduction.java                    |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentLogMapper.xml                                  |    4 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java |    8 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java         |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOverrunAlarmMapper.xml                               |   25 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentAlarmAnalyzeServiceImpl.java              |   13 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/constant/MdcConstant.java                                          |   26 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentLogService.java                                  |    2 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/MdcProductionTreeModel.java            |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcMessageApproval.java                                     |   97 +++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEquipmentVo.java                                             |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java                                           |   21 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java        |   13 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunMonitoringSpeedJob.java                                     |    6 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDeviceCalendarMapper.xml                             |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/EquipmentMachingDto.java                                       |    2 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java                 |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java                          |  243 ++++++-
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml                 |   11 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEquipmentStatusVo.java                                       |   27 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java                                 |  129 +++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcMessageApprovalMapper.xml                            |   22 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java                     |   20 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportQueryVo.java                                 |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcHomeController.java                                  |   66 ++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportShiftQueryVo.java                            |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentLogMapper.java                                     |    2 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java                          |    8 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java   |   19 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java                                     |   18 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java                                  |   23 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml                           |    9 
 57 files changed, 1,738 insertions(+), 159 deletions(-)

diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java b/lxzn-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java
index b7c0be1..d996096 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java
@@ -51,6 +51,10 @@
       */
     private String orgCode;
 	/**
+	 * 鐢ㄦ埛绫诲瀷
+	 */
+	private Integer userType;
+	/**
 	 * 澶村儚
 	 */
 	@SensitiveField
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/constant/MdcConstant.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/constant/MdcConstant.java
index d727367..68fcaae 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/constant/MdcConstant.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/constant/MdcConstant.java
@@ -57,4 +57,30 @@
 
     public static final String MONTH = "鏈�";
 
+    /**
+     * 璁惧绠$悊鍛�
+     */
+    public static final String MDC_EQUIPMENT_MANAGER = "mdcEquipmentManager";
+
+    /**
+     * 璁惧瓒呯骇绠$悊鍛�
+     */
+    public static final String MDC_EQUIPMENT_SUPER_MANAGER = "mdcEquipmentSuperManager";
+
+    /**
+     * 娑堟伅鐘舵�侊紙0寰呭鐞嗭紝1寰呯‘璁�, 2宸茬‘璁わ紝3宸叉嫆缁濓級
+     */
+    public static final String MSG_STATUS_0 = "0";
+    public static final String MSG_STATUS_1 = "1";
+    public static final String MSG_STATUS_2 = "2";
+    public static final String MSG_STATUS_3 = "3";
+
+    /**
+     * 鐢ㄦ埛绫诲瀷(1 鏅�氭垚鍛� 2 宸ユ 3 杞﹂棿 4 鍏徃锛�
+     */
+    public static final Integer USER_TYPE_1 = 1;
+    public static final Integer USER_TYPE_2 = 2;
+    public static final Integer USER_TYPE_3 = 3;
+    public static final Integer USER_TYPE_4 = 4;
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java
index 9ff87ae..d1c20c4 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java
@@ -426,7 +426,7 @@
      * @param mdcEquipment
      */
     @RequestMapping(value = "/exportXls")
-    public ModelAndView exportXls(HttpServletRequest request, MdcEquipment mdcEquipment) {
+    public ModelAndView exportXls(HttpServletRequest request, MdcEquipmentVo mdcEquipment) {
         // Step.1 缁勮鏌ヨ鏉′欢
         //QueryWrapper<MdcEquipment> queryWrapper = QueryGenerator.initQueryWrapper(mdcEquipment, request.getParameterMap());
         //Step.2 AutoPoi 瀵煎嚭Excel
@@ -525,4 +525,20 @@
         }
         return Result.OK("鍙嶉鎴愬姛锛�");
     }
+
+
+    @AutoLog(value = "璁惧琛�-閫氳繃杞﹂棿ids鑾峰彇璁惧鏍�")
+    @ApiOperation(value = "璁惧琛�-閫氳繃杞﹂棿ids鑾峰彇璁惧鏍�", notes = "璁惧琛�-閫氳繃杞﹂棿ids鑾峰彇璁惧鏍�")
+    @GetMapping(value = "/loadTreeListByProductionIds")
+    public Result<?> loadTreeListByProductionIds(@RequestParam(name = "ids", required = true) String ids) {
+        Result<List<MdcEquipmentTree>> result = new Result<>();
+        try {
+            List<MdcEquipmentTree> mdcEquipmentTreeList = mdcEquipmentService.loadTreeListByProductionIds(ids);
+            result.setSuccess(true);
+            result.setResult(mdcEquipmentTreeList);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return result;
+    }
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcHomeController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcHomeController.java
new file mode 100644
index 0000000..901b846
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcHomeController.java
@@ -0,0 +1,66 @@
+package org.jeecg.modules.mdc.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.mdc.constant.MdcConstant;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.vo.MdcCommonVo;
+import org.jeecg.modules.system.entity.MdcProduction;
+import org.jeecg.modules.system.service.IMdcProductionService;
+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
+ * @Description: MDC棣栭〉鎺ュ彛
+ * @date 2024/3/13 14:27
+ */
+@Slf4j
+@Api(tags = "MDC棣栭〉鎺ュ彛")
+@RestController
+@RequestMapping("/mdc/home")
+public class MdcHomeController {
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+
+    @Resource
+    private IMdcProductionService mdcProductionService;
+
+    @ApiOperation(value = "MDC棣栭〉鎺ュ彛-璁惧杩愯鐘舵�佺粺璁�", notes = "MDC棣栭〉鎺ュ彛-璁惧杩愯鐘舵�佺粺璁�")
+    @GetMapping("/equipmentStatusStatistics")
+    public Result<?> equipmentStatusStatistics(String productionCode) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        Integer userType = user.getUserType();
+        String userId = user.getId();
+        String key = "";
+        if (StringUtils.isNotBlank(productionCode)) {
+            //鍘傚尯
+            MdcProduction mdcProduction = mdcProductionService.getOne(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getProductionCode, productionCode).eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()));
+            key = mdcProduction.getId();
+        } else {
+            //鍒ゆ柇鏄叕鍙哥骇杩樻槸鍘傚尯
+            MdcProduction mdcProduction = mdcProductionService.getOne(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getParentId, ""));
+            if (userType.equals(MdcConstant.USER_TYPE_4)) {
+                //鍏徃
+                key = mdcProduction.getId();
+            } else if (userType.equals(MdcConstant.USER_TYPE_3)) {
+                //鍘傚尯
+                key = mdcProductionService.findFirstProduction(userId, mdcProduction.getId());
+            }
+        }
+        List<MdcCommonVo> resultMap = mdcEquipmentService.getEquipmentStatusStatistics(userId, key);
+        return Result.OK(resultMap);
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcMessageApprovalController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcMessageApprovalController.java
new file mode 100644
index 0000000..951b653
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcMessageApprovalController.java
@@ -0,0 +1,212 @@
+package org.jeecg.modules.mdc.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.dto.message.MessageDTO;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.api.ISysBaseAPI;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.mdc.constant.MdcConstant;
+import org.jeecg.modules.mdc.entity.MdcMessageApproval;
+import org.jeecg.modules.mdc.service.IMdcMessageApprovalService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @Description: mdc娑堟伅纭琛�
+ * @Author: Lius
+ * @Date: 2024-03-06
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "mdc娑堟伅纭琛�")
+@RestController
+@RequestMapping("/mdc/mdcMessageApproval")
+public class MdcMessageApprovalController extends JeecgController<MdcMessageApproval, IMdcMessageApprovalService> {
+
+    @Resource
+    private IMdcMessageApprovalService mdcMessageApprovalService;
+
+    @Resource
+    private ISysBaseAPI sysBaseApi;
+
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param mdcMessageApproval
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "mdc娑堟伅纭琛�-鍒嗛〉鍒楄〃鏌ヨ")
+    @ApiOperation(value = "mdc娑堟伅纭琛�-鍒嗛〉鍒楄〃鏌ヨ", notes = "mdc娑堟伅纭琛�-鍒嗛〉鍒楄〃鏌ヨ")
+    @GetMapping(value = "/list")
+    public Result<?> queryPageList(MdcMessageApproval mdcMessageApproval,
+                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                   HttpServletRequest req) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        Page<MdcMessageApproval> page = new Page<MdcMessageApproval>(pageNo, pageSize);
+        IPage<MdcMessageApproval> pageList = mdcMessageApprovalService.pageList(userId, page, mdcMessageApproval, req);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 娣诲姞
+     *
+     * @param mdcMessageApproval
+     * @return
+     */
+    @AutoLog(value = "mdc娑堟伅纭琛�-娣诲姞")
+    @ApiOperation(value = "mdc娑堟伅纭琛�-娣诲姞", notes = "mdc娑堟伅纭琛�-娣诲姞")
+    @PostMapping(value = "/add")
+    public Result<?> add(@RequestBody MdcMessageApproval mdcMessageApproval) {
+        mdcMessageApprovalService.save(mdcMessageApproval);
+        return Result.OK("娣诲姞鎴愬姛锛�");
+    }
+
+    /**
+     * 缂栬緫
+     *
+     * @param mdcMessageApproval
+     * @return
+     */
+    @AutoLog(value = "mdc娑堟伅纭琛�-缂栬緫")
+    @ApiOperation(value = "mdc娑堟伅纭琛�-缂栬緫", notes = "mdc娑堟伅纭琛�-缂栬緫")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> edit(@RequestBody MdcMessageApproval mdcMessageApproval) {
+        mdcMessageApprovalService.updateById(mdcMessageApproval);
+        return Result.OK("缂栬緫鎴愬姛!");
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "mdc娑堟伅纭琛�-閫氳繃id鍒犻櫎")
+    @ApiOperation(value = "mdc娑堟伅纭琛�-閫氳繃id鍒犻櫎", notes = "mdc娑堟伅纭琛�-閫氳繃id鍒犻櫎")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        mdcMessageApprovalService.removeById(id);
+        return Result.OK("鍒犻櫎鎴愬姛!");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "mdc娑堟伅纭琛�-鎵归噺鍒犻櫎")
+    @ApiOperation(value = "mdc娑堟伅纭琛�-鎵归噺鍒犻櫎", notes = "mdc娑堟伅纭琛�-鎵归噺鍒犻櫎")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.mdcMessageApprovalService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("鎵归噺鍒犻櫎鎴愬姛锛�");
+    }
+
+    /**
+     * 閫氳繃id鏌ヨ
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "mdc娑堟伅纭琛�-閫氳繃id鏌ヨ")
+    @ApiOperation(value = "mdc娑堟伅纭琛�-閫氳繃id鏌ヨ", notes = "mdc娑堟伅纭琛�-閫氳繃id鏌ヨ")
+    @GetMapping(value = "/queryById")
+    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
+        MdcMessageApproval mdcMessageApproval = mdcMessageApprovalService.getById(id);
+        return Result.OK(mdcMessageApproval);
+    }
+
+    /**
+     * 瀵煎嚭excel
+     *
+     * @param request
+     * @param mdcMessageApproval
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, MdcMessageApproval mdcMessageApproval) {
+        return super.exportXls(request, mdcMessageApproval, MdcMessageApproval.class, "mdc娑堟伅纭琛�");
+    }
+
+    /**
+     * 閫氳繃excel瀵煎叆鏁版嵁
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, MdcMessageApproval.class);
+    }
+
+    /**
+     * 涓婃姤鍘熷洜
+     */
+    @AutoLog(value = "mdc娑堟伅纭琛�-涓婃姤鍘熷洜")
+    @ApiOperation(value = "mdc娑堟伅纭琛�-涓婃姤鍘熷洜", notes = "mdc娑堟伅纭琛�-涓婃姤鍘熷洜")
+    @RequestMapping(value = "/reportReason", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> reportReason(@RequestBody MdcMessageApproval mdcMessageApproval) {
+        mdcMessageApproval.setMsgStatus(MdcConstant.MSG_STATUS_1);
+        mdcMessageApprovalService.updateById(mdcMessageApproval);
+        List<String> approverIdList = Arrays.asList(mdcMessageApproval.getApproverIds().split(","));
+        for (String approverId : approverIdList) {
+            //涓婃姤鍘熷洜鍙戦�佹秷鎭粰纭浜�
+            MessageDTO messageDTO = new MessageDTO();
+            messageDTO.setTitle("璁惧鐘舵�侀暱鏃堕棿鏈彉鍖栧師鍥犱笂鎶ョ‘璁わ紒");
+            messageDTO.setCategory("娑堟伅");
+            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            messageDTO.setFromUser(user.getUsername());
+            LoginUser userById = sysBaseApi.getUserById(approverId);
+            messageDTO.setToUser(userById.getUsername());
+            messageDTO.setContent("璁惧缂栧彿涓� [" + mdcMessageApproval.getEquipmentId() + "] 鐨勮澶囩姸鎬侀暱鏃堕棿鏈彉鍖栧師鍥犱笂鎶ュ緟纭锛�");
+            sysBaseApi.sendSysAnnouncement(messageDTO);
+        }
+
+        return Result.OK("涓婃姤鎴愬姛锛�");
+    }
+
+    /**
+     * 澶勭悊纭
+     */
+    @AutoLog(value = "mdc娑堟伅纭琛�-澶勭悊纭")
+    @ApiOperation(value = "mdc娑堟伅纭琛�-澶勭悊纭", notes = "mdc娑堟伅纭琛�-澶勭悊纭")
+    @RequestMapping(value = "/handleConfirm", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> handleConfirm(@RequestBody MdcMessageApproval mdcMessageApproval) {
+        if (mdcMessageApproval.getMsgStatus().equals(MdcConstant.MSG_STATUS_3)) {
+            //澶勭悊琚嫆缁濓紝闇�閲嶆柊涓婃姤鍘熷洜
+            //涓婃姤鍘熷洜鍙戦�佹秷鎭粰纭浜�
+            MessageDTO messageDTO = new MessageDTO();
+            messageDTO.setTitle("璁惧鐘舵�佹秷鎭紒");
+            messageDTO.setCategory("娑堟伅");
+            messageDTO.setFromUser("admin");
+            messageDTO.setToUser(mdcMessageApproval.getUpdateBy());
+            messageDTO.setContent("鎮ㄧ殑璁惧缂栧彿涓� [" + mdcMessageApproval.getEquipmentId() + "] 鐨勮澶囩姸鎬侀暱鏃堕棿鏈彉鍖栦笂鎶ュ凡琚澶囪秴绾х鐞嗗憳鎷掔粷锛岃閲嶆柊濉啓涓婃姤鍘熷洜锛�");
+            sysBaseApi.sendSysAnnouncement(messageDTO);
+        }
+        mdcMessageApprovalService.updateById(mdcMessageApproval);
+
+        return Result.OK("鎴愬姛锛�");
+    }
+
+
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcOverrunAlarmController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcOverrunAlarmController.java
new file mode 100644
index 0000000..441ee91
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcOverrunAlarmController.java
@@ -0,0 +1,155 @@
+package org.jeecg.modules.mdc.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.entity.MdcOverrunAlarm;
+import org.jeecg.modules.mdc.service.IMdcOverrunAlarmService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+
+/**
+ * @Description: mdc瓒呴檺鎶ヨ
+ * @Author: Lius
+ * @Date: 2024-03-01
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "mdc瓒呴檺鎶ヨ")
+@RestController
+@RequestMapping("/mdc/mdcOverrunAlarm")
+public class MdcOverrunAlarmController extends JeecgController<MdcOverrunAlarm, IMdcOverrunAlarmService> {
+
+    @Resource
+    private IMdcOverrunAlarmService mdcOverrunAlarmService;
+
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param mdcEquipment
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "mdc瓒呴檺鎶ヨ-鍒嗛〉鍒楄〃鏌ヨ")
+    @ApiOperation(value = "mdc瓒呴檺鎶ヨ-鍒嗛〉鍒楄〃鏌ヨ", notes = "mdc瓒呴檺鎶ヨ-鍒嗛〉鍒楄〃鏌ヨ")
+    @GetMapping(value = "/list")
+    public Result<?> queryPageList(MdcEquipment mdcEquipment,
+                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                   HttpServletRequest req) {
+        //QueryWrapper<MdcOverrunAlarm> queryWrapper = QueryGenerator.initQueryWrapper(mdcOverrunAlarm, req.getParameterMap());
+        Page<MdcOverrunAlarm> page = new Page<MdcOverrunAlarm>(pageNo, pageSize);
+        IPage<MdcOverrunAlarm> pageList = mdcOverrunAlarmService.pageList(page, mdcEquipment, req);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 娣诲姞
+     *
+     * @param mdcOverrunAlarm
+     * @return
+     */
+    @AutoLog(value = "mdc瓒呴檺鎶ヨ-娣诲姞")
+    @ApiOperation(value = "mdc瓒呴檺鎶ヨ-娣诲姞", notes = "mdc瓒呴檺鎶ヨ-娣诲姞")
+    @PostMapping(value = "/add")
+    public Result<?> add(@RequestBody MdcOverrunAlarm mdcOverrunAlarm) {
+        mdcOverrunAlarmService.save(mdcOverrunAlarm);
+        return Result.OK("娣诲姞鎴愬姛锛�");
+    }
+
+    /**
+     * 缂栬緫
+     *
+     * @param mdcOverrunAlarm
+     * @return
+     */
+    @AutoLog(value = "mdc瓒呴檺鎶ヨ-缂栬緫")
+    @ApiOperation(value = "mdc瓒呴檺鎶ヨ-缂栬緫", notes = "mdc瓒呴檺鎶ヨ-缂栬緫")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> edit(@RequestBody MdcOverrunAlarm mdcOverrunAlarm) {
+        mdcOverrunAlarmService.updateById(mdcOverrunAlarm);
+        return Result.OK("缂栬緫鎴愬姛!");
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "mdc瓒呴檺鎶ヨ-閫氳繃id鍒犻櫎")
+    @ApiOperation(value = "mdc瓒呴檺鎶ヨ-閫氳繃id鍒犻櫎", notes = "mdc瓒呴檺鎶ヨ-閫氳繃id鍒犻櫎")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        mdcOverrunAlarmService.removeById(id);
+        return Result.OK("鍒犻櫎鎴愬姛!");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "mdc瓒呴檺鎶ヨ-鎵归噺鍒犻櫎")
+    @ApiOperation(value = "mdc瓒呴檺鎶ヨ-鎵归噺鍒犻櫎", notes = "mdc瓒呴檺鎶ヨ-鎵归噺鍒犻櫎")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.mdcOverrunAlarmService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("鎵归噺鍒犻櫎鎴愬姛锛�");
+    }
+
+    /**
+     * 閫氳繃id鏌ヨ
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "mdc瓒呴檺鎶ヨ-閫氳繃id鏌ヨ")
+    @ApiOperation(value = "mdc瓒呴檺鎶ヨ-閫氳繃id鏌ヨ", notes = "mdc瓒呴檺鎶ヨ-閫氳繃id鏌ヨ")
+    @GetMapping(value = "/queryById")
+    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
+        MdcOverrunAlarm mdcOverrunAlarm = mdcOverrunAlarmService.getById(id);
+        return Result.OK(mdcOverrunAlarm);
+    }
+
+    /**
+     * 瀵煎嚭excel
+     *
+     * @param request
+     * @param mdcOverrunAlarm
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, MdcOverrunAlarm mdcOverrunAlarm) {
+        return super.exportXls(request, mdcOverrunAlarm, MdcOverrunAlarm.class, "mdc瓒呴檺鎶ヨ");
+    }
+
+    /**
+     * 閫氳繃excel瀵煎叆鏁版嵁
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, MdcOverrunAlarm.class);
+    }
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/EquipmentMachingDto.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/EquipmentMachingDto.java
index 0552e7b..2c1b4ef 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/EquipmentMachingDto.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/EquipmentMachingDto.java
@@ -7,6 +7,7 @@
 import org.jeecg.common.aspect.annotation.Dict;
 import org.jeecg.modules.mdc.entity.MdcDriveTypeParamConfig;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -153,6 +154,7 @@
 
     private String collectData;
 
+    private BigDecimal spindleCurrent;
 
     /*娴嬭瘯浣跨敤*/
     private String dataLine1;
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java
index cc47df4..afb4a9a 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java
@@ -131,6 +131,27 @@
     @ApiModelProperty(value = "璁惧鐘舵��")
     private Integer equipmentStatus;
 
+    /**
+     * 绯荤粺绫诲瀷
+     */
+    @Excel(name = "绯荤粺绫诲瀷", width = 15)
+    @ApiModelProperty(value = "绯荤粺绫诲瀷")
+    private String systemType;
+
+    /**
+     * 璁惧绾у埆
+     */
+    @Excel(name = "璁惧绾у埆", width = 15)
+    @ApiModelProperty(value = "璁惧绾у埆")
+    private String deviceLevel;
+
+    /**
+     * 璁惧绉嶇被
+     */
+    @Excel(name = "璁惧绉嶇被", width = 15)
+    @ApiModelProperty(value = "璁惧绉嶇被")
+    private String deviceCategory;
+
     /**閮ㄩ棬鍚嶇О*/
     @Excel(name = "閮ㄩ棬鍚嶇О", width = 15)
     private transient String orgCodeTxt;
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentRunningSection.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentRunningSection.java
index a9486bb..df2abf4 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentRunningSection.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentRunningSection.java
@@ -1,23 +1,20 @@
 package org.jeecg.modules.mdc.entity;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.Set;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import org.jeecg.common.system.base.entity.JeecgEntity;
-import org.springframework.format.annotation.DateTimeFormat;
 import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
 
 /**
  * @Description: 璁惧杩愯鏃舵鐘舵�佽〃
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcMessageApproval.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcMessageApproval.java
new file mode 100644
index 0000000..1ac751e
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcMessageApproval.java
@@ -0,0 +1,97 @@
+package org.jeecg.modules.mdc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecg.common.system.base.entity.JeecgEntity;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.io.Serializable;
+
+/**
+ * @Description: mdc娑堟伅纭琛�
+ * @Author: Lius
+ * @Date: 2024-03-06
+ * @Version: V1.0
+ */
+@Data
+@TableName("mdc_message_approval")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "mdc_message_approval瀵硅薄", description = "mdc娑堟伅纭琛�")
+public class MdcMessageApproval extends JeecgEntity implements Serializable {
+
+    private static final long serialVersionUID = 3826726426360323366L;
+
+    /**
+     * 璁惧缂栫爜
+     */
+    @Excel(name = "璁惧缂栫爜", width = 15)
+    @ApiModelProperty(value = "璁惧缂栫爜")
+    private String equipmentId;
+    /**
+     * 鏍囬
+     */
+    @Excel(name = "鏍囬", width = 15)
+    @ApiModelProperty(value = "鏍囬")
+    private String titile;
+    /**
+     * 鍐呭
+     */
+    @Excel(name = "鍐呭", width = 15)
+    @ApiModelProperty(value = "鍐呭")
+    private String msgContent;
+    /**
+     * 澶勭悊浜篿ds
+     */
+    @ApiModelProperty(value = "澶勭悊浜篿ds")
+    private String senderIds;
+    /**
+     * 澶勭悊浜哄鍚�
+     */
+    @Excel(name = "澶勭悊浜哄鍚�", width = 15)
+    @ApiModelProperty(value = "澶勭悊浜哄鍚�")
+    private String senderNames;
+    /**
+     * 娑堟伅鐘舵�侊紙0寰呭鐞嗭紝1寰呯‘璁�, 2宸茬‘璁わ紝3宸叉嫆缁濓級
+     */
+    @Excel(name = "娑堟伅鐘舵�侊紙0寰呭鐞嗭紝1寰呯‘璁�, 2宸茬‘璁わ紝3宸叉嫆缁濓級", width = 15)
+    @ApiModelProperty(value = "娑堟伅鐘舵�侊紙0寰呭鐞嗭紝1寰呯‘璁�, 2宸茬‘璁わ紝3宸叉嫆缁濓級")
+    @Dict(dicCode = "mdcMsgStatus")
+    private String msgStatus;
+    /**
+     * 娑堟伅纭浜篿ds
+     */
+    @Excel(name = "娑堟伅纭浜篿ds", width = 15)
+    @ApiModelProperty(value = "娑堟伅纭浜篿ds")
+    private String approverIds;
+    /**
+     * 娑堟伅纭浜哄鍚�
+     */
+    @Excel(name = "娑堟伅纭浜哄鍚�", width = 15)
+    @ApiModelProperty(value = "娑堟伅纭浜哄鍚�")
+    private String approverNames;
+    /**
+     * 涓婃姤鍐呭
+     */
+    @Excel(name = "涓婃姤鍐呭", width = 15)
+    @ApiModelProperty(value = "涓婃姤鍐呭")
+    private String reportContent;
+    /**
+     * 澶勭悊鎸夐挳
+     */
+    @TableField(exist = false)
+    @ApiModelProperty(value = "澶勭悊鎸夐挳")
+    private Boolean hasProcess = false;
+    /**
+     * 纭鎸夐挳
+     */
+    @TableField(exist = false)
+    @ApiModelProperty(value = "纭鎸夐挳")
+    private Boolean hasConfirm = false;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcOverrunAlarm.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcOverrunAlarm.java
new file mode 100644
index 0000000..e81850d
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcOverrunAlarm.java
@@ -0,0 +1,54 @@
+package org.jeecg.modules.mdc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.system.base.entity.JeecgEntity;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.io.Serializable;
+
+/**
+ * @Description: mdc瓒呴檺鎶ヨ
+ * @Author: Lius
+ * @Date: 2024-03-01
+ * @Version: V1.0
+ */
+@Data
+@TableName("mdc_overrun_alarm")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "mdc_overrun_alarm瀵硅薄", description = "mdc瓒呴檺鎶ヨ")
+public class MdcOverrunAlarm extends JeecgEntity implements Serializable {
+
+    private static final long serialVersionUID = 3633764093859258849L;
+
+    /**
+     * 璁惧缂栫爜
+     */
+    @Excel(name = "璁惧缂栫爜", width = 15)
+    @ApiModelProperty(value = "璁惧缂栫爜")
+    private String equipmentId;
+    /**
+     * 璁惧畾鑼冨洿
+     */
+    @Excel(name = "璁惧畾鑼冨洿", width = 15)
+    @ApiModelProperty(value = "璁惧畾鑼冨洿")
+    private String setValue;
+    /**
+     * 瀹為檯鍊�
+     */
+    @Excel(name = "瀹為檯鍊�", width = 15)
+    @ApiModelProperty(value = "瀹為檯鍊�")
+    private String realValue;
+    /**
+     * 鎶ヨ鍐呭
+     */
+    @Excel(name = "鎶ヨ鍐呭", width = 15)
+    @ApiModelProperty(value = "鎶ヨ鍐呭")
+    private String alarmContent;
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunMonitoringSpeedJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunMonitoringSpeedJob.java
index 6e1e457..ae0c2d4 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunMonitoringSpeedJob.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunMonitoringSpeedJob.java
@@ -17,7 +17,7 @@
 
 /**
  * @author Lius
- * @Description: 鐩戞帶璁惧杞�熶换鍔�
+ * @Description: 鐩戞帶璁惧杩愯鍙傛暟浠诲姟
  * @date 2024/1/16 17:36
  */
 @PersistJobDataAfterExecution
@@ -45,7 +45,7 @@
         if (byJobClassName != null && !byJobClassName.isEmpty()) {
             quartzLog.setJobId(byJobClassName.get(0).getId());
         }
-        log.info("鐩戞帶璁惧杞�熶换鍔� RunMonitoringSpeedJob start!  鏃堕棿:" + DateUtils.now());
+        log.info("鐩戞帶璁惧杩愯鍙傛暟浠诲姟 RunMonitoringSpeedJob start!  鏃堕棿:" + DateUtils.now());
         long startTime = System.currentTimeMillis();
         try {
             mdcEquipmentService.monitoringSpeedProcess();
@@ -54,7 +54,7 @@
             quartzLog.setIsSuccess(-1);
             quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
             // 鍙戦�佹秷鎭�氱煡
-            sysAnnouncementService.jobSendMessage("鐩戞帶璁惧杞�熶换鍔″け璐ワ紒", quartzLog.getExceptionDetail());
+            sysAnnouncementService.jobSendMessage("鐩戞帶璁惧杩愯鍙傛暟浠诲姟锛�", quartzLog.getExceptionDetail());
         }
         long endTime = System.currentTimeMillis();
         quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java
index 8acc779..793eb81 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java
@@ -6,9 +6,12 @@
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.system.api.ISysBaseAPI;
 import org.jeecg.common.system.vo.DictModel;
+import org.jeecg.modules.mdc.constant.MdcConstant;
 import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.entity.MdcMessageApproval;
 import org.jeecg.modules.mdc.service.IMdcEquipmentRunningSectionService;
 import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.service.IMdcMessageApprovalService;
 import org.jeecg.modules.mdc.service.MdcEfficiencyReportService;
 import org.jeecg.modules.mdc.util.DateUtils;
 import org.jeecg.modules.mdc.util.ThrowableUtil;
@@ -16,8 +19,11 @@
 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.entity.SysAnnouncement;
+import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.service.ISysAnnouncementService;
 import org.jeecg.modules.system.service.ISysDictService;
+import org.jeecg.modules.system.service.ISysUserService;
 import org.quartz.*;
 
 import javax.annotation.Resource;
@@ -26,6 +32,7 @@
 import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author Lius
@@ -61,6 +68,12 @@
     @Resource
     private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService;
 
+    @Resource
+    private IMdcMessageApprovalService mdcMessageApprovalService;
+
+    @Resource
+    private ISysUserService sysUserService;
+
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         SysQuartzLog quartzLog = new SysQuartzLog();
@@ -73,7 +86,7 @@
         long startTime = System.currentTimeMillis();
         try {
             List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<>());
-            //List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, "2140198"));
+//            List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, "3140045"));
             // 鑾峰彇鍒╃敤鐜囧垽瀹氬ぉ鏁�
             List<DictModel> dictModelList1 = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_EQUIPMENT_RATE_JUDGE);
             Integer equipmentRateJudge = 5;
@@ -94,28 +107,53 @@
             }
             for (MdcEquipment mdcEquipment : equipmentList) {
                 // 鍒ゆ柇鍒╃敤鐜�
-                String date = DateUtils.format(DateUtils.toDate(LocalDate.now().plusDays(-equipmentRateJudge).toString(), DateUtils.STR_DATE), DateUtils.STRDATE);
-                List<BigDecimal> efficiencyRateList = mdcEfficiencyReportService.getEfficiencyRate(mdcEquipment.getEquipmentId(), date);
-                if (efficiencyRateList != null && !efficiencyRateList.isEmpty()) {
-                    boolean flag = true;
-                    for (BigDecimal processLong : efficiencyRateList) {
-                        BigDecimal efficiencyRate = processLong.divide(new BigDecimal("86400"), 4, RoundingMode.HALF_UP);
-                        if (efficiencyRate.compareTo(new BigDecimal(equipmentRateNormal)) > -1) {
-                            flag = false;
-                        }
-                    }
-                    if (flag) {
-                        // 涓婃姤
-                        MessageDTO messageDTO = new MessageDTO();
-                        messageDTO.setTitle("璁惧鍒╃敤鐜囨姤璀︼紒");
-                        messageDTO.setCategory("棰勮娑堟伅");
-                        messageDTO.setFromUser("admin");
-                        messageDTO.setToUser("admin");
-                        messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囧埄鐢ㄧ巼浣庝簬姝e父鍊兼姤璀︼紒");
-                        sysBaseApi.sendSysAnnouncement(messageDTO);
+                // step.1 鏌ヨ娑堟伅涓璁惧鎶ヨ鏃堕棿
+                SysAnnouncement sysAnnouncement = sysAnnouncementService.findLastMessage("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囧埄鐢ㄧ巼浣庝簬姝e父鍊兼姤璀︼紒");
+                boolean flag1 = true;
+                if (sysAnnouncement != null) {
+                    Date createTime = sysAnnouncement.getCreateTime();
+                    Date msgDate = DateUtils.toDate(DateUtils.format(createTime, DateUtils.STR_DATE), DateUtils.STR_DATE);
+                    Date now = DateUtils.toDate(LocalDate.now().toString(), DateUtils.STR_DATE);
+                    Integer days = DateUtils.getDays(msgDate, now);
+                    if (days < equipmentRateJudge) {
+                        flag1 = false;
                     }
                 }
-                // 鍒ゆ柇璁惧鐘舵��
+                if (flag1) {
+                    String date = DateUtils.format(DateUtils.toDate(LocalDate.now().plusDays(-equipmentRateJudge).toString(), DateUtils.STR_DATE), DateUtils.STRDATE);
+                    List<BigDecimal> efficiencyRateList = mdcEfficiencyReportService.getEfficiencyRate(mdcEquipment.getEquipmentId(), date);
+                    if (efficiencyRateList != null && !efficiencyRateList.isEmpty()) {
+                        boolean flag = true;
+                        for (BigDecimal processLong : efficiencyRateList) {
+                            BigDecimal efficiencyRate = processLong.divide(new BigDecimal("86400"), 4, RoundingMode.HALF_UP);
+                            if (efficiencyRate.compareTo(new BigDecimal(equipmentRateNormal)) > -1) {
+                                flag = false;
+                            }
+                        }
+                        if (flag) {
+                            // 涓婃姤
+                            MessageDTO messageDTO = new MessageDTO();
+                            messageDTO.setTitle("璁惧鍒╃敤鐜囨姤璀︼紒");
+                            messageDTO.setCategory("棰勮娑堟伅");
+                            messageDTO.setFromUser("admin");
+                            messageDTO.setToUser("admin");
+                            messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囧埄鐢ㄧ巼浣庝簬姝e父鍊兼姤璀︼紒");
+                            sysBaseApi.sendSysAnnouncement(messageDTO);
+                        }
+                    }
+                }
+
+                // 鍒ゆ柇璁惧鐘舵�侀暱鏃堕棿鏃犲彉鍖栧鎵逛汉
+                SysAnnouncement sysAnnouncement1 = sysAnnouncementService.findLastMessage("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囩姸鎬侀暱鏈熸棤鍙樺寲鎶ヨ锛�");
+                if (sysAnnouncement1 != null) {
+                    Date createTime = sysAnnouncement1.getCreateTime();
+                    Date msgDate = DateUtils.toDate(DateUtils.format(createTime, DateUtils.STR_DATE), DateUtils.STR_DATE);
+                    Date now = DateUtils.toDate(LocalDate.now().toString(), DateUtils.STR_DATE);
+                    Integer days = DateUtils.getDays(msgDate, now);
+                    if (days < equipmentStatusJudge) {
+                        continue;
+                    }
+                }
                 Date date1 = DateUtils.toDate(LocalDate.now().plusDays(-equipmentStatusJudge).toString(), DateUtils.STR_DATE);
                 List<Integer> sectionList = mdcEquipmentRunningSectionService.getDataList(mdcEquipment.getEquipmentId(), date1);
                 if (sectionList != null && !sectionList.isEmpty() && sectionList.size() > 1) {
@@ -128,13 +166,46 @@
                     }
                     if (flag) {
                         // 涓婃姤
-                        MessageDTO messageDTO = new MessageDTO();
-                        messageDTO.setTitle("璁惧鐘舵�侀暱鏈熸棤鍙樺寲鎶ヨ锛�");
-                        messageDTO.setCategory("棰勮娑堟伅");
-                        messageDTO.setFromUser("admin");
-                        messageDTO.setToUser("admin");
-                        messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囩姸鎬侀暱鏈熸棤鍙樺寲鎶ヨ锛�");
-                        sysBaseApi.sendSysAnnouncement(messageDTO);
+                        // 鏌ヨ璁惧绠$悊鍛�
+                        List<SysUser> adminList = sysUserService.getEquipmentAdmin(MdcConstant.MDC_EQUIPMENT_MANAGER, mdcEquipment.getEquipmentId());
+                        // 鏌ヨ璁惧瓒呯骇绠$悊鍛�
+                        List<SysUser> superList = sysUserService.getEquipmentAdmin(MdcConstant.MDC_EQUIPMENT_SUPER_MANAGER, mdcEquipment.getEquipmentId());
+                        if (adminList != null && !adminList.isEmpty()) {
+                            for (SysUser sysUser : adminList) {
+                                MessageDTO messageDTO = new MessageDTO();
+                                messageDTO.setTitle("璁惧鐘舵�侀暱鏈熸棤鍙樺寲鎶ヨ锛�");
+                                messageDTO.setCategory("棰勮娑堟伅");
+                                messageDTO.setFromUser("admin");
+                                messageDTO.setToUser(sysUser.getUsername());
+                                messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囩姸鎬侀暱鏈熸棤鍙樺寲鎶ヨ锛�");
+                                sysBaseApi.sendSysAnnouncement(messageDTO);
+                            }
+                        } else {
+                            MessageDTO messageDTO = new MessageDTO();
+                            messageDTO.setTitle("璁惧鐘舵�侀暱鏈熸棤鍙樺寲鎶ヨ锛�");
+                            messageDTO.setCategory("棰勮娑堟伅");
+                            messageDTO.setFromUser("admin");
+                            messageDTO.setToUser("admin");
+                            messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囩姸鎬侀暱鏈熸棤鍙樺寲鎶ヨ锛�");
+                            sysBaseApi.sendSysAnnouncement(messageDTO);
+                        }
+
+                        if (adminList != null && !adminList.isEmpty() && superList != null && !superList.isEmpty()) {
+                            MdcMessageApproval mdcMessageApproval = new MdcMessageApproval();
+                            mdcMessageApproval.setEquipmentId(mdcEquipment.getEquipmentId());
+                            mdcMessageApproval.setTitile("璁惧鐘舵�侀暱鏈熸棤鍙樺寲鎶ヨ锛�");
+                            mdcMessageApproval.setMsgContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囩姸鎬侀暱鏈熸棤鍙樺寲鎶ヨ锛�");
+                            List<String> senderIdList = adminList.stream().map(SysUser::getId).collect(Collectors.toList());
+                            mdcMessageApproval.setSenderIds(String.join(",", senderIdList));
+                            List<String> senderNameList = adminList.stream().map(SysUser::getRealname).collect(Collectors.toList());
+                            mdcMessageApproval.setSenderNames(String.join(",", senderNameList));
+                            List<String> superIdList = superList.stream().map(SysUser::getId).collect(Collectors.toList());
+                            mdcMessageApproval.setApproverIds(String.join(",", superIdList));
+                            List<String> superNameList = superList.stream().map(SysUser::getRealname).collect(Collectors.toList());
+                            mdcMessageApproval.setApproverNames(String.join(",", superNameList));
+                            mdcMessageApproval.setMsgStatus(MdcConstant.MSG_STATUS_0);
+                            mdcMessageApprovalService.save(mdcMessageApproval);
+                        }
                     }
                 }
             }
@@ -143,7 +214,7 @@
             quartzLog.setIsSuccess(-1);
             quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
             // 鍙戦�佹秷鎭�氱煡
-            sysAnnouncementService.jobSendMessage("璁惧鐘舵�侀暱鏈熸棤鍙樺寲鎶ヨ浠诲姟澶辫触锛�", quartzLog.getExceptionDetail());
+            sysAnnouncementService.jobSendMessage("璁惧鐘舵�侀暱鏈熸棤鍙樺寲鎶ヨ浠诲姟", quartzLog.getExceptionDetail());
         }
         long endTime = System.currentTimeMillis();
         quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningMonitoringSpeedJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningMonitoringSpeedJob.java
new file mode 100644
index 0000000..ebf871a
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningMonitoringSpeedJob.java
@@ -0,0 +1,154 @@
+package org.jeecg.modules.mdc.job;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.dto.message.MessageDTO;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.api.ISysBaseAPI;
+import org.jeecg.common.system.vo.DictModel;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.mdc.dto.MdcEquipmentDto;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.entity.MdcOverrunAlarm;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.service.IMdcOverrunAlarmService;
+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.jeecg.modules.system.service.ISysDictService;
+import org.quartz.*;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Lius
+ * @Description: 鐩戞帶璁惧杩愯杞�熶笌NC绋嬪簭璁惧畾杞�熷姣�
+ * @date 2024/3/4 16:14
+ */
+@PersistJobDataAfterExecution
+@DisallowConcurrentExecution
+@Slf4j
+public class RunningMonitoringSpeedJob implements Job {
+
+    @Resource
+    private IQuartzJobService quartzJobService;
+
+    @Resource
+    private ISysQuartzLogService sysQuartzLogService;
+
+    @Resource
+    private ISysAnnouncementService sysAnnouncementService;
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+
+    @Resource
+    private ISysDictService sysDictService;
+
+    @Resource
+    private ISysBaseAPI sysBaseApi;
+
+    @Resource
+    private IMdcOverrunAlarmService mdcOverrunAlarmService;
+
+    @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());
+        }
+        log.info("鐩戞帶璁惧杩愯杞�熶笌NC绋嬪簭璁惧畾杞�熷姣� RunningMonitoringSpeedJob start!  鏃堕棿:" + DateUtils.now());
+        long startTime = System.currentTimeMillis();
+        try {
+            List<MdcEquipment> mdcEquipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().ne(MdcEquipment::getDriveType, "ZUOLAN"));
+
+            // 鑾峰彇瀛楀吀鏁版嵁
+            List<DictModel> dictModelList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_OPERATING_SPEED_RANGE);
+            BigDecimal range = BigDecimal.ZERO;
+            if (dictModelList != null && !dictModelList.isEmpty()) {
+                range = new BigDecimal(dictModelList.get(0).getValue());
+            }
+
+            for (MdcEquipment mdcEquipment : mdcEquipmentList) {
+                String saveTableName = mdcEquipment.getSaveTableName();
+                MdcEquipmentDto mdcEquipmentDto = new MdcEquipmentDto();
+                try {
+                    //鏌ヨ鍗曡〃鏁版嵁
+                    mdcEquipmentDto = mdcEquipmentService.getWorkLineLast(saveTableName);
+
+                } catch (Exception e) {
+                    log.error("鏌ヨ鍗曡〃鏁版嵁澶辫触!", e);
+                }
+                if (mdcEquipmentDto != null && StringUtils.isNotBlank(mdcEquipmentDto.getSpindlespeed()) && StringUtils.isNotBlank(mdcEquipmentDto.getActualspindlespeed())) {
+                    MessageDTO messageDTO = new MessageDTO();
+                    messageDTO.setTitle("璁惧杩愯杞�熸姤璀︼紒");
+                    messageDTO.setCategory("棰勮娑堟伅");
+                    messageDTO.setFromUser("admin");
+                    messageDTO.setToUser("admin");
+                    //璁惧畾
+                    BigDecimal spindlespeed = new BigDecimal(mdcEquipmentDto.getSpindlespeed());
+                    //瀹為檯
+                    BigDecimal actualspindlespeed = new BigDecimal(mdcEquipmentDto.getActualspindlespeed());
+
+                    MdcOverrunAlarm mdcOverrunAlarm = new MdcOverrunAlarm();
+                    mdcOverrunAlarm.setEquipmentId(mdcEquipment.getEquipmentId());
+                    mdcOverrunAlarm.setSetValue(spindlespeed.toString());
+                    mdcOverrunAlarm.setRealValue(actualspindlespeed.toString());
+                    if (range.equals(BigDecimal.ZERO)) {
+                        if (spindlespeed.compareTo(actualspindlespeed) == 1) {
+                            // 璁惧畾鍊煎ぇ浜庡疄闄呭��   浣�
+                            messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囪繍琛岃浆閫熶綆鎶ヨ锛�");
+                            sysBaseApi.sendSysAnnouncement(messageDTO);
+                            mdcOverrunAlarm.setAlarmContent("璁惧杩愯杞�熸瘮NC浠g爜璁惧畾鍊间綆鎶ヨ");
+                            mdcOverrunAlarmService.save(mdcOverrunAlarm);
+                        } else if (spindlespeed.compareTo(actualspindlespeed) == -1) {
+                            // 璁惧畾鍊煎皬浜庡疄闄呭��   楂�
+                            messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囪繍琛岃浆閫熼珮鎶ヨ锛�");
+                            sysBaseApi.sendSysAnnouncement(messageDTO);
+                            mdcOverrunAlarm.setAlarmContent("璁惧杩愯杞�熸瘮NC浠g爜璁惧畾鍊奸珮鎶ヨ");
+                            mdcOverrunAlarmService.save(mdcOverrunAlarm);
+                        }
+                    } else {
+                        BigDecimal multiply = spindlespeed.multiply(range.divide(new BigDecimal(100), 4, RoundingMode.HALF_UP));
+                        BigDecimal max = spindlespeed.add(multiply);
+                        BigDecimal min = spindlespeed.subtract(multiply);
+                        if (actualspindlespeed.compareTo(max) == 1 || actualspindlespeed.compareTo(min) == -1) {
+                            if (spindlespeed.compareTo(actualspindlespeed) == 1) {
+                                // 璁惧畾鍊煎ぇ浜庡疄闄呭��   浣�
+                                messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囪繍琛岃浆閫熶綆鎶ヨ锛�");
+                                sysBaseApi.sendSysAnnouncement(messageDTO);
+                                mdcOverrunAlarm.setAlarmContent("璁惧杩愯杞�熸瘮NC浠g爜璁惧畾鍊间綆鎶ヨ");
+                                mdcOverrunAlarmService.save(mdcOverrunAlarm);
+                            } else if (spindlespeed.compareTo(actualspindlespeed) == -1) {
+                                // 璁惧畾鍊煎皬浜庡疄闄呭��   楂�
+                                messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囪繍琛岃浆閫熼珮鎶ヨ锛�");
+                                sysBaseApi.sendSysAnnouncement(messageDTO);
+                                mdcOverrunAlarm.setAlarmContent("璁惧杩愯杞�熸瘮NC浠g爜璁惧畾鍊奸珮鎶ヨ");
+                                mdcOverrunAlarmService.save(mdcOverrunAlarm);
+                            }
+                        }
+                    }
+                }
+            }
+            quartzLog.setIsSuccess(0);
+        } catch (Exception e) {
+            quartzLog.setIsSuccess(-1);
+            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
+            // 鍙戦�佹秷鎭�氱煡
+            sysAnnouncementService.jobSendMessage("鐩戞帶璁惧杩愯杞�熶笌NC绋嬪簭璁惧畾杞�熷姣旓紒", 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/RunningOvertimeDurationJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOvertimeDurationJob.java
index 3c42552..32f01e6 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOvertimeDurationJob.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOvertimeDurationJob.java
@@ -79,8 +79,8 @@
         quartzLog.setParams(this.parameter);
         log.info(String.format("瀹氭椂缁熻璁惧鍔犵彮鏃堕暱浠诲姟 param: %s RunningOvertimeDurationJob start!  鏃堕棿:" + DateUtils.getNow(), this.parameter));
         long startTime = System.currentTimeMillis();
+        String date = "";
         try {
-            String date = "";
             if (StringUtils.isNotBlank(this.parameter)) {
                 date = DateUtils.format(DateUtils.toDate(this.parameter, DateUtils.STRDATE), DateUtils.STR_DATE);
                 Date initDate = DateUtils.toDate(this.parameter, DateUtils.STRDATE);
@@ -99,7 +99,7 @@
             List<MdcEquipmentOvertime> result = new ArrayList<>();
             for (MdcEquipment mdcEquipment : equipmentList) {
                 // 鑾峰彇璁惧宸ヤ綔鏃ュ巻
-                List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentIdAndDate(mdcEquipment.getEquipmentId(), this.parameter);
+                List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentIdAndDate(mdcEquipment.getEquipmentId(), DateUtils.format(DateUtils.toDate(date, DateUtils.STR_DATE),DateUtils.STRDATE));
                 if (mdcDeviceCalendarVos != null && !mdcDeviceCalendarVos.isEmpty()) {
                     //鑾峰彇鏈�鍚庝竴涓彮娆$粨鏉熸椂闂�
                     Date startDate = this.getCalendarEndDate(mdcDeviceCalendarVos, date);
@@ -121,7 +121,7 @@
                         mdcEquipmentOvertime.setEquipmentId(mdcEquipment.getEquipmentId());
                         mdcEquipmentOvertime.setDuration(duration);
                         mdcEquipmentOvertime.setAutoFlag(CommonConstant.AUTO_FLAG_Y);
-                        mdcEquipmentOvertime.setTheDate(this.parameter);
+                        mdcEquipmentOvertime.setTheDate(DateUtils.format(DateUtils.toDate(date, DateUtils.STR_DATE),DateUtils.STRDATE));
                         result.add(mdcEquipmentOvertime);
                     }
 
@@ -146,7 +146,7 @@
                         mdcEquipmentOvertime.setEquipmentId(mdcEquipment.getEquipmentId());
                         mdcEquipmentOvertime.setDuration(duration);
                         mdcEquipmentOvertime.setAutoFlag(CommonConstant.AUTO_FLAG_Y);
-                        mdcEquipmentOvertime.setTheDate(this.parameter);
+                        mdcEquipmentOvertime.setTheDate(DateUtils.format(DateUtils.toDate(date, DateUtils.STR_DATE),DateUtils.STRDATE));
                         result.add(mdcEquipmentOvertime);
                     }
 
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentLogMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentLogMapper.java
index cee8044..cfa1ba1 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentLogMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentLogMapper.java
@@ -15,5 +15,5 @@
 
     EquipmentLog getRow(@Param("equipmentid") String equipmentid, @Param("startTime") Date startTime);
 
-    Integer selectEquipmentOporation(@Param("equipmentId") String equipmentId);
+    EquipmentLog selectEquipmentOporation(@Param("equipmentId") String equipmentId);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
index 4cab5f9..2c844a6 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
@@ -5,9 +5,11 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.mdc.dto.MdcEquDepDto;
 import org.jeecg.modules.mdc.dto.MdcEquProDto;
 import org.jeecg.modules.mdc.dto.MdcEquipmentDto;
+import org.jeecg.modules.mdc.entity.EquipmentLog;
 import org.jeecg.modules.mdc.entity.MdcEquipment;
 import org.jeecg.modules.mdc.entity.MdcEquipmentMonitor;
 import org.jeecg.modules.mdc.vo.MdcEquipmentDepVo;
@@ -16,6 +18,7 @@
 import org.jeecg.modules.mdc.vo.WorkshopEquipmentVo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: 璁惧琛�
@@ -97,12 +100,23 @@
     IPage<MdcEquipment> pageList(Page<MdcEquipment> page, @Param("mdcEquipment") MdcEquipmentVo mdcEquipment);
 
     @InterceptorIgnore(tenantLine = "1")
-    MdcEquipmentDto getWorkLineLast(@Param("tableName") String saveTableName);
+    @Select("select TOP 1 CollectTime ${columns} from [${tableName}] order by CollectTime desc")
+    Map<String, Object> getWorkLineLast(Map<String, Object> param);
 
     /**
      * 瀵煎嚭list
      * @param mdcEquipment
      * @return
      */
-    List<MdcEquipment> exportXlsList(@Param("mdcEquipment") MdcEquipment mdcEquipment);
+    List<MdcEquipment> exportXlsList(@Param("mdcEquipment") MdcEquipmentVo mdcEquipment);
+
+    /**
+     * 鏌ヨ鍗曡〃鏁版嵁
+     * @param tableName
+     * @return
+     */
+    @InterceptorIgnore(tenantLine = "1")
+    MdcEquipmentDto findWorkLineLast(@Param("tableName") String tableName);
+
+    List<EquipmentLog> getEquipmentStatusList(@Param("equipmentIdList") List<String> equipmentIdList);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcMessageApprovalMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcMessageApprovalMapper.java
new file mode 100644
index 0000000..d5fae4d
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcMessageApprovalMapper.java
@@ -0,0 +1,22 @@
+package org.jeecg.modules.mdc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+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.mdc.entity.MdcMessageApproval;
+
+/**
+ * @Description: mdc娑堟伅纭琛�
+ * @Author: Lius
+ * @Date:   2024-03-06
+ * @Version: V1.0
+ */
+public interface MdcMessageApprovalMapper extends BaseMapper<MdcMessageApproval> {
+
+    /**
+     * 鍒楄〃鏌ヨ
+     */
+    IPage<MdcMessageApproval> pageList(@Param("userId") String userId, Page<MdcMessageApproval> page, @Param("mdcMessageApproval") MdcMessageApproval mdcMessageApproval);
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOverrunAlarmMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOverrunAlarmMapper.java
new file mode 100644
index 0000000..6d5acd5
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOverrunAlarmMapper.java
@@ -0,0 +1,27 @@
+package org.jeecg.modules.mdc.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+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.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.entity.MdcOverrunAlarm;
+
+/**
+ * @Description: mdc瓒呴檺鎶ヨ
+ * @Author: Lius
+ * @Date: 2024-03-01
+ * @Version: V1.0
+ */
+public interface MdcOverrunAlarmMapper extends BaseMapper<MdcOverrunAlarm> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param page
+     * @param mdcEquipment
+     * @return
+     */
+    IPage<MdcOverrunAlarm> pageList(Page<MdcOverrunAlarm> page, @Param("mdcEquipment") MdcEquipment mdcEquipment);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentLogMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentLogMapper.xml
index b178c17..d31b630 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentLogMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentLogMapper.xml
@@ -6,7 +6,7 @@
         SELECT top 1 * FROM EquipmentLog WHERE EquipmentID = #{ equipmentid } AND CollectTime &lt;= #{ startTime } AND Oporation in ('0','1','2','3') ORDER BY CollectTime ASC
     </select>
 
-    <select id="selectEquipmentOporation" resultType="java.lang.Integer">
-        SELECT TOP 1 Oporation FROM EquipmentLog WHERE EquipmentID = #{ equipmentId } ORDER BY CollectTime DESC
+    <select id="selectEquipmentOporation" resultType="org.jeecg.modules.mdc.entity.EquipmentLog">
+        SELECT TOP 1 * FROM EquipmentLog WHERE EquipmentID = #{ equipmentId } ORDER BY CollectTime DESC
     </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDeviceCalendarMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDeviceCalendarMapper.xml
index a63838e..b47450f 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDeviceCalendarMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDeviceCalendarMapper.xml
@@ -52,15 +52,12 @@
             t3.sleep_start_date,
             t3.sleep_end_date,
             t3.is_day_span,
-            t4.equipment_name,
-            t5.start_time overtimeStartTime,
-            t5.end_time overtimeEndTime
+            t4.equipment_name
         FROM
             mdc_device_calendar t1
             LEFT JOIN mdc_shift t2 ON t1.shift_id = t2.id
             LEFT JOIN mdc_shift_sub t3 ON t1.shift_sub_id = t3.id
             LEFT JOIN mdc_equipment t4 ON t1.equipment_id = t4.equipment_id
-            LEFT JOIN mdc_equipment_overtime t5 ON t5.calendar_id = t1.id
         <where>
             <if test="equipmentId != null and equipmentId != ''">
                 AND t4.equipment_id = #{ equipmentId }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml
index 5320b97..357a4b8 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml
@@ -28,6 +28,9 @@
         <if test="vo.equipmentType != null and vo.equipmentType != '' ">
             AND t2.equipment_type = #{ vo.equipmentType }
         </if>
+        <if test="vo.driveType != null and vo.driveType != '' ">
+            AND t2.drive_type = #{ vo.driveType }
+        </if>
         <if test="vo.equipmentIdList != null and vo.equipmentIdList.size() > 0 ">
             AND t2.equipment_id IN
             <foreach collection="vo.equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
@@ -65,6 +68,9 @@
             AND t1.the_date &gt;= #{ vo.startTime }
         <if test="vo.equipmentType != null and vo.equipmentType != '' ">
             AND t2.equipment_type = #{ vo.equipmentType }
+        </if>
+        <if test="vo.driveType != null and vo.driveType != '' ">
+            AND t2.drive_type = #{ vo.driveType }
         </if>
         <if test="vo.equipmentIdList != null and vo.equipmentIdList.size() > 0 ">
             AND t2.equipment_id IN
@@ -110,6 +116,9 @@
             <if test="vo.equipmentType != null and vo.equipmentType != '' ">
                 AND t2.equipment_type = #{ vo.equipmentType }
             </if>
+            <if test="vo.driveType != null and vo.driveType != '' ">
+                AND t2.drive_type = #{ vo.driveType }
+            </if>
         </where>
         GROUP BY
             t2.equipment_id,
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
index 492e4b3..480d71e 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
@@ -238,16 +238,14 @@
             <if test="mdcEquipment.driveType != null and mdcEquipment.driveType != '' ">
                 AND t1.drive_type = #{mdcEquipment.driveType}
             </if>
-            <if test="mdcEquipment.productionName != null and mdcEquipment.productionName != '' ">
-                AND t3.id = #{ mdcEquipment.productionName } OR t3.parent_id = #{ mdcEquipment.productionName }
+            <if test="mdcEquipment.productionIds != null and mdcEquipment.productionIds.size() > 0 ">
+                AND t3.id IN
+                <foreach collection="mdcEquipment.productionIds" index="index" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
             </if>
         </where>
         order by t1.sort_no
-    </select>
-
-
-    <select id="getWorkLineLast" resultType="org.jeecg.modules.mdc.dto.MdcEquipmentDto">
-        select top 1 spindlespeed, actualspindlespeed from [${tableName}] order by CollectTime  desc
     </select>
 
     <select id="exportXlsList" resultType="org.jeecg.modules.mdc.entity.MdcEquipment">
@@ -268,16 +266,40 @@
                 AND t1.equipment_name = #{mdcEquipment.equipmentModel}
             </if>
             <if test="mdcEquipment.equipmentType != null and mdcEquipment.equipmentType != '' ">
-                AND t1.equipmentType = #{mdcEquipment.equipmentType}
+                AND t1.equipment_type = #{mdcEquipment.equipmentType}
             </if>
             <if test="mdcEquipment.driveType != null and mdcEquipment.driveType != '' ">
                 AND t1.drive_type = #{mdcEquipment.driveType}
             </if>
-            <if test="mdcEquipment.productionName != null and mdcEquipment.productionName != '' ">
-                AND t3.id = #{ mdcEquipment.productionName } OR t3.parent_id = #{ mdcEquipment.productionName }
+            <if test="mdcEquipment.productionIds != null and mdcEquipment.productionIds.size() > 0 ">
+                AND t3.id IN
+                <foreach collection="mdcEquipment.productionIds" index="index" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
             </if>
         </where>
         order by t1.sort_no
     </select>
 
+    <!--鏌ヨ鍗曡〃鏁版嵁-->
+    <select id="findWorkLineLast" resultType="org.jeecg.modules.mdc.dto.MdcEquipmentDto">
+        select top 1 spindlespeed, actualspindlespeed from [${tableName}] order by CollectTime  desc
+    </select>
+
+    <!--鏌ヨ璁惧鏈�鏂颁竴鏉℃暟鎹�-->
+    <select id="getEquipmentStatusList" resultType="org.jeecg.modules.mdc.entity.EquipmentLog">
+        SELECT
+            t1.*
+        FROM
+            EquipmentLog t1
+            INNER JOIN ( SELECT MAX ( CollectTime ) AS CollectTime, EquipmentID FROM EquipmentLog GROUP BY EquipmentID ) t2 ON t1.CollectTime= t2.CollectTime
+            AND t1.EquipmentID= t2.EquipmentID
+        <if test="equipmentIdList != null and equipmentIdList.size() > 0">
+            AND t1.EquipmentID IN
+            <foreach collection="equipmentIdList" index="index" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcMessageApprovalMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcMessageApprovalMapper.xml
new file mode 100644
index 0000000..4e53609
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcMessageApprovalMapper.xml
@@ -0,0 +1,22 @@
+<?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.MdcMessageApprovalMapper">
+
+    <!--鍒楄〃鏌ヨ-->
+    <select id="pageList" resultType="org.jeecg.modules.mdc.entity.MdcMessageApproval">
+        SELECT
+            *
+        FROM
+            mdc_message_approval
+        <where>
+            (sender_ids LIKE CONCAT(CONCAT('%',#{userId}),'%') OR approver_ids LIKE CONCAT(CONCAT('%',#{userId}),'%'))
+            <if test="mdcMessageApproval.equipmentId != null and mdcMessageApproval.equipmentId != ''">
+                AND equipment_id = #{mdcMessageApproval.equipmentId}
+            </if>
+            <if test="mdcMessageApproval.msgStatus != null and mdcMessageApproval.msgStatus != ''">
+                AND msg_status = #{mdcMessageApproval.msgStatus}
+            </if>
+        </where>
+        ORDER BY create_time DESC
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOverrunAlarmMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOverrunAlarmMapper.xml
new file mode 100644
index 0000000..f812bb9
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOverrunAlarmMapper.xml
@@ -0,0 +1,25 @@
+<?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.MdcOverrunAlarmMapper">
+
+    <select id="pageList" resultType="org.jeecg.modules.mdc.entity.MdcOverrunAlarm">
+        SELECT
+            t1.*
+        FROM
+            mdc_overrun_alarm t1
+                LEFT JOIN mdc_equipment t2 ON t1.equipment_id = t2.equipment_id
+        <where>
+            <if test="mdcEquipment.equipmentId != null and mdcEquipment.equipmentId != '' ">
+                AND t1.equipment_id LIKE CONCAT(CONCAT('%',#{mdcEquipment.equipmentId}),'%')
+            </if>
+            <if test="mdcEquipment.equipmentType != null and mdcEquipment.equipmentType != '' ">
+                AND t2.equipment_type = #{mdcEquipment.equipmentType}
+            </if>
+            <if test="mdcEquipment.driveType != null and mdcEquipment.driveType != '' ">
+                AND t2.drive_type = #{mdcEquipment.driveType}
+            </if>
+        </where>
+        ORDER BY
+            t1.create_time DESC
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentLogService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentLogService.java
index 31622b0..c98f2b1 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentLogService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentLogService.java
@@ -27,5 +27,5 @@
      */
     EquipmentLog getRow(String equipmentid, Date startTime);
 
-    Integer selectEquipmentOporation(String equipmentId);
+    EquipmentLog selectEquipmentOporation(String equipmentId);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
index 1880efa..198b5fe 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
@@ -9,6 +9,7 @@
 import org.jeecg.modules.mdc.entity.MdcEquipment;
 import org.jeecg.modules.mdc.entity.MdcEquipmentMonitor;
 import org.jeecg.modules.mdc.model.MdcEquipmentTree;
+import org.jeecg.modules.mdc.vo.MdcCommonVo;
 import org.jeecg.modules.mdc.vo.MdcEquipmentVo;
 import org.jeecg.modules.mdc.vo.WorkshopEquipmentVo;
 
@@ -178,7 +179,7 @@
     IPage<MdcEquipment> pageList(Page<MdcEquipment> page, MdcEquipmentVo mdcEquipment, HttpServletRequest req);
 
     /**
-     * 鐩戞帶璁惧杞�熶换鍔�
+     * 鐩戞帶璁惧杩愯鍙傛暟浠诲姟
      */
     void monitoringSpeedProcess();
 
@@ -187,6 +188,24 @@
      * @param mdcEquipment
      * @return
      */
-    List<MdcEquipment> exportXlsList(MdcEquipment mdcEquipment);
+    List<MdcEquipment> exportXlsList(MdcEquipmentVo mdcEquipment);
 
+    /**
+     * 閫氳繃杞﹂棿ids鑾峰彇璁惧鏍�
+     * @param ids
+     * @return
+     */
+    List<MdcEquipmentTree> loadTreeListByProductionIds(String ids);
+
+    /**
+     * 鏌ヨ鍗曡〃鏁版嵁
+     * @param tableName
+     * @return
+     */
+    MdcEquipmentDto getWorkLineLast(String tableName);
+
+    /**
+     * 璁惧杩愯鐘舵�佺粺璁�
+     */
+    List<MdcCommonVo> getEquipmentStatusStatistics(String userId, String key);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcMessageApprovalService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcMessageApprovalService.java
new file mode 100644
index 0000000..aa7cb03
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcMessageApprovalService.java
@@ -0,0 +1,22 @@
+package org.jeecg.modules.mdc.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mdc.entity.MdcMessageApproval;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Description: mdc娑堟伅纭琛�
+ * @Author: Lius
+ * @Date: 2024-03-06
+ * @Version: V1.0
+ */
+public interface IMdcMessageApprovalService extends IService<MdcMessageApproval> {
+
+    /**
+     * 鍒楄〃鏌ヨ
+     */
+    IPage<MdcMessageApproval> pageList(String userId, Page<MdcMessageApproval> page, MdcMessageApproval mdcMessageApproval, HttpServletRequest req);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOverrunAlarmService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOverrunAlarmService.java
new file mode 100644
index 0000000..ce75112
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOverrunAlarmService.java
@@ -0,0 +1,30 @@
+package org.jeecg.modules.mdc.service;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.entity.MdcOverrunAlarm;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Description: mdc瓒呴檺鎶ヨ
+ * @Author: Lius
+ * @Date: 2024-03-01
+ * @Version: V1.0
+ */
+public interface IMdcOverrunAlarmService extends IService<MdcOverrunAlarm> {
+
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param page
+     * @param mdcEquipment
+     * @param req
+     * @return
+     */
+    IPage<MdcOverrunAlarm> pageList(Page<MdcOverrunAlarm> page, MdcEquipment mdcEquipment, HttpServletRequest req);
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentLogServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentLogServiceImpl.java
index 29d1671..76de098 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentLogServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentLogServiceImpl.java
@@ -50,7 +50,7 @@
     }
 
     @Override
-    public Integer selectEquipmentOporation(String equipmentId) {
+    public EquipmentLog selectEquipmentOporation(String equipmentId) {
         return this.baseMapper.selectEquipmentOporation(equipmentId);
     }
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java
index 238de3a..2b3ae6f 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java
@@ -7,10 +7,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.modules.mdc.entity.*;
 import org.jeecg.modules.mdc.mapper.MdcDeviceCalendarMapper;
-import org.jeecg.modules.mdc.service.IMdcDeviceCalendarService;
-import org.jeecg.modules.mdc.service.IMdcEquipmentService;
-import org.jeecg.modules.mdc.service.IMdcShiftSubService;
-import org.jeecg.modules.mdc.service.IMdcVacationManagementService;
+import org.jeecg.modules.mdc.service.*;
 import org.jeecg.modules.mdc.vo.EquipmentCalendarVo;
 import org.jeecg.modules.mdc.vo.MdcDeviceCalendarQueryVo;
 import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo;
@@ -41,6 +38,9 @@
 
     @Resource
     private IMdcVacationManagementService mdcVacationManagementService;
+
+    @Resource
+    private IMdcEquipmentOvertimeService mdcEquipmentOvertimeService;
 
     /**
      * 鍒嗛〉鍒楄〃鏌ヨ
@@ -212,7 +212,17 @@
 
     @Override
     public List<MdcDeviceCalendarVo> listByEquipmentIdAndDate(String equipmentId, String date) {
-        return this.baseMapper.listByEquipmentAndDate(equipmentId, date);
+        List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = this.baseMapper.listByEquipmentAndDate(equipmentId, date);
+        if (mdcDeviceCalendarVos != null && !mdcDeviceCalendarVos.isEmpty()) {
+            for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) {
+                List<MdcEquipmentOvertime> list = mdcEquipmentOvertimeService.list(new LambdaQueryWrapper<MdcEquipmentOvertime>().eq(MdcEquipmentOvertime::getEquipmentId, mdcDeviceCalendarVo.getEquipmentId()).eq(MdcEquipmentOvertime::getTheDate, mdcDeviceCalendarVo.getEndDate()));
+                if (list != null && !list.isEmpty()) {
+                    mdcDeviceCalendarVo.setOvertimeStartTime(list.get(0).getStartTime());
+                    mdcDeviceCalendarVo.setOvertimeEndTime(list.get(0).getEndTime());
+                }
+            }
+        }
+        return mdcDeviceCalendarVos;
     }
 
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentAlarmAnalyzeServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentAlarmAnalyzeServiceImpl.java
index d0f0311..01e7d16 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentAlarmAnalyzeServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentAlarmAnalyzeServiceImpl.java
@@ -1,11 +1,15 @@
 package org.jeecg.modules.mdc.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.modules.mdc.dto.MdcAlarmAnalyzeDto;
 import org.jeecg.modules.mdc.dto.MdcAlarmDto;
 import org.jeecg.modules.mdc.dto.MdcAlarmListDto;
 import org.jeecg.modules.mdc.dto.MdcAlarmTrendDto;
+import org.jeecg.modules.mdc.entity.MdcAlarmInfo;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
 import org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection;
+import org.jeecg.modules.mdc.service.IMdcAlarmInfoService;
 import org.jeecg.modules.mdc.service.IMdcEquipmentRunningSectionService;
 import org.jeecg.modules.mdc.service.IMdcEquipmentService;
 import org.jeecg.modules.mdc.service.MdcEquipmentAlarmAnalyzeService;
@@ -29,6 +33,9 @@
 
     @Resource
     private IMdcEquipmentService mdcEquipmentService;
+
+    @Resource
+    private IMdcAlarmInfoService mdcAlarmInfoService;
 
     @Override
     public List<MdcAlarmAnalyzeDto> alarmList(String userId, MdcAlarmAnalyzeQueryVo vo) {
@@ -77,6 +84,12 @@
                     mdcAlarmAnalyzeDto.setAlarmCode(mdcEquipmentRunningSection.getAlarm());
                     mdcAlarmAnalyzeDto.setCount(1);
                     mdcAlarmAnalyzeDto.setTimeCount(new BigDecimal(mdcEquipmentRunningSection.getDuration()));
+                    //鏌ヨ鎶ヨ鍙峰唴瀹�
+                    List<MdcEquipment> list = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, mdcEquipmentRunningSection.getEquipmentId()));
+                    List<MdcAlarmInfo> mdcAlarmInfo = mdcAlarmInfoService.list(new LambdaQueryWrapper<MdcAlarmInfo>().eq(MdcAlarmInfo::getDriveType, list.get(0).getDriveType()).eq(MdcAlarmInfo::getAlarmCode, mdcEquipmentRunningSection.getAlarm()).eq(MdcAlarmInfo::getIsUse, 0));
+                    if (mdcAlarmInfo != null && !mdcAlarmInfo.isEmpty()) {
+                        mdcAlarmAnalyzeDto.setAlarmContent(mdcAlarmInfo.get(0).getAlarmContent());
+                    }
                     map.put(mdcEquipmentRunningSection.getAlarm(), mdcAlarmAnalyzeDto);
                 }
             }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java
index 1d64041..f97637b 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java
@@ -49,6 +49,9 @@
     @Resource
     private IEquipmentRunningTraceService equipmentRunningTraceService;
 
+    @Resource
+    private IMdcAlarmInfoService mdcAlarmInfoService;
+
     @Override
     public List<MdcEquipmentRunningSectionDto> logList(MdcEquipmentRunningSectionVo equipmentRunningSectionVo) {
 
@@ -60,9 +63,9 @@
         List<MdcEquipmentRunningSection> running = loadEquipmentRunningTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr());
         //鏌ヨ鎶ヨ鏁版嵁
         List<MdcEquipmentRunningSection> errs = loadEquipmentErrorTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr());
+        Equipment equip = equipmentService.getOne(new LambdaQueryWrapper<Equipment>().eq(Equipment::getEquipmentid, equipmentRunningSectionVo.getEquipmentId()));
         if (!running.isEmpty()) {
             MdcEquipmentRunningSectionDto dto;
-            Equipment equip = equipmentService.getOne(new LambdaQueryWrapper<Equipment>().eq(Equipment::getEquipmentid, equipmentRunningSectionVo.getEquipmentId()));
             String tableName = "";
             Boolean isTableExist = false;
             if (equip != null) {
@@ -88,21 +91,54 @@
             for (MdcEquipmentRunningSection entity : errs) {
                 dto = new MdcEquipmentRunningSectionDto();
                 BeanUtils.copyProperties(entity, dto);
-                Set<TmpEquipmentAlarm> set = entity.getTmpEquipmentAlarmSet();
-                if (entity.getStatus() == 22 && set != null && !set.isEmpty()) {
-                    Iterator<TmpEquipmentAlarm> iterator = entity.getTmpEquipmentAlarmSet().iterator();
-                    //鑾峰彇鎶ヨ缂栧彿鐩稿悓鐨勬姤璀︿俊鎭�
-                    while (iterator.hasNext()) {
-                        TmpEquipmentAlarm next = iterator.next();
-                        if (StringUtils.isNotBlank(next.getAlarmNo()) && next.getAlarmNo().equals(entity.getStatus())) {
-                            dto.setAlarmContent(next.getAlarmContent());
+                if (entity.getStatus() == 22) {
+                    if (equip != null) {
+                        List<MdcAlarmInfo> mdcAlarmInfo = mdcAlarmInfoService.list(new LambdaQueryWrapper<MdcAlarmInfo>().eq(MdcAlarmInfo::getDriveType, equip.getDrivetype()).eq(MdcAlarmInfo::getAlarmCode, entity.getAlarm()).eq(MdcAlarmInfo::getIsUse, 0));
+                        if (mdcAlarmInfo != null && !mdcAlarmInfo.isEmpty()) {
+                            dto.setAlarmContent(mdcAlarmInfo.get(0).getAlarmContent());
                         }
                     }
                 }
+//                Set<TmpEquipmentAlarm> set = entity.getTmpEquipmentAlarmSet();
+//                if (entity.getStatus() == 22 && set != null && !set.isEmpty()) {
+//                    Iterator<TmpEquipmentAlarm> iterator = entity.getTmpEquipmentAlarmSet().iterator();
+//                    //鑾峰彇鎶ヨ缂栧彿鐩稿悓鐨勬姤璀︿俊鎭�
+//                    while (iterator.hasNext()) {
+//                        TmpEquipmentAlarm next = iterator.next();
+//                        if (StringUtils.isNotBlank(next.getAlarmNo()) && next.getAlarmNo().equals(entity.getStatus())) {
+//                            dto.setAlarmContent(next.getAlarmContent());
+//                        }
+//                    }
+//                }
                 dtos.add(dto);
             }
         }
-        return dtos;
+
+        List<MdcEquipmentRunningSectionDto> result = new ArrayList<>();
+        //鍚堝苟鐩稿悓鐘舵�佹暟鎹�
+        for (int i = 0; i < dtos.size() - 1; i++) {
+            MdcEquipmentRunningSectionDto mdcEquipmentRunningSectionDto = dtos.get(i);
+            MdcEquipmentRunningSectionDto next = dtos.get(i + 1);
+            if (mdcEquipmentRunningSectionDto.getStatus().equals(next.getStatus()) && mdcEquipmentRunningSectionDto.getEndTime().equals(next.getStartTime())) {
+                MdcEquipmentRunningSectionDto equipmentRunningSectionDto = new MdcEquipmentRunningSectionDto();
+                BeanUtils.copyProperties(mdcEquipmentRunningSectionDto, equipmentRunningSectionDto);
+                equipmentRunningSectionDto.setEndTime(next.getEndTime());
+                equipmentRunningSectionDto.setDuration(mdcEquipmentRunningSectionDto.getDuration() + next.getDuration());
+                result.add(equipmentRunningSectionDto);
+                i++;
+            } else {
+                result.add(mdcEquipmentRunningSectionDto);
+            }
+        }
+        if (dtos.size() > 1) {
+            MdcEquipmentRunningSectionDto a = dtos.get(dtos.size() - 2);
+            MdcEquipmentRunningSectionDto b = dtos.get(dtos.size() - 1);
+            if (!a.getStatus().equals(b.getStatus()) && a.getEndTime().equals(b.getStartTime())) {
+                result.add(dtos.get(dtos.size() - 1));
+            }
+        }
+
+        return result;
     }
 
     /**
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
index 5eb7085..1e21981 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
@@ -9,7 +9,6 @@
 import org.jeecg.common.api.dto.message.MessageDTO;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.system.api.ISysBaseAPI;
-import org.jeecg.common.system.vo.DictModel;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.mdc.dto.MdcEquDepDto;
 import org.jeecg.modules.mdc.dto.MdcEquProDto;
@@ -22,17 +21,17 @@
 import org.jeecg.modules.mdc.util.DateUtils;
 import org.jeecg.modules.mdc.util.FindsEquipmentDepartUtil;
 import org.jeecg.modules.mdc.util.FindsEquipmentProductionUtil;
-import org.jeecg.modules.mdc.vo.MdcEquipmentDepVo;
-import org.jeecg.modules.mdc.vo.MdcEquipmentProVo;
-import org.jeecg.modules.mdc.vo.MdcEquipmentVo;
-import org.jeecg.modules.mdc.vo.WorkshopEquipmentVo;
+import org.jeecg.modules.mdc.vo.*;
 import org.jeecg.modules.system.entity.MdcEquipmentDepart;
 import org.jeecg.modules.system.entity.MdcProduction;
 import org.jeecg.modules.system.entity.MdcProductionEquipment;
 import org.jeecg.modules.system.entity.SysDepart;
 import org.jeecg.modules.system.mapper.MdcEquipmentDepartMapper;
 import org.jeecg.modules.system.mapper.MdcProductionEquipmentMapper;
-import org.jeecg.modules.system.service.*;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.jeecg.modules.system.service.IMdcUserProductionService;
+import org.jeecg.modules.system.service.ISysDepartService;
+import org.jeecg.modules.system.service.ISysUserDepartService;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -82,10 +81,16 @@
     private IEquipmentBaseInfoService equipmentBaseInfoService;
 
     @Resource
-    private ISysDictService sysDictService;
+    private ISysBaseAPI sysBaseApi;
 
     @Resource
-    private ISysBaseAPI sysBaseApi;
+    private IMdcAlarmInfoService mdcAlarmInfoService;
+
+    @Resource
+    private IMdcEquipmentThresholdService mdcEquipmentThresholdService;
+
+    @Resource
+    private IMdcOverrunAlarmService mdcOverrunAlarmService;
 
 
     @Override
@@ -369,7 +374,8 @@
         mdcEquipmentDto.setDataFlag(Integer.parseInt(CommonConstant.STATUS_1));
         ControlSystem controlSystem = controlSystemService.getByDriveType(mdcEquipmentDto.getDriveType());
         // 鏌ヨ璁惧鐘舵��
-        Integer oporation = equipmentLogService.selectEquipmentOporation(mdcEquipment.getEquipmentId());
+        EquipmentLog equipmentLog = equipmentLogService.selectEquipmentOporation(mdcEquipment.getEquipmentId());
+        Integer oporation = equipmentLog.getOporation();
 
         if (controlSystem != null) {
             //鑾峰彇宸ヤ綔鏁版嵁骞跺垵濮嬪寲
@@ -439,6 +445,21 @@
                                 value = String.valueOf(mdcTorqueConfig.getTorqueValue());
                             } else {
                                 value = "0";
+                            }
+                        } else if ("alarm".equals(englishName)) {
+                            if (oporation == 22) {
+                                value = equipmentLog.getAlarm();
+                            } else {
+                                value = "鏃�";
+                            }
+                        } else if ("alarmContent".equals(englishName)) {
+                            if (oporation == 22) {
+                                List<MdcAlarmInfo> mdcAlarmInfo = mdcAlarmInfoService.list(new LambdaQueryWrapper<MdcAlarmInfo>().eq(MdcAlarmInfo::getDriveType, mdcEquipment.getDriveType()).eq(MdcAlarmInfo::getAlarmCode, equipmentLog.getAlarm()).eq(MdcAlarmInfo::getIsUse, 0));
+                                if (mdcAlarmInfo != null && !mdcAlarmInfo.isEmpty()) {
+                                    value = mdcAlarmInfo.get(0).getAlarmContent();
+                                }
+                            } else {
+                                value = "鏃�";
                             }
                         } else {
                             value = result == null ? null : result.toString();
@@ -707,60 +728,69 @@
 
     @Override
     public IPage<MdcEquipment> pageList(Page<MdcEquipment> page, MdcEquipmentVo mdcEquipment, HttpServletRequest req) {
+        if (StringUtils.isNotBlank(mdcEquipment.getProductionName())) {
+            // 閫掑綊鏌ヨ鎵�鏈夊瓙鑺傜偣
+            List<String> productionIds = mdcProductionService.recursionChildren(mdcEquipment.getProductionName());
+            mdcEquipment.setProductionIds(productionIds);
+        }
         return this.baseMapper.pageList(page, mdcEquipment);
     }
 
     /**
-     * 鐩戞帶璁惧杞�熶换鍔�
+     * 鐩戞帶璁惧杩愯鍙傛暟浠诲姟
      */
     @Override
     public void monitoringSpeedProcess() {
-        List<MdcEquipment> equipmentList = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getDriveType, "FANUC"));
+//        List<MdcEquipment> equipmentList = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getDriveType, "FANUC"));
+        List<MdcEquipment> equipmentList = super.list();
         //List<MdcEquipment> equipmentList = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, "2140198"));
-        // 鑾峰彇瀛楀吀鏁版嵁
-        List<DictModel> dictModelList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_OPERATING_SPEED_RANGE);
-        Integer range = 0;
-        if (dictModelList != null && !dictModelList.isEmpty()) {
-            range = Integer.valueOf(dictModelList.get(0).getValue());
-        }
+
         for (MdcEquipment mdcEquipment : equipmentList) {
-            String saveTableName = mdcEquipment.getSaveTableName();
-            //鏌ヨ鍗曡〃鏁版嵁
-            MdcEquipmentDto mdcEquipmentDto = this.baseMapper.getWorkLineLast(saveTableName);
-            if (mdcEquipmentDto != null) {
-                MessageDTO messageDTO = new MessageDTO();
-                messageDTO.setTitle("璁惧杩愯杞�熸姤璀︼紒");
-                messageDTO.setCategory("棰勮娑堟伅");
-                messageDTO.setFromUser("admin");
-                messageDTO.setToUser("admin");
-                Integer spindlespeed = Integer.valueOf(mdcEquipmentDto.getSpindlespeed());
-                Integer actualspindlespeed = Integer.valueOf(mdcEquipmentDto.getActualspindlespeed());
-                if (range.equals(0)) {
-                    if (spindlespeed > actualspindlespeed) {
-                        // 瀹為檯鍊煎ぇ浜庤瀹氬��   楂�
-                        messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囪繍琛岃浆閫熼珮鎶ヨ锛�");
-                        sysBaseApi.sendSysAnnouncement(messageDTO);
-                    } else if (spindlespeed < actualspindlespeed) {
-                        // 瀹為檯鍊煎皬浜庤瀹氬��   浣�
-                        messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囪繍琛岃浆閫熶綆鎶ヨ锛�");
-                        sysBaseApi.sendSysAnnouncement(messageDTO);
-                    }
-                } else {
-                    int max = actualspindlespeed + actualspindlespeed * (range / 100);
-                    int min = actualspindlespeed - actualspindlespeed * (range / 100);
-                    if (spindlespeed > max || spindlespeed < min) {
-                        if (spindlespeed > actualspindlespeed) {
-                            // 瀹為檯鍊煎ぇ浜庤瀹氬��   楂�
-                            messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囪繍琛岃浆閫熼珮鎶ヨ锛�");
+            List<MdcEquipmentThreshold> mdcEquipmentThresholdList = mdcEquipmentThresholdService.list(new LambdaQueryWrapper<MdcEquipmentThreshold>().eq(MdcEquipmentThreshold::getControlSystemType, mdcEquipment.getDriveType()));
+            if (mdcEquipmentThresholdList != null && !mdcEquipmentThresholdList.isEmpty()) {
+                String saveTableName = mdcEquipment.getSaveTableName();
+                StringBuilder builder = new StringBuilder();
+                for (MdcEquipmentThreshold mdcEquipmentThreshold : mdcEquipmentThresholdList) {
+                    builder.append(",").append(mdcEquipmentThreshold.getEnglishName()).append(" as \"").append(mdcEquipmentThreshold.getEnglishName()).append("\"  ");
+                }
+                Map<String, Object> param = new HashMap<>();
+                param.put("columns", builder.toString());
+                param.put("tableName", saveTableName);
+                Map<String, Object> map = new HashMap<>();
+                try {
+                    map = this.baseMapper.getWorkLineLast(param);
+                } catch (Exception e) {
+                    log.error("鏌ヨ鍗曡〃鏁版嵁鍑哄樊锛�", e);
+                }
+                if (!map.isEmpty()) {
+                    for (MdcEquipmentThreshold mdcEquipmentThreshold : mdcEquipmentThresholdList) {
+                        Integer actualValue = Integer.valueOf(map.get(mdcEquipmentThreshold.getEnglishName()).toString());
+                        Integer max = mdcEquipmentThreshold.getMaxThreshold();
+                        Integer min = mdcEquipmentThreshold.getMinThreshold();
+                        MessageDTO messageDTO = new MessageDTO();
+                        messageDTO.setTitle("璁惧" + mdcEquipmentThreshold.getChineseName() + "鎶ヨ锛�");
+                        messageDTO.setCategory("棰勮娑堟伅");
+                        messageDTO.setFromUser("admin");
+                        messageDTO.setToUser("admin");
+                        MdcOverrunAlarm mdcOverrunAlarm = new MdcOverrunAlarm();
+                        mdcOverrunAlarm.setEquipmentId(mdcEquipment.getEquipmentId());
+                        mdcOverrunAlarm.setSetValue(min + "-" + max);
+                        mdcOverrunAlarm.setRealValue(actualValue.toString());
+                        if (actualValue > max) {
+                            // 楂�
+                            messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶�" + mdcEquipmentThreshold.getChineseName() + "楂樻姤璀︼紒");
                             sysBaseApi.sendSysAnnouncement(messageDTO);
-                        } else if (spindlespeed < actualspindlespeed) {
-                            // 瀹為檯鍊煎皬浜庤瀹氬��   浣�
-                            messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶囪繍琛岃浆閫熶綆鎶ヨ锛�");
+                            mdcOverrunAlarm.setAlarmContent(mdcEquipmentThreshold.getChineseName() + "楂樻姤璀�");
+                            mdcOverrunAlarmService.save(mdcOverrunAlarm);
+                        } else if (actualValue < min) {
+                            // 浣�
+                            messageDTO.setContent("璁惧缂栧彿涓� [" + mdcEquipment.getEquipmentId() + "] 鐨勮澶�" + mdcEquipmentThreshold.getChineseName() + "浣庢姤璀︼紒");
                             sysBaseApi.sendSysAnnouncement(messageDTO);
+                            mdcOverrunAlarm.setAlarmContent(mdcEquipmentThreshold.getChineseName() + "浣庢姤璀�");
+                            mdcOverrunAlarmService.save(mdcOverrunAlarm);
                         }
                     }
                 }
-
             }
         }
 
@@ -773,8 +803,121 @@
      * @return
      */
     @Override
-    public List<MdcEquipment> exportXlsList(MdcEquipment mdcEquipment) {
+    public List<MdcEquipment> exportXlsList(MdcEquipmentVo mdcEquipment) {
+        if (StringUtils.isNotBlank(mdcEquipment.getProductionName())) {
+            // 閫掑綊鏌ヨ鎵�鏈夊瓙鑺傜偣
+            List<String> productionIds = mdcProductionService.recursionChildren(mdcEquipment.getProductionName());
+            mdcEquipment.setProductionIds(productionIds);
+        }
         return this.baseMapper.exportXlsList(mdcEquipment);
     }
 
+    /**
+     * 閫氳繃杞﹂棿ids鑾峰彇璁惧鏍�
+     *
+     * @param ids
+     * @return
+     */
+    @Override
+    public List<MdcEquipmentTree> loadTreeListByProductionIds(String ids) {
+        List<String> productionIds = Arrays.asList(ids.split(","));
+        //鑾峰彇鎵�鏈変骇绾挎暟鎹�
+        List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()).orderByAsc(MdcProduction::getProductionOrder));
+        List<String> allProductionIds = new ArrayList<>();
+        //鎵惧埌鎵�鏈変骇绾縤d鐨勪笂绾d
+        if (!productionIds.isEmpty()) {
+            for (String productionId : productionIds) {
+                this.getAllProductionIds(productionList, productionId, allProductionIds);
+            }
+        }
+        //杩囨护浜х嚎鏁版嵁
+        List<MdcProduction> list = productionList.stream().filter((MdcProduction mdcProduction) -> allProductionIds.contains(mdcProduction.getId())).collect(Collectors.toList());
+        //缁勮浜х嚎璁惧鏍�
+        List<MdcEquipmentTree> treeList = FindsEquipmentProductionUtil.wrapEquipmentProductionTreeList(list);
+        //濉厖璁惧鏁版嵁
+        FillEquipmentByProduction(treeList);
+        return treeList;
+    }
+
+    /**
+     * 鏌ヨ鍗曡〃鏁版嵁
+     * @param tableName
+     * @return
+     */
+    @Override
+    public MdcEquipmentDto getWorkLineLast(String tableName) {
+        return this.baseMapper.findWorkLineLast(tableName);
+    }
+
+    /**
+     * 璁惧杩愯鐘舵�佺粺璁�
+     */
+    @Override
+    public List<MdcCommonVo> getEquipmentStatusStatistics(String userId, String key) {
+        List<MdcCommonVo> result = new ArrayList<>();
+        MdcCommonVo mdcCommonVo1 = new MdcCommonVo();
+        mdcCommonVo1.setName("鍏虫満");
+        mdcCommonVo1.setValue(0);
+        result.add(mdcCommonVo1);
+        MdcCommonVo mdcCommonVo2 = new MdcCommonVo();
+        mdcCommonVo2.setName("鎶ヨ");
+        mdcCommonVo2.setValue(0);
+        result.add(mdcCommonVo2);
+        MdcCommonVo mdcCommonVo3 = new MdcCommonVo();
+        mdcCommonVo3.setName("寰呮満");
+        mdcCommonVo3.setValue(0);
+        result.add(mdcCommonVo3);
+        MdcCommonVo mdcCommonVo4 = new MdcCommonVo();
+        mdcCommonVo4.setName("杩愯");
+        mdcCommonVo4.setValue(0);
+        result.add(mdcCommonVo4);
+        MdcEquipmentStatusVo mdcEquipmentStatusVo = new MdcEquipmentStatusVo();
+        List<String> equipmentIdList = this.getEquipmentIdsProduction(userId, key);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            return result;
+        }
+        List<EquipmentLog> logList = this.baseMapper.getEquipmentStatusList(equipmentIdList);
+        if (logList != null && !logList.isEmpty()) {
+            for (EquipmentLog equipmentLog : logList) {
+                if (equipmentLog.getOporation() != null) {
+                    switch (equipmentLog.getOporation()) {
+                        case 1:
+                        case 2:
+                            mdcEquipmentStatusVo.setWaitCount(mdcEquipmentStatusVo.getWaitCount() + 1);
+                            break;
+                        case 3:
+                            mdcEquipmentStatusVo.setRunCount(mdcEquipmentStatusVo.getRunCount() + 1);
+                            break;
+                        case 22:
+                            mdcEquipmentStatusVo.setAlarmCount(mdcEquipmentStatusVo.getAlarmCount() + 1);
+                            break;
+                        default:
+                            mdcEquipmentStatusVo.setCloseCount(mdcEquipmentStatusVo.getCloseCount() + 1);
+                            break;
+                    }
+                } else {
+                    mdcEquipmentStatusVo.setCloseCount(mdcEquipmentStatusVo.getCloseCount() + 1);
+                }
+            }
+        }
+        result.clear();
+        MdcCommonVo mdcCommonVo5 = new MdcCommonVo();
+        mdcCommonVo5.setName("鍏虫満");
+        mdcCommonVo5.setValue(mdcEquipmentStatusVo.getCloseCount());
+        result.add(mdcCommonVo5);
+        MdcCommonVo mdcCommonVo6 = new MdcCommonVo();
+        mdcCommonVo6.setName("鎶ヨ");
+        mdcCommonVo6.setValue(mdcEquipmentStatusVo.getAlarmCount());
+        result.add(mdcCommonVo6);
+        MdcCommonVo mdcCommonVo7 = new MdcCommonVo();
+        mdcCommonVo7.setName("寰呮満");
+        mdcCommonVo7.setValue(mdcEquipmentStatusVo.getWaitCount());
+        result.add(mdcCommonVo7);
+        MdcCommonVo mdcCommonVo8 = new MdcCommonVo();
+        mdcCommonVo8.setName("杩愯");
+        mdcCommonVo8.setValue(mdcEquipmentStatusVo.getRunCount());
+        result.add(mdcCommonVo8);
+        return result;
+    }
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentWorkLineServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentWorkLineServiceImpl.java
index fe773d0..0701d87 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentWorkLineServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentWorkLineServiceImpl.java
@@ -15,6 +15,7 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -111,6 +112,20 @@
             }
         }
         resultList = resultList.stream().sorted(Comparator.comparing(EquipmentMachingDto::getCollectTime)).collect(Collectors.toList());
+        for (MdcDriveTypeParamConfig mdcDriveTypeParamConfig : mdcDriveTypeParamConfigs) {
+            if ("spindleCurrent".equals(mdcDriveTypeParamConfig.getEnglishName())) {
+                for (EquipmentMachingDto equipmentMachingDto : resultList) {
+                    String devicePower = mdcEquipment.getDevicePower();
+                    if (StringUtils.isNotBlank(devicePower)) {
+                        devicePower = "2500";
+                    }
+                    String spindleload = equipmentMachingDto.getSpindleload();
+                    if (StringUtils.isNotBlank(spindleload)) {
+                        equipmentMachingDto.setSpindleCurrent(new BigDecimal(devicePower).divide(new BigDecimal("380"), 2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(spindleload)));
+                    }
+                }
+            }
+        }
         return resultList;
     }
 
@@ -157,35 +172,56 @@
             }
             for (int i = 1; i <= collentParams.size(); i++) {
                 try {
-                    switch (i) {
-                        case 1:
-                            ei.setDataLine1(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+                    switch (collentParams.get(i - 1).getEnglishName()) {
+                        case "spindlespeed":
+                            ei.setSpindlespeed(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
                             break;
-                        case 2:
-                            ei.setDataLine2(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+                        case "spindleload":
+                            ei.setSpindleload(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
                             break;
-                        case 3:
-                            ei.setDataLine3(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+                        case "spindlebeilv":
+                            ei.setSpindlebeilv(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
                             break;
-                        case 4:
-                            ei.setDataLine4(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+                        case "feedrate":
+                            ei.setFeedrate(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
                             break;
-                        case 5:
-                            ei.setDataLine5(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
-                            break;
-                        case 6:
-                            ei.setDataLine6(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
-                            break;
-                        case 7:
-                            ei.setDataLine7(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
-                            break;
-                        case 8:
-                            ei.setDataLine8(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+                        case "feedbeilv":
+                            ei.setFeedbeilv(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
                             break;
                     }
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
+//                try {
+//                    switch (i) {
+//                        case 1:
+//                            ei.setDataLine1(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+//                            break;
+//                        case 2:
+//                            ei.setDataLine2(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+//                            break;
+//                        case 3:
+//                            ei.setDataLine3(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+//                            break;
+//                        case 4:
+//                            ei.setDataLine4(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+//                            break;
+//                        case 5:
+//                            ei.setDataLine5(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+//                            break;
+//                        case 6:
+//                            ei.setDataLine6(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+//                            break;
+//                        case 7:
+//                            ei.setDataLine7(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+//                            break;
+//                        case 8:
+//                            ei.setDataLine8(map.get(collentParams.get(i - 1).getEnglishName()) == null ? null : map.get(collentParams.get(i - 1).getEnglishName()).toString());
+//                            break;
+//                    }
+//                } catch (Exception e) {
+//                    e.printStackTrace();
+//                }
             }
             dto.add(ei);
         }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcMessageApprovalServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcMessageApprovalServiceImpl.java
new file mode 100644
index 0000000..657f19f
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcMessageApprovalServiceImpl.java
@@ -0,0 +1,43 @@
+package org.jeecg.modules.mdc.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.mdc.constant.MdcConstant;
+import org.jeecg.modules.mdc.entity.MdcMessageApproval;
+import org.jeecg.modules.mdc.mapper.MdcMessageApprovalMapper;
+import org.jeecg.modules.mdc.service.IMdcMessageApprovalService;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @Description: mdc娑堟伅纭琛�
+ * @Author: Lius
+ * @Date: 2024-03-06
+ * @Version: V1.0
+ */
+@Service
+public class MdcMessageApprovalServiceImpl extends ServiceImpl<MdcMessageApprovalMapper, MdcMessageApproval> implements IMdcMessageApprovalService {
+
+    /**
+     * 鍒〃鏌ヨ
+     */
+    @Override
+    public IPage<MdcMessageApproval> pageList(String userId, Page<MdcMessageApproval> page, MdcMessageApproval mdcMessageApproval, HttpServletRequest req) {
+        IPage<MdcMessageApproval> pageList = this.baseMapper.pageList(userId, page, mdcMessageApproval);
+        List<MdcMessageApproval> mdcMessageApprovalList = pageList.getRecords();
+        if (mdcMessageApprovalList != null && !mdcMessageApprovalList.isEmpty()) {
+            pageList.getRecords().forEach(item -> {
+                if (item.getSenderIds().contains(userId) && (item.getMsgStatus().equals(MdcConstant.MSG_STATUS_0) || item.getMsgStatus().equals(MdcConstant.MSG_STATUS_3))) {
+                    item.setHasProcess(true);
+                }
+                if (item.getApproverIds().contains(userId) && item.getMsgStatus().equals(MdcConstant.MSG_STATUS_1)) {
+                    item.setHasConfirm(true);
+                }
+            });
+        }
+        return pageList;
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverrunAlarmServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverrunAlarmServiceImpl.java
new file mode 100644
index 0000000..3e46eff
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverrunAlarmServiceImpl.java
@@ -0,0 +1,28 @@
+package org.jeecg.modules.mdc.service.impl;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.entity.MdcOverrunAlarm;
+import org.jeecg.modules.mdc.mapper.MdcOverrunAlarmMapper;
+import org.jeecg.modules.mdc.service.IMdcOverrunAlarmService;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Description: mdc瓒呴檺鎶ヨ
+ * @Author: Lius
+ * @Date: 2024-03-01
+ * @Version: V1.0
+ */
+@Service
+public class MdcOverrunAlarmServiceImpl extends ServiceImpl<MdcOverrunAlarmMapper, MdcOverrunAlarm> implements IMdcOverrunAlarmService {
+
+    @Override
+    public IPage<MdcOverrunAlarm> pageList(Page<MdcOverrunAlarm> page, MdcEquipment mdcEquipment, HttpServletRequest req) {
+        return this.baseMapper.pageList(page, mdcEquipment);
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcCommonVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcCommonVo.java
new file mode 100644
index 0000000..d37ef5f
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcCommonVo.java
@@ -0,0 +1,13 @@
+package org.jeecg.modules.mdc.vo;
+
+import lombok.Data;
+
+/**
+ * @author Lius
+ * @date 2024/3/13 18:02
+ */
+@Data
+public class MdcCommonVo {
+    private Integer value;
+    private String name;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportQueryVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportQueryVo.java
index e6ffd89..04db1e5 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportQueryVo.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportQueryVo.java
@@ -46,4 +46,9 @@
      */
     private String equipmentType;
 
+    /**
+     * 椹卞姩绫诲瀷
+     */
+    private String driveType;
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportShiftQueryVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportShiftQueryVo.java
index 221e89e..3e55858 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportShiftQueryVo.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportShiftQueryVo.java
@@ -49,4 +49,9 @@
      */
     private String equipmentType;
 
+    /**
+     * 椹卞姩绫诲瀷
+     */
+    private String driveType;
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEquipmentStatusVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEquipmentStatusVo.java
new file mode 100644
index 0000000..4232a78
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEquipmentStatusVo.java
@@ -0,0 +1,27 @@
+package org.jeecg.modules.mdc.vo;
+
+import lombok.Data;
+
+/**
+ * @author Lius
+ * @date 2024/3/13 15:43
+ */
+@Data
+public class MdcEquipmentStatusVo {
+    /**
+     * 杩愯
+     */
+    private Integer runCount = 0;
+    /**
+     * 鍏虫満
+     */
+    private Integer closeCount = 0;
+    /**
+     * 鎶ヨ
+     */
+    private Integer alarmCount = 0;
+    /**
+     * 寰呮満
+     */
+    private Integer waitCount = 0;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEquipmentVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEquipmentVo.java
index 19ec3ef..20397fb 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEquipmentVo.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEquipmentVo.java
@@ -2,6 +2,8 @@
 
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author: LiuS
  * @create: 2023-04-11 10:34
@@ -16,4 +18,5 @@
     private String equipmentType;
     private String driveType;
     private String productionName;
+    private List<String> productionIds;
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcProduction.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcProduction.java
index f23d1f6..5d36ad0 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcProduction.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/MdcProduction.java
@@ -64,6 +64,11 @@
     @ApiModelProperty(value = "浜х嚎缂栫爜")
     private String orgCode;
     /**
+     * 浜х嚎缂栫爜
+     */
+    @ApiModelProperty(value = "杞﹂棿缂栫爜")
+    private String productionCode;
+    /**
      * 鍦板潃
      */
     @Excel(name = "鍦板潃", width = 15)
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java
index 5d15bac..99fd90f 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java
@@ -169,6 +169,12 @@
     private Integer userIdentity;
 
     /**
+     * 鐢ㄦ埛绫诲瀷锛�1 鏅�氭垚鍛� 2 宸ユ 3 杞﹂棿 4 鍏徃锛�
+     */
+    @Excel(name="锛�1鏅�氭垚鍛� 2宸ユ 3杞﹂棿 4鍏徃锛�",width = 15)
+    private Integer userType;
+
+    /**
      * 璐熻矗閮ㄩ棬
      */
     @Excel(name="璐熻矗閮ㄩ棬",width = 15,dictTable ="sys_depart",dicText = "depart_name",dicCode = "id")
@@ -210,5 +216,7 @@
      */
     private Date passwordTime;
 
+    private String equipmentIds;
+
 
 }
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 d6313fc..0b9f429 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
@@ -21,4 +21,17 @@
      */
     @Select("SELECT * FROM mdc_production where del_flag ='0' AND parent_id = #{parentId,jdbcType=VARCHAR}")
     List<MdcProduction> queryProdByPid(@Param("parentId") String parentId);
+
+    /**
+     * 閫掑綊鏌ヨ鎵�鏈夊瓙鑺傜偣
+     */
+    List<String> recursionChildren(@Param("productionId") String productionId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鍜岃溅闂磇d鑾峰彇鐢ㄦ埛鎷ユ湁鐨勮溅闂磇d
+     * @param userId
+     * @param productionId
+     * @return
+     */
+    String findFirstProduction(@Param("userId") String userId, @Param("productionId") String productionId);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java
index 4c2aad7..2ad2698 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java
@@ -1,13 +1,13 @@
 package org.jeecg.modules.system.mapper;
 
-import java.util.List;
-
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.system.entity.SysAnnouncement;
 import org.jeecg.modules.system.entity.SysAnnouncementSend;
 import org.jeecg.modules.system.model.AnnouncementSendModel;
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import java.util.List;
 
 /**
  * @Description: 鐢ㄦ埛閫氬憡闃呰鏍囪琛�
@@ -48,4 +48,9 @@
 	 * 鑾峰彇棣栭〉娑堟伅
 	 */
 	List<SysAnnouncementSend> getPrimaryInfo(@Param("userId") String userId,@Param("msgCategoryList")List<String> msgCategoryList);
+
+	/**
+	 * 鏍规嵁娑堟伅鍐呭鏌ヨ娑堟伅閫氱煡
+	 */
+    SysAnnouncement findLastMessage(@Param("messageContent") String messageContent);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
index cb3734c..7966336 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
@@ -178,4 +178,9 @@
 	 * 鏍规嵁瑙掕壊缂栫爜鏌ヨ鐢ㄦ埛id闆嗗悎
 	 */
 	List<String> getUserByRoleCode(@Param("roleCode") String roleCode);
+
+	/**
+	 * 鏍规嵁瑙掕壊缂栫爜鍜岃澶囩紪鍙锋煡璇㈢敤鎴�
+	 */
+    List<SysUser> getEquipmentAdmin(@Param("roleCode") String roleCode, @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 ce695b0..e1cad5c 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
@@ -2,4 +2,28 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.system.mapper.MdcProductionMapper">
 
+    <!--閫掑綊鏌ヨ鎵�鏈夊瓙鑺傜偣-->
+    <select id="recursionChildren" resultType="java.lang.String">
+        WITH temp ( id ) AS (
+            SELECT
+                id
+            FROM
+                mdc_production
+            WHERE
+                id = #{ productionId } UNION ALL
+            SELECT
+                a.id
+            FROM
+                mdc_production a
+                    INNER JOIN temp ON a.parent_id = temp.id
+        ) SELECT
+            *
+        FROM
+            temp
+    </select>
+
+    <!--鏍规嵁鐢ㄦ埛id鍜岃溅闂磇d鑾峰彇鐢ㄦ埛鎷ユ湁鐨勮溅闂磇d-->
+    <select id="findFirstProduction" resultType="java.lang.String">
+        SELECT TOP 1 id FROM mdc_user_production t1 LEFT JOIN mdc_production t2 ON t1.pro_id = t2.id WHERE t1.user_id = #{ userId } AND t2.parent_id = #{productionId}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementSendMapper.xml b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementSendMapper.xml
index 532dd8f..df2baa5 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementSendMapper.xml
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementSendMapper.xml
@@ -125,4 +125,8 @@
 			</if>
 	</select>
 
+    <select id="findLastMessage" resultType="org.jeecg.modules.system.entity.SysAnnouncement">
+		SELECT TOP 1 * FROM sys_announcement WHERE msg_content = #{messageContent} ORDER BY create_time DESC;
+	</select>
+
 </mapper>
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
index feef5b8..3e751a9 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
@@ -206,4 +206,15 @@
 		WHERE
 			sr.role_code = #{ roleCode }
 	</select>
+	<!--鏍规嵁瑙掕壊缂栫爜鍜岃澶囩紪鍙锋煡璇㈢敤鎴�-->
+    <select id="getEquipmentAdmin" resultType="org.jeecg.modules.system.entity.SysUser">
+		SELECT
+			t1.*
+		FROM
+			sys_user t1
+				LEFT JOIN sys_user_role t2 ON t1.id = t2.user_id
+				LEFT JOIN sys_role t3 ON t2.role_id = t3.id
+		WHERE
+			t3.role_code = #{roleCode} AND equipment_ids LIKE concat(concat('%',#{equipmentId}),'%')
+	</select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/MdcProductionTreeModel.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/MdcProductionTreeModel.java
index 3fc3399..c7f84f5 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/MdcProductionTreeModel.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/MdcProductionTreeModel.java
@@ -57,6 +57,8 @@
 
     private String orgCode;
 
+    private String productionCode;
+
     private String address;
 
     private String memo;
@@ -101,6 +103,7 @@
         this.description = mdcProduction.getDescription();
         this.orgType = mdcProduction.getOrgType();
         this.orgCode = mdcProduction.getOrgCode();
+        this.productionCode = mdcProduction.getProductionCode();
         this.address = mdcProduction.getAddress();
         this.memo = mdcProduction.getMemo();
         this.status = mdcProduction.getStatus();
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 e2f6d55..8dd86b9 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
@@ -64,4 +64,18 @@
      * 鏍规嵁鐢ㄦ埛id鑾峰彇浜х嚎涓嬫媺鏍戦�夐」
      */
     List<ProductionIdModel> loadProductionTreeOptions(String userId);
+
+    /**
+     * 閫掑綊鏌ヨ鎵�鏈夊瓙鑺傜偣
+     */
+    List<String> recursionChildren(String productionId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鍜岃溅闂磇d鑾峰彇鐢ㄦ埛鎷ユ湁鐨勮溅闂磇d
+     * @param userId
+     * @param productionId
+     * @return
+     */
+    String findFirstProduction(String userId, String productionId);
+
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java
index a9314bb..d08dfaf 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java
@@ -67,4 +67,8 @@
     void jobSendMessage(String jobDescription, String exceptionDetail);
 
 
+    /**
+     * 鏍规嵁娑堟伅鍐呭鏌ヨ娑堟伅閫氱煡鏃堕棿
+     */
+    SysAnnouncement findLastMessage(String messageContent);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
index 0a4567f..751395e 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
@@ -318,4 +318,6 @@
 	public List<SysUser> getAllUsersByRoleId(String roleId);
 
 	List<String> getUserByRoleCode(String roleCode);
+
+	List<SysUser> getEquipmentAdmin(String roleCode, 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 0e8f025..d95c890 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
@@ -217,6 +217,25 @@
     }
 
     /**
+     * 閫掑綊鏌ヨ鎵�鏈夊瓙鑺傜偣id
+     */
+    @Override
+    public List<String> recursionChildren(String productionId) {
+        return this.baseMapper.recursionChildren(productionId);
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鍜岃溅闂磇d鑾峰彇鐢ㄦ埛鎷ユ湁鐨勮溅闂磇d
+     * @param userId
+     * @param productionId
+     * @return
+     */
+    @Override
+    public String findFirstProduction(String userId, String productionId) {
+        return this.baseMapper.findFirstProduction(userId, productionId);
+    }
+
+    /**
      * delete 鏂规硶璋冪敤 閫掑綊鏌ユ壘瀛愰泦id
      */
     private void checkChildrenExists(String id, List<String> idList) {
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java
index 783aa0c..427d0b4 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java
@@ -251,4 +251,12 @@
 
 	}
 
+	/**
+	 * 鏍规嵁娑堟伅鍐呭鏌ヨ娑堟伅閫氱煡
+	 */
+	@Override
+	public SysAnnouncement findLastMessage(String messageContent) {
+		return sysAnnouncementSendMapper.findLastMessage(messageContent);
+	}
+
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
index 4decd8a..106de85 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -705,4 +705,12 @@
 	public List<String> getUserByRoleCode(String roleCode) {
 		return this.baseMapper.getUserByRoleCode(roleCode);
 	}
+
+	/**
+	 * 鏍规嵁瑙掕壊缂栫爜鍜岃澶囩紪鍙锋煡璇㈢敤鎴�
+	 */
+	@Override
+	public List<SysUser> getEquipmentAdmin(String roleCode, String equipmentId) {
+		return this.baseMapper.getEquipmentAdmin(roleCode, equipmentId);
+	}
 }

--
Gitblit v1.9.3