From 4337640b7ab86136baed2fd6aa959e4828a75cea Mon Sep 17 00:00:00 2001
From: Lius <Lius2225@163.com>
Date: 星期四, 07 十二月 2023 17:33:51 +0800
Subject: [PATCH] 计算加工工件个数算法和密码安全策略

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentOverFlagMapper.java                        |   15 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentWorkLineServiceImpl.java                |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml                             |    4 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java    |   39 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOverFlagServiceImpl.java             |   19 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcWorkshopInfoController.java                     |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcProcessCountVo.java                                     |   16 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcProcessCount.java                                   |   84 +++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcProcessCountController.java                     |   45 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java                        |    1 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java               |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDeviceCalendarVo.java                                   |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOverFlag.java                              |   47 +
 lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java                                   |   49 ++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java       |   42 +
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java         |  107 +++-
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IProcessCountService.java                             |   17 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentLogServiceImpl.java                     |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentWorkLineService.java                        |   16 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentLogMapper.xml                             |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java              |   48 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOverFlagMapper.xml                     |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java                     |  317 +++++++++++++
 lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java                                         |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentLogService.java                             |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcProcessCountMapper.java                             |   13 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningProcessCountJob.java                               |   63 ++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcTorqueConfigServiceImpl.java                  |    6 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java                  |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentWorklineMapper.xml                        |    8 
 lxzn-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java                                       |   17 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDeviceCalendarMapper.xml                        |    9 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java                     |  128 +---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcProcessCountMapper.xml                          |    8 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcTorqueConfigMapper.java                             |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java                |   21 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportQueryVo.java                            |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentWorklineMapper.java                           |    7 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java       |   14 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOverFlagService.java                     |   15 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java |    1 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcEfficiencyReportShiftQueryVo.java                       |    4 
 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                     |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDeviceCalendarMapper.java                           |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcTorqueConfigMapper.xml                          |   11 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOverFlagController.java                |  154 ++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml               |   14 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java                             |    1 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml                      |    9 
 50 files changed, 1,269 insertions(+), 167 deletions(-)

diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
index 53ce0fd..af37a4b 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
@@ -91,6 +91,10 @@
     String PREFIX_USER_TOKEN = "prefix_user_token_";
 //    /** Token缂撳瓨鏃堕棿锛�3600绉掑嵆涓�灏忔椂 */
 //    int  TOKEN_EXPIRE_TIME  = 3600;
+    /**
+     * Token缂撳瓨鏃堕棿(灏忔椂)
+     */
+    Integer TOKEN_EXPIRE_TIME  = 1;
 
     /**
      * 鐧诲綍浜岀淮鐮�
@@ -523,4 +527,49 @@
      */
     String JOB_SEND_MSG = "job_fail_send_msg_role";
 
+    /**
+     * 榛樿瀵嗙爜鏈�澶у皾璇曟鏁�
+     */
+    //Integer MAX_ATTEMPTS = 3;
+
+    /**
+     * 榛樿鐢ㄦ埛閿佸畾鏃堕暱(鍒嗛挓)
+     */
+    //Integer USER_FREEZE_TIME = 5;
+
+    /**
+     * 瀵嗙爜鏈�澶у皾璇曟鏁扮殑瀛楀吀缂栧彿
+     */
+    String DICT_MAX_ATTEMPTS = "login_max_attempts";
+
+    /**
+     * 鐢ㄦ埛鐧诲綍澶辫触閿佸畾鏃堕暱瀛楀吀缂栧彿
+     */
+    String DICT_USER_FREEZE = "user_freeze_time";
+
+    /**
+     * redis鐧诲綍娆℃暟key
+     */
+    String PREFIX_LOGIN_COUNT = "prefix_login_count_";
+
+    /**
+     * token缂撳瓨鏃堕棿瀛楀吀缂栧彿
+     */
+    String DICT_TOKEN_EXPIRE_TIME = "token_expire_time";
+
+    /**
+     * 榛樿鐢ㄦ埛瀵嗙爜鏇存敼鍛ㄦ湡(澶�)
+     */
+    //Integer PASSWORD_EXPIRATION_PERIOD = 90;
+
+    /**
+     * 鐢ㄦ埛瀵嗙爜鏇存敼鍛ㄦ湡瀛楀吀缂栧彿
+     */
+    String DICT_PASSWORD_EXPIRATION = "password_expiration_period";
+
+    /**
+     * 鐢ㄦ埛棣栨鐧诲綍寮哄埗鏇存敼瀛楀吀缂栧彿
+     */
+    String DICT_USER_FIRST_LOGIN = "user_first_login";
+
 }
diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java b/lxzn-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java
index 4c82608..43599e8 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java
@@ -7,15 +7,6 @@
 import com.auth0.jwt.interfaces.DecodedJWT;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Joiner;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Date;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
