From 40bf019f0b348378385ed0a819b5b06e1708d558 Mon Sep 17 00:00:00 2001
From: lyh <925863403@qq.com>
Date: 星期六, 09 八月 2025 00:19:37 +0800
Subject: [PATCH] 工作流代码

---
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java |  669 ++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 487 insertions(+), 182 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 0f997e7..88c86f4 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,6 +5,7 @@
 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;
@@ -23,6 +24,7 @@
 import org.jeecg.modules.eam.constant.BusinessCodeConst;
 import org.jeecg.modules.eam.constant.EamMaintenanceStandardDetailCategory;
 import org.jeecg.modules.eam.constant.MaintenanceStandardStatusEnum;
+import org.jeecg.modules.eam.constant.SecondMaintenanceStatusEnum;
 import org.jeecg.modules.eam.entity.EamEquipment;
 import org.jeecg.modules.eam.entity.EamEquipmentExtend;
 import org.jeecg.modules.eam.entity.EamMaintenanceStandard;
@@ -39,6 +41,7 @@
 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.entity.BaseFactory;
@@ -183,7 +186,7 @@
         //鍒犻櫎鏍囪
         entity.setDelFlag(CommonConstant.DEL_FLAG_0);
         //閲嶅鎬ф牎楠�
-        EamMaintenanceStandard exist = checkDuplicate(entity.getEquipmentId(), entity.getMaintenanceCategory(), MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
+        EamMaintenanceStandard exist = checkDuplicate(entity.getEquipmentId(), entity.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name());
         if (exist != null) {
             throw new JeecgBootException("璁惧鏍囧噯宸插瓨鍦紝涓嶈兘閲嶅娣诲姞锛�");
         }
@@ -259,7 +262,7 @@
         //鍒犻櫎鏍囪
         newEntity.setDelFlag(CommonConstant.DEL_FLAG_0);
         //閲嶅鎬ф牎楠�
-        EamMaintenanceStandard exist = checkDuplicate(newEntity.getEquipmentId(), newEntity.getMaintenanceCategory(), MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
+        EamMaintenanceStandard exist = checkDuplicate(newEntity.getEquipmentId(), newEntity.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name());
         if (exist != null) {
             throw new JeecgBootException("璁惧鏍囧噯宸插瓨鍦紝涓嶈兘閲嶅娣诲姞锛�");
         }
@@ -285,7 +288,8 @@
         queryWrapper.eq(EamMaintenanceStandard::getEquipmentId, equipmentId);
         queryWrapper.eq(EamMaintenanceStandard::getMaintenanceCategory, maintenanceCategory);
         queryWrapper.eq(EamMaintenanceStandard::getDelFlag, CommonConstant.DEL_FLAG_0);
-        queryWrapper.eq(EamMaintenanceStandard::getStandardStatus, standardStatus);
+        queryWrapper.ne(EamMaintenanceStandard::getStandardStatus, standardStatus);
+        queryWrapper.ne(EamMaintenanceStandard::getStandardStatus,MaintenanceStandardStatusEnum.START.name());
         queryWrapper.orderByDesc(EamMaintenanceStandard::getStandardVersion);
 
         List<EamMaintenanceStandard> list = eamMaintenanceStandardMapper.selectList(queryWrapper);
@@ -323,192 +327,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
+    @Transactional(rollbackFor = Exception.class)
     public Result<?> saveEamMaintenanceStandardProcess(String id) {
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        EamMaintenanceStandard maintenanceStandard = this.getById(id);
-        if (maintenanceStandard == null) {
-            return Result.error("鏈壘鍒板搴斾繚鍏绘爣鍑�");
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+        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());
-            List<UserSelector> userSelectorList = sysUserService.selectOperatorList(eamEquipment.getEquipmentCode(), eamEquipment.getFactoryOrgCode(), 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());
-                        List<UserSelector> userSelectorList = sysUserService.selectOperatorList(eamEquipment.getEquipmentCode(), eamEquipment.getFactoryOrgCode(), 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);
+        }
     }
 
 
@@ -531,8 +717,9 @@
 
     @Override
     public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
-        //涓氬姟鏄惁骞查娴佺▼锛屼笟鍔″共棰勶紝娴佺▼骞查锛屾寚瀹氫汉鍛樿繘琛屽鐞�
-        return null;
+        //鑾峰彇涓嬩竴姝ュ鐞嗕汉
+        Object object = values.get("NextAssignee");
+        return (List<String>) object;
     }
 
     /*娴佺▼涓氬姟浠g爜--------------------------缁撴潫*/
@@ -545,7 +732,11 @@
      */
     @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);
 
@@ -560,13 +751,58 @@
 
             eamMaintenanceStandard.setStandardName(name);
 
