From dd890a133f35b4b21ed00ec557ca83f733ff04dc Mon Sep 17 00:00:00 2001
From: lyh <925863403@qq.com>
Date: 星期三, 03 九月 2025 18:03:24 +0800
Subject: [PATCH] 实现二保三保规范一个Word文档中包含多个保养内容(即多个设备)导入

---
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java | 1978 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 1,365 insertions(+), 613 deletions(-)

diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java
index 06054ef..f7a0afa 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java
@@ -5,11 +5,13 @@
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jeecg.weibo.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xwpf.usermodel.*;
@@ -20,10 +22,6 @@
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.vo.LoginUser;
-import org.jeecg.modules.system.entity.BaseFactory;
-import org.jeecg.modules.system.entity.BaseFactoryUser;
-import org.jeecg.modules.system.service.IBaseFactoryService;
-import org.jeecg.modules.system.service.IBaseFactoryUserService;
 import org.jeecg.modules.eam.constant.BusinessCodeConst;
 import org.jeecg.modules.eam.constant.EamMaintenanceStandardDetailCategory;
 import org.jeecg.modules.eam.constant.MaintenanceStandardStatusEnum;
@@ -38,16 +36,21 @@
 import org.jeecg.modules.eam.service.IEamEquipmentService;
 import org.jeecg.modules.eam.service.IEamMaintenanceStandardDetailService;
 import org.jeecg.modules.eam.service.IEamMaintenanceStandardService;
-import org.jeecg.modules.eam.vo.*;
+import org.jeecg.modules.eam.vo.EamMaintenanceStandardVo;
 import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
 import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
 import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
 import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
 import org.jeecg.modules.flowable.service.IFlowDefinitionService;
 import org.jeecg.modules.flowable.service.IFlowTaskService;
-import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
-import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.entity.BaseFactory;
+import org.jeecg.modules.system.entity.BaseFactoryUser;
+import org.jeecg.modules.system.entity.SysParams;
+import org.jeecg.modules.system.service.*;
 import org.jeecg.modules.system.vo.UserSelector;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -65,11 +68,12 @@
 /**
  * @Description: 淇濆吇鏍囧噯
  * @Author: jeecg-boot
- * @Date:   2025-03-26
+ * @Date: 2025-03-26
  * @Version: V1.0
  */
 @Service("IEamMaintenanceStandardService")