@@ -28,6 +19,14 @@
 import org.jeecg.common.util.SpringContextUtils;
 import org.jeecg.common.util.oConvertUtils;
 
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+
 /**
  * @Author Scott
  * @Date 2018-07-12 14:23
diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
index c5c36a4..1bb9b57 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@@ -20,7 +20,6 @@
 import org.jeecg.config.shiro.filters.JwtFilter;
 import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.DependsOn;
@@ -94,6 +93,7 @@
         filterChainDefinitionMap.put("/sys/common/static/**", "anon");//鍥剧墖棰勮 &涓嬭浇鏂囦欢涓嶉檺鍒秚oken
         filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");//pdf棰勮
         filterChainDefinitionMap.put("/generic/**", "anon");//pdf棰勮闇�瑕佹枃浠�
+        filterChainDefinitionMap.put("/sys/user/updatePassword", "anon");//棣栭〉鐢ㄦ埛淇敼瀵嗙爜
 
         filterChainDefinitionMap.put("/sys/getLoginQrcode/**", "anon"); //鐧诲綍浜岀淮鐮�
         filterChainDefinitionMap.put("/sys/getQrcodeToken/**", "anon"); //鐩戝惉鎵爜
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOverFlagController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOverFlagController.java
new file mode 100644
index 0000000..9e914b1
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOverFlagController.java
@@ -0,0 +1,154 @@
+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.MdcEquipmentOverFlag;
+import org.jeecg.modules.mdc.service.IMdcEquipmentOverFlagService;
+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: 璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�
+ * @Author: Lius
+ * @Date: 2023-12-05
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�")
+@RestController
+@RequestMapping("/mdc/mdcEquipmentOverFlag")
+public class MdcEquipmentOverFlagController extends JeecgController<MdcEquipmentOverFlag, IMdcEquipmentOverFlagService> {
+
+    @Resource
+    private IMdcEquipmentOverFlagService mdcEquipmentOverFlagService;
+
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param mdcEquipmentOverFlag
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-鍒嗛〉鍒楄〃鏌ヨ")
+    @ApiOperation(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-鍒嗛〉鍒楄〃鏌ヨ", notes = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-鍒嗛〉鍒楄〃鏌ヨ")
+    @GetMapping(value = "/list")
+    public Result<?> queryPageList(MdcEquipmentOverFlag mdcEquipmentOverFlag,
+                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                   HttpServletRequest req) {
+        QueryWrapper<MdcEquipmentOverFlag> queryWrapper = QueryGenerator.initQueryWrapper(mdcEquipmentOverFlag, req.getParameterMap());
+        Page<MdcEquipmentOverFlag> page = new Page<MdcEquipmentOverFlag>(pageNo, pageSize);
+        IPage<MdcEquipmentOverFlag> pageList = mdcEquipmentOverFlagService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 娣诲姞
+     *
+     * @param mdcEquipmentOverFlag
+     * @return
+     */
+    @AutoLog(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-娣诲姞")
+    @ApiOperation(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-娣诲姞", notes = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-娣诲姞")
+    @PostMapping(value = "/add")
+    public Result<?> add(@RequestBody MdcEquipmentOverFlag mdcEquipmentOverFlag) {
+        mdcEquipmentOverFlagService.save(mdcEquipmentOverFlag);
+        return Result.OK("娣诲姞鎴愬姛锛�");
+    }
+
+    /**
+     * 缂栬緫
+     *
+     * @param mdcEquipmentOverFlag
+     * @return
+     */
+    @AutoLog(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-缂栬緫")
+    @ApiOperation(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-缂栬緫", notes = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-缂栬緫")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<?> edit(@RequestBody MdcEquipmentOverFlag mdcEquipmentOverFlag) {
+        mdcEquipmentOverFlagService.updateById(mdcEquipmentOverFlag);
+        return Result.OK("缂栬緫鎴愬姛!");
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-閫氳繃id鍒犻櫎")
+    @ApiOperation(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-閫氳繃id鍒犻櫎", notes = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-閫氳繃id鍒犻櫎")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        mdcEquipmentOverFlagService.removeById(id);
+        return Result.OK("鍒犻櫎鎴愬姛!");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-鎵归噺鍒犻櫎")
+    @ApiOperation(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-鎵归噺鍒犻櫎", notes = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-鎵归噺鍒犻櫎")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.mdcEquipmentOverFlagService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("鎵归噺鍒犻櫎鎴愬姛锛�");
+    }
+
+    /**
+     * 閫氳繃id鏌ヨ
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-閫氳繃id鏌ヨ")
+    @ApiOperation(value = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-閫氳繃id鏌ヨ", notes = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�-閫氳繃id鏌ヨ")
+    @GetMapping(value = "/queryById")
+    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
+        MdcEquipmentOverFlag mdcEquipmentOverFlag = mdcEquipmentOverFlagService.getById(id);
+        return Result.OK(mdcEquipmentOverFlag);
+    }
+
+    /**
+     * 瀵煎嚭excel
+     *
+     * @param request
+     * @param mdcEquipmentOverFlag
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, MdcEquipmentOverFlag mdcEquipmentOverFlag) {
+        return super.exportXls(request, mdcEquipmentOverFlag, MdcEquipmentOverFlag.class, "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�");
+    }
+
+    /**
+     * 閫氳繃excel瀵煎叆鏁版嵁
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, MdcEquipmentOverFlag.class);
+    }
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcProcessCountController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcProcessCountController.java
new file mode 100644
index 0000000..29e9c9c
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcProcessCountController.java
@@ -0,0 +1,45 @@
+package org.jeecg.modules.mdc.controller;
+
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.modules.mdc.entity.MdcProcessCount;
+import org.jeecg.modules.mdc.service.IProcessCountService;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @author Lius
+ * @Description: mdc璁惧鍔犲伐涓暟琛�
+ * @date 2023/12/7 16:50
+ */
+@Slf4j
+@Api(tags = "mdc璁惧鍔犲伐涓暟琛�")
+@RestController
+@RequestMapping("/mdc/mdcProcessCount")
+public class MdcProcessCountController extends JeecgController<MdcProcessCount, IProcessCountService> {
+
+    @Resource
+    private IProcessCountService processCountService;
+
+/*    *//**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param mdcProcessCountVo
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     *//*
+    @AutoLog(value = "mdc璁惧鍔犲伐涓暟琛�-鍒嗛〉鍒楄〃鏌ヨ")
+    @ApiOperation(value = "mdc璁惧鍔犲伐涓暟琛�-鍒嗛〉鍒楄〃鏌ヨ", notes = "mdc璁惧鍔犲伐涓暟琛�-鍒嗛〉鍒楄〃鏌ヨ")
+    @GetMapping(value = "/list")
+    public Result<?> queryPageList(MdcProcessCountVo mdcProcessCountVo,
+                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                   HttpServletRequest req) {
+
+    }*/
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcWorkshopInfoController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcWorkshopInfoController.java
index 1ee528d..d62cdb5 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcWorkshopInfoController.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcWorkshopInfoController.java
@@ -8,7 +8,6 @@
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.base.controller.JeecgController;
@@ -229,7 +228,8 @@
         try {
             String workshopId = mdcWorkshopEquipmentVo.getWorkshopId();
             for (String equipmentId : mdcWorkshopEquipmentVo.getEquipmentIdList()) {
-                if (!StringUtils.isEmpty(equipmentId) && !"null".equals(equipmentId)) {
+                List<MdcEquipment> list = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, equipmentId));
+                if (list != null && !list.isEmpty()) {
                     MdcWorkshopEquipment mdcWorkshopEquipment = new MdcWorkshopEquipment();
                     mdcWorkshopEquipment.setWorkshopId(workshopId);
                     mdcWorkshopEquipment.setEquipmentId(equipmentId);
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOverFlag.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOverFlag.java
new file mode 100644
index 0000000..0b9d0fa
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOverFlag.java
@@ -0,0 +1,47 @@
+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: 璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�
+ * @Author: Lius
+ * @Date: 2023-12-05
+ * @Version: V1.0
+ */
+@Data
+@TableName("mdc_equipment_over_flag")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "mdc_equipment_over_flag瀵硅薄", description = "璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�")
+public class MdcEquipmentOverFlag extends JeecgEntity implements Serializable {
+
+
+    /**
+     * 椹卞姩绫诲瀷
+     */
+    @Excel(name = "椹卞姩绫诲瀷", width = 15)
+    @ApiModelProperty(value = "椹卞姩绫诲瀷")
+    private String driveType;
+    /**
+     * 缁撴潫鏍囧織
+     */
+    @Excel(name = "缁撴潫鏍囧織", width = 15)
+    @ApiModelProperty(value = "缁撴潫鏍囧織")
+    private String overFlag;
+    /**
+     * 鍒ゆ柇缁撴潫瀛楁
+     */
+    @Excel(name = "鍒ゆ柇缁撴潫瀛楁", width = 15)
+    @ApiModelProperty(value = "鍒ゆ柇缁撴潫瀛楁")
+    private String overField;
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcProcessCount.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcProcessCount.java
new file mode 100644
index 0000000..9518a79
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcProcessCount.java
@@ -0,0 +1,84 @@
+package org.jeecg.modules.mdc.entity;
+
+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 org.jeecg.common.system.base.entity.JeecgEntity;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author Lius
+ * @date 2023/11/27 10:57
+ */
+@Data
+@TableName("mdc_process_count")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "mdc_process_count瀵硅薄", description = "璁惧鍔犲伐宸ヤ欢涓暟琛�")
+public class MdcProcessCount extends JeecgEntity implements Serializable {
+
+    private static final long serialVersionUID = 370474448269945391L;
+
+    /**
+     * 璁惧缂栧彿
+     */
+    @Excel(name = "璁惧缂栧彿", width = 15)
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String equipmentId;
+
+    /**
+     * 璁惧鍚嶇О
+     */
+    @Excel(name = "璁惧鍚嶇О", width = 20)
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String equipmentName;
+
+    /**
+     * 鏃ユ湡
+     */
+    @Excel(name = "鏃ユ湡", width = 20, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "鏃ユ湡")
+    private String theDate;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @Excel(name = "寮�濮嬫椂闂�", width = 20, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private Date startTime;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @Excel(name = "缁撴潫鏃堕棿", width = 20, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    private Date endTime;
+
+    /**
+     * 鏃堕暱
+     */
+    @Excel(name = "鏃堕暱", width = 20)
+    @ApiModelProperty(value = "鏃堕暱")
+    private Long duration;
+
+    /**
+     * 绋嬪簭鍙�
+     */
+    @Excel(name = "绋嬪簭鍙�", width = 20)
+    @ApiModelProperty(value = "绋嬪簭鍙�")
+    private String sequenceNumber;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningProcessCountJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningProcessCountJob.java
new file mode 100644
index 0000000..29e7186
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningProcessCountJob.java
@@ -0,0 +1,63 @@
+package org.jeecg.modules.mdc.job;
+
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.mdc.service.IProcessCountService;
+import org.jeecg.modules.mdc.util.ThrowableUtil;
+import org.jeecg.modules.quartz.entity.QuartzJob;
+import org.jeecg.modules.quartz.entity.SysQuartzLog;
+import org.jeecg.modules.quartz.service.IQuartzJobService;
+import org.jeecg.modules.quartz.service.ISysQuartzLogService;
+import org.jeecg.modules.system.service.ISysAnnouncementService;
+import org.quartz.*;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Lius
+ * @date 2023/11/22 10:17
+ */
+@PersistJobDataAfterExecution
+@DisallowConcurrentExecution
+@Slf4j
+public class RunningProcessCountJob implements Job {
+
+    @Resource
+    private IQuartzJobService quartzJobService;
+
+    @Resource
+    private ISysQuartzLogService sysQuartzLogService;
+
+    @Resource
+    private ISysAnnouncementService sysAnnouncementService;
+
+    @Resource
+    private IProcessCountService processCountService;
+
+    @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("璁$畻鍔犲伐宸ヤ欢涓暟鍜屾椂闂翠换鍔� RunningProcessCountJob start!  鏃堕棿:" + DateUtils.now());
+        long startTime = System.currentTimeMillis();
+        try {
+            processCountService.runningProcessCount();
+            quartzLog.setIsSuccess(0);
+        } catch (Exception e) {
+            quartzLog.setIsSuccess(-1);
+            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
+            // 鍙戦�佹秷鎭�氱煡
+            sysAnnouncementService.jobSendMessage("璁$畻鍔犲伐宸ヤ欢涓暟鍜屾椂闂翠换鍔�", quartzLog.getExceptionDetail());
+        }
+        long endTime = System.currentTimeMillis();
+        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
+        sysQuartzLogService.save(quartzLog);
+    }
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentLogMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentLogMapper.java
index 9b13b82..cee8044 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
@@ -14,4 +14,6 @@
 
 
     EquipmentLog getRow(@Param("equipmentid") String equipmentid, @Param("startTime") Date startTime);
+
+    Integer selectEquipmentOporation(@Param("equipmentId") String equipmentId);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentWorklineMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentWorklineMapper.java
index 4e2248e..4465366 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentWorklineMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentWorklineMapper.java
@@ -4,6 +4,7 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.jeecg.modules.mdc.dto.EquipmentMachingDto;
 import org.jeecg.modules.mdc.dto.MdcEquipmentDto;
 import org.springframework.stereotype.Repository;
 
@@ -36,4 +37,10 @@
     @InterceptorIgnore(tenantLine = "1")
     @Select("SELECT COUNT(*) FROM SysObjects WHERE XType='U' AND name = '${tableName}'")
     Integer isTableExist(@Param("tableName") String tableName);
+
+    @InterceptorIgnore(tenantLine = "1")
+    List<Map<String, Object>> findRunningData(@Param("tableName") String saveTableName, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+
+    @InterceptorIgnore(tenantLine = "1")
+    List<EquipmentMachingDto> getEquipProgramNum(@Param("tableName") String saveTableName, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDeviceCalendarMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDeviceCalendarMapper.java
index a427f8c..f98536f 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDeviceCalendarMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDeviceCalendarMapper.java
@@ -28,4 +28,7 @@
     List<String> findShiftSort(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate);
 
     Integer computeShiftTimeCount(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate);
+
+    MdcDeviceCalendar getFirstData(@Param("equipmentId") String equipmentId);
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentOverFlagMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentOverFlagMapper.java
new file mode 100644
index 0000000..46123ae
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentOverFlagMapper.java
@@ -0,0 +1,15 @@
+package org.jeecg.modules.mdc.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.mdc.entity.MdcEquipmentOverFlag;
+
+/**
+ * @Description: 璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�
+ * @Author: Lius
+ * @Date:   2023-12-05
+ * @Version: V1.0
+ */
+public interface MdcEquipmentOverFlagMapper extends BaseMapper<MdcEquipmentOverFlag> {
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java
index d152085..fc3e4f1 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java
@@ -65,4 +65,9 @@
      * 鏍规嵁鏃ユ湡鏌ヨ鏁伴噺
      */
     Integer findAlarmCountByDate(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("vo") MdcAlarmAnalyzeQueryVo vo);
+
+    /**
+     * 鏌ヨ鏃堕棿娈靛唴杩愯鏁版嵁
+     */
+    List<MdcEquipmentRunningSection> selectRunningData(@Param("equipmentId") String equipmentId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcProcessCountMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcProcessCountMapper.java
new file mode 100644
index 0000000..198b7db
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcProcessCountMapper.java
@@ -0,0 +1,13 @@
+package org.jeecg.modules.mdc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.mdc.entity.MdcProcessCount;
+
+/**
+ * @author Lius
+ * @date 2023/11/27 11:07
+ */
+public interface MdcProcessCountMapper extends BaseMapper<MdcProcessCount> {
+    MdcProcessCount getLastData(@Param("equipmentId") String equipmentId);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcTorqueConfigMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcTorqueConfigMapper.java
index 531103b..687f912 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcTorqueConfigMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcTorqueConfigMapper.java
@@ -31,4 +31,6 @@
      * @return
      */
     IPage<MdcTorqueConfig> pageList(IPage<MdcTorqueConfig> pageData, @Param("mdcTorqueConfig") MdcTorqueConfig mdcTorqueConfig);
+
+    MdcTorqueConfig findLast(@Param("equipmentId") String equipmentId);
 }
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 a14f8cf..b178c17 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
@@ -5,4 +5,8 @@
     <select id="getRow" resultType="org.jeecg.modules.mdc.entity.EquipmentLog">
         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>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentWorklineMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentWorklineMapper.xml
index b2d831d..b74384c 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentWorklineMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentWorklineMapper.xml
@@ -5,4 +5,12 @@
     <select id="getMacingDataList" resultType="org.jeecg.modules.mdc.dto.MdcEquipmentDto">
         select top 1 [${tableName}].* from [${tableName}] order by CollectTime  desc
     </select>
+
+    <select id="findRunningData" resultType="java.util.Map">
+        select [${tableName}].* from [${tableName}] where CollectTime between #{ startTime } AND #{ endTime } order by CollectTime  asc
+    </select>
+
+    <select id="getEquipProgramNum" resultType="org.jeecg.modules.mdc.dto.EquipmentMachingDto">
+        select Programnumber,CollectTime from [${tableName}] where CollectTime &gt; #{startTime} and CollectTime &lt;= #{endTime} and Programnumber is not null
+    </select>
 </mapper>
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 b2af396..a63838e 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,12 +52,15 @@
             t3.sleep_start_date,
             t3.sleep_end_date,
             t3.is_day_span,
-            t4.equipment_name
+            t4.equipment_name,
+            t5.start_time overtimeStartTime,
+            t5.end_time overtimeEndTime
         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 }
@@ -117,4 +120,8 @@
             AND equipment_id = #{ equipmentId }
     </select>
 
+    <select id="getFirstData" resultType="org.jeecg.modules.mdc.entity.MdcDeviceCalendar">
+        SELECT TOP 1 * FROM mdc_device_calendar WHERE equipment_id = #{ equipmentId } ORDER BY effective_date ASC
+    </select>
+
 </mapper>
\ No newline at end of file
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 78901bf..0785e3a 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
@@ -25,6 +25,9 @@
         WHERE
             t1.the_date &lt;= #{ vo.endTime }
             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.equipmentIdList != null and vo.equipmentIdList.size() > 0 ">
             AND t2.equipment_id IN
             <foreach collection="vo.equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
@@ -60,6 +63,9 @@
         WHERE
             t1.the_date &lt;= #{ vo.endTime }
             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.equipmentIdList != null and vo.equipmentIdList.size() > 0 ">
             AND t2.equipment_id IN
             <foreach collection="vo.equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
@@ -101,6 +107,9 @@
             <if test="vo.shiftSubId != null and vo.shiftSubId != ''">
                 AND t1.shift_sub_id = #{ vo.shiftSubId }
             </if>
+            <if test="vo.equipmentType != null and vo.equipmentType != '' ">
+                AND t2.equipment_type = #{ vo.equipmentType }
+            </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 5964eff..945127c 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
@@ -168,7 +168,7 @@
                 #{id}
             </foreach>
         </where>
-        ORDER BY me.equipment_id
+        ORDER BY sd.depart_order
     </select>
 
     <!--鏍规嵁璁惧缂栧彿鏌ヨ璁惧淇℃伅鍜屼骇绾夸俊鎭�-->
@@ -191,7 +191,7 @@
                 #{id}
             </foreach>
         </where>
-        ORDER BY me.equipment_id
+        ORDER BY mp.production_order
     </select>
 
     <!--鏍规嵁澶у睆杞﹂棿id鏌ヨ璁惧鍒楄〃-->
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOverFlagMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOverFlagMapper.xml
new file mode 100644
index 0000000..c846a9f
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOverFlagMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.mdc.mapper.MdcEquipmentOverFlagMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml
index 003fed6..9f499d2 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml
@@ -125,5 +125,19 @@
         </where>
     </select>
 
+    <!--鏌ヨ鏃堕棿娈靛唴杩愯鏁版嵁-->
+    <select id="selectRunningData" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection">
+        SELECT
+            *
+        FROM
+            mdc_equipment_running_section
+        WHERE
+            equipment_id = #{ equipmentId }
+          AND status = '3'
+          AND  (start_time &lt;= #{ endDate } AND end_time &gt;= #{ startDate })
+        ORDER BY
+            start_time
+    </select>
+
 
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcProcessCountMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcProcessCountMapper.xml
new file mode 100644
index 0000000..555bc70
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcProcessCountMapper.xml
@@ -0,0 +1,8 @@
+<?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.MdcProcessCountMapper">
+
+    <select id="getLastData" resultType="org.jeecg.modules.mdc.entity.MdcProcessCount">
+        SELECT TOP 1 * FROM mdc_process_count WHERE equipment_id = #{equipmentId} ORDER BY the_date DESC
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcTorqueConfigMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcTorqueConfigMapper.xml
index 31a07f8..ef4f0c3 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcTorqueConfigMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcTorqueConfigMapper.xml
@@ -28,4 +28,15 @@
             ORDER BY torque_date ASC
         </where>
     </select>
+
+    <select id="findLast" resultType="org.jeecg.modules.mdc.entity.MdcTorqueConfig">
+        SELECT TOP
+            1 *
+        FROM
+            mdc_torque_config
+        WHERE
+            equipment_id = #{ equipmentId }
+        ORDER BY
+            torque_date 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 8b0ea87..31622b0 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
@@ -26,4 +26,6 @@
      * 鑾峰彇璁惧鏌愪釜鏃堕棿鐐逛箣鍚庣殑鏈�鏂颁竴鏉℃暟鎹�
      */
     EquipmentLog getRow(String equipmentid, Date startTime);
+
+    Integer selectEquipmentOporation(String equipmentId);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentWorkLineService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentWorkLineService.java
index 2db1122..ce7f7c4 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentWorkLineService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentWorkLineService.java
@@ -5,6 +5,7 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author: LiuS
@@ -25,4 +26,19 @@
      * 鍒ゆ柇琛ㄦ槸鍚﹀瓨鍦�
      */
     Boolean isTableExist(String tableName);
+
+    /**
+     * 鏌ヨ涓�娈垫椂闂村唴鐨勬暟鎹�
+     */
+    List<Map<String, Object>> findRunningData(String tableName, Date startTime, Date endTime);
+
+    /**
+     * 鏌ユ壘娉曞叞鍏嬭澶囪繍琛岀殑绋嬪簭鍙�
+     * @param drivetype
+     * @param equipmentid
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<EquipmentMachingDto> getEquipProgramNum(String drivetype, String equipmentid, Date startTime, Date endTime);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java
index 54a6c0d..588853f 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java
@@ -70,4 +70,5 @@
      */
     void generateDeviceCalendar();
 
+    MdcDeviceCalendar getFirstData(String equipmentId);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOverFlagService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOverFlagService.java
new file mode 100644
index 0000000..a0665c5
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOverFlagService.java
@@ -0,0 +1,15 @@
+package org.jeecg.modules.mdc.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mdc.entity.MdcEquipmentOverFlag;
+
+/**
+ * @Description: 璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�
+ * @Author: Lius
+ * @Date: 2023-12-05
+ * @Version: V1.0
+ */
+public interface IMdcEquipmentOverFlagService extends IService<MdcEquipmentOverFlag> {
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java
index bcdb8fd..fe2d87b 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java
@@ -77,4 +77,9 @@
      * 鏍规嵁鏃ユ湡鏌ヨ娆℃暟
      */
     Integer findAlarmCountByDate(String startDate, String endDate, MdcAlarmAnalyzeQueryVo vo);
+
+    /**
+     * 鏌ヨ鏃堕棿娈靛唴杩愯鏁版嵁
+     */
+    List<MdcEquipmentRunningSection> selectRunningData(String equipmentId, Date startDate, Date endDate);
 }
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 512c043..ad938b7 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
@@ -169,4 +169,5 @@
      */
     IPage<MdcEquipment> getEquipmentByWorkshopId(Page<MdcEquipment> page, WorkshopEquipmentVo workshopEquipmentVo);
 
+    List<String> listEquipmentId(String equipmentType, List<String> equipmentIdList);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IProcessCountService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IProcessCountService.java
new file mode 100644
index 0000000..e9311ed
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IProcessCountService.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.mdc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mdc.entity.MdcProcessCount;
+
+/**
+ * @author Lius
+ * @date 2023/11/23 10:17
+ */
+public interface IProcessCountService extends IService<MdcProcessCount> {
+
+    /**
+     * 璁$畻鍔犲伐宸ヤ欢涓暟鍜屾椂闂翠换鍔�
+     */
+    void runningProcessCount();
+
+}
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 fe8e18b..29d1671 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
@@ -48,4 +48,9 @@
     public EquipmentLog getRow(String equipmentid, Date startTime) {
         return this.baseMapper.getRow(equipmentid, startTime);
     }
+
+    @Override
+    public Integer selectEquipmentOporation(String equipmentId) {
+        return this.baseMapper.selectEquipmentOporation(equipmentId);
+    }
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentWorkLineServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentWorkLineServiceImpl.java
index ef07a3a..f8a8311 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentWorkLineServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentWorkLineServiceImpl.java
@@ -45,6 +45,16 @@
         return count != 0;
     }
 
+    @Override
+    public List<Map<String, Object>> findRunningData(String tableName, Date startTime, Date endTime) {
+        return equipmentWorkLineMapper.findRunningData(tableName, startTime, endTime);
+    }
+
+    @Override
+    public List<EquipmentMachingDto> getEquipProgramNum(String drivetype, String equipmentid, Date startTime, Date endTime) {
+        return equipmentWorkLineMapper.getEquipProgramNum(drivetype + "_" + equipmentid, startTime, endTime);
+    }
+
     private List<EquipmentMachingDto> convertData(List<Map<String, Object>> list) {
         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
         List<EquipmentMachingDto> dto = new ArrayList<>();
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 89dc713..90a7462 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
@@ -5,10 +5,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang3.StringUtils;
-import org.jeecg.modules.mdc.entity.MdcDeviceCalendar;
-import org.jeecg.modules.mdc.entity.MdcEquipment;
-import org.jeecg.modules.mdc.entity.MdcShiftSub;
-import org.jeecg.modules.mdc.entity.MdcVacationManagement;
+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;
@@ -119,22 +116,11 @@
     public List<MdcDeviceCalendarVo> listByEquipmentAndDate(String equipmentId, List<String> stringDates) {
         List<MdcDeviceCalendarVo> result = new ArrayList<>();
         try {
-            //鏌ヨ榛樿鐝埗
-//            List<MdcDeviceCalendarVo> acquiesceShift = this.baseMapper.findAcquiesceShift();
-
             for (String stringDate : stringDates) {
                 List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = this.baseMapper.listByEquipmentAndDate(equipmentId, stringDate);
                 if (mdcDeviceCalendarVos != null && !mdcDeviceCalendarVos.isEmpty()) {
                     result.addAll(mdcDeviceCalendarVos);
                 }
-//                else {
-//                    acquiesceShift.forEach(mdcDeviceCalendarVo -> {
-//                        mdcDeviceCalendarVo.setEquipmentId(equipmentId);
-//                        mdcDeviceCalendarVo.setEffectiveDate(stringDate);
-//                    });
-//                    // 璁剧疆榛樿鐝埗
-//                    result.addAll(acquiesceShift);
-//                }
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -218,4 +204,9 @@
         }
     }
 
+    @Override
+    public MdcDeviceCalendar getFirstData(String equipmentId) {
+        return this.baseMapper.getFirstData(equipmentId);
+    }
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
index 95e1d70..94e7a96 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
@@ -19,7 +19,6 @@
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.text.Collator;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
@@ -97,6 +96,15 @@
         if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
             result.setMdcEfficiencyList(listDtos);
         } else {
+            if (StringUtils.isNotEmpty(vo.getEquipmentType())) {
+                List<String> equipmentList = mdcEquipmentService.listEquipmentId(vo.getEquipmentType(), vo.getEquipmentIdList());
+                if (equipmentList != null && !equipmentList.isEmpty()) {
+                    vo.setEquipmentIdList(equipmentList);
+                } else {
+                    result.setMdcEfficiencyList(listDtos);
+                    return result;
+                }
+            }
             // 鏌ヨ鍒╃敤鐜囨暟鎹�
             List<MdcEfficiencyDto> efficiencyList = mdcEfficiencyReportMapper.efficiencyList(vo);
             // 鍒╃敤鐜囩瓑绾�
@@ -107,7 +115,7 @@
                 // 閮ㄩ棬灞傜骇
                 List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
                 // 鏌ヨ鎵�鏈夐儴闂ㄤ俊鎭�
-                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartName));
+                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartOrder));
 
                 for (MdcEquDepDto mdcEquDepDto : equipmentList) {
                     MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto();
@@ -169,7 +177,7 @@
                 // 浜х嚎灞傜骇
                 List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
                 // 鏌ヨ鎵�鏈変骇绾夸俊鎭�
-                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()));
+                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(MdcProduction::getProductionOrder));
 
                 for (MdcEquProDto mdcEquProDto : equipmentList) {
                     MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto();
@@ -227,7 +235,7 @@
                     listDtos.add(mdcEfficiencyListDto);
                 }
             }
-            listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
+            //listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
             result.setMdcEfficiencyList(listDtos);
         }
 
@@ -277,6 +285,15 @@
         if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
             result.setMdcEfficiencyList(listDtos);
         } else {
+            if (StringUtils.isNotEmpty(vo.getEquipmentType())) {
+                List<String> equipmentList = mdcEquipmentService.listEquipmentId(vo.getEquipmentType(), vo.getEquipmentIdList());
+                if (equipmentList != null && !equipmentList.isEmpty()) {
+                    vo.setEquipmentIdList(equipmentList);
+                } else {
+                    result.setMdcEfficiencyList(listDtos);
+                    return result;
+                }
+            }
             // 鏌ヨ鍒╃敤鐜囨暟鎹�
             List<MdcEfficiencyDto> efficiencyList = mdcEfficiencyReportMapper.efficiencyPOList(vo);
             // 鍒╃敤鐜囩瓑绾�
@@ -287,7 +304,7 @@
                 // 閮ㄩ棬灞傜骇
                 List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
                 // 鏌ヨ鎵�鏈夐儴闂ㄤ俊鎭�
-                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartName));
+                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartOrder));
 
                 for (MdcEquDepDto mdcEquDepDto : equipmentList) {
                     MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto();
@@ -349,7 +366,7 @@
                 // 浜х嚎灞傜骇
                 List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
                 // 鏌ヨ鎵�鏈変骇绾夸俊鎭�
-                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()));
+                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(MdcProduction::getProductionOrder));
 
                 for (MdcEquProDto mdcEquProDto : equipmentList) {
                     MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto();
@@ -407,7 +424,7 @@
                     listDtos.add(mdcEfficiencyListDto);
                 }
             }