-            // 妫�鏌ラ噸澶�
-            EamMaintenanceStandard exist = checkDuplicate(eamMaintenanceStandard.getEquipmentId(),
-                    eamMaintenanceStandard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.START.name());
-            if (exist != null) {
-                return Result.error(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);
 
             Map<Integer, String> rowErrors = new HashMap<>();
@@ -594,9 +830,11 @@
 
             // 瑙﹀彂淇濆吇娴佺▼
             SysParams sysParams = sysParamsService.getSysPramBySettingKey("maintenance_import_type");
-            if (sysParams != null && sysParams.getSettingValue().equals("1")) {
-                eamMaintenanceStandard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
-                eamMaintenanceStandardMapper.updateById(eamMaintenanceStandard);
+            if (sysParams != null) {
+                if (sysParams.getSettingValue().equals("1")){
+                    eamMaintenanceStandard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
+                    eamMaintenanceStandardMapper.updateById(eamMaintenanceStandard);
+                }
             } else {
                 return Result.error("鏈壘鍒颁繚鍏绘祦绋嬪鍏ョ浉鍏抽厤缃�,璇疯仈绯荤鐞嗗憳");
             }
@@ -1075,10 +1313,25 @@
      */
     @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())) {
+            // 鑾峰彇鏂囨。鏍囬锛堢涓�涓潪绌烘钀斤級
+            String documentTitle = null;
+            for (XWPFParagraph p : doc.getParagraphs()) {
+                String text = p.getText();
+                if (text != null && !text.trim().isEmpty()) {
+                    documentTitle = text.trim();
+                    break; // 鎵惧埌绗竴涓潪绌烘钀藉嵆閫�鍑�
+                }
+            }
+
+            // 鍩虹楠岃瘉
+            if (doc.getTables().isEmpty()) {
+                return Result.error(fileName + ": 鏂囨。涓湭鎵惧埌琛ㄦ牸");
+            }
+
             // 鍩虹楠岃瘉
             if (doc.getTables().isEmpty()) {
                 return Result.error(fileName + ": 鏂囨。涓湭鎵惧埌琛ㄦ牸");
@@ -1106,12 +1359,64 @@
                         return Result.error(fileName + ": 璁惧淇℃伅鎻愬彇澶辫触");
                     }
 
+                    EamMaintenanceStandard eamMaintenanceStandardOld=new EamMaintenanceStandard();
+                    if (StrUtil.isNotEmpty(id)){
+                        eamMaintenanceStandardOld=eamMaintenanceStandardMapper.selectById(id);
+                    }
+
                     // 閰嶇疆绫诲瀷鐩稿叧鍙傛暟
                     configureStandard(standard, type, file);
-                    EamMaintenanceStandard exist = checkDuplicate(standard.getEquipmentId(), standard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.START.name());
-                    if (exist != null) {
-                        return Result.error(fileName + ": 璁惧鏍囧噯宸插瓨鍦紝涓嶈兘閲嶅娣诲姞");
+                    if (StrUtil.isEmpty(id)){
+                        EamMaintenanceStandard exist = checkDuplicate(standard.getEquipmentId(), standard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name());
+                        if (exist != null) {
+                            return Result.error(fileName + ": 璁惧鏍囧噯宸插瓨鍦紝涓嶈兘閲嶅娣诲姞");
+                        }
                     }
+
+                    if (StrUtil.isNotEmpty(id)){
+                        if (eamMaintenanceStandardOld.getEquipmentId().equals(standard.getEquipmentId())
+                                &&eamMaintenanceStandardOld.getMaintenanceCategory().equals(standard.getMaintenanceCategory())) {
+                            //鍒ゆ柇鏄惁鐜版湁寰呮彁浜ゆ暟鎹�
+                            EamMaintenanceStandard maintenanceStandard=eamMaintenanceStandardMapper.selectOne(
+                                    new QueryWrapper<EamMaintenanceStandard>().eq("equipment_id",standard.getEquipmentId())
+                                            .eq("maintenance_category",standard.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",standard.getEquipmentId())
+                                            .eq("maintenance_category",standard.getMaintenanceCategory())
+                                            .eq("del_flag", CommonConstant.DEL_FLAG_0)
+                                            .and(it->it.
+                                                    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));
+                                    standard.setStandardVersion("v" + (mainVersion + 1));
+                                } catch (NumberFormatException ignored) {
+                                }
+                            }
+                        }else {
+                            return Result.error("鍗囩増瀵煎叆鐨勬枃浠朵笌鍘熸湁鏁版嵁鐨勮澶囩紪鍙蜂笉涓�鑷�,璇烽噸鏂扮紪杈戝鍏ユ枃浠�");
+                        }
+                    }
+                    standard.setStandardName(documentTitle);
                     eamMaintenanceStandardMapper.insert(standard);
                     standardId = standard.getId();
 

--
Gitblit v1.9.3