-public class EamMaintenanceStandardServiceImpl extends ServiceImpl<EamMaintenanceStandardMapper, EamMaintenanceStandard> implements IEamMaintenanceStandardService , FlowCallBackServiceI {
+@Slf4j
+public class EamMaintenanceStandardServiceImpl extends ServiceImpl<EamMaintenanceStandardMapper, EamMaintenanceStandard> implements IEamMaintenanceStandardService, FlowCallBackServiceI {
 
     @Resource
     private EamMaintenanceStandardMapper eamMaintenanceStandardMapper;
@@ -97,6 +101,8 @@
     private IEamEquipmentExtendService eamEquipmentExtendService;
     @Autowired
     private ISysBusinessCodeRuleService businessCodeRuleService;
+    @Autowired
+    private ISysParamsService sysParamsService;
 
     // 甯搁噺瀹氫箟
     private static final String REPAIR_TITLE = "缁翠慨浜哄憳淇濆吇鍐呭";
@@ -124,43 +130,45 @@
             queryWrapper.in("e.equipment_code", equipArr);
         } else {
             //娌℃湁閫夋嫨璁惧锛屾牴鎹腑蹇冭繃婊よ澶�
-            List<BaseFactoryUser> baseFactoryUserList=baseFactoryUserService.
-                    list(new LambdaQueryWrapper<BaseFactoryUser>().eq(BaseFactoryUser::getUserId,sysUser.getId()));
-            if(!CollectionUtils.isEmpty(baseFactoryUserList)){
-                List<String> factoryIds = baseFactoryUserList.stream().map(BaseFactoryUser::getFactoryId).collect(Collectors.toList());
-                List<String> factoryCode= baseFactoryService.listByIds(factoryIds).stream().map(BaseFactory::getFactoryCode).collect(Collectors.toList());
+            List<BaseFactoryUser> baseFactoryUserList = baseFactoryUserService.
+                    list(new LambdaQueryWrapper<BaseFactoryUser>().eq(BaseFactoryUser::getUserId, sysUser.getId()));
+            if (!CollectionUtils.isEmpty(baseFactoryUserList)) {
+                Set<String> factoryIds = baseFactoryUserList.stream().map(BaseFactoryUser::getFactoryId).collect(Collectors.toSet());
+                Set<String> factoryCode = baseFactoryService.listByIds(factoryIds).stream().map(BaseFactory::getOrgCode).collect(Collectors.toSet());
                 queryWrapper.in("e.factory_org_code", factoryCode);
+            } else {
+                return page;
             }
         }
-        if(eamMaintenanceStandard != null) {
+        if (eamMaintenanceStandard != null) {
             //缂栫爜 妯$硦鏌ヨ
-            if(StringUtils.isNotBlank(eamMaintenanceStandard.getStandardCode())) {
+            if (StringUtils.isNotBlank(eamMaintenanceStandard.getStandardCode())) {
                 queryWrapper.like("ems.standard_code", eamMaintenanceStandard.getStandardCode());
             }
             //鍚嶇О 妯$硦鏌ヨ
-            if(StringUtils.isNotBlank(eamMaintenanceStandard.getStandardName())) {
+            if (StringUtils.isNotBlank(eamMaintenanceStandard.getStandardName())) {
                 queryWrapper.like("ems.standard_name", eamMaintenanceStandard.getStandardName());
             }
             //璁惧
-            if(StringUtils.isNotBlank(eamMaintenanceStandard.getEquipmentId())) {
+            if (StringUtils.isNotBlank(eamMaintenanceStandard.getEquipmentId())) {
                 queryWrapper.eq("ems.equipment_id", eamMaintenanceStandard.getEquipmentId());
             }
             //淇濆吇鍒嗙被
-            if(StringUtils.isNotBlank(eamMaintenanceStandard.getMaintenanceCategory())) {
+            if (StringUtils.isNotBlank(eamMaintenanceStandard.getMaintenanceCategory())) {
                 queryWrapper.eq("ems.maintenance_category", eamMaintenanceStandard.getMaintenanceCategory());
             }
             //淇濆吇鍒嗙被
-            if(StringUtils.isNotBlank(eamMaintenanceStandard.getStandardStatus())) {
+            if (StringUtils.isNotBlank(eamMaintenanceStandard.getStandardStatus())) {
                 queryWrapper.eq("ems.standard_status", eamMaintenanceStandard.getStandardStatus());
             }
             //璁惧缂栫爜
-            if(StringUtils.isNotBlank(eamMaintenanceStandard.getKeyword())) {
+            if (StringUtils.isNotBlank(eamMaintenanceStandard.getKeyword())) {
                 queryWrapper.and(wrapper -> wrapper.like("e.equipment_name", eamMaintenanceStandard.getKeyword())
                         .or()
                         .like("e.equipment_code", eamMaintenanceStandard.getKeyword()));
             }
             //id
-            if(StringUtils.isNotBlank(eamMaintenanceStandard.getId())) {
+            if (StringUtils.isNotBlank(eamMaintenanceStandard.getId())) {
                 queryWrapper.eq("ems.id", eamMaintenanceStandard.getId());
             }
         }
@@ -175,19 +183,19 @@
         BeanUtils.copyProperties(standardRequest, entity);
         entity.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
         //鐗堟湰閫掑
-        entity.setStandardVersion("v"+CommonConstant.OPERATE_TYPE_1);
+        entity.setStandardVersion("v" + CommonConstant.OPERATE_TYPE_1);
         //璁惧澶勭悊
         entity.setEquipmentId(standardRequest.getEquipmentId());
         //鍒犻櫎鏍囪
         entity.setDelFlag(CommonConstant.DEL_FLAG_0);
         //閲嶅鎬ф牎楠�
-        EamMaintenanceStandard exist = checkDuplicate(entity.getEquipmentId(), entity.getMaintenanceCategory());
-        if(exist != null){
+        EamMaintenanceStandard exist = checkDuplicate(entity.getEquipmentId(), entity.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name());
+        if (exist != null) {
             throw new JeecgBootException("璁惧鏍囧噯宸插瓨鍦紝涓嶈兘閲嶅娣诲姞锛�");
         }
         eamMaintenanceStandardMapper.insert(entity);
         //澶勭悊鏄庣粏鏁版嵁
-        if(CollectionUtil.isNotEmpty(standardRequest.getTableDetailList())) {
+        if (CollectionUtil.isNotEmpty(standardRequest.getTableDetailList())) {
             standardRequest.getTableDetailList().forEach(tableDetail -> {
                 tableDetail.setStandardId(entity.getId());
             });
@@ -200,7 +208,7 @@
     @Transactional(rollbackFor = Exception.class)
     public boolean editMaintenanceStandard(EamMaintenanceStandardRequest standardRequest) {
         EamMaintenanceStandard entity = eamMaintenanceStandardMapper.selectById(standardRequest.getId());
-        if(entity == null){
+        if (entity == null) {
             throw new JeecgBootException("缂栬緫鐨勬暟鎹凡鍒犻櫎锛岃鍒锋柊閲嶈瘯锛�");
         }
         entity.setStandardName(standardRequest.getStandardName());
@@ -209,25 +217,17 @@
         //澶勭悊璇︽儏
         if(CollectionUtil.isNotEmpty(standardRequest.getTableDetailList())) {
             List<EamMaintenanceStandardDetail> addList = new ArrayList<>();
-            List<EamMaintenanceStandardDetail> updateList = new ArrayList<>();
+            //鍏堝垹闄ゅ師鏈�
+            LambdaQueryWrapper<EamMaintenanceStandardDetail> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(EamMaintenanceStandardDetail::getStandardId, standardRequest.getId());
+            eamMaintenanceStandardDetailService.remove(queryWrapper);
             standardRequest.getTableDetailList().forEach(tableDetail -> {
-                tableDetail.setStandardId(entity.getId());
-                if(tableDetail.getId() == null){
-                    addList.add(tableDetail);
-                }else {
-                    updateList.add(tableDetail);
-                }
+                EamMaintenanceStandardDetail eamMaintenanceStandardDetail=new EamMaintenanceStandardDetail();
+                BeanUtils.copyProperties(tableDetail, eamMaintenanceStandardDetail);
+                eamMaintenanceStandardDetail.setStandardId(entity.getId());
+                addList.add(eamMaintenanceStandardDetail);
             });
-            if(CollectionUtil.isNotEmpty(addList)){
-                eamMaintenanceStandardDetailService.saveBatch(addList);
-            }
-            if(CollectionUtil.isNotEmpty(updateList)){
-                eamMaintenanceStandardDetailService.updateBatchById(updateList);
-            }
-        }
-        if(CollectionUtil.isNotEmpty(standardRequest.getRemoveDetailList())) {
-            List<String> ids = standardRequest.getRemoveDetailList().stream().map(EamMaintenanceStandardDetail::getId).collect(Collectors.toList());
-            eamMaintenanceStandardDetailService.removeBatchByIds(ids);
+            eamMaintenanceStandardDetailService.saveBatch(addList);
         }
         return true;
     }
@@ -236,7 +236,7 @@
     @Transactional(rollbackFor = Exception.class)
     public boolean upgradeMaintenanceStandard(EamMaintenanceStandardRequest standardRequest) {
         EamMaintenanceStandard entity = eamMaintenanceStandardMapper.selectById(standardRequest.getId());
-        if(entity == null){
+        if (entity == null) {
             throw new JeecgBootException("缂栬緫鐨勬暟鎹凡鍒犻櫎锛岃鍒锋柊閲嶈瘯锛�");
         }
 
@@ -256,7 +256,7 @@
         if (matcher.find()) {
             try {
                 int mainVersion = Integer.parseInt(matcher.group(1));
-                newEntity.setStandardVersion("v"+(mainVersion+1));
+                newEntity.setStandardVersion("v" + (mainVersion + 1));
             } catch (NumberFormatException ignored) {
             }
         }
@@ -265,13 +265,13 @@
         //鍒犻櫎鏍囪
         newEntity.setDelFlag(CommonConstant.DEL_FLAG_0);
         //閲嶅鎬ф牎楠�
-        EamMaintenanceStandard exist = checkDuplicate(newEntity.getEquipmentId(), newEntity.getMaintenanceCategory());
-        if(exist != null){
+        EamMaintenanceStandard exist = checkDuplicate(newEntity.getEquipmentId(), newEntity.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name());
+        if (exist != null) {
             throw new JeecgBootException("璁惧鏍囧噯宸插瓨鍦紝涓嶈兘閲嶅娣诲姞锛�");
         }
         eamMaintenanceStandardMapper.insert(newEntity);
         //澶勭悊鏄庣粏鏁版嵁
-        if(CollectionUtil.isNotEmpty(standardRequest.getTableDetailList())) {
+        if (CollectionUtil.isNotEmpty(standardRequest.getTableDetailList())) {
             standardRequest.getTableDetailList().forEach(tableDetail -> {
                 tableDetail.setId(null);
                 tableDetail.setCreateBy(null);
@@ -286,16 +286,17 @@
     }
 
     @Override
-    public EamMaintenanceStandard checkDuplicate(String equipmentId, String maintenanceCategory) {
+    public EamMaintenanceStandard checkDuplicate(String equipmentId, String maintenanceCategory, String standardStatus) {
         LambdaQueryWrapper<EamMaintenanceStandard> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(EamMaintenanceStandard::getEquipmentId, equipmentId);
         queryWrapper.eq(EamMaintenanceStandard::getMaintenanceCategory, maintenanceCategory);
         queryWrapper.eq(EamMaintenanceStandard::getDelFlag, CommonConstant.DEL_FLAG_0);
-        queryWrapper.eq(EamMaintenanceStandard::getStandardStatus, MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
+        queryWrapper.ne(EamMaintenanceStandard::getStandardStatus, standardStatus);
+        queryWrapper.ne(EamMaintenanceStandard::getStandardStatus,MaintenanceStandardStatusEnum.START.name());
         queryWrapper.orderByDesc(EamMaintenanceStandard::getStandardVersion);
 
         List<EamMaintenanceStandard> list = eamMaintenanceStandardMapper.selectList(queryWrapper);
-        if(CollectionUtil.isEmpty(list)) {
+        if (CollectionUtil.isEmpty(list)) {
             return null;
         }
         return list.get(0);
@@ -303,12 +304,13 @@
 
     /**
      * 鏌ヨ鏍囧噯鍒楄〃-鍓嶇灞曠ず璇ョ敤鎴锋嫢鏈夌殑鏍囧噯
-     * @param keyword 璁惧缂栧彿
+     *
+     * @param keyword             璁惧缂栧彿
      * @param maintenanceCategory 淇濆吇绫诲瀷
      * @return
      */
     @Override
-    public List<EamMaintenanceStandard> queryListByKeywordAndCategory(String keyword, String equipmentId, Integer pageSize, String maintenanceCategory){
+    public List<EamMaintenanceStandard> queryListByKeywordAndCategory(String keyword, String equipmentId, Integer pageSize, String maintenanceCategory) {
         Page<EamMaintenanceStandard> page = new Page<EamMaintenanceStandard>(1, pageSize);
         EamMaintenanceStandard query = new EamMaintenanceStandard();
         query.setEquipmentId(equipmentId);
@@ -328,192 +330,374 @@
         return eamMaintenanceStandardMapper.selectList(queryWrapper);
     }
 
+    @Override
+    public EamMaintenanceStandard queryByEquipmentIdAndCategory(String equipmentId, String maintenanceCategory) {
+        LambdaQueryWrapper<EamMaintenanceStandard> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(EamMaintenanceStandard::getDelFlag, CommonConstant.DEL_FLAG_0);
+        queryWrapper.eq(EamMaintenanceStandard::getMaintenanceCategory, maintenanceCategory);
+        queryWrapper.eq(EamMaintenanceStandard::getStandardStatus, MaintenanceStandardStatusEnum.START.name());
+        queryWrapper.eq(EamMaintenanceStandard::getEquipmentId, equipmentId);
+        return eamMaintenanceStandardMapper.selectOne(queryWrapper);
+    }
+
 
     /*娴佺▼涓氬姟浠g爜--------------------------寮�濮�*/
 
-    /**
-     * 娴佺▼鍚姩,淇濆瓨瀵瑰簲鐨勬暟鎹�
-     * @param id
-     * @return
-     */
     @Override
-    public Result<?> saveEamMaintenanceStandardProcess(String id){
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        EamMaintenanceStandard maintenanceStandard=this.getById(id);
-        if (maintenanceStandard==null){
-            return Result.error("鏈壘鍒板搴斾繚鍏绘爣鍑�");
+    @Transactional(rollbackFor = Exception.class)
+    public Result<?> saveEamMaintenanceStandardProcess(String id) {
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+        LoginUser currentUser = getCurrentUser();
+
+        // 鏍¢獙淇濆吇鏍囧噯鏄惁瀛樺湪
+        EamMaintenanceStandard maintenanceStandard = validateStandardExistence(id);
+
+        // 鏍¢獙鍏宠仈璁惧鏄惁瀛樺湪
+        EamEquipment equipment = validateEquipmentExistence(maintenanceStandard.getEquipmentId());
+
+        // 妫�鏌ユ槸鍚︽槸椹冲洖鍚庨噸鏂版彁浜ょ殑娴佺▼
+        FlowMyBusiness flowBusiness = flowMyBusinessService.selectByDataId(maintenanceStandard.getId());
+
+        if (isReSubmitScenario(flowBusiness)) {
+            return handleReSubmitScenario(maintenanceStandard, equipment, currentUser, flowBusiness);
         }
-        System.out.println("淇濆吇瑙勮寖娴佺▼锛�" + maintenanceStandard.getId());
-        flowCommonService.initActBusiness(maintenanceStandard.getStandardName()+"瑙勮寖杩涜娴佺▼瀹℃牳",
-                maintenanceStandard.getId(), "IEamMaintenanceStandardService", "eam_maintenance_standard", null);
-        Map<String, Object> variables = new HashMap<>();
-        variables.put("dataId", maintenanceStandard.getId());
-        variables.put("organization", "淇濆吇瑙勮寖鍚姩娴佺▼");
-        variables.put("comment", "淇濆吇瑙勮寖鍚姩娴佺▼");
-        variables.put("proofreading",true);
-        Result result= flowDefinitionService.startProcessInstanceByKey("eam_maintenance_standard", variables);
-        if (!result.isSuccess()) {
-            super.removeById(maintenanceStandard.getId());
-        }else {
-            maintenanceStandard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_REPAIR_DIRECTOR.name());
-            maintenanceStandard.setDesigner(user.getUsername());
-            maintenanceStandard.setDesignTime(new Date());
-            eamMaintenanceStandardMapper.updateById(maintenanceStandard);
-            //鑾峰彇flow鐨勬祦绋嬪疄渚媔d,璁剧疆涓嬩竴姝ョ殑澶勭悊浜哄憳
-            List<FlowMyBusiness> businessList = flowMyBusinessService.list(
-                    new QueryWrapper<FlowMyBusiness>()
-                            .eq("data_id", maintenanceStandard.getId())
-            );
-            if (businessList.isEmpty()) {
-                return Result.error("娴佺▼璁板綍涓嶅瓨鍦�");
-            }
-            FlowMyBusiness flowMyBusiness = businessList.get(0);
-            EamEquipment eamEquipment=eamEquipmentService.getById(maintenanceStandard.getEquipmentId());
-            BaseFactory baseFactory=baseFactoryService.getOne(new QueryWrapper<BaseFactory>().eq("org_code", eamEquipment.getFactoryOrgCode()));
-            List<UserSelector> userSelectorList=sysUserService.selectOperatorFactoryList(eamEquipment.getEquipmentCode(),baseFactory.getId(), BusinessCodeConst.PCR0008);
-            if (!CollectionUtils.isEmpty(userSelectorList)) {
-                List<String> usernameList=userSelectorList.stream().map(UserSelector::getUsername).collect(Collectors.toList());
-                flowMyBusiness.setTodoUsers(JSON.toJSONString(usernameList));
-                flowMyBusinessService.updateById(flowMyBusiness);
-            }
+
+        // 澶勭悊棣栨鍚姩娴佺▼
+        return handleFirstSubmitScenario(maintenanceStandard, equipment, currentUser);
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁鏄┏鍥炲悗閲嶆柊鎻愪氦鐨勫満鏅�
+     */
+    private boolean isReSubmitScenario(FlowMyBusiness flowBusiness) {
+        return flowBusiness != null &&
+                MaintenanceStandardStatusEnum.WAIT_SUBMIT.name().equals(flowBusiness.getTaskNameId());
+    }
+
+    /**
+     * 澶勭悊椹冲洖鍚庨噸鏂版彁浜ょ殑娴佺▼
+     */
+    private Result<?> handleReSubmitScenario(EamMaintenanceStandard maintenanceStandard,
+                                             EamEquipment equipment,
+                                             LoginUser currentUser,
+                                             FlowMyBusiness flowBusiness) {
+        // 鏇存柊寰呭姙缁翠慨宸�
+        updateTodoMaintenanceWorkers(flowBusiness, equipment);
+
+        // 璁ら浠诲姟
+        claimTaskOrFail(flowBusiness.getTaskId(), currentUser);
+
+        // 鏋勫缓娴佺▼鍙橀噺
+        Map<String, Object> variables = buildProcessVariables(maintenanceStandard.getId(), "淇濆吇瑙勮寖鍐嶆鍚姩娴佺▼");
+
+        // 璁剧疆涓嬩竴绾у鎵逛汉(缁翠慨瀹や富浠�)
+        setNextApprover(variables, equipment, BusinessCodeConst.PCR0008, "缁翠慨瀹や富浠�");
+
+        // 瀹屾垚褰撳墠浠诲姟锛屾帹杩涙祦绋�
+        FlowTaskVo taskVo = buildFlowTaskVo(flowBusiness, maintenanceStandard, variables, "淇濆吇瑙勮寖鍐嶆鍚姩娴佺▼");
+        Result result = flowTaskService.complete(taskVo);
+
+        // 鏇存柊淇濆吇鏍囧噯鐘舵��
+        if (result.isSuccess()) {
+            updateMaintenanceStandardStatus(maintenanceStandard, currentUser, MaintenanceStandardStatusEnum.WAIT_REPAIR_DIRECTOR);
+            return Result.ok("淇濆吇瑙勮寖娴佺▼閲嶅惎鎴愬姛");
         }
+
         return result;
     }
 
     /**
-     * 瀹℃壒鎿嶄綔
-     * @param eamMaintenanceStandardVo
-     * @return
+     * 澶勭悊棣栨鎻愪氦鐨勬祦绋�
+     */
+    private Result<?> handleFirstSubmitScenario(EamMaintenanceStandard maintenanceStandard,
+                                                EamEquipment equipment,
+                                                LoginUser currentUser) {
+        // 鍒濆鍖栨祦绋嬩笟鍔′俊鎭�
+        flowCommonService.initActBusiness(
+                maintenanceStandard.getStandardName() + "瑙勮寖杩涜娴佺▼瀹℃牳",
+                maintenanceStandard.getId(),
+                "IEamMaintenanceStandardService",
+                "eam_maintenance_standard",
+                null
+        );
+
+        // 鏋勫缓娴佺▼鍙橀噺
+        Map<String, Object> variables = buildProcessVariables(maintenanceStandard.getId(), "淇濆吇瑙勮寖鍚姩娴佺▼");
+
+        // 璁剧疆涓嬩竴绾у鎵逛汉(缁翠慨瀹や富浠�)
+        setNextApprover(variables, equipment, BusinessCodeConst.PCR0008, "缁翠慨瀹や富浠�");
+
+        // 鍚姩娴佺▼瀹炰緥
+        Result result = flowDefinitionService.startProcessInstanceByKey("eam_maintenance_standard", variables);
+
+        // 澶勭悊娴佺▼鍚姩缁撴灉
+        if (result.isSuccess()) {
+            updateMaintenanceStandardStatus(maintenanceStandard, currentUser, MaintenanceStandardStatusEnum.WAIT_REPAIR_DIRECTOR);
+            validateFlowBusinessRecord(maintenanceStandard.getId());
+        } else {
+            this.removeById(maintenanceStandard.getId());
+        }
+
+        return result;
+    }
+
+    /**
+            * 瀹℃壒鎿嶄綔
      */
     @Override
-    public Result<?> auditEamMaintenanceStandard(EamMaintenanceStandardVo eamMaintenanceStandardVo){
-        try {
-            // 鍙傛暟鏍¢獙
-            if (StrUtil.isEmpty(eamMaintenanceStandardVo.getTaskId()) || StrUtil.isEmpty(eamMaintenanceStandardVo.getDataId())) {
-                return Result.error("鍙傛暟閿欒");
-            }
-            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-            String userId = user.getId();
-            eamMaintenanceStandardVo.setAssignee(user.getUsername());
-            if (StrUtil.isEmpty(userId)) {
-                return Result.error("鏈壘鍒板搴旂敤鎴�");
-            }
+    @Transactional(rollbackFor = Exception.class)
+    public Result<?> auditEamMaintenanceStandard(EamMaintenanceStandardVo vo) {
+        // 鍩虹鏍¢獙
+        EamMaintenanceStandard standard = validateStandardExistence(vo.getDataId());
+        LoginUser user = getCurrentUser();
+        FlowMyBusiness business = validateFlowBusiness(vo);
+        validateUserAuthorization(business, user);
+        claimTaskOrFail(business.getTaskId(), user);
 
-            // 鏁版嵁鏌ヨ
-            EamMaintenanceStandard eamMaintenanceStandard = this.getById(eamMaintenanceStandardVo.getDataId());
-            if (eamMaintenanceStandard == null) {
-                return Result.error("鏈壘鍒板搴斾繚鍏绘爣鍑�");
-            }
+        // 鍑嗗瀹℃壒鎵�闇�鏁版嵁
+        EamEquipment equipment = validateEquipmentExistence(standard.getEquipmentId());
+        Map<String, Object> variables = new HashMap<>();
 
-            // 2. 鏌ヨ娴佺▼涓氬姟璁板綍锛堝鐞嗙┖缁撴灉锛�
-            List<FlowMyBusiness> businessList = flowMyBusinessService.list(
-                    new QueryWrapper<FlowMyBusiness>()
-                            .eq("process_instance_id", eamMaintenanceStandardVo.getInstanceId())
-            );
-            if (businessList.isEmpty()) {
-                return Result.error("娴佺▼璁板綍涓嶅瓨鍦�");
-            }
-            FlowMyBusiness flowMyBusiness = businessList.get(0);
+        // 鏍规嵁褰撳墠鐘舵�佸鐞嗗鎵�
+        MaintenanceStandardStatusEnum status = MaintenanceStandardStatusEnum.getInstance(standard.getStandardStatus());
+        if (status == null) {
+            throw new JeecgBootException("鏃犳晥鐨勪繚鍏绘爣鍑嗙姸鎬�");
+        }
 
-            // 3. 鏍¢獙鐢ㄦ埛鏄惁涓哄�欓�夊鐞嗕汉
-            List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
-            if (todoUsers == null || !todoUsers.contains(user.getUsername())) {
-                return Result.error("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
-            }
+        switch (status) {
+            case WAIT_REPAIR_DIRECTOR:
+                handleRepairDirectorApproval(vo, standard, equipment, variables);
+                break;
+            case WAIT_TECHNICAL_DIRECTOR:
+                handleTechnicalDirectorApproval(vo, standard, equipment, variables);
+                break;
+            default:
+                throw new JeecgBootException("褰撳墠鐘舵�佷笉鏀寔瀹℃壒鎿嶄綔");
+        }
 
-            // 4. 璁ら浠诲姟锛堝鐞嗗凡琚棰嗙殑鎯呭喌锛�
-            String taskId = flowMyBusiness.getTaskId();
-            Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
-            if (task == null) {
-                return Result.error("浠诲姟涓嶅瓨鍦ㄦ垨宸插畬鎴�");
-            }
-            if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
-                return Result.error("浠诲姟宸茶浠栦汉璁ら");
-            }
-            taskService.claim(taskId, user.getUsername());
+        // 鎻愪氦瀹℃壒缁撴灉
+        submitApprovalResult(vo, standard, variables);
+        return Result.OK("鎿嶄綔鎴愬姛");
+    }
 
-            // 璁剧疆娴佺▼鍙橀噺
-            Map<String, Object> values = setProcessVariables(eamMaintenanceStandard, userId, eamMaintenanceStandardVo);
-            eamMaintenanceStandardVo.setValues(values);
-            eamMaintenanceStandardVo.setComment(values.get("comment").toString());
-            // 瀹屾垚娴佺▼浠诲姟
-            Result result = flowTaskService.complete(eamMaintenanceStandardVo);
-            if (result.isSuccess()) {
-                if (eamMaintenanceStandardVo.getRepairManagerApproveResult() != null) {
-                    if (eamMaintenanceStandardVo.getRepairManagerApproveResult().equals("1")){
-                        List<FlowMyBusiness> newbusinessList = flowMyBusinessService.list(
-                                new QueryWrapper<FlowMyBusiness>()
-                                        .eq("process_instance_id", eamMaintenanceStandardVo.getInstanceId()));
-                        FlowMyBusiness newflowMyBusiness = newbusinessList.get(0);
-                        eamMaintenanceStandard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_TECHNICAL_DIRECTOR.name());
-                        //鑾峰彇flow鐨勬祦绋嬪疄渚媔d,璁剧疆涓嬩竴姝ョ殑澶勭悊浜哄憳
-                        EamMaintenanceStandard maintenanceStandard=this.getById(eamMaintenanceStandardVo.getDataId());
-                        EamEquipment eamEquipment=eamEquipmentService.getById(maintenanceStandard.getEquipmentId());
-                        BaseFactory baseFactory=baseFactoryService.getOne(new QueryWrapper<BaseFactory>().eq("org_code", eamEquipment.getFactoryOrgCode()));
-                        List<UserSelector> userSelectorList=sysUserService.selectOperatorFactoryList(eamEquipment.getEquipmentCode(),baseFactory.getId(), BusinessCodeConst.PCR0009);
-                        if (!CollectionUtils.isEmpty(userSelectorList)) {
-                            List<String> usernameList=userSelectorList.stream().map(UserSelector::getUsername).collect(Collectors.toList());
-                            newflowMyBusiness.setTodoUsers(JSON.toJSONString(usernameList));
-                            flowMyBusinessService.updateById(newflowMyBusiness);
-                        }
-                    }else {
-                        eamMaintenanceStandard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
-                    }
-                    eamMaintenanceStandard.setRepairManager(user.getUsername());
-                    eamMaintenanceStandard.setRepairManagerApproveResult(eamMaintenanceStandardVo.getRepairManagerApproveResult());
-                    eamMaintenanceStandard.setRepairManagerApproveTime(new Date());
-                    eamMaintenanceStandard.setRepairManagerApproveComment(eamMaintenanceStandardVo.getComment());
-                }
-                if (eamMaintenanceStandardVo.getTechnicalManagerApproveResult() != null) {
-                    if (eamMaintenanceStandardVo.getTechnicalManagerApproveResult().equals("1")){
-                        eamMaintenanceStandard.setStandardStatus(MaintenanceStandardStatusEnum.START.name());
-                        //鍒ゆ柇鏄惁杩涜鍗囩増锛岄�氳繃璁惧缂栧彿銆佷繚鍏诲垎绫汇�佺姸鎬佽繘琛岀瓫閫�
-                        EamMaintenanceStandard maintenanceStandard=this.getById(eamMaintenanceStandardVo.getDataId());
-                        QueryWrapper<EamMaintenanceStandard> queryWrapper=new QueryWrapper<>();
-                        queryWrapper.eq("equipment_id", maintenanceStandard.getEquipmentId());
-                        queryWrapper.eq("maintenance_category", maintenanceStandard.getMaintenanceCategory());
-                        queryWrapper.eq("standard_status", MaintenanceStandardStatusEnum.START.name());
-                        List<EamMaintenanceStandard> list=eamMaintenanceStandardMapper.selectList(queryWrapper);
-                        if (!CollectionUtils.isEmpty(list)) {
-                            //浣滃簾鍘熸湁
-                            for (EamMaintenanceStandard eamMaintenanceStandard1 : list) {
-                                eamMaintenanceStandard1.setStandardStatus(MaintenanceStandardStatusEnum.ABOLISH.name());
-                                this.updateById(eamMaintenanceStandard1);
-                            }
-                        }
-                    }else {
-                        eamMaintenanceStandard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
-                    }
-                    eamMaintenanceStandard.setTechnicalManager(user.getUsername());
-                    eamMaintenanceStandard.setTechnicalManagerApproveResult(eamMaintenanceStandardVo.getTechnicalManagerApproveResult());
-                    eamMaintenanceStandard.setTechnicalManagerApproveTime(new Date());
-                    eamMaintenanceStandard.setTechnicalManagerApproveComment(eamMaintenanceStandardVo.getComment());
-                }
-                this.updateById(eamMaintenanceStandard);
-            } else {
-                return result;
-            }
-            return Result.OK("鎿嶄綔鎴愬姛");
-        } catch (Exception e) {
-            return Result.error("鎿嶄綔澶辫触锛�" + e.getMessage());
+
+    private LoginUser getCurrentUser() {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (user == null) {
+            throw new JeecgBootException("鏈幏鍙栧埌鐧诲綍鐢ㄦ埛锛岃閲嶆柊鐧诲綍鍚庡啀璇曪紒");
+        }
+        return user;
+    }
+
+    private EamMaintenanceStandard validateStandardExistence(String id) {
+        EamMaintenanceStandard standard = this.getById(id);
+        if (standard == null) {
+            throw new JeecgBootException("鏈壘鍒板搴斾繚鍏绘爣鍑�");
+        }
+        return standard;
+    }
+
+    private EamEquipment validateEquipmentExistence(String equipmentId) {
+        EamEquipment equipment = eamEquipmentService.getById(equipmentId);
+        if (equipment == null) {
+            throw new JeecgBootException("鍏宠仈璁惧涓嶅瓨鍦�");
+        }
+        return equipment;
+    }
+
+    private FlowMyBusiness validateFlowBusiness(EamMaintenanceStandardVo vo) {
+        FlowMyBusiness business = flowMyBusinessService.getFlowMyBusiness(vo.getInstanceId(), vo.getTaskId());
+        if (business == null) {
+            throw new JeecgBootException("娴佺▼瀹炰緥涓嶅瓨鍦紝璇峰埛鏂伴噸璇�");
+        }
+        return business;
+    }
+
+    private void validateUserAuthorization(FlowMyBusiness business, LoginUser user) {
+        List<String> todoUsers = JSON.parseArray(business.getTodoUsers(), String.class);
+        if (todoUsers == null || !todoUsers.contains(user.getUsername())) {
+            throw new JeecgBootException("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
         }
     }
 
-    private Map<String, Object> setProcessVariables(EamMaintenanceStandard eamMaintenanceStandard, String userId, EamMaintenanceStandardVo eamMaintenanceStandardVo) {
-        Map<String, Object> values = new HashMap<>();
-        values.put("dataId", eamMaintenanceStandard.getId());
-        values.put("assignee", userId);
-        if (eamMaintenanceStandardVo.getRepairManagerApproveResult() != null) {
-            values.put("repairManagerApproveResult", eamMaintenanceStandardVo.getRepairManagerApproveResult());
-            values.put("organization", eamMaintenanceStandardVo.getRepairManagerApproveComment());
-            values.put("comment", eamMaintenanceStandardVo.getRepairManagerApproveComment());
+    private void claimTaskOrFail(String taskId, LoginUser user) {
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+        if (task == null) {
+            throw new JeecgBootException("浠诲姟涓嶅瓨鍦ㄦ垨宸插畬鎴�");
         }
-        if (eamMaintenanceStandardVo.getTechnicalManagerApproveResult() != null) {
-            values.put("technicalManagerApproveResult", eamMaintenanceStandardVo.getTechnicalManagerApproveResult());
-            values.put("organization", eamMaintenanceStandardVo.getTechnicalManagerApproveComment());
-            values.put("comment", eamMaintenanceStandardVo.getTechnicalManagerApproveComment());
+        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+            throw new JeecgBootException("浠诲姟宸茶浠栦汉璁ら");
         }
-        return values;
+        taskService.claim(taskId, user.getUsername());
+    }
+
+    private Map<String, Object> buildProcessVariables(String dataId, String comment) {
+        Map<String, Object> vars = new HashMap<>();
+        vars.put("dataId", dataId);
+        vars.put("organization", comment);
+        vars.put("comment", comment);
+        vars.put("proofreading", true);
+        return vars;
+    }
+
+    private void setNextApprover(Map<String, Object> variables, EamEquipment equipment,
+                                 String businessCode, String roleName) {
+        List<UserSelector> approvers = sysUserService.selectOperatorList(
+                equipment.getEquipmentCode(),
+                equipment.getFactoryOrgCode(),
+                businessCode
+        );
+        if (CollectionUtils.isEmpty(approvers)) {
+            throw new JeecgBootException("璁惧鏈厤缃�" + roleName);
+        }
+        variables.put("NextAssignee", approvers.stream()
+                .map(UserSelector::getUsername)
+                .collect(Collectors.toList()));
+    }
+
+    private void updateTodoMaintenanceWorkers(FlowMyBusiness business, EamEquipment equipment) {
+        List<UserSelector> maintenanceWorkers = sysUserService.selectOperatorList(
+                equipment.getEquipmentCode(),
+                equipment.getFactoryOrgCode(),
+                BusinessCodeConst.PCR0002
+        );
+        if (CollectionUtils.isEmpty(maintenanceWorkers)) {
+            throw new JeecgBootException("璁惧鏈厤缃淮淇伐");
+        }
+        business.setTodoUsers(JSON.toJSONString(
+                maintenanceWorkers.stream()
+                        .map(UserSelector::getUsername)
+                        .collect(Collectors.toList())
+        ));
+        flowMyBusinessService.updateById(business);
+    }
+
+    private FlowTaskVo buildFlowTaskVo(FlowMyBusiness business, EamMaintenanceStandard standard,
+                                       Map<String, Object> variables, String comment) {
+        FlowTaskVo taskVo = new FlowTaskVo();
+        taskVo.setTaskId(business.getTaskId());
+        taskVo.setComment(comment);
+        taskVo.setInstanceId(business.getProcessInstanceId());
+        taskVo.setDataId(standard.getId());
+        taskVo.setValues(variables);
+        return taskVo;
+    }
+
+    private void updateMaintenanceStandardStatus(EamMaintenanceStandard standard,
+                                                 LoginUser user,
+                                                 MaintenanceStandardStatusEnum status) {
+        standard.setStandardStatus(status.name());
+        if (MaintenanceStandardStatusEnum.WAIT_REPAIR_DIRECTOR.equals(status)) {
+            standard.setDesigner(user.getUsername());
+            standard.setDesignTime(new Date());
+        }
+        this.updateById(standard);
+    }
+
+    private void validateFlowBusinessRecord(String standardId) {
+        List<FlowMyBusiness> businessList = flowMyBusinessService.list(
+                new QueryWrapper<FlowMyBusiness>().eq("data_id", standardId)
+        );
+        if (CollectionUtils.isEmpty(businessList)) {
+            throw new JeecgBootException("娴佺▼璁板綍涓嶅瓨鍦�");
+        }
+    }
+
+    private void handleRepairDirectorApproval(EamMaintenanceStandardVo vo,
+                                              EamMaintenanceStandard standard,
+                                              EamEquipment equipment,
+                                              Map<String, Object> variables) {
+        // 璁剧疆鍩虹娴佺▼鍙橀噺
+        variables.putAll(buildProcessVariables(standard.getId(),
+                StrUtil.blankToDefault(vo.getRepairManagerApproveComment(), "")));
+        variables.put("repairManagerApproveResult", vo.getRepairManagerApproveResult());
+
+        LoginUser user = getCurrentUser();
+        vo.setAssignee(user.getUsername());
+        vo.setComment(vo.getRepairManagerApproveComment());
+        if ("2".equals(vo.getRepairManagerApproveResult())) {
+            // 椹冲洖
+            UpdateWrapper<EamMaintenanceStandard> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.eq("id", standard.getId());
+            updateWrapper.set("standard_status", MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
+            updateWrapper.set("designer", null);
+            updateWrapper.set("design_time", null);
+            this.update(updateWrapper);
+        } else {
+            // 閫氳繃
+            setNextApprover(variables, equipment, BusinessCodeConst.PCR0009, "鐢熶骇璁惧鎶�鏈富绠�");
+            standard.setRepairManager(user.getUsername());
+            standard.setRepairManagerApproveResult(vo.getRepairManagerApproveResult());
+            standard.setRepairManagerApproveTime(new Date());
+            standard.setRepairManagerApproveComment(vo.getRepairManagerApproveComment());
+            standard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_TECHNICAL_DIRECTOR.name());
+        }
+    }
+
+    private void handleTechnicalDirectorApproval(EamMaintenanceStandardVo vo,
+                                                 EamMaintenanceStandard standard,
+                                                 EamEquipment equipment,
+                                                 Map<String, Object> variables) {
+        // 璁剧疆鍩虹娴佺▼鍙橀噺
+        variables.putAll(buildProcessVariables(standard.getId(),
+                StrUtil.blankToDefault(vo.getTechnicalManagerApproveComment(), "")));
+        variables.put("technicalManagerApproveResult", vo.getTechnicalManagerApproveResult());
+
+        LoginUser user = getCurrentUser();
+        vo.setAssignee(user.getUsername());
+        vo.setComment(vo.getTechnicalManagerApproveComment());
+        if ("2".equals(vo.getTechnicalManagerApproveResult())) {
+            // 椹冲洖
+            standard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_REPAIR_DIRECTOR.name());
+            standard.setRepairManager(null);
+            standard.setRepairManagerApproveResult(null);
+            standard.setRepairManagerApproveTime(null);
+            standard.setRepairManagerApproveComment(null);
+            setNextApprover(variables, equipment, BusinessCodeConst.PCR0008, "缁翠慨瀹や富浠�");
+        } else {
+            // 閫氳繃
+            standard.setTechnicalManager(user.getUsername());
+            standard.setTechnicalManagerApproveResult(vo.getTechnicalManagerApproveResult());
+            standard.setTechnicalManagerApproveTime(new Date());
+            standard.setTechnicalManagerApproveComment(vo.getTechnicalManagerApproveComment());
+            standard.setStandardStatus(MaintenanceStandardStatusEnum.START.name());
+        }
+    }
+
+    private void submitApprovalResult(EamMaintenanceStandardVo vo,
+                                      EamMaintenanceStandard standard,
+                                      Map<String, Object> variables) {
+        vo.setValues(variables);
+        Result result = flowTaskService.complete(vo);
+        if (!result.isSuccess()) {
+            throw new JeecgBootException("瀹℃壒娴佺▼鎻愪氦澶辫触: " + result.getMessage());
+        }
+
+        // 鏇存柊淇濆吇鏍囧噯
+        this.updateById(standard);
+
+        // 鎶�鏈富绠″鎵归�氳繃鍚庯紝浣滃簾鏃х増鏈�
+        if (MaintenanceStandardStatusEnum.WAIT_TECHNICAL_DIRECTOR.name().equals(standard.getStandardStatus())
+                && "1".equals(vo.getTechnicalManagerApproveResult())) {
+            abolishPreviousStandards(standard);
+        }
+    }
+
+    private void abolishPreviousStandards(EamMaintenanceStandard current) {
+        List<EamMaintenanceStandard> previous = eamMaintenanceStandardMapper.selectList(
+                new QueryWrapper<EamMaintenanceStandard>()
+                        .ne("id", current.getId())
+                        .eq("equipment_id", current.getEquipmentId())
+                        .eq("maintenance_category", current.getMaintenanceCategory())
+                        .eq("standard_status", MaintenanceStandardStatusEnum.START.name())
+        );
+
+        if (!CollectionUtils.isEmpty(previous)) {
+            previous.forEach(standard -> {
+                standard.setStandardStatus(MaintenanceStandardStatusEnum.ABOLISH.name());
+            });
+            this.updateBatchById(previous);
+        }
     }
 
 
@@ -536,20 +720,26 @@
 
     @Override
     public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
-        //涓氬姟鏄惁骞查娴佺▼锛屼笟鍔″共棰勶紝娴佺▼骞查锛屾寚瀹氫汉鍛樿繘琛屽鐞�
-        return null;
+        //鑾峰彇涓嬩竴姝ュ鐞嗕汉
+        Object object = values.get("NextAssignee");
+        return (List<String>) object;
     }
 
     /*娴佺▼涓氬姟浠g爜--------------------------缁撴潫*/
 
 
     /*瀵煎叆鐐规鏂囦欢Excel--------------------------寮�濮�*/
+
     /**
-        * 鐐规琛ㄥ鍏ュ叆鍙�
-    */
+     * 鐐规琛ㄥ鍏ュ叆鍙�
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Result<?> importPointInspectionExcel(MultipartFile file) {
+    public Result<?> importPointInspectionExcel(MultipartFile file,String id) {
+        EamMaintenanceStandard eamMaintenanceStandardOld=new EamMaintenanceStandard();
+        if (StrUtil.isNotEmpty(id)){
+            eamMaintenanceStandardOld=eamMaintenanceStandardMapper.selectById(id);
+        }
         try (Workbook workbook = WorkbookFactory.create(file.getInputStream())) {
             Sheet sheet = workbook.getSheetAt(0);
 
@@ -558,26 +748,77 @@
 
             // 1. 鎻愬彇璁惧淇℃伅
             EamMaintenanceStandard eamMaintenanceStandard = extractDeviceInfo(sheet);
-            if (eamMaintenanceStandard == null) {
+            if (eamMaintenanceStandard == null || eamMaintenanceStandard.getEquipmentId() == null) {
                 return Result.error("璁惧淇℃伅鎻愬彇澶辫触");
-            }else {
-                if (eamMaintenanceStandard.getEquipmentId() == null) {
-                    return Result.error("璁惧淇℃伅鎻愬彇澶辫触");
-                }
             }
 
             eamMaintenanceStandard.setStandardName(name);
+
+            // 妫�鏌ラ噸澶�,鍙鍏ユ牎楠岋紝鍗囩増涓嶆牎楠�
+            if (StrUtil.isEmpty(id)){
+                EamMaintenanceStandard exist = checkDuplicate(eamMaintenanceStandard.getEquipmentId(),
+                        eamMaintenanceStandard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name());
+                if (exist != null) {
+                    return Result.error(name + ": 璁惧鏍囧噯宸插瓨鍦紝涓嶈兘閲嶅娣诲姞");
+                }
+            }
+            if (StrUtil.isNotEmpty(id)){
+                if (eamMaintenanceStandardOld.getEquipmentId().equals(eamMaintenanceStandard.getEquipmentId())
+                        &&eamMaintenanceStandardOld.getMaintenanceCategory().equals(eamMaintenanceStandard.getMaintenanceCategory())) {
+                    //鍒ゆ柇鏄惁鐜版湁寰呮彁浜ゆ暟鎹�
+                    EamMaintenanceStandard maintenanceStandard=eamMaintenanceStandardMapper.selectOne(
+                            new QueryWrapper<EamMaintenanceStandard>().eq("equipment_id",eamMaintenanceStandard.getEquipmentId())
+                                    .eq("maintenance_category",eamMaintenanceStandard.getMaintenanceCategory())
+                                    .eq("standard_status",MaintenanceStandardStatusEnum.WAIT_SUBMIT.name())
+                                    .eq("del_flag", CommonConstant.DEL_FLAG_0));
+                    if (maintenanceStandard != null) {
+                        //鍒犻櫎鍘熸湁寰呮彁浜�
+                        eamMaintenanceStandardMapper.deleteById(maintenanceStandard.getId());
+                    }
+                    //鏌ヨ鍦ㄦ祦绋嬩腑鐨勬暟鎹�
+                    List<EamMaintenanceStandard> eamMaintenanceStandardList=eamMaintenanceStandardMapper.selectList(
+                            new QueryWrapper<EamMaintenanceStandard>().eq("equipment_id",eamMaintenanceStandard.getEquipmentId())
+                                    .eq("maintenance_category",eamMaintenanceStandard.getMaintenanceCategory())
+                                    .eq("del_flag", CommonConstant.DEL_FLAG_0)
+                                    .and(i->i.
+                                            eq("standard_status",MaintenanceStandardStatusEnum.WAIT_REPAIR_DIRECTOR.name())
+                                            .or()
+                                            .eq("standard_status",MaintenanceStandardStatusEnum.WAIT_TECHNICAL_DIRECTOR.name())
+                    ));
+                    if (!eamMaintenanceStandardList.isEmpty()) {
+                        return Result.error("宸插瓨鍦ㄥ浜庡鎵规祦绋嬬殑鏁版嵁锛岃鍒犻櫎鎴栫粨鏉熷悗杩涜鍗囩増瀵煎叆鎿嶄綔");
+                    }
+                    //鍗囩増鎿嶄綔锛屼綔搴熷師鏈�
+                    eamMaintenanceStandardOld.setStandardStatus(MaintenanceStandardStatusEnum.ABOLISH.name());
+                    eamMaintenanceStandardMapper.updateById(eamMaintenanceStandardOld);
+                    //鐗堟湰閫掑鑾峰彇鏁板瓧
+                    Pattern pattern = Pattern.compile("(\\d+)(?:\\.\\d+)*$");
+                    Matcher matcher = pattern.matcher(eamMaintenanceStandardOld.getStandardVersion());
+                    if (matcher.find()) {
+                        try {
+                            int mainVersion = Integer.parseInt(matcher.group(1));
+                            eamMaintenanceStandard.setStandardVersion("v" + (mainVersion + 1));
+                        } catch (NumberFormatException ignored) {
+                        }
+                    }
+                }else {
+                    return Result.error("鍗囩増瀵煎叆鐨勬枃浠朵笌鍘熸湁鏁版嵁鐨勮澶囩紪鍙蜂笉涓�鑷�,璇烽噸鏂扮紪杈戝鍏ユ枃浠�");
+                }
+            }
+            eamMaintenanceStandard.setInitialDate(new Date());
             eamMaintenanceStandardMapper.insert(eamMaintenanceStandard);
 
-            // 2. 鎻愬彇姣忔棩鐐规椤圭洰
-            List<EamMaintenanceStandardDetail> dailyDetails = extractDailyItems(sheet, eamMaintenanceStandard);
-            if(dailyDetails.isEmpty()){
+            Map<Integer, String> rowErrors = new HashMap<>();
+
+            // 2. 鎻愬彇姣忔棩鐐规椤圭洰锛堜紭鍖栫┖琛屽拰缁撴潫鏍囪澶勭悊锛�
+            List<EamMaintenanceStandardDetail> dailyDetails = extractDailyItems(sheet, eamMaintenanceStandard, rowErrors);
+            if (dailyDetails.isEmpty()) {
                 return Result.error("鏈壘鍒版瘡鏃ョ偣妫�椤圭洰");
             }
 
             // 3. 鎻愬彇鍛ㄤ繚鍏婚」鐩�
-            List<EamMaintenanceStandardDetail> weeklyDetails = extractWeeklyItems(sheet, eamMaintenanceStandard);
-            if(weeklyDetails.isEmpty()){
+            List<EamMaintenanceStandardDetail> weeklyDetails = extractWeeklyItems(sheet, eamMaintenanceStandard, rowErrors);
+            if (weeklyDetails.isEmpty()) {
                 return Result.error("鏈壘鍒板懆淇濆吇椤圭洰");
             }
 
@@ -590,6 +831,17 @@
                 eamMaintenanceStandardDetailService.saveBatch(allDetails);
             }
 
+            // 瑙﹀彂淇濆吇娴佺▼
+            SysParams sysParams = sysParamsService.getSysPramBySettingKey("maintenance_import_type");
+            if (sysParams != null) {
+                if (sysParams.getSettingValue().equals("1")){
+                    eamMaintenanceStandard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
+                    eamMaintenanceStandardMapper.updateById(eamMaintenanceStandard);
+                }
+            } else {
+                return Result.error("鏈壘鍒颁繚鍏绘祦绋嬪鍏ョ浉鍏抽厤缃�,璇疯仈绯荤鐞嗗憳");
+            }
+
             return Result.OK("鐐规琛ㄥ鍏ユ垚鍔�");
 
         } catch (Exception e) {
@@ -598,8 +850,8 @@
     }
 
     /**
-        * 鎻愬彇鐐规琛ㄦ爣棰�
-    */
+     * 鎻愬彇鐐规琛ㄦ爣棰�
+     */
     private String extractInspectionTitle(MultipartFile file) {
         try (Workbook workbook = WorkbookFactory.create(file.getInputStream())) {
             Sheet sheet = workbook.getSheetAt(0);
@@ -623,7 +875,7 @@
     }
 
     /**
-        * 鎻愬彇鐐规琛ㄤ箣鍓嶇殑鏂囧瓧
+     * 鎻愬彇鐐规琛ㄤ箣鍓嶇殑鏂囧瓧
      */
     private String extractTextBeforeInspection(String title) {
         if (StringUtils.isBlank(title)) {
@@ -635,8 +887,8 @@
     }
 
     /**
-        * 鎻愬彇璁惧淇℃伅
-    */
+     * 鎻愬彇璁惧淇℃伅
+     */
     private EamMaintenanceStandard extractDeviceInfo(Sheet sheet) {
         Row headerRow = sheet.getRow(0);
         if (headerRow == null) {
@@ -671,7 +923,7 @@
             EamEquipment equipments = eamEquipmentService.selectByEquipmentCode(standard.getEquipmentCode());
             if (equipments == null) {
                 return null;
-            }else {
+            } else {
                 standard.setEquipmentId(equipments.getId());
             }
         }
@@ -688,7 +940,7 @@
     }
 
     /**
-        * 瑙f瀽鏃ユ湡瀛楃涓�
+     * 瑙f瀽鏃ユ湡瀛楃涓�
      */
     private Date parseDate(String dateStr) throws ParseException {
         // 灏濊瘯澶氱鏃ユ湡鏍煎紡
@@ -714,172 +966,8 @@
     }
 
     /**
-        * 鎻愬彇姣忔棩鐐规椤圭洰
-    */
-    private List<EamMaintenanceStandardDetail> extractDailyItems(Sheet sheet, EamMaintenanceStandard standard) {
-        return extractItems(sheet, standard, "鐐规椤圭洰", "瀹屾垚鏁版嵁/瑕佹眰", "DAY_INSPECTION");
-    }
-
-    /**
-        * 鎻愬彇鍛ㄤ繚鍏婚」鐩�
-    */
-    private List<EamMaintenanceStandardDetail> extractWeeklyItems(Sheet sheet, EamMaintenanceStandard standard) {
-        return extractItems(sheet, standard, "鍛ㄤ繚鍏婚」鐩�", "妫�鏌ユ爣鍑�", "WEEK_INSPECTION");
-    }
-
-    /**
-        * 閫氱敤椤圭洰鎻愬彇鏂规硶
-    */
-    private List<EamMaintenanceStandardDetail> extractItems(Sheet sheet, EamMaintenanceStandard standard,
-                                                            String primaryHeader, String secondaryHeader,
-                                                            String itemCategory) {
-        int[] section = findTableSection(sheet, primaryHeader, secondaryHeader);
-        if (section == null) {
-            return Collections.emptyList();
-        }
-
-        List<EamMaintenanceStandardDetail> details = new ArrayList<>();
-        for (int rowIdx = section[0]; rowIdx <= section[1]; rowIdx++) {
-            Row row = sheet.getRow(rowIdx);
-            if (row == null || isEmptyRow(row)) {
-                continue;
-            }
-
-            // 纭繚绗竴鍒楁槸搴忓彿锛堟暟瀛楋級
-            Cell seqCell = row.getCell(0);
-            if (seqCell == null || seqCell.getCellType() != CellType.NUMERIC) {
-                continue;
-            }
-
-            // 鍒涘缓椤圭洰璇︽儏
-            EamMaintenanceStandardDetail detail = new EamMaintenanceStandardDetail();
-            detail.setStandardId(standard.getId());
-            detail.setItemName(getCellStringValue(row.getCell(1)));
-            detail.setItemCategory(itemCategory);
-
-            // 鏍规嵁椤圭洰绫诲瀷璁剧疆闇�姹傚瓧娈�
-            if ("DAY_INSPECTION".equals(itemCategory)) {
-                detail.setItemDemand(getCellStringValue(row.getCell(2)));
-            } else if ("WEEK_INSPECTION".equals(itemCategory)) {
-                detail.setItemDemand(getCellStringValue(row.getCell(2)));
-            }
-
-            details.add(detail);
-        }
-
-        return details;
-    }
-
-    /**
-        * 鏌ユ壘琛ㄦ牸鍖哄煙
+     * 浣跨敤姝e垯鎻愬彇瀛楁
      */
-    private int[] findTableSection(Sheet sheet, String primaryHeader, String secondaryHeader) {
-        for (int rowIdx = 0; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
-            Row row = sheet.getRow(rowIdx);
-            if (row == null) continue;
-
-            if (isHeaderRow(row, primaryHeader, secondaryHeader)) {
-                int startRow = rowIdx + 1;
-                int endRow = findDataEnd(sheet, startRow);
-                return new int[]{startRow, endRow};
-            }
-        }
-        return null;
-    }
-
-    /**
-        * 妫�鏌ユ槸鍚︿负琛ㄥご琛�
-    */
-    private boolean isHeaderRow(Row row, String header1, String header2) {
-        boolean foundHeader1 = false;
-        boolean foundHeader2 = false;
-
-        for (int colIdx = 0; colIdx < row.getLastCellNum(); colIdx++) {
-            Cell cell = row.getCell(colIdx);
-            if (cell == null) continue;
-
-            String cellValue = getCellStringValue(cell);
-            if (cellValue.contains(header1)) foundHeader1 = true;
-            if (cellValue.contains(header2)) foundHeader2 = true;
-        }
-
-        return foundHeader1 && foundHeader2;
-    }
-
-    /**
-        * 鏌ユ壘鏁版嵁缁撴潫浣嶇疆
-     */
-    private int findDataEnd(Sheet sheet, int startRow) {
-        for (int rowIdx = startRow; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
-            Row row = sheet.getRow(rowIdx);
-            if (row == null) return rowIdx - 1;
-
-            // 妫�鏌ユ槸鍚︾粨鏉熸爣蹇楄锛堝绛惧瓧琛岋級
-            if (isSignatureRow(row)) {
-                return rowIdx - 1;
-            }
-
-            // 妫�鏌ユ槸鍚︽柊鐨勮〃澶村紑濮�
-            if (isNewHeaderStart(row)) {
-                return rowIdx - 1;
-            }
-        }
-        return sheet.getLastRowNum();
-    }
-
-    /**
-        * 璇嗗埆绛惧瓧琛岀壒寰�
-    */
-    private boolean isSignatureRow(Row row) {
-        for (int colIdx = 0; colIdx < row.getLastCellNum(); colIdx++) {
-            Cell cell = row.getCell(colIdx);
-            if (cell == null) continue;
-
-            String value = getCellStringValue(cell);
-            if (value.contains("绛惧瓧") || value.contains("璐d换浜�") ||
-                    value.contains("鎵ц") || value.contains("纭")) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 璇嗗埆鏂拌〃澶村紑濮�
-    */
-    private boolean isNewHeaderStart(Row row) {
-        for (int colIdx = 0; colIdx < row.getLastCellNum(); colIdx++) {
-            Cell cell = row.getCell(colIdx);
-            if (cell == null) continue;
-
-            String value = getCellStringValue(cell);
-            if ("搴忓彿".equals(value) || "鐐规椤圭洰".equals(value) || "鍛ㄤ繚鍏婚」鐩�".equals(value)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-        * 妫�鏌ヨ鏄惁涓虹┖
-    */
-    private boolean isEmptyRow(Row row) {
-        if (row == null) return true;
-        for (int colIdx = 0; colIdx < row.getLastCellNum(); colIdx++) {
-            Cell cell = row.getCell(colIdx);
-            if (cell != null && cell.getCellType() != CellType.BLANK) {
-                String value = getCellStringValue(cell);
-                if (StringUtils.isNotBlank(value)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-        * 浣跨敤姝e垯鎻愬彇瀛楁
-    */
     private String extractField(String text, String regex) {
         if (StringUtils.isBlank(text)) return "";
         Pattern pattern = Pattern.compile(regex);
@@ -888,10 +976,139 @@
     }
 
     /**
-        * 鑾峰彇鍗曞厓鏍煎瓧绗︿覆鍊�
+            * 鎻愬彇姣忔棩鐐规椤圭洰
+     */
+    private List<EamMaintenanceStandardDetail> extractDailyItems(Sheet sheet, EamMaintenanceStandard standard, Map<Integer, String> rowErrors) {
+        // 浣跨敤澶氬叧閿瘝鍖归厤
+        String[] primaryHeaders = {"鐐规椤圭洰", "鏃ュ父鐐规", "姣忔棩妫�鏌�"};
+        String[] secondaryHeaders = {"瀹屾垚鏁版嵁/瑕佹眰", "妫�鏌ユ爣鍑�", "瑕佹眰"};
+        return extractItems(sheet, standard, primaryHeaders, secondaryHeaders, "DAY_INSPECTION", rowErrors);
+    }
+
+    /**
+            * 鎻愬彇鍛ㄤ繚鍏婚」鐩�
+     */
+    private List<EamMaintenanceStandardDetail> extractWeeklyItems(Sheet sheet, EamMaintenanceStandard standard, Map<Integer, String> rowErrors) {
+        // 浣跨敤澶氬叧閿瘝鍖归厤
+        String[] primaryHeaders = {"鍛ㄤ繚鍏婚」鐩�", "鍛ㄤ繚鍏�", "姣忓懆淇濆吇"};
+        String[] secondaryHeaders = {"妫�鏌ユ爣鍑�", "淇濆吇瑕佹眰", "鏍囧噯"};
+        return extractItems(sheet, standard, primaryHeaders, secondaryHeaders, "WEEK_INSPECTION", rowErrors);
+    }
+
+    /**
+     * 鏍稿績鏀硅繘锛氫紭鍖栬〃鏍煎尯鍩熻瘑鍒拰鏁版嵁鎻愬彇
     */
+    private List<EamMaintenanceStandardDetail> extractItems(Sheet sheet,
+                                                            EamMaintenanceStandard standard,
+                                                            String[] primaryHeaders,
+                                                            String[] secondaryHeaders,
+                                                            String itemCategory,
+                                                            Map<Integer, String> rowErrors) {
+
+        // 1. 瀹氫綅琛ㄦ牸鍖哄煙锛堢簿纭尮閰嶈〃澶达級
+        int startRow = findHeaderRow(sheet, primaryHeaders, secondaryHeaders);
+        if (startRow == -1) {
+            rowErrors.put(-1, "鏈壘鍒�" + Arrays.toString(primaryHeaders) + "琛ㄥご鍖哄煙");
+            return Collections.emptyList();
+        }
+
+        int endRow = findDataEnd(sheet, startRow + 1, "鍛ㄤ繚鍏婚」鐩�");
+
+        // 鎻愬彇鏃ュ織锛堝疄闄呬娇鐢ㄦ椂鍙互鍘绘帀锛�
+        System.out.println("鎻愬彇鍖哄煙: " + (startRow + 1) + "琛屽埌" + (endRow + 1) + "琛�");
+
+        // 2. 鎻愬彇鏁版嵁琛�
+        List<EamMaintenanceStandardDetail> details = new ArrayList<>();
+        for (int rowIdx = startRow + 1; rowIdx <= endRow; rowIdx++) {
+            Row row = sheet.getRow(rowIdx);
+            if (row == null) continue;
+
+            try {
+                // 搴忓彿鍒楀鐞�
+                Cell seqCell = row.getCell(0);
+                if (seqCell == null || seqCell.getCellType() == CellType.BLANK) {
+                    continue;
+                }
+
+                // 鑾峰彇搴忓彿鍊硷紙鏀寔鏁板瓧鍜屾枃鏈牸寮忥級
+                int seqValue = 0;
+                try {
+                    if (seqCell.getCellType() == CellType.NUMERIC) {
+                        seqValue = (int) seqCell.getNumericCellValue();
+                    } else if (seqCell.getCellType() == CellType.STRING) {
+                        seqValue = Integer.parseInt(seqCell.getStringCellValue().trim());
+                    }
+                } catch (NumberFormatException e) {
+                    rowErrors.put(rowIdx + 1, "搴忓彿鏍煎紡閿欒");
+                    continue;
+                }
+
+                // 椤圭洰鍚嶇О鍒楋紙绗簩鍒楋級
+                Cell nameCell = row.getCell(1);
+                if (nameCell == null || nameCell.getCellType() == CellType.BLANK) {
+                    continue;
+                }
+                String itemName = getCellStringValue(nameCell).trim();
+
+                // 瑕佹眰/鏍囧噯鍒楋紙绗笁鍒楋級
+                String demand = "";
+                if (row.getLastCellNum() >= 3) {
+                    Cell demandCell = row.getCell(2);
+                    if (demandCell != null) {
+                        demand = getCellStringValue(demandCell).trim();
+                    }
+                }
+
+                // 鍒涘缓璇︽儏瀵硅薄
+                EamMaintenanceStandardDetail detail = new EamMaintenanceStandardDetail();
+                detail.setStandardId(standard.getId());
+                detail.setItemCode(seqValue);
+                detail.setItemName(itemName);
+                detail.setItemDemand(demand);
+                detail.setItemCategory(itemCategory);
+                details.add(detail);
+
+            } catch (Exception e) {
+                rowErrors.put(rowIdx + 1, "瑙f瀽閿欒: " + e.getMessage());
+            }
+        }
+        return details;
+    }
+
+    /**
+     * 鑾峰彇琛屼腑鎵�鏈夊崟鍏冩牸鐨勫瓧绗︿覆鍊�
+     */
+    private List<String> getRowStringValues(Row row) {
+        List<String> values = new ArrayList<>();
+        if (row == null) return values;
+
+        for (int cellIdx = 0; cellIdx < row.getLastCellNum(); cellIdx++) {
+            Cell cell = row.getCell(cellIdx);
+            if (cell != null) {
+                values.add(getCellStringValue(cell));
+            } else {
+                values.add(""); // 瀵逛簬绌哄崟鍏冩牸娣诲姞绌哄瓧绗︿覆
+            }
+        }
+        return values;
+    }
+
+    /**
+     * 鑾峰彇鍗曞厓鏍煎瓧绗︿覆鍊硷紙澧炲己鍏紡澶勭悊锛�
+     */
     private String getCellStringValue(Cell cell) {
-        if (cell == null) return "";
+        if (cell == null) {
+            return "";
+        }
+        // 淇濇寔涓嶅彉锛屼絾娣诲姞鏁板瓧绫诲瀷澶勭悊
+        if (cell.getCellType() == CellType.NUMERIC) {
+            // 鏁存暟澶勭悊
+            double num = cell.getNumericCellValue();
+            if (num == (int) num) {
+                return String.valueOf((int) num);
+            }
+            return String.valueOf(num);
+        }
         switch (cell.getCellType()) {
             case STRING:
                 return cell.getStringCellValue().trim();
@@ -903,150 +1120,766 @@
             case BOOLEAN:
                 return String.valueOf(cell.getBooleanCellValue());
             case FORMULA:
-                return handleFormulaCell(cell);
+                return getFormulaCellValue(cell);
             default:
                 return "";
         }
     }
 
     /**
-        * 澶勭悊鍏紡鍗曞厓鏍�
+     * 绮剧‘鏌ユ壘琛ㄥご琛�
     */
-    private String handleFormulaCell(Cell cell) {
+    private int findHeaderRow(Sheet sheet, String[] primaryHeaders, String[] secondaryHeaders) {
+        for (int rowIdx = 0; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
+            Row row = sheet.getRow(rowIdx);
+            if (row == null) continue;
+
+            String rowText = getRowStringValues(row).stream().collect(Collectors.joining());
+
+            // 妫�鏌ヤ富鏍囬鍜屽壇鏍囬
+            boolean hasPrimary = false;
+            boolean hasSecondary = false;
+
+            for (String header : primaryHeaders) {
+                if (rowText.contains(header)) {
+                    hasPrimary = true;
+                    break;
+                }
+            }
+
+            for (String header : secondaryHeaders) {
+                if (rowText.contains(header)) {
+                    hasSecondary = true;
+                    break;
+                }
+            }
+
+            if (hasPrimary && hasSecondary) {
+                return rowIdx;
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 鏌ユ壘鏁版嵁缁撴潫浣嶇疆锛堟牴鎹偍鐨凟xcel缁撴瀯浼樺寲锛�
+     */
+    private int findDataEnd(Sheet sheet, int startRow, String nextSectionKeyword) {
+        int consecutiveEmptyRows = 0;
+        final int MAX_EMPTY_ROWS = 3;
+
+        for (int rowIdx = startRow; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
+            Row row = sheet.getRow(rowIdx);
+
+            // 鍏抽敭鏀硅繘1锛氱┖琛屽鐞�
+            if (isEssentiallyEmpty(row)) {
+                consecutiveEmptyRows++;
+                if (consecutiveEmptyRows >= MAX_EMPTY_ROWS) {
+                    return rowIdx - consecutiveEmptyRows;
+                }
+                continue;
+            } else {
+                consecutiveEmptyRows = 0;
+            }
+
+            // 鍏抽敭鏀硅繘2锛氱粨鏉熸爣璁版娴�
+            String rowText = getRowStringValues(row).stream().collect(Collectors.joining());
+
+            // 鏍规嵁鎮ㄧ殑Excel缁撴瀯锛岀瀛楄鏈夌壒瀹氭牸寮�
+            if (rowText.contains("缁存姢璐d换浜虹瀛�")) {
+                return rowIdx - 1;
+            }
+
+            // 妫�娴嬩笅涓�涓尯鍩熺殑寮�濮嬶紙濡傚懆淇濆吇椤圭洰锛�
+            if (StringUtils.isNotBlank(nextSectionKeyword) &&
+                    rowText.contains(nextSectionKeyword)) {
+                return rowIdx - 1;
+            }
+        }
+        return sheet.getLastRowNum();
+    }
+
+    /**
+     * 鍒ゆ柇鏉′欢锛氬墠涓ゅ垪涓虹┖鍗宠涓虹┖琛�
+     */
+    private boolean isEssentiallyEmpty(Row row) {
+        if (row == null) return true;
+
+        // 妫�鏌ュ簭鍙峰垪
+        Cell indexCell = row.getCell(0);
+        if (indexCell != null && indexCell.getCellType() != CellType.BLANK) {
+            return false;
+        }
+
+        // 妫�鏌ラ」鐩悕绉板垪
+        Cell nameCell = row.getCell(1);
+        if (nameCell != null && nameCell.getCellType() != CellType.BLANK) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+            * 鑾峰彇鍏紡鍗曞厓鏍煎��
+     */
+    private String getFormulaCellValue(Cell cell) {
         try {
-            FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator();
+            Workbook workbook = cell.getSheet().getWorkbook();
+            FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
             CellValue cellValue = evaluator.evaluate(cell);
-
-            if (cellValue == null) return "";
-
+            if (cellValue == null) {
+                return "";
+            }
             switch (cellValue.getCellType()) {
-                case STRING: return cellValue.getStringValue();
-                case NUMERIC: return String.valueOf((int) cellValue.getNumberValue());
-                case BOOLEAN: return String.valueOf(cellValue.getBooleanValue());
-                default: return "";
+                case STRING:
+                    return cellValue.getStringValue();
+                case NUMERIC:
+                    return String.valueOf((int) cellValue.getNumberValue());
+                case BOOLEAN:
+                    return String.valueOf(cellValue.getBooleanValue());
+                default:
+                    return "";
             }
         } catch (Exception e) {
+            log.warn("瑙f瀽鍏紡鍗曞厓鏍煎け璐�");
             return "";
         }
     }
+
+
+    private int findDataEnd(Sheet sheet, int startRow) {
+        int consecutiveEmptyRows = 0;
+        final int MAX_EMPTY_ROWS = 2;
+        boolean foundData = false;
+
+        for (int rowIdx = startRow; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
+            Row row = sheet.getRow(rowIdx);
+
+            // 鍏抽敭浼樺寲1锛氬厛妫�鏌ユ槸鍚︿负绌鸿
+            if (isEmptyRow(row)) {
+                consecutiveEmptyRows++;
+                if (consecutiveEmptyRows >= MAX_EMPTY_ROWS) {
+                    return foundData ? rowIdx - consecutiveEmptyRows : startRow;
+                }
+                continue;
+            } else {
+                consecutiveEmptyRows = 0;
+            }
+
+            // 鍏抽敭浼樺寲2锛氫弗鏍奸檺瀹氱粨鏉熸爣璁扮殑璇嗗埆鏉′欢
+            if (isStrongEndMarker(row)) {
+                return foundData ? rowIdx - 1 : startRow;
+            }
+
+            // 鍏抽敭浼樺寲3锛氭爣璁板凡鎵惧埌鏈夋晥鏁版嵁
+            foundData = true;
+        }
+        return sheet.getLastRowNum();
+    }
+
+    // 澧炲己鐗堢粨鏉熸爣璁拌瘑鍒�
+    private boolean isStrongEndMarker(Row row) {
+        String rowText = String.join("", getRowStringValues(row)).toLowerCase();
+
+        return
+                // 绮剧‘鍖归厤绛惧瓧鐗瑰緛锛堝嚭鐜板湪琛岄锛�
+                (rowText.startsWith("缁存姢璐d换浜虹瀛�") ||
+                        rowText.startsWith("鎵ц浜虹瀛�")) ||
+                        // 绮剧‘鍖归厤鏂版澘鍧楁爣棰�
+                        rowText.matches("^\\s*鍛ㄤ繚鍏婚」鐩甛\s*$") ||
+                        rowText.contains("骞村害淇濆吇椤圭洰");
+    }
+
+    // 绌鸿妫�娴嬩紭鍖栵紙鍏佽閮ㄥ垎鍒椾负绌猴級
+    private boolean isEmptyRow(Row row) {
+        if (row == null) return true;
+        // 鍙鏌ュ墠3鍒楋紙搴忓彿鍒�+椤圭洰鍚�+瑕佹眰锛�
+        for (int cellIdx = 0; cellIdx < Math.min(3, row.getLastCellNum()); cellIdx++) {
+            Cell cell = row.getCell(cellIdx);
+            if (cell != null && cell.getCellType() != CellType.BLANK) {
+                return false;
+            }
+        }
+        return true;
+    }
     /*瀵煎叆鐐规鏂囦欢Excel--------------------------缁撴潫*/
 
-    /*瀵煎叆浜屼繚涓変繚鏂囦欢Excel--------------------------寮�濮�*/
+    /*瀵煎叆浜屼繚涓変繚鏂囦欢Word--------------------------寮�濮�*/
     /**
-     * 缁熶竴淇濆吇瑙勮寖瀵煎叆鍏ュ彛
      * @param file 涓婁紶鏂囦欢
      * @param type 淇濆吇绫诲瀷 (SECOND/THIRD)
      * @return 瀵煎叆缁撴灉锛堝寘鍚垚鍔�/澶辫触淇℃伅锛�
      */
     @Override
     @Transactional
-    public Result<?> importMaintenanceStandard(MultipartFile file, String type) {
+    public Result<?> importMaintenanceStandard(MultipartFile file, String type, String id) {
         String fileName = file.getOriginalFilename();
-
         try (XWPFDocument doc = new XWPFDocument(file.getInputStream())) {
-            // 鍩虹楠岃瘉
-            if (doc.getTables().isEmpty()) {
-                return Result.error(fileName + ": 鏂囨。涓湭鎵惧埌琛ㄦ牸");
+            List<XWPFTable> tables = doc.getTables();
+            List<EamMaintenanceStandard> standards = new ArrayList<>();
+            List<EamMaintenanceStandardDetail> allItems = new ArrayList<>();
+            int deviceCount = 0;
+            boolean isRevision = StrUtil.isNotEmpty(id);
+            EamMaintenanceStandard oldStandardForRevision = null;
+            Map<String, Integer> deviceVersionMap = new HashMap<>();
+            Map<String, Integer> compositeVersionMap = new HashMap<>();
+
+            // 鑾峰彇鏂囨。涓殑鎵�鏈夋钀�
+            List<XWPFParagraph> paragraphs = doc.getParagraphs();
+
+            // 濡傛灉鏄崌鐗堝鍏ワ紝鑾峰彇鍘熸湁鏍囧噯
+            if (isRevision) {
+                oldStandardForRevision = eamMaintenanceStandardMapper.selectById(id);
+                if (oldStandardForRevision == null) {
+                    return Result.error("鍗囩増瀵煎叆澶辫触锛氭湭鎵惧埌ID涓�" + id + "鐨勮澶囨爣鍑�");
+                }
+                // 棰勫姞杞借澶囩増鏈俊鎭紙浣跨敤澶嶅悎閿級
+                loadDeviceMaxVersions(oldStandardForRevision.getEquipmentId(), compositeVersionMap);
+            } else {
+                // 闈炲崌鐗堝鍏ユ椂锛岄鍔犺浇鎵�鏈夎澶囩殑鏈�澶х増鏈紙浣跨敤澶嶅悎閿級
+                loadAllDeviceMaxVersions(compositeVersionMap);
             }
 
-            List<XWPFTable> tables = doc.getTables();
-            EamMaintenanceStandard standard = null;
-            boolean firstTableProcessed = false;
-            List<EamMaintenanceStandardDetail> items = new ArrayList<>();
-            String standardId = null;
-
-            // 1. 澶勭悊鎵�鏈夎〃鏍�
-            for (int i = 0; i < tables.size(); i++) {
+            // 澶氳澶囧鐞嗕富寰幆
+            for (int i = 0; i < tables.size(); ) {
                 XWPFTable table = tables.get(i);
 
-                if (i == 0) { // 绗竴椤佃〃鏍�
-                    // 楠岃瘉璁惧淇℃伅琛ㄦ牸
-                    if (isWrongDocumentType(table, type)) {
-                        return Result.error(fileName + ": 鏂囨。绫诲瀷涓嶅尮閰� - " +
-                                ("SECOND".equals(type) ? "璇峰鍏ヤ簩绾т繚鍏绘枃妗�" : "璇峰鍏ヤ笁绾т繚鍏绘枃妗�"));
+                // 璇嗗埆璁惧淇℃伅琛ㄦ牸
+                if (isDeviceInfoTable(table)) {
+                    deviceCount++;
+
+                    // 鍗囩増瀵煎叆鍙兘澶勭悊鍗曡澶�
+                    if (isRevision && deviceCount > 1) {
+                        throw new ImportException("鍗囩増瀵煎叆浠呮敮鎸佸崟璁惧鏂囨。");
                     }
 
                     // 鎻愬彇璁惧淇℃伅
-                    standard = extractDeviceInfo(table);
+                    EamMaintenanceStandard standard = extractDeviceInfo(table, type);
                     if (standard == null) {
-                        return Result.error(fileName + ": 璁惧淇℃伅鎻愬彇澶辫触");
+                        throw new ImportException("琛ㄦ牸" + (i+1) + "锛氳澶囦俊鎭彁鍙栧け璐�");
                     }
 
-                    // 閰嶇疆绫诲瀷鐩稿叧鍙傛暟
-                    configureStandard(standard, type, file);
+                    // 浠庢枃妗d腑鑾峰彇鏍囬锛堣〃鏍煎墠鐨勬钀斤級
+                    String title = extractTitleBeforeTable(table, paragraphs);
+                    if (title != null) {
+                        standard.setStandardName(title);
+                    }
+
+                    // 澶勭悊閲嶅鍜屽崌鐗堥�昏緫
+                    processStandard(standard, type, file, id, oldStandardForRevision, compositeVersionMap);
+
+                    // 淇濆瓨璁惧鏍囧噯
                     eamMaintenanceStandardMapper.insert(standard);
-                    standardId = standard.getId();
+                    standards.add(standard);
 
-                    // 鎻愬彇绗竴椤电殑淇濆吇椤圭洰
+                    // 鏇存柊璁惧鐗堟湰鏄犲皠
+                    updateDeviceVersionMap(deviceVersionMap, standard);
+
+                    // 鎻愬彇褰撳墠璁惧淇℃伅琛ㄦ牸涓殑淇濆吇椤圭洰
+                    List<EamMaintenanceStandardDetail> items = new ArrayList<>();
                     if ("SECOND".equals(type)) {
-                        items.addAll(extractSecondMaintenanceItems(table, standardId, true));
-                    } else if ("THIRD".equals(type)) {
-                        items.addAll(extractThirdMaintenanceItems(table, standardId, true));
+                        items.addAll(extractSecondMaintenanceItems(table, standard.getId(), true));
+                    } else {
+                        items.addAll(extractThirdMaintenanceItems(table, standard.getId(), true));
                     }
 
-                    firstTableProcessed = true;
-                } else if (firstTableProcessed) { // 鍚庣画椤甸潰
-                    // 鎻愬彇鍚庣画椤甸潰鐨勪繚鍏婚」鐩�
-                    if ("SECOND".equals(type)) {
-                        items.addAll(extractSecondMaintenanceItems(table, standardId, false));
-                    } else if ("THIRD".equals(type)) {
-                        items.addAll(extractThirdMaintenanceItems(table, standardId, false));
+                    // 鎻愬彇鍚庣画鍏宠仈鐨勪繚鍏婚」鐩〃鏍�
+                    i++; // 绉诲姩鍒颁笅涓�涓〃鏍�
+                    while (i < tables.size() && !isDeviceInfoTable(tables.get(i))) {
+                        XWPFTable itemTable = tables.get(i);
+                        if ("SECOND".equals(type)) {
+                            items.addAll(extractSecondMaintenanceItems(itemTable, standard.getId(), false));
+                        } else {
+                            items.addAll(extractThirdMaintenanceItems(itemTable, standard.getId(), false));
+                        }
+                        i++;
                     }
+
+                    // 椤圭洰鍚庡鐞�
+                    processItemsAfterExtraction(items, type);
+                    allItems.addAll(items);
+
+                    // 濡傛灉鏄渶鍚庝竴涓〃鏍硷紝闇�瑕侀��鍑哄惊鐜�
+                    if (i >= tables.size()) break;
+                } else {
+                    i++; // 濡傛灉涓嶆槸璁惧淇℃伅琛ㄦ牸锛岀户缁笅涓�涓�
                 }
             }
 
-            // 楠岃瘉璁惧淇℃伅鎻愬彇
-            if (standard == null) {
-                return Result.error(fileName + ": 璁惧淇℃伅鎻愬彇澶辫触");
+            // 鏍¢獙璁惧鏁伴噺
+            if (standards.isEmpty()) {
+                return Result.error(fileName + "锛氭湭鎵惧埌鏈夋晥鐨勮澶囦俊鎭〃鏍�");
             }
 
-            // 2. 鍚庡鐞嗭細鏍规嵁涓嶅悓绫诲瀷杩涜澶勭悊
-            processItemsAfterExtraction(items, type);
-
-            // 3. 椤圭洰楠岃瘉
-            if (items.isEmpty()) {
-                return Result.error(fileName + ": 鏈彁鍙栧埌浠讳綍淇濆吇椤圭洰");
+            // 鎵归噺淇濆瓨淇濆吇椤圭洰
+            if (!allItems.isEmpty()) {
+                eamMaintenanceStandardDetailService.saveBatch(allItems);
             }
 
-            // 4. 淇濆瓨椤圭洰
-            eamMaintenanceStandardDetailService.saveBatch(items);
+            // 鏇存柊娴佺▼鐘舵��
+            SysParams sysParams = sysParamsService.getSysPramBySettingKey("maintenance_import_type");
+            if (sysParams != null && "1".equals(sysParams.getSettingValue())) {
+                for (EamMaintenanceStandard standard : standards) {
+                    standard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
+                    eamMaintenanceStandardMapper.updateById(standard);
+                }
+            } else if (sysParams == null) {
+                throw new ImportException("鏈厤缃繚鍏绘祦绋嬪鍏ュ弬鏁�");
+            }
 
-            return Result.ok(fileName + ": 瀵煎叆鎴愬姛, 椤圭洰鏁�: " + items.size());
+            // 浣滃簾鏃х増鏈紙淇濈暀鏈�鏂扮増鏈級
+            obsoleteOldVersionsByCompositeKey(deviceVersionMap);
+
+            return Result.ok(fileName + "瀵煎叆鎴愬姛锛岃澶囨暟锛�" + standards.size() + "锛岄」鐩暟锛�" + allItems.size());
 
         } catch (ImportException e) {
-            return Result.error(e.getMessage());
+            return Result.error(fileName + "锛�" + e.getMessage());
         } catch (Exception e) {
-            return Result.error(fileName + ": 绯荤粺閿欒 - " + e.getClass().getSimpleName());
+            log.error("瀵煎叆淇濆吇瑙勮寖澶辫触", e);
+            return Result.error(fileName + "锛氱郴缁熼敊璇� - " + e.getMessage());
+        }
+    }
+
+    // 璁惧淇℃伅琛ㄦ牸璇嗗埆鏂规硶
+    private boolean isDeviceInfoTable(XWPFTable table) {
+        if (table.getNumberOfRows() < 2) return false;
+
+        // 妫�鏌ュ墠涓よ鏄惁鍖呭惈璁惧淇℃伅鐗瑰緛
+        String row1 = getRowText(table.getRow(0));
+        String row2 = getRowText(table.getRow(1));
+        List<String> keywords = Arrays.asList("璁惧绫诲埆", "璁惧缂栧彿", "璁惧鍚嶇О", "璁惧鍨嬪彿");
+        int matchCount = 0;
+
+        for (String keyword : keywords) {
+            if (row1.contains(keyword) || row2.contains(keyword)) {
+                matchCount++;
+            }
+        }
+        return matchCount >= 2; // 鑷冲皯鍖归厤涓や釜鍏抽敭璇�
+    }
+
+    // 鑾峰彇琛ㄦ牸琛岀殑鏂囨湰鍐呭
+    private String getRowText(XWPFTableRow row) {
+        if (row == null) return "";
+        StringBuilder sb = new StringBuilder();
+        for (XWPFTableCell cell : row.getTableCells()) {
+            sb.append(getCellText(cell));
+        }
+        return sb.toString();
+    }
+
+
+    /**
+     * 浠庤〃鏍煎墠鐨勬钀戒腑鎻愬彇鏍囬锛堜慨澶嶇増锛�
+     */
+    private String extractTitleBeforeTable(XWPFTable table, List<XWPFParagraph> paragraphs) {
+        try {
+            // 鑾峰彇琛ㄦ牸鐨凜TTbl瀵硅薄
+            CTTbl ctTbl = table.getCTTbl();
+
+            // 鑾峰彇琛ㄦ牸鎵�鍦ㄧ殑body
+            IBody body = table.getBody();
+
+            // 鑾峰彇body鐨勬墍鏈夊厓绱狅紙娈佃惤鍜岃〃鏍硷級
+            List<IBodyElement> bodyElements = body.getBodyElements();
+
+            // 鎵惧埌褰撳墠琛ㄦ牸鍦╞ody涓殑浣嶇疆
+            int tableIndex = -1;
+            for (int i = 0; i < bodyElements.size(); i++) {
+                IBodyElement element = bodyElements.get(i);
+                if (element instanceof XWPFTable && element.equals(table)) {
+                    tableIndex = i;
+                    break;
+                }
+            }
+
+            // 濡傛灉鎵惧埌琛ㄦ牸浣嶇疆锛屽悜鍓嶆煡鎵炬钀�
+            if (tableIndex > 0) {
+                for (int i = tableIndex - 1; i >= 0; i--) {
+                    IBodyElement element = bodyElements.get(i);
+                    if (element instanceof XWPFParagraph) {
+                        XWPFParagraph paragraph = (XWPFParagraph) element;
+                        String text = paragraph.getText();
+                        if (text != null && !text.trim().isEmpty() && text.contains("淇濆吇瑙勮寖")) {
+                            return text.trim();
+                        }
+                    }
+                }
+            }
+
+            // 濡傛灉涓婃柟娌℃湁鎵惧埌鏍囬锛屽皾璇曚粠琛ㄦ牸鍐呴儴鎻愬彇
+            if (table.getNumberOfRows() > 0) {
+                XWPFTableRow firstRow = table.getRow(0);
+                for (XWPFTableCell cell : firstRow.getTableCells()) {
+                    String text = getCellText(cell);
+                    if (text != null && text.contains("淇濆吇瑙勮寖")) {
+                        return text.trim();
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.warn("鎻愬彇鏍囬澶辫触", e);
+        }
+
+        return null;
+    }
+
+    /**
+     * 澶勭悊璁惧鏍囧噯鐨勯噸澶嶆牎楠屽拰鍗囩増閫昏緫
+     */
+    private void processStandard(EamMaintenanceStandard standard, String type, MultipartFile file,
+                                 String id, EamMaintenanceStandard oldStandard,
+                                 Map<String, Integer> versionMap) throws ImportException {
+        // 濡傛灉鏍囬涓虹┖锛屼娇鐢ㄨ澶囧悕绉扮敓鎴愰粯璁ゆ爣棰�
+        if (StrUtil.isEmpty(standard.getStandardName())) {
+            String defaultTitle = standard.getEquipmentName() + "鐢熶骇璁惧" +
+                    ("SECOND".equals(type) ? "浜岀骇" : "涓夌骇") + "淇濆吇瑙勮寖";
+            standard.setStandardName(defaultTitle);
+        }
+
+        // 閰嶇疆鍩虹灞炴��
+        configureStandard(standard, type, file);
+
+        if (StrUtil.isNotEmpty(id)) {
+            // 鍗囩増瀵煎叆澶勭悊
+            if (oldStandard == null) {
+                throw new ImportException("鏈壘鍒拌鍗囩増鐨勬爣鍑嗚褰�");
+            }
+
+            // 楠岃瘉璁惧涓�鑷存�э紙璁惧ID鍜屼繚鍏荤被鍒繀椤讳竴鑷达級
+            if (!oldStandard.getEquipmentId().equals(standard.getEquipmentId()) ||
+                    !oldStandard.getMaintenanceCategory().equals(standard.getMaintenanceCategory())) {
+                throw new ImportException("鍗囩増璁惧淇℃伅鎴栦繚鍏荤被鍒笉涓�鑷�");
+            }
+
+            // 妫�鏌ュ緟鍔炴祦绋�
+            List<EamMaintenanceStandard> pendingList = eamMaintenanceStandardMapper.selectList(
+                    new QueryWrapper<EamMaintenanceStandard>()
+                            .eq("equipment_id", standard.getEquipmentId())
+                            .eq("maintenance_category", standard.getMaintenanceCategory())
+                            .in("standard_status",
+                                    MaintenanceStandardStatusEnum.WAIT_SUBMIT.name(),
+                                    MaintenanceStandardStatusEnum.WAIT_REPAIR_DIRECTOR.name(),
+                                    MaintenanceStandardStatusEnum.WAIT_TECHNICAL_DIRECTOR.name())
+                            .eq("del_flag", CommonConstant.DEL_FLAG_0)
+            );
+
+            if (!pendingList.isEmpty()) {
+                throw new ImportException("瀛樺湪寰呭鎵规祦绋嬶紝璇风粨鏉熷悗鍐嶆搷浣�");
+            }
+
+            // 浣滃簾鏃ф爣鍑�
+            oldStandard.setStandardStatus(MaintenanceStandardStatusEnum.ABOLISH.name());
+            eamMaintenanceStandardMapper.updateById(oldStandard);
+
+            // 鐗堟湰鍗囩骇
+            String newVersion = incrementVersion(oldStandard.getStandardVersion());
+            standard.setStandardVersion(newVersion);
+
+            // 鏇存柊鐗堟湰鏄犲皠
+            String compositeKey = generateCompositeKey(
+                    standard.getEquipmentId(),
+                    standard.getMaintenanceCategory()
+            );
+            int newVersionNum = extractVersionNumber(newVersion);
+            versionMap.put(compositeKey, newVersionNum);
+
+        } else {
+            // 鏌ヨ鎵�鏈夊尮閰嶇殑璁惧+淇濆吇绫诲埆鏍囧噯
+            List<EamMaintenanceStandard> existingStandards = eamMaintenanceStandardMapper.selectList(
+                    new QueryWrapper<EamMaintenanceStandard>()
+                            .eq("equipment_id", standard.getEquipmentId())
+                            .eq("maintenance_category", standard.getMaintenanceCategory())
+                            .eq("del_flag", CommonConstant.DEL_FLAG_0)
+            );
+
+            // 濡傛灉瀛樺湪鍖归厤璁板綍锛屾壘鍑烘渶澶х増鏈彿
+            if (!existingStandards.isEmpty()) {
+                // 鎵惧嚭鏈�澶х増鏈彿
+                int maxVersion = existingStandards.stream()
+                        .mapToInt(s -> extractVersionNumber(s.getStandardVersion()))
+                        .max()
+                        .orElse(0);
+
+                // 璁剧疆鏂扮増鏈彿涓烘渶澶х増鏈�+1
+                standard.setStandardVersion("v" + (maxVersion + 1));
+
+                // 鏇存柊鐗堟湰鏄犲皠
+                String compositeKey = generateCompositeKey(
+                        standard.getEquipmentId(),
+                        standard.getMaintenanceCategory()
+                );
+                versionMap.put(compositeKey, maxVersion + 1);
+            } else {
+                // 娌℃湁鍖归厤璁板綍锛屽垵濮嬪寲涓簐1
+                standard.setStandardVersion("v1");
+
+                // 鏇存柊鐗堟湰鏄犲皠
+                String compositeKey = generateCompositeKey(
+                        standard.getEquipmentId(),
+                        standard.getMaintenanceCategory()
+                );
+                versionMap.put(compositeKey, 1);
+            }
         }
     }
 
     /**
-     * 鍚庡鐞嗘柟娉曪細鏍规嵁涓嶅悓绫诲瀷杩涜澶勭悊
+     * 閰嶇疆淇濆吇鏍囧噯鍙傛暟
     */
-    private void processItemsAfterExtraction(List<EamMaintenanceStandardDetail> items, String type) {
+    private void configureStandard(EamMaintenanceStandard standard, String type, MultipartFile file) {
+        // 鍩虹鍙傛暟
+        standard.setInitialDate(new Date())
+                .setStandardStatus(MaintenanceStandardStatusEnum.START.name())
+                .setDelFlag(CommonConstant.DEL_FLAG_0)
+                .setStandardCode(businessCodeRuleService.generateBusinessCodeSeq(
+                        BusinessCodeConst.MAINTENANCE_STANDARD_CODE_RULE
+                ));
+
+        // 绫诲瀷鐗瑰畾鍙傛暟
         if ("SECOND".equals(type)) {
-            // 浜岀骇淇濆吇: 鍒犻櫎娌℃湁搴忓彿鐨勬暟鎹�
-            items.removeIf(item -> item.getItemCode() == null);
+            standard.setMaintenanceCategory("SECOND_MAINTENANCE")
+                    .setMaintenancePeriod(6)
+                    .setPeriodUnit("鏈�");
         } else {
-            // 涓夌骇淇濆吇:
-            // 1. 鍒犻櫎绗竴鏉℃暟鎹紙閫氬父鏄爣棰樿锛�
-            if (!items.isEmpty()) {
-                items.remove(0);
+            standard.setMaintenanceCategory("THIRD_MAINTENANCE")
+                    .setPeriodUnit("骞�");
+
+            // 鑾峰彇涓夌骇淇濆吇鍛ㄦ湡
+            if (standard.getEquipmentId() != null) {
+                EamEquipmentExtend extend = eamEquipmentExtendService.getById(standard.getEquipmentId());
+                if (extend != null && extend.getThirdMaintenancePeriod() != null) {
+                    standard.setMaintenancePeriod(extend.getThirdMaintenancePeriod());
+                }
             }
 
-            // 2. 涓虹己澶遍儴浣嶇殑鏁版嵁濉厖鍓嶄竴鏉$殑淇濆吇閮ㄤ綅
-            String lastPart = "";
-            for (EamMaintenanceStandardDetail item : items) {
-                if (item.getItemPart() != null && !item.getItemPart().isEmpty()) {
-                    lastPart = item.getItemPart();
-                } else if (!lastPart.isEmpty()) {
-                    item.setItemPart(lastPart);
+            // 榛樿涓夌骇淇濆吇鍛ㄦ湡
+            if (standard.getMaintenancePeriod() == null) {
+                standard.setMaintenancePeriod(1);
+            }
+        }
+    }
+
+
+    /**
+     * 鍔犺浇鎸囧畾璁惧鐨勬渶澶х増鏈彿
+     */
+    private void loadDeviceMaxVersions(String equipmentId, Map<String, Integer> compositeVersionMap) {
+        if (StrUtil.isBlank(equipmentId)) return;
+
+        // 鏌ヨ璇ヨ澶囩殑鎵�鏈夋爣鍑�
+        List<EamMaintenanceStandard> standards = eamMaintenanceStandardMapper.selectList(
+                new QueryWrapper<EamMaintenanceStandard>()
+                        .eq("equipment_id", equipmentId)
+                        .eq("del_flag", CommonConstant.DEL_FLAG_0)
+        );
+
+        // 鎸変繚鍏诲垎绫诲垎缁�
+        Map<String, List<EamMaintenanceStandard>> standardsByCategory = standards.stream()
+                .collect(Collectors.groupingBy(EamMaintenanceStandard::getMaintenanceCategory));
+
+        // 瑙f瀽姣忎釜淇濆吇鍒嗙被鐨勬渶澶х増鏈彿
+        for (Map.Entry<String, List<EamMaintenanceStandard>> entry : standardsByCategory.entrySet()) {
+            String maintenanceCategory = entry.getKey();
+            int maxVersion = entry.getValue().stream()
+                    .mapToInt(s -> extractVersionNumber(s.getStandardVersion()))
+                    .max()
+                    .orElse(0);
+
+            String compositeKey = generateCompositeKey(equipmentId, maintenanceCategory);
+            compositeVersionMap.put(compositeKey, maxVersion);
+        }
+    }
+
+    /**
+     * 鍔犺浇鎵�鏈夎澶囩殑鏈�澶х増鏈彿
+     */
+    private void loadAllDeviceMaxVersions(Map<String, Integer> deviceVersionMap) {
+        // 鏌ヨ鎵�鏈夎澶囩殑鏍囧噯
+        List<EamMaintenanceStandard> allStandards = eamMaintenanceStandardMapper.selectList(
+                new QueryWrapper<EamMaintenanceStandard>()
+                        .eq("del_flag", CommonConstant.DEL_FLAG_0)
+        );
+
+        // 鍒涘缓澶嶅悎閿垎缁勶細璁惧ID + 淇濆吇鍒嗙被
+        Map<String, List<EamMaintenanceStandard>> standardsByCompositeKey = new HashMap<>();
+
+        for (EamMaintenanceStandard standard : allStandards) {
+            String compositeKey = generateCompositeKey(
+                    standard.getEquipmentId(),
+                    standard.getMaintenanceCategory()
+            );
+
+            standardsByCompositeKey
+                    .computeIfAbsent(compositeKey, k -> new ArrayList<>())
+                    .add(standard);
+        }
+
+        // 璁$畻姣忎釜澶嶅悎閿殑鏈�澶х増鏈彿
+        for (Map.Entry<String, List<EamMaintenanceStandard>> entry : standardsByCompositeKey.entrySet()) {
+            String compositeKey = entry.getKey();
+            int maxVersion = entry.getValue().stream()
+                    .mapToInt(s -> extractVersionNumber(s.getStandardVersion()))
+                    .max()
+                    .orElse(0);
+
+            deviceVersionMap.put(compositeKey, maxVersion);
+        }
+    }
+
+    /**
+     * 鏇存柊璁惧鐗堟湰鏄犲皠琛�
+     */
+    private void updateDeviceVersionMap(Map<String, Integer> compositeVersionMap,
+                                        EamMaintenanceStandard newStandard) {
+        String compositeKey = generateCompositeKey(
+                newStandard.getEquipmentId(),
+                newStandard.getMaintenanceCategory()
+        );
+
+        int newVersion = extractVersionNumber(newStandard.getStandardVersion());
+
+        // 濡傛灉澶嶅悎閿凡瀛樺湪锛屾瘮杈冪増鏈彿
+        if (compositeVersionMap.containsKey(compositeKey)) {
+            int currentMax = compositeVersionMap.get(compositeKey);
+            if (newVersion > currentMax) {
+                compositeVersionMap.put(compositeKey, newVersion);
+            }
+        } else {
+            compositeVersionMap.put(compositeKey, newVersion);
+        }
+    }
+    /**
+     * 浣滃簾鏃х増鏈�
+     */
+    private void obsoleteOldVersionsByCompositeKey(Map<String, Integer> compositeVersionMap) {
+        for (Map.Entry<String, Integer> entry : compositeVersionMap.entrySet()) {
+            String compositeKey = entry.getKey();
+            String[] parts = compositeKey.split("\\|");
+            if (parts.length != 2) continue;
+
+            String equipmentId = parts[0];
+            String maintenanceCategory = parts[1];
+            int maxVersion = entry.getValue();
+
+            // 浣滃簾鎵�鏈変笉鏄渶鏂扮増鏈殑鏍囧噯锛堢浉鍚岃澶�+鐩稿悓淇濆吇鍒嗙被锛�
+            List<EamMaintenanceStandard> oldStandards = eamMaintenanceStandardMapper.selectList(
+                    new QueryWrapper<EamMaintenanceStandard>()
+                            .eq("equipment_id", equipmentId)
+                            .eq("maintenance_category", maintenanceCategory)
+                            .eq("del_flag", CommonConstant.DEL_FLAG_0)
+            );
+
+            for (EamMaintenanceStandard standard : oldStandards) {
+                int version = extractVersionNumber(standard.getStandardVersion());
+                if (version < maxVersion) {
+                    // 妫�鏌ユ槸鍚﹀湪瀹℃壒娴佺▼涓�
+                    if (isPendingApproval(standard)) {
+                        log.warn("璺宠繃浣滃簾锛氳澶噞}鐨剓}鏍囧噯{}澶勪簬瀹℃壒娴佺▼涓�",
+                                equipmentId, maintenanceCategory, standard.getId());
+                        continue;
+                    }
+
+                    standard.setStandardStatus(MaintenanceStandardStatusEnum.ABOLISH.name());
+                    eamMaintenanceStandardMapper.updateById(standard);
+
+                    log.info("璁惧{}鐨剓}鏃ф爣鍑嗗凡浣滃簾锛歿} (v{})",
+                            equipmentId, maintenanceCategory, standard.getId(), version);
                 }
             }
         }
     }
+
     /**
-     * 鎻愬彇浜岀骇淇濆吇椤圭洰锛堝尯鍒嗙涓�椤靛拰鍚庣画椤甸潰锛�
+     * 鍒ゆ柇鏍囧噯鏄惁澶勪簬瀹℃壒娴佺▼涓�
+     */
+    private boolean isPendingApproval(EamMaintenanceStandard standard) {
+        return MaintenanceStandardStatusEnum.WAIT_SUBMIT.name().equals(standard.getStandardStatus()) ||
+                MaintenanceStandardStatusEnum.WAIT_REPAIR_DIRECTOR.name().equals(standard.getStandardStatus()) ||
+                MaintenanceStandardStatusEnum.WAIT_TECHNICAL_DIRECTOR.name().equals(standard.getStandardStatus());
+    }
+
+    /**
+     * 浠庣増鏈瓧绗︿覆涓彁鍙栨暟瀛�
+    */
+    private int extractVersionNumber(String versionStr) {
+        if (StrUtil.isBlank(versionStr)) return 0;
+
+        Pattern pattern = Pattern.compile("v?(\\d+)");
+        Matcher matcher = pattern.matcher(versionStr);
+        if (matcher.find()) {
+            try {
+                return Integer.parseInt(matcher.group(1));
+            } catch (NumberFormatException e) {
+                log.warn("鐗堟湰鍙疯В鏋愬け璐�: {}", versionStr);
+            }
+        }
+        return 0;
+    }
+
+    /**
+     * 鐢熸垚璁惧+淇濆吇绫诲埆鐨勫鍚堥敭
+    */
+    private String generateCompositeKey(String equipmentId, String maintenanceCategory) {
+        return equipmentId + "|" + maintenanceCategory;
+    }
+
+    /**
+     * 鐗堟湰鍙烽�掑閫昏緫
+     */
+    private String incrementVersion(String oldVersion) {
+        if (StrUtil.isBlank(oldVersion)) {
+            return "v1";
+        }
+
+        // 灏濊瘯鍖归厤 vX 鏍煎紡
+        Pattern pattern = Pattern.compile("v?(\\d+)");
+        Matcher matcher = pattern.matcher(oldVersion);
+        if (matcher.find()) {
+            try {
+                int verNum = Integer.parseInt(matcher.group(1)) + 1;
+                return "v" + verNum;
+            } catch (NumberFormatException e) {
+                // 鏍煎紡閿欒锛屼娇鐢ㄩ粯璁�
+            }
+        }
+        return "v1";
+    }
+
+    /**
+     * 鎻愬彇璁惧鍩烘湰淇℃伅
+     */
+    private EamMaintenanceStandard extractDeviceInfo(XWPFTable table, String type) {
+        if (table.getNumberOfRows() < 2) return null;
+
+        // 鎻愬彇鍓嶄袱琛屾暟鎹�
+        Map<String, String> row1Data = extractRowData(table.getRow(0));
+        Map<String, String> row2Data = extractRowData(table.getRow(1));
+
+        // 鍒涘缓璁惧鏍囧噯瀵硅薄
+        EamMaintenanceStandard standard = new EamMaintenanceStandard();
+        standard.setEquipmentText(row1Data.get("璁惧绫诲埆"));
+        standard.setEquipmentCode(row1Data.get("璁惧缂栧彿"));
+        standard.setEquipmentName(row2Data.get("璁惧鍚嶇О"));
+        standard.setEquipmentModel(row2Data.get("璁惧鍨嬪彿"));
+
+        // 鍏宠仈璁惧ID
+        if (StrUtil.isNotEmpty(standard.getEquipmentCode())) {
+            EamEquipment equipment = eamEquipmentService.selectByEquipmentCode(standard.getEquipmentCode());
+            if (equipment == null) {
+                log.warn("璁惧缂栫爜鏈壘鍒�: {}", standard.getEquipmentCode());
+                return null;
+            } else {
+                standard.setEquipmentId(equipment.getId());
+            }
+        }
+
+        return standard;
+    }
+
+    /**
+     * 鎻愬彇浜岀骇淇濆吇椤圭洰
      */
     private List<EamMaintenanceStandardDetail> extractSecondMaintenanceItems(
             XWPFTable table, String standardId, boolean isFirstTable) {
@@ -1083,7 +1916,7 @@
                 if (row.getTableCells().size() > 1) {
                     String seqText = getCellText(row.getCell(1));
                     try {
-                        if (!seqText.equals("搴忓彿")){
+                        if (!seqText.equals("搴忓彿")) {
                             item.setItemCode(Integer.parseInt(seqText.trim()));
                         }
                     } catch (NumberFormatException e) {
@@ -1130,7 +1963,6 @@
 
             // 鍒涘缓淇濆吇椤圭洰
             EamMaintenanceStandardDetail item = new EamMaintenanceStandardDetail();
-            item.setItemCategory("THIRD_MAINTENANCE");
             item.setStandardId(standardId);
             int colCount = row.getTableCells().size();
 
@@ -1173,7 +2005,7 @@
             } else if (cellContents.size() == 1) {
                 // 鍗曞垪妯″紡锛氳涓哄唴瀹�
                 item.setItemName(cellContents.get(0));
-            } else if (cellContents.isEmpty() && !isRowEmpty(row)) {
+            } else if (!isRowEmpty(row)) {
                 // 鐗规畩澶勭悊锛氳闈炵┖浣嗘病鏈夋彁鍙栧埌鍐呭锛堝彲鑳芥槸澶嶆潅鍚堝苟鍗曞厓鏍硷級
                 // 灏濊瘯鎻愬彇鏁磋鏂囨湰浣滀负鍐呭
                 StringBuilder content = new StringBuilder();
@@ -1189,28 +2021,8 @@
     }
 
     /**
-     * 浼樺寲鍚庣殑绌鸿妫�娴嬶紙瑙e喅璺ㄩ〉绌鸿闂锛�
-     */
-    private boolean isRowEmpty(XWPFTableRow row) {
-        if (row == null || row.getTableCells().isEmpty()) {
-            return true;
-        }
-
-        boolean allCellsEmpty = true;
-        for (XWPFTableCell cell : row.getTableCells()) {
-            String text = getCellText(cell).trim();
-            // 淇濈暀鍖呭惈鎹㈣绗︾瓑鐨勫崟鍏冩牸浣滀负闈炵┖琛�
-            if (!text.isEmpty() && !text.replaceAll("\\s+", "").isEmpty()) {
-                allCellsEmpty = false;
-                break;
-            }
-        }
-        return allCellsEmpty;
-    }
-
-    /**
      * 鏂囨。绫诲瀷鏍¢獙 - 闃叉浜屼繚浼犲叆涓変繚鎴栧弽涔�
-    */
+     */
     private boolean isWrongDocumentType(XWPFTable table, String requestedType) {
         boolean hasRepairTitle = false;
         boolean hasOperatorTitle = false;
@@ -1255,41 +2067,6 @@
     }
 
     /**
-     * 鎻愬彇璁惧鍩烘湰淇℃伅
-     */
-    private EamMaintenanceStandard extractDeviceInfo(XWPFTable table) {
-        if (table.getNumberOfRows() < 2) return null;
-
-        // 鎻愬彇鍓嶄袱琛屾暟鎹�
-        Map<String, String> row1Data = extractRowData(table.getRow(0));
-        Map<String, String> row2Data = extractRowData(table.getRow(1));
-
-        // 鍒涘缓璁惧鏍囧噯瀵硅薄
-        EamMaintenanceStandard standard = new EamMaintenanceStandard();
-        standard.setEquipmentText(row1Data.get("璁惧绫诲埆"));
-        standard.setEquipmentCode(row1Data.get("璁惧缂栧彿"));
-        standard.setEquipmentName(row2Data.get("璁惧鍚嶇О"));
-        standard.setEquipmentModel(row2Data.get("璁惧鍨嬪彿"));
-
-        // 鍏宠仈璁惧ID
-        if (StrUtil.isNotEmpty(standard.getEquipmentCode())) {
-            EamEquipment equipments = eamEquipmentService.selectByEquipmentCode(standard.getEquipmentCode());
-            if (equipments == null) {
-                return null;
-            }else {
-                standard.setEquipmentId(equipments.getId());
-            }
-        }
-
-        return standard;
-    }
-
-    // 绠�鏄撶増瀛楃涓查潪绌哄垽鏂�
-    private boolean isNotBlank(String str) {
-        return str != null && !str.trim().isEmpty();
-    }
-
-    /**
      * 琛ㄦ牸琛屾暟鎹В鏋�
      */
     private Map<String, String> extractRowData(XWPFTableRow row) {
@@ -1309,7 +2086,10 @@
             else {
                 for (int i = 0; i < cellCount; i++) {
                     String text = getCellText(row.getCell(i));
+                    // 鏀寔涓枃鍐掑彿鍜岃嫳鏂囧啋鍙�
                     int colonIndex = text.indexOf('锛�');
+                    if (colonIndex < 0) colonIndex = text.indexOf(':');
+
                     if (colonIndex > 0) {
                         String key = cleanKey(text.substring(0, colonIndex));
                         String value = text.substring(colonIndex + 1);
@@ -1325,64 +2105,31 @@
 
     /**
      * 閿悕鏍囧噯鍖栧鐞�
-     */
+    */
     private String cleanKey(String key) {
         if (key == null) return "";
         // 绉婚櫎绌烘牸鍜屼腑鏂囧啋鍙�
-        return key.replaceAll("\\s", "").replace("锛�", "");
+        return key.replaceAll("\\s", "").replace("锛�", "").replace(":", "");
     }
 
     /**
-     * 閰嶇疆淇濆吇鏍囧噯鍙傛暟
+     * 绌鸿妫�娴嬶紙瑙e喅璺ㄩ〉绌鸿闂锛�
      */
-    private void configureStandard(EamMaintenanceStandard standard, String type, MultipartFile file) {
-        // 鍩虹鍙傛暟
-        String filename = file.getOriginalFilename();
-        if (filename != null && filename.contains(".")) {
-            filename = filename.substring(0, filename.lastIndexOf('.'));
+    private boolean isRowEmpty(XWPFTableRow row) {
+        if (row == null || row.getTableCells().isEmpty()) {
+            return true;
         }
 
-        standard.setStandardName(filename)
-                .setInitialDate(new Date())
-                .setStandardStatus(MaintenanceStandardStatusEnum.START.name())
-                .setStandardVersion("v" + CommonConstant.OPERATE_TYPE_1)
-                .setDelFlag(0)
-                .setStandardCode(businessCodeRuleService.generateBusinessCodeSeq(
-                        BusinessCodeConst.MAINTENANCE_STANDARD_CODE_RULE
-                ));
-
-        // 绫诲瀷鐗瑰畾鍙傛暟
-        if ("SECOND".equals(type)) {
-            standard.setMaintenanceCategory("SECOND_MAINTENANCE")
-                    .setMaintenancePeriod(6)
-                    .setPeriodUnit("鏈�");
-        } else {
-            standard.setMaintenanceCategory("THIRD_MAINTENANCE")
-                    .setPeriodUnit("骞�");
-
-            // 鑾峰彇涓夌骇淇濆吇鍛ㄦ湡
-            if (standard.getEquipmentId() != null) {
-                EamEquipmentExtend extend = eamEquipmentExtendService.getById(standard.getEquipmentId());
-                if (extend != null) {
-                    standard.setMaintenancePeriod(extend.getThirdMaintenancePeriod());
-                }
+        boolean allCellsEmpty = true;
+        for (XWPFTableCell cell : row.getTableCells()) {
+            String text = getCellText(cell).trim();
+            // 淇濈暀鍖呭惈鎹㈣绗︾瓑鐨勫崟鍏冩牸浣滀负闈炵┖琛�
+            if (!text.isEmpty() && !text.replaceAll("\\s+", "").isEmpty()) {
+                allCellsEmpty = false;
+                break;
             }
         }
-    }
-
-    /**
-     * 鍒涘缓淇濆吇椤圭洰
-     */
-    private EamMaintenanceStandardDetail createItem(
-            EamMaintenanceStandardDetailCategory category,
-            String content,
-            String standardId) {
-
-        EamMaintenanceStandardDetail item = new EamMaintenanceStandardDetail();
-        item.setItemCategory(category.name());
-        item.setStandardId(standardId);
-        item.setItemName(cleanContent(content));
-        return item;
+        return allCellsEmpty;
     }
 
     /**
@@ -1408,28 +2155,6 @@
     }
 
     /**
-     * 鍐呭娓呯悊
-     */
-    private String cleanContent(String text) {
-        if (text == null) return "";
-
-        // 鏇挎崲鐗规畩绌烘牸鍜屽悎骞惰繛缁┖鏍�
-        text = text.replace('\u00A0', ' ')
-                .replace('\u2007', ' ')
-                .replace('\u202F', ' ')
-                .replaceAll("\\s+", " ");
-
-        // 瑙勮寖鏍囩偣绗﹀彿
-        return text.replace(',', '銆�')
-                .replace('锛�', '銆�')
-                .replace(';', '锛�')
-                .replace('锛�', '锛�')
-                .replace(':', '锛�')
-                .replace('锛�', '锛�')
-                .trim();
-    }
-
-    /**
      * 楠岃瘉鏈夋晥椤圭洰琛�
      */
     private boolean isValidItemRow(XWPFTableRow row) {
@@ -1438,6 +2163,33 @@
                 !getCellText(row.getCell(1)).trim().isEmpty();
     }
 
-    /*瀵煎叆浜屼繚涓変繚鏂囦欢Excel--------------------------缁撴潫*/
+    /**
+     * 鍚庡鐞嗘柟娉曪細鏍规嵁涓嶅悓绫诲瀷杩涜澶勭悊
+     */
+    private void processItemsAfterExtraction(List<EamMaintenanceStandardDetail> items, String type) {
+        if ("SECOND".equals(type)) {
+            // 浜岀骇淇濆吇: 鍒犻櫎娌℃湁搴忓彿鐨勬暟鎹�
+            items.removeIf(item -> item.getItemCode() == null);
+        } else {
+            // 涓夌骇淇濆吇:
+            // 1. 鍒犻櫎绗竴鏉℃暟鎹紙閫氬父鏄爣棰樿锛�
+            if (!items.isEmpty()) {
+                items.remove(0);
+            }
+            // 2. 涓虹己澶遍儴浣嶇殑鏁版嵁濉厖鍓嶄竴鏉$殑淇濆吇閮ㄤ綅
+            String lastPart = "";
+            int i = 1;
+            for (EamMaintenanceStandardDetail item : items) {
+                item.setItemCode(i);
+                if (item.getItemPart() != null && !item.getItemPart().isEmpty()) {
+                    lastPart = item.getItemPart();
+                } else if (!lastPart.isEmpty()) {
+                    item.setItemPart(lastPart);
+                }
+                i++;
+            }
+        }
+    }
 
+    /*瀵煎叆浜屼繚涓変繚鏂囦欢Word--------------------------缁撴潫*/
 }

--
Gitblit v1.9.3