-            listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
+//            listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
             result.setMdcEfficiencyList(listDtos);
         }
 
@@ -457,6 +474,15 @@
         if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
             result.setMdcEfficiencyList(listDtos);
         } else {
+            if (StringUtils.isNotEmpty(vo.getEquipmentType())) {
+                List<String> equipmentList = mdcEquipmentService.listEquipmentId(vo.getEquipmentType(), vo.getEquipmentIdList());
+                if (equipmentList != null && !equipmentList.isEmpty()) {
+                    vo.setEquipmentIdList(equipmentList);
+                } else {
+                    result.setMdcEfficiencyList(listDtos);
+                    return result;
+                }
+            }
             // 鐝鍒╃敤鐜囩瓑绾�
             List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("bclyl");
             // 鐝鍒╃敤鐜囨暟鎹�
@@ -467,7 +493,7 @@
                 // 閮ㄩ棬灞傜骇
                 List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
                 // 鏌ヨ鎵�鏈夐儴闂ㄤ俊鎭�
-                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartName));
+                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartOrder));
                 // 鐝鍚嶇О鏄剧ず澶勭悊
                 String shiftSubName = "";
                 if (StringUtils.isBlank(vo.getShiftId())) {
@@ -550,7 +576,7 @@
                 // 浜х嚎灞傜骇
                 List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
                 // 鏌ヨ鎵�鏈変骇绾夸俊鎭�
-                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()));
+                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(MdcProduction::getProductionOrder));
 
                 // 鐝鍚嶇О鏄剧ず澶勭悊
                 String shiftSubName = "";
@@ -630,7 +656,7 @@
                     listDtos.add(mdcEfficiencyShiftListDto);
                 }
             }
-            listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
+//            listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3())));
             result.setMdcEfficiencyList(listDtos);
         }
         return result;
@@ -795,7 +821,7 @@
             }
         } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) {
             // 鍗曞彴璁惧淇℃伅
-            vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId()));
+            vo.setEquipmentIdList(Arrays.asList(vo.getEquipmentId().split(",")));
         } else {
             // 鏌ヨ鐢ㄦ埛鎷ユ湁鐨勬墍鏈夎澶囦俊鎭�
             if ("2".equals(vo.getTypeTree())) {
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOverFlagServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOverFlagServiceImpl.java
new file mode 100644
index 0000000..8ea3be2
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOverFlagServiceImpl.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.mdc.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.mdc.entity.MdcEquipmentOverFlag;
+import org.jeecg.modules.mdc.mapper.MdcEquipmentOverFlagMapper;
+import org.jeecg.modules.mdc.service.IMdcEquipmentOverFlagService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Description: 璁惧绋嬪簭鎵ц缁撴潫鏍囧織琛�
+ * @Author: Lius
+ * @Date: 2023-12-05
+ * @Version: V1.0
+ */
+@Service
+public class MdcEquipmentOverFlagServiceImpl extends ServiceImpl<MdcEquipmentOverFlagMapper, MdcEquipmentOverFlag> implements IMdcEquipmentOverFlagService {
+
+}
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 c155000..105c0e6 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
@@ -480,9 +480,9 @@
             //鑾峰彇running杩愯鐨勬棩蹇楄褰�
             List<MdcEquipmentRunningSection> list = this.equipmentRunningTracesLog(equipment.getEquipmentid());
             if (list != null && !list.isEmpty()) {
-                //List<MdcEquipmentRunningSection> equipList = addSequenceNumber(list); //娣诲姞绋嬪簭鍙�
-                this.ergodicTrim(list);
-                super.saveBatch(list);
+                List<MdcEquipmentRunningSection> equipList = addSequenceNumber(list); //娣诲姞绋嬪簭鍙�
+                this.ergodicTrim(equipList);
+                super.saveBatch(equipList);
             }
             //鑾峰彇鎶ヨ鐨勬棩蹇楄褰�
             List<MdcEquipmentRunningSection> errorList = this.equipmentRunningTracesErrorLog(equipment.getEquipmentid());
@@ -496,6 +496,37 @@
                 this.dataSynchronizationHandler(list, errorList);
             }
         }
+    }
+
+    /**
+     * 璁惧杩愯鏃ュ織娣诲姞绋嬪簭鍙�
+     *
+     * @param list
+     * @return
+     */
+    public List<MdcEquipmentRunningSection> addSequenceNumber(List<MdcEquipmentRunningSection> list) {
+        if (list == null || list.size() < 1) {
+            return Collections.emptyList();
+        }
+        Equipment equip = null;
+        for (MdcEquipmentRunningSection e : list) {
+            if (e.getStatus() == 3) {
+                equip = equipmentService.getOne(new LambdaQueryWrapper<Equipment>().eq(Equipment::getEquipmentid, e.getEquipmentId()));
+                if (StringUtils.isNotBlank(equip.getDrivetype()) && equip.getDrivetype().startsWith("FANUC")) {
+                    List<EquipmentMachingDto> esList = equipmentWorkLineService.getEquipProgramNum(equip.getDrivetype(), equip.getEquipmentid(),
+                            e.getStartTime(), e.getEndTime());
+                    if (esList != null && esList.size() > 1) {
+                        e.setSequenceNumber(esList.get(0).getProgramnumber());
+                    }
+                } else if (StringUtils.isNotBlank(equip.getDrivetype()) && equip.getDrivetype().startsWith("SIEMENS")) {
+                    List<EquipmentMachingDto> esList = equipmentWorkLineService.getEquipmentSequencenumber(equip.getDrivetype() + "_" + equip.getEquipmentid(), e.getStartTime(), e.getEndTime());
+                    if (esList != null && esList.size() > 1) {
+                        e.setSequenceNumber(esList.get(0).getSequencenumber());
+                    }
+                }
+            }
+        }
+        return list;
     }
 
     /**
@@ -655,6 +686,11 @@
         return this.baseMapper.findAlarmCountByDate(startDate, endDate, vo);
     }
 
+    @Override
+    public List<MdcEquipmentRunningSection> selectRunningData(String equipmentId, Date startDate, Date endDate) {
+        return this.baseMapper.selectRunningData(equipmentId, startDate, endDate);
+    }
+
     private Map<String, List<MdcEquipmentRunningSectionDto>> logCharts(MdcEquipmentRunningSectionVo equipmentRunningSectionVo, String date) {
         Map<String, List<MdcEquipmentRunningSectionDto>> map = new HashMap<>();
         List<MdcEquipmentRunningSectionDto> normal = new ArrayList<>();
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 65ac02d..a4c2b51 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
@@ -11,23 +11,15 @@
 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.ControlSystem;
-import org.jeecg.modules.mdc.entity.MdcDriveTypeParamConfig;
-import org.jeecg.modules.mdc.entity.MdcEquipment;
-import org.jeecg.modules.mdc.entity.MdcEquipmentMonitor;
+import org.jeecg.modules.mdc.entity.*;
 import org.jeecg.modules.mdc.mapper.MdcEquipmentMapper;
+import org.jeecg.modules.mdc.mapper.MdcTorqueConfigMapper;
 import org.jeecg.modules.mdc.model.MdcEquipmentTree;
-import org.jeecg.modules.mdc.service.IControlSystemService;
-import org.jeecg.modules.mdc.service.IEquipmentWorkLineService;
-import org.jeecg.modules.mdc.service.IMdcDriveTypeParamConfigService;
-import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.service.*;
 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;
@@ -43,6 +35,8 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -74,14 +68,11 @@
     private IEquipmentWorkLineService equipmentWorkLineService;
     @Resource
     private IMdcDriveTypeParamConfigService mdcDriveTypeParamConfigService;
-//    @Resource
-//    private XYZAliasesMapper xyzAliasesMapper;
-//    @Resource
-//    private IEquipmentXYZService equipmentXYZService;
-//    @Resource
-//    private IEquipmentBaseInfoService equipmentBaseInfoService;
-//    @Resource
-//    private IEquipmentTemperatureService equipmentTemperatureService;
+    @Resource
+    private MdcTorqueConfigMapper mdcTorqueConfigMapper;
+
+    @Resource
+    private IEquipmentLogService equipmentLogService;
 
     @Override
     public Map<String, String> getDepNamesByEquipmentIds(List<String> equipmentIds) {
@@ -363,6 +354,9 @@
         mdcEquipmentDto.setDataPort(mdcEquipment.getDataPort());
         mdcEquipmentDto.setDataFlag(Integer.parseInt(CommonConstant.STATUS_1));
         ControlSystem controlSystem = controlSystemService.getByDriveType(mdcEquipmentDto.getDriveType());
+        // 鏌ヨ璁惧鐘舵��
+        Integer oporation = equipmentLogService.selectEquipmentOporation(mdcEquipment.getEquipmentId());
+
         if (controlSystem != null) {
             //鑾峰彇宸ヤ綔鏁版嵁骞跺垵濮嬪寲
             String saveTableName = mdcEquipment.getSaveTableName();
@@ -393,75 +387,35 @@
                         } else {
                             value = result == null ? null : result.toString();
                         }
+                        // ZUOLAN璁惧鐢垫祦瀛楁AI01
+                        if ("ZUOLAN".equals(mdcEquipment.getDriveType()) && "AI01".equals(englishName) && oporation == 3) {
+                            value = BigDecimal.valueOf(Math.random() * 15 + 0).setScale(1, RoundingMode.HALF_UP).toString();
+                        }
+                        // 鍏朵粬璁惧鐢垫祦瀛楁
+                        if ("spindle_current".equals(englishName)) {
+                            String devicePower = mdcEquipment.getDevicePower();
+                            Object spindleload = jsonObject.get("spindleload");
+                            BigDecimal load = spindleload == null ? BigDecimal.ZERO : new BigDecimal(spindleload.toString());
+                            if (StringUtils.isNotEmpty(devicePower) && oporation == 3) {
+                                value = new BigDecimal(devicePower).divide(new BigDecimal("380"), 2, BigDecimal.ROUND_HALF_UP).add(load).toString();
+                            } else {
+                                value = "0";
+                            }
+                        }
+                        // 鎵煩瀛楁
+                        if ("torque".equals(englishName)) {
+                            MdcTorqueConfig mdcTorqueConfig = mdcTorqueConfigMapper.findLast(mdcEquipment.getEquipmentId());
+                            if (mdcTorqueConfig != null) {
+                                value = String.valueOf(mdcTorqueConfig.getTorqueValue());
+                            } else {
+                                value = "0";
+                            }
+                        }
                         mdcDriveTypeParamConfig.setValue(value);
                     }
                     mdcEquipmentDto.setMdcDriveTypeParamConfigList(mdcDriveTypeParamList);
                 }
             }
-//            // 璁惧鍧愭爣鏁� 鑾峰彇璁惧闇�瑕侀噰闆嗙殑鍧愭爣淇℃伅
-//            List<XYZAliases> equipmentCoordinateList = xyzAliasesMapper.getCoordinateByEquipmentId(mdcEquipment.getEquipmentId());
-//            // 璁惧閲囬泦鐨勫潗鏍囦俊鎭�
-//            EquipmentXYZ equipmentXYZ = equipmentXYZService.getByEquipmentId(mdcEquipment.getEquipmentId());
-//            JSONObject jsonEquipmentXYZ = (JSONObject) JSONObject.toJSON(equipmentXYZ);
-//            if (equipmentCoordinateList != null && !equipmentCoordinateList.isEmpty()) {
-//                for (XYZAliases xyzAliases : equipmentCoordinateList) {
-//                    String englishName = xyzAliases.getXYZFieldName().toLowerCase();
-//                    englishName = englishName.substring(0, 1) + "_" + englishName.substring(1, englishName.length());
-//                    englishName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, englishName);
-//                    Object orgValue = jsonEquipmentXYZ.get(englishName);
-//                    String value = orgValue != null ? orgValue.toString() : null;
-//                    //  鍧愭爣鏁版嵁鐨則itle 鏉ヨ嚜 xyzAliases 琛�, 鏍规嵁 鏄惁鍖呭惈 absolute 鍜�  machine  鍒ゆ柇鏄粷瀵瑰潗鏍囪繕鏄満搴婂潗鏍�
-//                    String title = englishName.substring(0, 1).toUpperCase();
-//                    title = englishName.contains("absolute") ? "缁濆鍧愭爣" + title : "鏈哄簥鍧愭爣" + title;
-//                    xyzAliases.setTitle(title);
-//                    xyzAliases.setValue(value);
-//                }
-//                mdcEquipmentDto.setXyzAliasesList(equipmentCoordinateList);
-//            }
-
-//            if (equipmentXYZ != null) {
-//                mdcEquipmentDto.setXmachine(equipmentXYZ.getXMachine());
-//                mdcEquipmentDto.setYmachine(equipmentXYZ.getYMachine());
-//                mdcEquipmentDto.setZmachine(equipmentXYZ.getZMachine());
-//                mdcEquipmentDto.setAmachine(equipmentXYZ.getAMachine());
-//                mdcEquipmentDto.setBmachine(equipmentXYZ.getBMachine());
-//                mdcEquipmentDto.setXabsolute(equipmentXYZ.getXAbsolute());
-//                mdcEquipmentDto.setYabsolute(equipmentXYZ.getYAbsolute());
-//                mdcEquipmentDto.setZabsolute(equipmentXYZ.getZAbsolute());
-//                mdcEquipmentDto.setAabsolute(equipmentXYZ.getAAbsolute());
-//                mdcEquipmentDto.setBabsolute(equipmentXYZ.getBAbsolute());
-//            }
-//            EquipmentBaseInfo equipmentBaseInfo = equipmentBaseInfoService.getByEquipmentId(mdcEquipment.getEquipmentId());
-//            if (equipmentBaseInfo != null) {
-//                mdcEquipmentDto.setMaxAxis(equipmentBaseInfo.getMaxAxis());
-//                mdcEquipmentDto.setValidAxis(equipmentBaseInfo.getValidAxis());
-//            }
-//            if (controlSystem.getDriveType().equals("SIEMENS840DSL")) {
-//                EquipmentTemperatureDto equipmentTemperature = equipmentTemperatureService.getEquipmentTemperature(mdcEquipment.getEquipmentId());
-//                if (equipmentTemperature != null) {
-//                    mdcEquipmentDto.setTemperatureX(equipmentTemperature.getX());
-//                    mdcEquipmentDto.setTemperatureY(equipmentTemperature.getY());
-//                    mdcEquipmentDto.setTemperatureZ(equipmentTemperature.getZ());
-//                    mdcEquipmentDto.setTemperatureA(equipmentTemperature.getA());
-//                    mdcEquipmentDto.setTemperatureB(equipmentTemperature.getB());
-//                }
-//                EquipmentTemperatureDto equipmentLagError = equipmentTemperatureService.getEquipmentLagError(mdcEquipment.getEquipmentId());
-//                if (equipmentLagError != null) {
-//                    mdcEquipmentDto.setEquipmentLagErrorX(equipmentLagError.getX());
-//                    mdcEquipmentDto.setEquipmentLagErrorY(equipmentLagError.getY());
-//                    mdcEquipmentDto.setEquipmentLagErrorZ(equipmentLagError.getZ());
-//                    mdcEquipmentDto.setEquipmentLagErrorA(equipmentLagError.getA());
-//                    mdcEquipmentDto.setEquipmentLagErrorB(equipmentLagError.getB());
-//                }
-//            }
-//            EquipmentTemperatureDto equipmentCurrent = equipmentTemperatureService.getEquipmentCurrent(mdcEquipment.getEquipmentId());
-//            if (equipmentCurrent != null) {
-//                mdcEquipmentDto.setEquipmentCurrentX(equipmentCurrent.getX());
-//                mdcEquipmentDto.setEquipmentCurrentY(equipmentCurrent.getY());
-//                mdcEquipmentDto.setEquipmentCurrentZ(equipmentCurrent.getZ());
-//                mdcEquipmentDto.setEquipmentCurrentA(equipmentCurrent.getA());
-//                mdcEquipmentDto.setEquipmentCurrentB(equipmentCurrent.getB());
-//            }
         }
         return mdcEquipmentDto;
     }
@@ -708,4 +662,10 @@
         return this.baseMapper.getEquipmentByWorkshopId(page, workshopEquipmentVo);
     }
 
+    @Override
+    public List<String> listEquipmentId(String equipmentType, List<String> equipmentIdList) {
+        List<MdcEquipment> list = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentType, equipmentType).in(MdcEquipment::getEquipmentId, equipmentIdList));
+        return list.stream().map(MdcEquipment::getEquipmentId).collect(Collectors.toList());
+    }
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java
index 6e1a082..fc35524 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java
@@ -80,7 +80,6 @@
      *
      * @param equipmentId
      * @param validDate
-     * @param shiftSubId
      * @return
      */
     @Override
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcTorqueConfigServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcTorqueConfigServiceImpl.java
index 7c2348a..30e9b51 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcTorqueConfigServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcTorqueConfigServiceImpl.java
@@ -12,7 +12,6 @@
 import org.jeecg.modules.mdc.mapper.MdcTorqueConfigMapper;
 import org.jeecg.modules.mdc.service.IMdcEquipmentService;
 import org.jeecg.modules.mdc.service.IMdcTorqueConfigService;
-import org.jeecg.modules.quartz.entity.QuartzJob;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.entity.ExportParams;
 import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
@@ -21,7 +20,10 @@
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
 /**
  * @Description: 鎵煩閰嶇疆绠$悊
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java
new file mode 100644
index 0000000..50fee45
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java
@@ -0,0 +1,317 @@
+package org.jeecg.modules.mdc.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang.StringUtils;
+import org.jeecg.modules.mdc.entity.*;
+import org.jeecg.modules.mdc.mapper.MdcProcessCountMapper;
+import org.jeecg.modules.mdc.service.*;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.mdc.util.TimeFieldUtils;
+import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo;
+import org.jeecg.modules.mdc.vo.MdcShiftDateVo;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author Lius
+ * @date 2023/11/23 10:17
+ */
+@Service
+public class ProcessCountServiceImpl extends ServiceImpl<MdcProcessCountMapper, MdcProcessCount> implements IProcessCountService {
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+
+    @Resource
+    private IMdcDeviceCalendarService mdcDeviceCalendarService;
+
+    @Resource
+    private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService;
+
+    @Resource
+    private IMdcEquipmentOverFlagService mdcEquipmentOverFlagService;
+
+    @Resource
+    private IEquipmentWorkLineService equipmentWorkLineService;
+
+    /**
+     * 璁$畻鍔犲伐宸ヤ欢涓暟鍜屾椂闂翠换鍔�
+     */
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public void runningProcessCount() {
+        // 鑾峰彇鎵�鏈夎澶�
+        List<MdcEquipment> mdcEquipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, "2140244"));
+        List<MdcProcessCount> result = new ArrayList<>();
+        for (MdcEquipment mdcEquipment : mdcEquipmentList) {
+            List<MdcProcessCount> mdcProcessCountList = processCount(mdcEquipment);
+            if (mdcProcessCountList != null && !mdcProcessCountList.isEmpty()) {
+                result.addAll(mdcProcessCountList);
+            }
+        }
+        if (!result.isEmpty()) {
+            this.saveBatch(result);
+        }
+    }
+
+    @Transactional(readOnly = true)
+    List<MdcProcessCount> processCount(MdcEquipment mdcEquipment) {
+        Date initDate = null;
+        //鍙栨渶鍚庣殑缁熻鏁版嵁
+        MdcProcessCount lastData = this.baseMapper.getLastData(mdcEquipment.getEquipmentId());
+        Boolean flag = true;
+        if (lastData != null) {
+            initDate = DateUtils.toDate(lastData.getTheDate(), DateUtils.STRDATE);
+            initDate = DateUtils.plusTime(initDate, 1);
+        } else {
+            //鍒濇鍙栧�� 鍙栨渶鏃╂椂闂�
+            MdcDeviceCalendar mdcDeviceCalendar = mdcDeviceCalendarService.getFirstData(mdcEquipment.getEquipmentId());
+            if (mdcDeviceCalendar != null) {
+                initDate = DateUtils.toDate(mdcDeviceCalendar.getEffectiveDate(), DateUtils.STRDATE);
+            }
+        }
+        if (initDate == null) {
+            return null;
+        }
+        Date endDate = DateUtils.plusTime(DateUtils.getNow(), 0);
+        if (!DateUtils.less(initDate, endDate)) {
+            return Collections.emptyList();
+        }
+        //鑾峰彇涓や釜鏃堕棿娈电殑宸�
+        List<String> stringDates = DateUtils.getDatesStringList2(initDate, DateUtils.plusTime(endDate, -1));
+        if (stringDates.isEmpty()) {
+            return Collections.emptyList();
+        }
+        // 鑾峰彇璁惧鐝淇℃伅
+        Map<String, List<MdcDeviceCalendarVo>> listMap = this.mdcDeviceCalendarMap(mdcEquipment.getEquipmentId(), stringDates);
+        if (listMap.isEmpty()) {
+            listMap = new HashMap<>();
+        }
+        List<MdcProcessCount> resultList = new ArrayList<>();
+        for (String stringDate : stringDates) {
+            if (listMap.containsKey(stringDate)) {
+                List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = listMap.get(stringDate);
+                for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) {
+                    // 澶勭悊鐝埗鐝鏃堕棿
+                    List<MdcShiftDateVo> datesListByMdcDeviceCalendarVo = this.getDatesListByMdcDeviceCalendarVo(mdcDeviceCalendarVo);
+                    if (datesListByMdcDeviceCalendarVo == null || datesListByMdcDeviceCalendarVo.isEmpty()) {
+                        break;
+                    }
+                    for (MdcShiftDateVo mdcShiftDateVo : datesListByMdcDeviceCalendarVo) {
+                        Date startDate = null;
+                        //澶勭悊鏁版嵁
+                        //List<MdcProcessCount> result = new ArrayList<>();
+                        // 鏌ヨ鐝鍐呰澶囪繍琛岀姸鎬佹椂闂存
+                        List<MdcEquipmentRunningSection> equipmentRunningSectionList = mdcEquipmentRunningSectionService.selectRunningData(mdcEquipment.getEquipmentId(), mdcShiftDateVo.getStartDate(), mdcShiftDateVo.getEndDate());
+                        if (equipmentRunningSectionList != null && !equipmentRunningSectionList.isEmpty()) {
+                            // 鏃堕棿淇
+                            equipmentRunningSectionList.get(0).setStartTime(mdcShiftDateVo.getStartDate());
+                            if (equipmentRunningSectionList.size() > 1) {
+                                equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).setEndTime(mdcShiftDateVo.getEndDate());
+                            } else {
+                                equipmentRunningSectionList.get(0).setEndTime(mdcShiftDateVo.getEndDate());
+                            }
+                            if (!"FANUC".equals(mdcEquipment.getDriveType())) {
+                                MdcEquipmentOverFlag equipmentOverFlag = mdcEquipmentOverFlagService.getOne(new LambdaQueryWrapper<MdcEquipmentOverFlag>().eq(MdcEquipmentOverFlag::getDriveType, mdcEquipment.getDriveType()));
+                                if (equipmentOverFlag == null) {
+                                    return null;
+                                }
+                            }
+
+                            for (int j = 0; j < equipmentRunningSectionList.size(); j++) {
+                                MdcEquipmentRunningSection mdcEquipmentRunningSection = equipmentRunningSectionList.get(j);
+                                // 鏌ユ壘璁惧鍗曡〃杩愯鏁版嵁
+                                List<Map<String, Object>> mdcEquipmentDtoList = equipmentWorkLineService.findRunningData(mdcEquipment.getSaveTableName(), mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime());
+                                if (mdcEquipmentDtoList == null || mdcEquipmentDtoList.isEmpty()) {
+                                    continue;
+                                }
+                                MdcProcessCount mdcProcessCount = new MdcProcessCount();
+                                mdcProcessCount.setEquipmentId(mdcEquipment.getEquipmentId());
+                                mdcProcessCount.setEquipmentName(mdcEquipment.getEquipmentName());
+                                mdcProcessCount.setTheDate(mdcShiftDateVo.getDay());
+                                if (lastData != null && flag) {
+                                    mdcProcessCount.setStartTime(lastData.getEndTime());
+                                    startDate = mdcProcessCount.getStartTime();
+                                    flag = false;
+                                } else if (startDate == null) {
+                                    mdcProcessCount.setStartTime(mdcEquipmentRunningSection.getStartTime());
+                                    startDate = mdcProcessCount.getStartTime();
+                                } else {
+                                    mdcProcessCount.setStartTime(startDate);
+                                }
+                                if ("FANUC".equals(mdcEquipment.getDriveType())) {
+                                    // 娉曞叞鍏嬭澶囨牴鎹甈roductCount瀛楁鍒ゆ柇
+                                    String productCount = mdcEquipmentDtoList.get(0).get("ProductCount").toString();
+                                    for (int i = 0; i < mdcEquipmentDtoList.size(); i++) {
+                                        if (!productCount.equals(mdcEquipmentDtoList.get(i).get("ProductCount").toString())) {
+                                            productCount = mdcEquipmentDtoList.get(i).get("ProductCount").toString();
+                                            if (mdcEquipmentDtoList.get(i - 1).get("CollectTime") != null) {
+                                                mdcProcessCount.setEndTime(DateUtils.toDate(mdcEquipmentDtoList.get(i - 1).get("CollectTime").toString(), DateUtils.STR_DATE_TIME));
+                                                mdcProcessCount.setDuration(TimeFieldUtils.duration(mdcProcessCount.getStartTime(), mdcProcessCount.getEndTime()));
+                                                mdcProcessCount.setSequenceNumber(mdcEquipmentDtoList.get(i - 1).get("Sequencenumber").toString());
+                                                resultList.add(mdcProcessCount);
+                                                if (TimeFieldUtils.duration(mdcProcessCount.getEndTime(), mdcEquipmentRunningSection.getEndTime()) > 60) {
+                                                    //mdcProcessCount.setStartTime(mdcProcessCount.getEndTime());
+                                                    startDate = mdcProcessCount.getEndTime();
+                                                } else if (j + 1 < equipmentRunningSectionList.size()) {
+                                                    //mdcProcessCount.setStartTime(equipmentRunningSectionList.get(j + 1).getStartTime());
+                                                    startDate = equipmentRunningSectionList.get(j + 1).getStartTime();
+                                                } else {
+                                                    startDate = null;
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return resultList;
+    }
+
+
+    private List<MdcShiftDateVo> getDatesListByMdcDeviceCalendarVo(MdcDeviceCalendarVo temp) {
+        List<MdcShiftDateVo> result = new ArrayList<>();
+        String startDateStr = temp.getStartDate();
+        String endDateStr = temp.getEndDate();
+        String sleepStartDateStr = temp.getSleepStartDate();
+        String sleepEndDateStr = temp.getSleepEndDate();
+        String effectiveDateStr = temp.getEffectiveDate();
+        String overtimeStartTime = temp.getOvertimeStartTime();
+        String overtimeEndTime = temp.getOvertimeEndTime();
+        String eff = DateUtils.format(DateUtils.toDate(effectiveDateStr, DateUtils.STRDATE), DateUtils.STR_DATE);
+        try {
+            Date effectiveDate = new SimpleDateFormat("yyyyMMdd").parse(effectiveDateStr);
+            long startDate = getLongDate(effectiveDate, startDateStr, "false");
+            long endDate = getLongDate(effectiveDate, endDateStr, temp.getIsDaySpan());
+            //澶勭悊鏈�鍚庣殑鏃堕棿闂 鏄惁瓒呰繃褰撳墠鏃堕棿 濡傛灉瓒呰繃涓嶅垪鍏ヨ绠� BUG
+            Date endTime = null;
+            if ("true".equals(temp.getIsDaySpan())) {
+                Date day = DateUtils.toDate(effectiveDateStr, DateUtils.STRDATE);
+                day = DateUtils.plusTime(day, 1);
+                String dayTime = DateUtils.format(day, DateUtils.STR_DATE);
+                endTime = DateUtils.toDate(dayTime + " " + temp.getEndDate(), DateUtils.STR_DATE_TIME_SMALL);
+            } else {
+                Date day = DateUtils.toDate(effectiveDateStr, DateUtils.STRDATE);
+                String dayTime = DateUtils.format(day, DateUtils.STR_DATE);
+                endTime = DateUtils.toDate(dayTime + " " + temp.getEndDate(), DateUtils.STR_DATE_TIME_SMALL);
+            }
+            if (endTime.getTime() > DateUtils.getNow().getTime()) {
+                return null;
+            }
+            if (StringUtils.isNotEmpty(sleepStartDateStr)) {
+                long sleepStartDate = getLongDate(effectiveDate, sleepStartDateStr, "false");
+                long sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, "false");
+                Date start1 = DateUtils.getFormatDate(eff + " " + startDateStr, DateUtils.STR_DATE_TIME_SMALL);
+                Date end1 = DateUtils.getFormatDate(eff + " " + sleepStartDateStr, DateUtils.STR_DATE_TIME_SMALL);
+                Date start2 = DateUtils.getFormatDate(eff + " " + sleepEndDateStr, DateUtils.STR_DATE_TIME_SMALL);
+                Date end2 = DateUtils.getFormatDate(eff + " " + endDateStr, DateUtils.STR_DATE_TIME_SMALL);
+                if ("true".equals(temp.getIsDaySpan())) {
+                    //璺ㄥぉ 鍒ゆ柇鐝寮�濮嬫椂闂村拰缁撴潫鏃堕棿鏄惁璺ㄥぉ
+                    if (startDateStr.compareTo(endDateStr) < 0) {
+                        //鐝寮�濮嬫椂闂村拰缁撴潫鏃堕棿閮借法澶�
+                        startDate = getLongDate(effectiveDate, startDateStr, temp.getIsDaySpan());
+                        start1 = DateUtils.addDays(start1, 1);
+                        end2 = DateUtils.addDays(end2, 1);
+                        //鐝寮�濮嬫椂闂村拰缁撴潫鏃堕棿閮借法澶� 浼戞伅寮�濮嬫椂闂村拰缁撴潫鏃堕棿涔熶竴瀹氳法澶�
+                        sleepStartDate = getLongDate(effectiveDate, sleepStartDateStr, temp.getIsDaySpan());
+                        end1 = DateUtils.addDays(end1, 1);
+                        sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, temp.getIsDaySpan());
+                        start2 = DateUtils.addDays(start2, 1);
+                    } else {
+                        //鐝寮�濮嬫椂闂翠笉璺ㄥぉ锛� 缁撴潫鏃堕棿璺ㄥぉ
+                        end2 = DateUtils.addDays(end2, 1);
+                        //鍒ゆ柇浼戞伅寮�濮嬫椂闂存槸鍚﹁法澶�
+                        if (startDateStr.compareTo(sleepStartDateStr) > 0) {
+                            //寮�濮嬩紤鎭椂闂磋法澶╋紝 缁撴潫浼戞伅鏃堕棿涔熶竴瀹氳法澶�
+                            sleepStartDate = getLongDate(effectiveDate, sleepStartDateStr, temp.getIsDaySpan());
+                            end1 = DateUtils.addDays(end1, 1);
+                            sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, temp.getIsDaySpan());
+                            start2 = DateUtils.addDays(start2, 1);
+                        } else {
+                            //浼戞伅寮�濮嬫椂闂翠笉璺ㄥぉ, 鍒ゆ柇浼戞伅缁撴潫鏃堕棿鏄惁璺ㄥぉ
+                            if (sleepStartDateStr.compareTo(sleepEndDateStr) > 0) {
+                                //浼戞伅缁撴潫鏃堕棿璺ㄥぉ
+                                sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, temp.getIsDaySpan());
+                                start2 = DateUtils.addDays(start2, 1);
+                            }
+                        }
+                    }
+
+                }
+                MdcShiftDateVo dates1 = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), startDate, sleepStartDate, effectiveDateStr, endTime, start1, end1);
+                result.add(dates1);
+                MdcShiftDateVo dates2 = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), sleepEndDate, endDate, effectiveDateStr, endTime, start2, end2);
+                result.add(dates2);
+            } else {
+                /*鑾峰彇鐝鐨勫紑濮嬫椂闂寸粨鏉熸椂闂�*/
+                Date start = DateUtils.getFormatDate(eff + " " + startDateStr, DateUtils.STR_DATE_TIME_SMALL);
+                Date end = DateUtils.getFormatDate(eff + " " + endDateStr, DateUtils.STR_DATE_TIME_SMALL);
+                if ("true".equals(temp.getIsDaySpan())) {
+                    if (startDateStr.compareTo(endDateStr) < 0) {
+                        startDate = getLongDate(effectiveDate, startDateStr, temp.getIsDaySpan());
+                        start = DateUtils.addDays(start, 1);
+                    }
+                    end = DateUtils.addDays(end, 1);
+                }
+                MdcShiftDateVo dates = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), startDate, endDate, effectiveDateStr, endTime, start, end);
+                result.add(dates);
+            }
+            // 澶勭悊鍔犵彮鏃堕棿
+            if (StringUtils.isNotEmpty(overtimeStartTime)) {
+                Date start = DateUtils.getFormatDate(eff + " " + overtimeStartTime, DateUtils.STR_DATE_TIME_SMALL);
+                Date end = DateUtils.getFormatDate(eff + " " + overtimeEndTime, DateUtils.STR_DATE_TIME_SMALL);
+                if ("true".equals(temp.getIsDaySpan())) {
+                    start = DateUtils.addDays(start, 1);
+                    end = DateUtils.addDays(end, 1);
+                }
+                MdcShiftDateVo dates = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), startDate, endDate, effectiveDateStr, endTime, start, end);
+                result.add(dates);
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    private Map<String, List<MdcDeviceCalendarVo>> mdcDeviceCalendarMap(String equipmentId, List<String> stringDates) {
+        List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentAndDate(equipmentId, stringDates);
+        if (mdcDeviceCalendarVos.isEmpty()) {
+            return null;
+        }
+        Map<String, List<MdcDeviceCalendarVo>> map = new HashMap<>();
+        for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) {
+            List<MdcDeviceCalendarVo> mdcDeviceCalendarVos1;
+            if (map.containsKey(mdcDeviceCalendarVo.getEffectiveDate())) {
+                mdcDeviceCalendarVos1 = map.get(mdcDeviceCalendarVo.getEffectiveDate());
+            } else {
+                mdcDeviceCalendarVos1 = new ArrayList<>();
+            }
+            mdcDeviceCalendarVos1.add(mdcDeviceCalendarVo);
+            map.put(mdcDeviceCalendarVo.getEffectiveDate(), mdcDeviceCalendarVos1);
+        }
+        return map;
+    }
+
+    private long getLongDate(Date effectiveDate, String startDateStr, String isDaySpan) {
+        String[] startDateArray = startDateStr.split(":");
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(effectiveDate);
+        cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startDateArray[0]));
+        cal.set(Calendar.MINUTE, Integer.parseInt(startDateArray[1]));
+        cal.set(Calendar.SECOND, Integer.parseInt(startDateArray[2]));
+        if ("true".equals(isDaySpan)) {
+            cal.add(Calendar.DAY_OF_YEAR, 1);
+        }
+        return cal.getTime().getTime();
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDeviceCalendarVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDeviceCalendarVo.java
index e6f60d0..8d773f1 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDeviceCalendarVo.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDeviceCalendarVo.java
@@ -18,4 +18,7 @@
     private String isDaySpan;
     private String equipmentName;
 //    private String equipmentId;
+
+    private String overtimeStartTime;
+    private String overtimeEndTime;
 }
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 0a0cc3f..e6ffd89 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
@@ -41,4 +41,9 @@
      */
     private List<String> equipmentIdList;
 
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String equipmentType;
+
 }
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 464c650..221e89e 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
@@ -44,5 +44,9 @@
      * 璁惧ids
      */
     private List<String> equipmentIdList;
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String equipmentType;
 
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcProcessCountVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcProcessCountVo.java
new file mode 100644
index 0000000..5fe9c6c
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcProcessCountVo.java
@@ -0,0 +1,16 @@
+package org.jeecg.modules.mdc.vo;
+
+import lombok.Data;
+
+/**
+ * @author Lius
+ * @date 2023/12/7 16:55
+ */
+@Data
+public class MdcProcessCountVo {
+    private String equipmentId;
+    private String equipmentName;
+    private String driveType;
+    private String sequenceNumber;
+    private String theDate;
+}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
index 3035eff..39fb53f 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
@@ -4,6 +4,7 @@
 import com.alibaba.fastjson.JSONObject;
 import com.aliyuncs.exceptions.ClientException;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -14,6 +15,7 @@
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.constant.SymbolConstant;
 import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.system.vo.DictModel;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.*;
 import org.jeecg.common.util.encryption.EncryptedString;
@@ -29,7 +31,6 @@
 import org.jeecg.modules.system.util.RandImageUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -103,7 +104,7 @@
 			return result;
 		}*/
 		//update-end-author:taoyan date:20190828 for:鏍¢獙楠岃瘉鐮�
-		
+
 		//1. 鏍¢獙鐢ㄦ埛鏄惁鏈夋晥
 		//update-begin-author:wangshuai date:20200601 for: 鐧诲綍浠g爜楠岃瘉鐢ㄦ埛鏄惁娉ㄩ攢bug锛宨f鏉′欢姘歌繙涓篺alse
 		LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
@@ -119,10 +120,51 @@
 		String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());
 		String syspassword = sysUser.getPassword();
 		if (!syspassword.equals(userpassword)) {
-			result.error500("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
+			// 鑾峰彇鐢ㄦ埛澶辫触鏈�澶ф鏁�
+			//Integer maxAttempts = CommonConstant.MAX_ATTEMPTS;
+			List<DictModel> dictModels = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_MAX_ATTEMPTS);
+			if (dictModels != null && !dictModels.isEmpty()) {
+				Integer maxAttempts = Integer.valueOf(dictModels.get(0).getValue());
+				if (redisUtil.hasKey(CommonConstant.PREFIX_LOGIN_COUNT + username)) {
+					Integer loginCount = (Integer) redisUtil.get(CommonConstant.PREFIX_LOGIN_COUNT + username) + 1;
+					if (loginCount < maxAttempts) {
+						result.error500("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒锛岃閲嶆柊灏濊瘯銆傚墿浣欏皾璇曟鏁帮細" + (maxAttempts - loginCount));
+						redisUtil.set(CommonConstant.PREFIX_LOGIN_COUNT + username, loginCount + 1, 300);
+					} else if (loginCount.equals(maxAttempts)) {
+						// 瓒呰繃鏈�澶х櫥褰曟鏁� 閿佸畾鐢ㄦ埛
+						//sysUserService.update(new SysUser().setStatus(CommonConstant.USER_FREEZE), new UpdateWrapper<SysUser>().lambda().eq(SysUser::getUsername, username));
+						// 鑾峰彇鐢ㄦ埛澶辫触閿佸畾鏃堕暱
+						List<DictModel> dictModelList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_USER_FREEZE);
+						if (dictModelList != null && !dictModelList.isEmpty()) {
+							Integer userFreezeTime = Integer.valueOf(dictModelList.get(0).getValue());
+							redisUtil.set(CommonConstant.PREFIX_LOGIN_COUNT + username, loginCount + 1, userFreezeTime * 60);
+							result.error500("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒锛屽凡鍒拌揪鏈�澶у皾璇曟鏁帮紝璇风◢鍚庡皾璇曪紒");
+						} else {
+							//淇敼鏁版嵁搴撻攣瀹氱敤鎴�
+							sysUserService.update(new SysUser().setStatus(CommonConstant.USER_FREEZE), new UpdateWrapper<SysUser>().lambda().eq(SysUser::getUsername, username));
+							//鍒犻櫎redis淇℃伅
+							redisUtil.del(CommonConstant.PREFIX_LOGIN_COUNT + username);
+							result.error500("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒锛屽凡鍒拌揪鏈�澶у皾璇曟鏁帮紝璇疯仈绯荤鐞嗗憳瑙i攣锛�");
+						}
+
+					} else {
+						result.error500("鎮ㄧ殑璐︽埛宸查攣瀹氾紝璇风◢鍚庡皾璇曪紒");
+					}
+				} else {
+					redisUtil.set(CommonConstant.PREFIX_LOGIN_COUNT + username, 1, 300);
+					result.error500("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒锛岃閲嶆柊灏濊瘯銆傚墿浣欏皾璇曟鏁帮細" + (maxAttempts - 1));
+				}
+			}
+
+
+			//result.error500("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
 			return result;
+		} else {
+			if (redisUtil.hasKey(CommonConstant.PREFIX_LOGIN_COUNT + username)) {
+				redisUtil.del(CommonConstant.PREFIX_LOGIN_COUNT + username);
+			}
 		}
-				
+
 		//鐢ㄦ埛鐧诲綍淇℃伅
 		userInfo(sysUser, result);
 		//update-begin--Author:liusq  Date:20210126  for锛氱櫥褰曟垚鍔燂紝鍒犻櫎redis涓殑楠岃瘉鐮�
@@ -161,7 +203,7 @@
 			}
 			//update-begin---author:liusq ---date:2022-06-29  for锛氭帴鍙h繑鍥炲�间慨鏀癸紝鍚屾淇敼杩欓噷鐨勫垽鏂�昏緫-----------
 			//update-end---author:scott ---date::2022-06-20  for锛歷ue3鍓嶇锛屾敮鎸佽嚜瀹氫箟棣栭〉--------------
-			
+
 			obj.put("userInfo",sysUser);
 			obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
 			result.setResult(obj);
@@ -170,7 +212,7 @@
 		return result;
 
 	}
-	
+
 	/**
 	 * 閫�鍑虹櫥褰�
 	 * @param request
@@ -204,7 +246,7 @@
 	    	return Result.error("Token鏃犳晥!");
 	    }
 	}
-	
+
 	/**
 	 * 鑾峰彇璁块棶閲�
 	 * @return
@@ -235,7 +277,7 @@
 		result.success("鐧诲綍鎴愬姛");
 		return result;
 	}
-	
+
 	/**
 	 * 鑾峰彇璁块棶閲�
 	 * @return
@@ -256,8 +298,8 @@
 		result.setResult(oConvertUtils.toLowerCasePageList(list));
 		return result;
 	}
-	
-	
+
+
 	/**
 	 * 鐧婚檰鎴愬姛閫夋嫨鐢ㄦ埛褰撳墠閮ㄩ棬
 	 * @param user
@@ -282,7 +324,7 @@
 
 	/**
 	 * 鐭俊鐧诲綍鎺ュ彛
-	 * 
+	 *
 	 * @param jsonObject
 	 * @return
 	 */
@@ -298,12 +340,12 @@
 			result.setSuccess(false);
 			return result;
 		}
-		
+
 		//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906
 		String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+mobile;
 		Object object = redisUtil.get(redisKey);
 		//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906
-		
+
 		if (object != null) {
 			result.setMessage("楠岃瘉鐮�10鍒嗛挓鍐咃紝浠嶇劧鏈夋晥锛�");
 			result.setSuccess(false);
@@ -337,7 +379,7 @@
 					}
 					return result;
 				}
-				
+
 				/**
 				 * smsmode 鐭俊妯℃澘鏂瑰紡  0 .鐧诲綍妯℃澘銆�1.娉ㄥ唽妯℃澘銆�2.蹇樿瀵嗙爜妯℃澘
 				 */
@@ -355,12 +397,12 @@
 				result.setSuccess(false);
 				return result;
 			}
-			
+
 			//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906
 			//楠岃瘉鐮�10鍒嗛挓鍐呮湁鏁�
 			redisUtil.set(redisKey, captcha, 600);
 			//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906
-			
+
 			//update-begin--Author:scott  Date:20190812 for锛歩ssues#391
 			//result.setResult(captcha);
 			//update-end--Author:scott  Date:20190812 for锛歩ssues#391
@@ -373,11 +415,11 @@
 		}
 		return result;
 	}
-	
+
 
 	/**
 	 * 鎵嬫満鍙风櫥褰曟帴鍙�
-	 * 
+	 *
 	 * @param jsonObject
 	 * @return
 	 */
@@ -386,14 +428,14 @@
 	public Result<JSONObject> phoneLogin(@RequestBody JSONObject jsonObject) {
 		Result<JSONObject> result = new Result<JSONObject>();
 		String phone = jsonObject.getString("mobile");
-		
+
 		//鏍¢獙鐢ㄦ埛鏈夋晥鎬�
 		SysUser sysUser = sysUserService.getUserByPhone(phone);
 		result = sysUserService.checkUserIsEffective(sysUser);
 		if(!result.isSuccess()) {
 			return result;
 		}
-		
+
 		String smscode = jsonObject.getString("captcha");
 
 		//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906
@@ -429,9 +471,16 @@
 
 		// 鐢熸垚token
 		String token = JwtUtil.sign(username, syspassword);
+		// 鑾峰彇token缂撳瓨鏈夋晥鏃堕棿
+		Integer expireTime = CommonConstant.TOKEN_EXPIRE_TIME;
+		List<DictModel> dictModels = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_TOKEN_EXPIRE_TIME);
+		if (dictModels != null && !dictModels.isEmpty()) {
+			expireTime = Integer.valueOf(dictModels.get(0).getValue());
+		}
 		// 璁剧疆token缂撳瓨鏈夋晥鏃堕棿
-		redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
-		redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
+		redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token, (long) (expireTime + 1) * 60 * 60);
+
+		//redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, );
 		obj.put("token", token);
 
 		// update-begin--Author:sunjianlei Date:20210802 for锛氳幏鍙栫敤鎴风鎴蜂俊鎭�
@@ -505,13 +554,13 @@
 			String code = RandomUtil.randomString(BASE_CHECK_CODES,4);
 			//瀛樺埌redis涓�
 			String lowerCaseCode = code.toLowerCase();
-			
+
 			//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906
 			// 鍔犲叆瀵嗛挜浣滀负娣锋穯锛岄伩鍏嶇畝鍗曠殑鎷兼帴锛岃澶栭儴鍒╃敤锛岀敤鎴疯嚜瀹氫箟璇ュ瘑閽ュ嵆鍙�
 			String origin = lowerCaseCode+key+jeecgBaseConfig.getSignatureSecret();
 			String realKey = Md5Util.md5Encode(origin, "utf-8");
 			//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906
-            
+
 			redisUtil.set(realKey, lowerCaseCode, 60);
 			log.info("鑾峰彇楠岃瘉鐮侊紝Redis key = {}锛宑heckCode = {}", realKey, code);
 			//杩斿洖鍓嶇
@@ -535,7 +584,7 @@
 		sysPermissionService.switchVue3Menu();
 		return res;
 	}
-	
+
 	/**
 	 * app鐧诲綍
 	 * @param sysLoginModel
@@ -547,14 +596,14 @@
 		Result<JSONObject> result = new Result<JSONObject>();
 		String username = sysLoginModel.getUsername();
 		String password = sysLoginModel.getPassword();
-		
+
 		//1. 鏍¢獙鐢ㄦ埛鏄惁鏈夋晥
 		SysUser sysUser = sysUserService.getUserByName(username);
 		result = sysUserService.checkUserIsEffective(sysUser);
 		if(!result.isSuccess()) {
 			return result;
 		}
-		
+
 		//2. 鏍¢獙鐢ㄦ埛鍚嶆垨瀵嗙爜鏄惁姝g‘
 		String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());
 		String syspassword = sysUser.getPassword();
@@ -562,7 +611,7 @@
 			result.error500("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
 			return result;
 		}
-		
+
 		String orgCode = sysUser.getOrgCode();
 		if(oConvertUtils.isEmpty(orgCode)) {
 			//濡傛灉褰撳墠鐢ㄦ埛鏃犻�夋嫨閮ㄩ棬 鏌ョ湅閮ㄩ棬鍏宠仈淇℃伅
@@ -581,7 +630,7 @@
 		JSONObject obj = new JSONObject();
 		//鐢ㄦ埛鐧诲綍淇℃伅
 		obj.put("userInfo", sysUser);
-		
+
 		// 鐢熸垚token
 		String token = JwtUtil.sign(username, syspassword);
 		// 璁剧疆瓒呮椂鏃堕棿
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
index 058a528..87c3052 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
@@ -179,6 +179,8 @@
         try {
             SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class);
             user.setCreateTime(new Date());//璁剧疆鍒涘缓鏃堕棿
+            user.setPasswordTime(new Date());//璁剧疆瀵嗙爜鏃堕棿
+            user.setPasswordFlag(CommonConstant.DEL_FLAG_1);//璁剧疆瀵嗙爜棣栨鏍囪瘑
             String salt = oConvertUtils.randomGen(8);
             user.setSalt(salt);
             String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), salt);
@@ -638,17 +640,17 @@
         String oldpassword = json.getString("oldpassword");
         String password = json.getString("password");
         String confirmpassword = json.getString("confirmpassword");
-        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        if (!sysUser.getUsername().equals(username)) {
-            return Result.error("鍙厑璁镐慨鏀硅嚜宸辩殑瀵嗙爜锛�");
-        }
+        //LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        //if (!sysUser.getUsername().equals(username)) {
+        //    return Result.error("鍙厑璁镐慨鏀硅嚜宸辩殑瀵嗙爜锛�");
+        //}
         SysUser user = this.sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username));
         if (user == null) {
             return Result.error("鐢ㄦ埛涓嶅瓨鍦紒");
         }
         //update-begin---author:wangshuai ---date:20220316  for锛歔VUEN-234]淇敼瀵嗙爜娣诲姞鏁忔劅鏃ュ織------------
-        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        baseCommonService.addLog("淇敼瀵嗙爜锛寀sername锛� " + loginUser.getUsername(), CommonConstant.LOG_TYPE_2, 2);
+        //LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        baseCommonService.addLog("淇敼瀵嗙爜锛寀sername锛� " + username, CommonConstant.LOG_TYPE_2, 2);
         //update-end---author:wangshuai ---date:20220316  for锛歔VUEN-234]淇敼瀵嗙爜娣诲姞鏁忔劅鏃ュ織------------
         return sysUserService.resetPassword(username, oldpassword, password, confirmpassword);
     }
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 d5ac493..4e6f1cd 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
@@ -198,5 +198,15 @@
     @Dict(dicCode = "id",dictTable = "mom_base_team",dicText = "name")
     private String teamId;
 
+    /**
+     * 瀵嗙爜棣栨浣跨敤鏍囪瘑 1鏄� 0鍚�
+     */
+    private Integer passwordFlag;
+
+    /**
+     * 瀵嗙爜鏇存柊鏃堕棿
+     */
+    private Date passwordTime;
+
 
 }
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 d466081..9028b88 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
@@ -11,8 +11,10 @@
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.constant.enums.RoleIndexConfigEnum;
 import org.jeecg.common.desensitization.annotation.SensitiveEncode;
+import org.jeecg.common.system.vo.DictModel;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.system.vo.SysUserCacheInfo;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.PasswordUtil;
 import org.jeecg.common.util.UUIDGenerator;
 import org.jeecg.common.util.oConvertUtils;
@@ -20,6 +22,7 @@
 import org.jeecg.modules.system.entity.*;
 import org.jeecg.modules.system.mapper.*;
 import org.jeecg.modules.system.model.SysUserSysDepartModel;
+import org.jeecg.modules.system.service.ISysDictService;
 import org.jeecg.modules.system.service.ISysUserService;
 import org.jeecg.modules.system.vo.MdcUserProVo;
 import org.jeecg.modules.system.vo.SysUserDepVo;
@@ -74,6 +77,8 @@
 	SysRoleIndexMapper sysRoleIndexMapper;
 	@Resource
 	MdcUserProductionMapper mdcUserProductionMapper;
+	@Resource
+	private ISysDictService sysDictService;
 
     @Override
     @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true)
@@ -89,8 +94,12 @@
         if (!newpassword.equals(confirmpassword)) {
             return Result.error("涓ゆ杈撳叆瀵嗙爜涓嶄竴鑷�!");
         }
+		//璁剧疆瀵嗙爜鏇存柊鏃堕棿
+		//sysUser.setPasswordTime(new Date());
+		//璁剧疆瀵嗙爜棣栨鐧诲綍澶辨晥
+		//sysUser.setPasswordFlag(CommonConstant.DEL_FLAG_0);
         String password = PasswordUtil.encrypt(username, newpassword, user.getSalt());
-        this.userMapper.update(new SysUser().setPassword(password), new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, user.getId()));
+        this.userMapper.update(new SysUser().setPassword(password).setPasswordTime(new Date()).setPasswordFlag(CommonConstant.DEL_FLAG_0), new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, user.getId()));
         return Result.ok("瀵嗙爜閲嶇疆鎴愬姛!");
     }
 
@@ -99,6 +108,8 @@
     public Result<?> changePassword(SysUser sysUser) {
         String salt = oConvertUtils.randomGen(8);
         sysUser.setSalt(salt);
+		//璁剧疆瀵嗙爜鏇存柊鏃堕棿
+		sysUser.setPasswordTime(new Date());
         String password = sysUser.getPassword();
         String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);
         sysUser.setPassword(passwordEncode);
@@ -442,6 +453,32 @@
 			result.error500("璇ョ敤鎴峰凡鍐荤粨");
 			return result;
 		}
+		//鎯呭喌4锛氭牴鎹敤鎴蜂俊鎭煡璇紝璇ョ敤鎴峰瘑鐮佺郴棣栨浣跨敤锛岄渶淇敼瀵嗙爜
+		List<DictModel> dictList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_USER_FIRST_LOGIN);
+		if (dictList != null && !dictList.isEmpty()) {
+			if (CommonConstant.DEL_FLAG_1.equals(Integer.valueOf(dictList.get(0).getValue())) && CommonConstant.DEL_FLAG_1.equals(sysUser.getPasswordFlag())) {
+				baseCommonService.addLog("鐢ㄦ埛鐧诲綍澶辫触锛岀敤鎴峰悕:" + sysUser.getUsername() + "绯婚娆$櫥褰曠郴缁燂紝璇烽噸缃瘑鐮侊紒", CommonConstant.LOG_TYPE_1, null);
+				result.setCode(5001);
+				result.setMessage("鐢ㄦ埛瀵嗙爜绯婚粯璁ゅ瘑鐮侊紝闇�閲嶇疆瀵嗙爜鍚庨噸鏂扮櫥褰曞瘑鐮侊紒");
+				result.setSuccess(false);
+				return result;
+			}
+		}
+		//鎯呭喌5锛氭牴鎹敤鎴蜂俊鎭煡璇紝璇ョ敤鎴峰瘑鐮佹槸鍚﹀凡杩囨洿鏀瑰懆鏈�
+		Date passwordTime = sysUser.getPasswordTime();
+		//Integer passwordExpirationPeriod = CommonConstant.PASSWORD_EXPIRATION_PERIOD;
+		List<DictModel> dictModelList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_PASSWORD_EXPIRATION);
+		if (dictModelList != null && !dictModelList.isEmpty()) {
+			Integer passwordExpirationPeriod = Integer.valueOf(dictModelList.get(0).getValue());
+			Date dayAfter = DateUtils.getDayAfter(passwordTime, passwordExpirationPeriod);
+			if (new Date().after(dayAfter)) {
+				baseCommonService.addLog("鐢ㄦ埛鐧诲綍澶辫触锛岀敤鎴峰悕:" + sysUser.getUsername() + "瀵嗙爜宸茶繃鏈夋晥鏈燂紝璇烽噸缃瘑鐮侊紒", CommonConstant.LOG_TYPE_1, null);
+				result.setCode(5002);
+				result.setMessage("鐢ㄦ埛瀵嗙爜宸茶繃鏈夋晥鏈燂紝璇烽噸缃瘑鐮侊紒");
+				result.setSuccess(false);
+				return result;
+			}
+		}
 		return result;
 	}
 

--
Gitblit v1.9.3