瀏覽代碼

维修、维保结单匹配,自动结单,接单负责人非必填

HD_wangm 3 月之前
父節點
當前提交
2dc1060f47

+ 12 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/controller/GxtMisInfoController.java

@@ -46,6 +46,18 @@ public class GxtMisInfoController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询MIS工单列表
+     */
+    @ApiOperation("查询MIS工单列表")
+    @GetMapping("/autoList")
+    public TableDataInfo autoList(GxtMisInfo misInfo)
+    {
+        startPage();
+        List<GxtMisInfo> list = misInfoService.selectAutoGxtMisInfoList(misInfo);
+        return getDataTable(list);
+    }
+
     /**
      * 查询MIS工单列表
      */

+ 20 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtMisInfo.java

@@ -57,6 +57,10 @@ public class GxtMisInfo extends BaseEntity {
     /** 工单状态:draft-草稿,to_assign-待派单,assigned-已派单,accepted-已接单,processing-处理中,paused-暂停中,to_approve-待审批,suspended-已挂起,completed-已完成 */
     private String workOrderStatus;
 
+    private Date pauseTime;
+
+    private Date restartTime;
+
     public String getMisNo() {
         return misNo;
     }
@@ -184,4 +188,20 @@ public class GxtMisInfo extends BaseEntity {
     public void setWorkOrderStatus(String workOrderStatus) {
         this.workOrderStatus = workOrderStatus;
     }
+
+    public Date getPauseTime() {
+        return pauseTime;
+    }
+
+    public void setPauseTime(Date pauseTime) {
+        this.pauseTime = pauseTime;
+    }
+
+    public Date getRestartTime() {
+        return restartTime;
+    }
+
+    public void setRestartTime(Date restartTime) {
+        this.restartTime = restartTime;
+    }
 }

+ 9 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/mapper/GxtRepairOrderMapper.java

@@ -33,6 +33,15 @@ public interface GxtRepairOrderMapper
      */
     public List<GxtRepairOrder> selectGxtRepairOrderList(GxtRepairOrder gxtRepairOrder);
 
+    /**
+     * 查询用于自动结单的维修工单列表
+     * 查询状态为assigned或to_finish且接单时间、停机时间、恢复运行时间不为空的工单
+     *
+     * @param gxtRepairOrder 维修工单
+     * @return 维修工单集合
+     */
+    public List<GxtRepairOrder> selectGxtRepairOrderListForAutoFinalize(GxtRepairOrder gxtRepairOrder);
+
     /**
      * 新增维修工单
      *

+ 9 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/mapper/GxtWorkOrderMapper.java

@@ -32,6 +32,15 @@ public interface GxtWorkOrderMapper {
      */
     public List<GxtWorkOrder> selectGxtWorkOrderList(GxtWorkOrder gxtWorkOrder);
 
+    /**
+     * 查询用于自动结单的维保工单列表
+     * 查询状态为assigned或to_finish且接单时间、停机时间、恢复运行时间不为空的工单
+     *
+     * @param gxtWorkOrder 维保工单
+     * @return 维保工单集合
+     */
+    public List<GxtWorkOrder> selectGxtWorkOrderListForAutoFinalize(GxtWorkOrder gxtWorkOrder);
+
     /**
      * 新增维保工单
      *

+ 7 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/mapper/source/GxtMisInfoMapper.java

@@ -27,4 +27,11 @@ public interface GxtMisInfoMapper {
      */
     public List<GxtWorkOrderPerson> selectGxtWorkOrderPersonList(GxtWorkOrderPerson workOrderPerson);
 
+    /**
+     * 自动匹配查询
+     * @param misInfo
+     * @return
+     */
+    public List<GxtMisInfo> selectAutoGxtMisInfoList(GxtMisInfo misInfo);
+
 }

+ 1 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/service/IGxtMisInfoService.java

@@ -27,4 +27,5 @@ public interface IGxtMisInfoService {
      */
     public List<GxtWorkOrderPerson> selectGxtWorkOrderPersonList(GxtWorkOrderPerson workOrderPerson);
 
+    public List<GxtMisInfo> selectAutoGxtMisInfoList(GxtMisInfo misInfo);
 }

+ 5 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtMisNoServiceImpl.java

@@ -47,5 +47,10 @@ public class GxtMisNoServiceImpl implements IGxtMisInfoService
         return misInfoMapper.selectGxtWorkOrderPersonList(workOrderPerson);
     }
 
+    @Override
+    public List<GxtMisInfo> selectAutoGxtMisInfoList(GxtMisInfo misInfo) {
+        return misInfoMapper.selectAutoGxtMisInfoList(misInfo);
+    }
+
 
 }

+ 33 - 19
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtRepairOrderServiceImpl.java

@@ -564,19 +564,21 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
         int result = gxtRepairOrderMapper.updateGxtRepairOrder(gxtRepairOrder);
         // 记录接单流转信息
         if (result > 0) {
-            // 工作负责人存入工单工作组员名单
-            GxtRepairOrderPerson person = new GxtRepairOrderPerson();
-            person.setIsLeader(1);
-            person.setUserId(gxtRepairOrder.getTeamLeaderId());
-            person.setNickName(gxtRepairOrder.getTeamLeaderName());
-            person.setOrderId(oldOrder.getId());
-            person.setOrderCode(oldOrder.getWorkOrderProjectNo());
-            person.setStatus(1);
-            person.setCreateBy(SecurityUtils.getUsername());
-            person.setCreateTime(DateUtils.getNowDate());
-            gxtRepairOrderPersonMapper.insertGxtRepairOrderPerson(person);
-
-            gxtUserOperatorHistoryService.insertHistoryRepairOrder(UserConstants.OP_TYPE_LEADER, gxtRepairOrder);
+            if (null != gxtRepairOrder.getTeamLeaderId()) {
+                // 工作负责人存入工单工作组员名单
+                GxtRepairOrderPerson person = new GxtRepairOrderPerson();
+                person.setIsLeader(1);
+                person.setUserId(gxtRepairOrder.getTeamLeaderId());
+                person.setNickName(gxtRepairOrder.getTeamLeaderName());
+                person.setOrderId(oldOrder.getId());
+                person.setOrderCode(oldOrder.getWorkOrderProjectNo());
+                person.setStatus(1);
+                person.setCreateBy(SecurityUtils.getUsername());
+                person.setCreateTime(DateUtils.getNowDate());
+                gxtRepairOrderPersonMapper.insertGxtRepairOrderPerson(person);
+
+                gxtUserOperatorHistoryService.insertHistoryRepairOrder(UserConstants.OP_TYPE_LEADER, gxtRepairOrder);
+            }
 
             GxtRepairOrderFlow flow = new GxtRepairOrderFlow();
             flow.setOrderId(gxtRepairOrder.getId());
@@ -898,6 +900,11 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
         } else {
             memberNames = "无";
         }*/
+        // 结单:仅有待结单的工单才能结单
+        if (!"to_finish".equals(oldOrder.getWorkOrderStatus()))
+        {
+            throw new ServiceException("仅有待结单的工单才能结单");
+        }
         String memberNames = null;
         if(StringUtils.isNotEmpty(gxtRepairOrder.getWorkGroupMemberName())){
             memberNames = gxtRepairOrder.getWorkGroupMemberName();
@@ -931,6 +938,7 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
             if (StringUtils.isNotEmpty(gxtRepairOrder.getInfoEntry()) && "1".equals(gxtRepairOrder.getInfoEntry())) {   //信息录入选择“关联mis工单”
 //                gxtRepairOrderPersonMapper.deleteGxtRepairOrderPersonByOrderId(gxtRepairOrder.getId());
                 if(gxtRepairOrder.getRepairOrderPersonList() != null && !gxtRepairOrder.getRepairOrderPersonList().isEmpty()){
+                    gxtRepairOrderPersonMapper.deleteGxtRepairOrderPersonByOrderId(gxtRepairOrder.getId());
                     for (GxtRepairOrderPerson person : gxtRepairOrder.getRepairOrderPersonList())
                     {
                         SysUser sysUser = new SysUser();
@@ -939,7 +947,13 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
                         List<SysUser> sysUserList = sysUserService.selectUserListNoDataScope(sysUser);
                         if (sysUserList.size() > 0) {
                             sysUser = sysUserList.get(0);
-                            if (sysUser.getUserId().equals(gxtRepairOrder.getTeamLeaderId())) continue; //检修人员是否已存在
+//                            if (sysUser.getUserId().equals(gxtRepairOrder.getTeamLeaderId())) continue; //检修人员是否已存在
+                            //负责人发生变化,修改工单负责人
+                            if (!sysUser.getUserId().equals(gxtRepairOrder.getTeamLeaderId()) && 1 == person.getIsLeader()) {
+                                gxtRepairOrder.setTeamLeaderName(sysUser.getNickName());
+                                gxtRepairOrder.setTeamLeaderId(sysUser.getUserId());
+                                gxtRepairOrderMapper.updateGxtRepairOrder(gxtRepairOrder);
+                            }
                         } else {
                             throw new ServiceException("检修人员不存在");
                         }
@@ -971,11 +985,11 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
 //                        }
 //                        if(sysUser == null) continue;
                         person.setUserId(sysUser.getUserId());
-                        if (Objects.equals(sysUser.getUserId(), gxtRepairOrder.getTeamLeaderId())) {
-                            person.setIsLeader(1);
-                        } else {
-                            person.setIsLeader(0);
-                        }
+//                        if (Objects.equals(sysUser.getUserId(), gxtRepairOrder.getTeamLeaderId())) {
+//                            person.setIsLeader(1);
+//                        } else {
+//                            person.setIsLeader(0);
+//                        }
                         person.setUserId(sysUser.getUserId());
                         person.setOrderId(gxtRepairOrder.getId());
                         person.setOrderCode(gxtRepairOrder.getWorkOrderProjectNo());

+ 60 - 37
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtWorkOrderServiceImpl.java

@@ -762,6 +762,13 @@ public class GxtWorkOrderServiceImpl implements IGxtWorkOrderService
             order.setWlryNum(gxtWorkOrder.getWlryNum());
             order.setWwryNum(gxtWorkOrder.getWwryNum());
             order.setOrderEntryType(gxtWorkOrder.getOrderEntryType());
+            order.setWorkPermitNum(gxtWorkOrder.getWorkPermitNum());
+            order.setMisNo(gxtWorkOrder.getMisNo());
+            order.setInfoEntry(gxtWorkOrder.getInfoEntry());
+//            if (null != gxtWorkOrder.getTeamLeaderName() && order.getTeamLeaderName() != gxtWorkOrder.getTeamLeaderName()) {
+//                order.setTeamLeaderName(gxtWorkOrder.getTeamLeaderName());
+//            }
+
 
             int result = gxtWorkOrderMapper.updateGxtWorkOrder(order);
 
@@ -769,19 +776,32 @@ public class GxtWorkOrderServiceImpl implements IGxtWorkOrderService
             {
 //                // 2. 删除旧的工作组成员
 //                gxtWorkOrderPersonMapper.deleteGxtWorkOrderPersonByOrderId(id)
-                if (StringUtils.isNotEmpty(gxtWorkOrder.getInfoEntry()) && gxtWorkOrder.getInfoEntry().equals("1")) {
-                    // 3. 添加新的工作组成员
-                    for (GxtWorkOrderPerson person : gxtWorkOrder.getWorkOrderPersonList()) {
-                        SysUser sysUser = new SysUser();
-                        sysUser.setUserName(person.getUserName());
-                        sysUser.setNickName(person.getNickName());
-                        List<SysUser> sysUserList = sysUserService.selectUserListNoDataScope(sysUser);
-                        if (sysUserList.size() > 0) {
-                            sysUser = sysUserList.get(0);
-                            if (sysUser.getUserId().equals(order.getTeamLeaderId())) continue;  //检修人员是否已存在
-                        } else {
-                            throw new ServiceException("检修人员不存在");
-                        }
+                if (StringUtils.isNotEmpty(gxtWorkOrder.getInfoEntry()) && "1".equals(gxtWorkOrder.getInfoEntry())) {
+
+                    if (gxtWorkOrder.getWorkOrderPersonList().size() > 0) {
+
+                        gxtWorkOrderPersonMapper.deleteGxtWorkOrderPersonByOrderId(id);
+                        // 3. 添加新的工作组成员
+                        for (GxtWorkOrderPerson person : gxtWorkOrder.getWorkOrderPersonList()) {
+                            SysUser sysUser = new SysUser();
+                            sysUser.setUserName(person.getUserName());
+                            sysUser.setNickName(person.getNickName());
+                            List<SysUser> sysUserList = sysUserService.selectUserListNoDataScope(sysUser);
+                            if (sysUserList.size() > 0) {
+                                sysUser = sysUserList.get(0);
+                                //负责人发生变化,修改工单负责人
+                                if (!sysUser.getUserId().equals(order.getTeamLeaderId()) && 1 == person.getIsLeader()) {
+                                    order.setTeamLeaderName(sysUser.getNickName());
+                                    order.setTeamLeaderId(sysUser.getUserId());
+                                    gxtWorkOrderMapper.updateGxtWorkOrder(order);
+                                }
+                                // 已存在的负责人删掉
+//                                if (null != order.getTeamLeaderId() && sysUser.getUserId().equals(order.getTeamLeaderId()) && "1".equals(person.getIsLeader())) {
+//                                    gxtWorkOrderPersonMapper.deleteGxtWorkOrderPersonByOrderId(id);
+//                                }
+                            } else {
+                                throw new ServiceException("检修人员不存在");
+                            }
 //                    SysUser sysUser = null;
 //                    if(StringUtils.isNotEmpty(person.getUserName())){
 //                        sysUser = sysUserService.selectUserByUserName(person.getUserName());
@@ -809,18 +829,19 @@ public class GxtWorkOrderServiceImpl implements IGxtWorkOrderService
 //                        }
 //                    }
 //                    if(sysUser == null) continue;
-                        person.setUserId(sysUser.getUserId());
-                        if (sysUser.getUserId() == order.getTeamLeaderId()) {
-                            person.setIsLeader(1);
-                        } else {
-                            person.setIsLeader(0);
-                        }
-                        person.setOrderId(id);
-                        person.setOrderCode(order.getWorkOrderProjectNo());
-                        person.setStatus(1);
-                        person.setCreateBy(SecurityUtils.getUsername());
+                            person.setUserId(sysUser.getUserId());
+//                        if (sysUser.getUserId() == order.getTeamLeaderId()) {
+//                            person.setIsLeader(1);
+//                        } else {
+//                            person.setIsLeader(0);
+//                        }
+                            person.setOrderId(id);
+                            person.setOrderCode(order.getWorkOrderProjectNo());
+                            person.setStatus(1);
+                            person.setCreateBy(SecurityUtils.getUsername());
 //                    person.setCreateTime(DateUtils.getNowDate());
-                        gxtWorkOrderPersonMapper.insertGxtWorkOrderPerson(person);
+                            gxtWorkOrderPersonMapper.insertGxtWorkOrderPerson(person);
+                        }
                     }
                 } else {
                     if(StringUtils.isNotEmpty(gxtWorkOrder.getWorkGroupMemberName())){
@@ -995,19 +1016,21 @@ public class GxtWorkOrderServiceImpl implements IGxtWorkOrderService
         int result = gxtWorkOrderMapper.updateGxtWorkOrder(order);
         if (result > 0)
         {
-            // 工作负责人存入工单工作组员名单
-            GxtWorkOrderPerson person = new GxtWorkOrderPerson();
-            person.setIsLeader(1);
-            person.setUserId(gxtWorkOrder.getTeamLeaderId());
-            person.setNickName(gxtWorkOrder.getTeamLeaderName());
-            person.setMisNo(order.getMisNo());
-            person.setOrderId(order.getId());
-            person.setOrderCode(order.getWorkOrderProjectNo());
-            person.setStatus(1);
-            person.setCreateBy(SecurityUtils.getUsername());
-            person.setCreateTime(DateUtils.getNowDate());
-            gxtWorkOrderPersonMapper.insertGxtWorkOrderPerson(person);
-            gxtUserOperatorHistoryService.insertHistoryWorkOrder(UserConstants.OP_TYPE_LEADER, order);
+            if (null != gxtWorkOrder.getTeamLeaderId()) {
+                // 工作负责人存入工单工作组员名单
+                GxtWorkOrderPerson person = new GxtWorkOrderPerson();
+                person.setIsLeader(1);
+                person.setUserId(gxtWorkOrder.getTeamLeaderId());
+                person.setNickName(gxtWorkOrder.getTeamLeaderName());
+                person.setMisNo(order.getMisNo());
+                person.setOrderId(order.getId());
+                person.setOrderCode(order.getWorkOrderProjectNo());
+                person.setStatus(1);
+                person.setCreateBy(SecurityUtils.getUsername());
+                person.setCreateTime(DateUtils.getNowDate());
+                gxtWorkOrderPersonMapper.insertGxtWorkOrderPerson(person);
+                gxtUserOperatorHistoryService.insertHistoryWorkOrder(UserConstants.OP_TYPE_LEADER, order);
+            }
 //            String memberNames = gxtWorkOrder.getWorkOrderPersonList().stream()
 //                    .map(GxtWorkOrderPerson::getNickName)
 //                    .collect(java.util.stream.Collectors.joining(","));

+ 360 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/task/OrderAutoFinalizeTask.java

@@ -0,0 +1,360 @@
+package com.ygtx.gxt.task;
+
+import com.ygtx.common.core.domain.entity.SysUser;
+import com.ygtx.common.utils.DateUtils;
+import com.ygtx.gxt.domain.*;
+import com.ygtx.gxt.mapper.*;
+import com.ygtx.gxt.mapper.source.GxtMisInfoMapper;
+import com.ygtx.system.mapper.SysUserMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 工单自动结单任务
+ * @author lingma
+ */
+@EnableScheduling
+@Component("autoFinalizeTask")
+public class OrderAutoFinalizeTask {
+
+    private static final Logger log = LoggerFactory.getLogger(OrderAutoFinalizeTask.class);
+
+    @Autowired
+    private GxtRepairOrderMapper gxtRepairOrderMapper;
+
+    @Autowired
+    private GxtWorkOrderMapper gxtWorkOrderMapper;
+
+    @Autowired
+    private GxtWorkOrderFlowMapper gxtWorkOrderFlowMapper;
+
+    @Autowired
+    private GxtRepairOrderFlowMapper gxtRepairOrderFlowMapper;
+
+    @Autowired
+    private GxtMisInfoMapper misInfoMapper;
+
+    @Autowired
+    private GxtOrderPersonMapper orderPersonMapper;
+
+    @Autowired
+    private GxtRepairOrderPersonMapper repairOrderPersonMapper;
+
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    @Autowired
+    private GxtWorkOrderPersonMapper workOrderPersonMapper;
+
+    /**
+     * 每小时执行定时任务
+     * 查找状态为assigned或to_finish且接单时间、停机时间、恢复运行时间不为空的工单
+     */
+    public void finalizeOrders() {
+        log.info("开始执行工单自动结单任务");
+        
+        // 查询维修工单 - 状态为assigned或to_finish,且接单时间、停机时间、恢复运行时间不为空
+        GxtRepairOrder gxtRepairOrder = new GxtRepairOrder();
+        gxtRepairOrder.setWorkOrderStatus("assigned,to_finish");
+        gxtRepairOrder.setOrderEntryType("1");
+        List<GxtRepairOrder> repairOrderList = gxtRepairOrderMapper.selectGxtRepairOrderListForAutoFinalize(gxtRepairOrder);
+        
+        // 更新维修工单状态为完成
+        GxtRepairOrder updateRepairOrder = new GxtRepairOrder();
+        updateRepairOrder.setWorkOrderStatus("completed");
+        updateRepairOrder.setUpdateTime(DateUtils.getNowDate());
+        updateRepairOrder.setUpdateBy("admin");
+
+        for (GxtRepairOrder repairOrder : repairOrderList) {
+            // 关联查询MIS工单信息
+            GxtMisInfo misInfo = new GxtMisInfo();
+            misInfo.setPcsStationName(repairOrder.getPcsStationName());
+            misInfo.setPcsDeviceName(repairOrder.getPcsDeviceName());
+            misInfo.setPauseTime(repairOrder.getOccurTime());
+            misInfo.setRestartTime(repairOrder.getRestartTime());
+            misInfo.setWorkOrderStatus("结束");
+            List<GxtMisInfo> misInfoList = misInfoMapper.selectAutoGxtMisInfoList(misInfo);
+            
+            GxtMisInfo validMisInfo = null;
+            List<GxtWorkOrderPerson> personList = null;
+            // 如果查询出的misInfoList大于1,则不执行后续操作
+            if (misInfoList != null && misInfoList.size() == 1) {
+                GxtMisInfo mis = misInfoList.get(0);
+                if (mis.getWorkPermitNum() != null && !mis.getWorkPermitNum().isEmpty()) {
+                    // 查询工作负责人和工作组成员信息
+                    GxtWorkOrderPerson workOrderPerson = new GxtWorkOrderPerson();
+                    workOrderPerson.setMisNo(mis.getMisNo());
+                    personList = misInfoMapper.selectGxtWorkOrderPersonList(workOrderPerson);
+                    
+                    if (personList != null && !personList.isEmpty()) {
+                        boolean hasLeader = false;
+                        boolean hasMembers = false;
+                        
+                        for (GxtWorkOrderPerson person : personList) {
+                            if (person.getIsLeader() != null && 1 == person.getIsLeader()) {
+                                hasLeader = true;
+                            } else {
+                                hasMembers = true;
+                            }
+                        }
+                        
+                        if (hasLeader && hasMembers) {
+                            validMisInfo = mis;
+                        }
+                    }
+                }
+            }
+            
+            // 如果存在有效MIS工单信息,则更新工单状态为已完成
+            if (validMisInfo != null && personList != null && !personList.isEmpty()) {
+                // 检查是否同时存在工作负责人和工作组成员
+                boolean hasLeaderCheck = false;
+                boolean hasMembersCheck = false;
+                for (GxtWorkOrderPerson person : personList) {
+                    if (person.getIsLeader() != null && 1 == person.getIsLeader()) {
+                        hasLeaderCheck = true;
+                    } else {
+                        hasMembersCheck = true;
+                    }
+                }
+                
+                if (hasLeaderCheck && hasMembersCheck) {
+                    updateRepairOrder.setId(repairOrder.getId());
+                    updateRepairOrder.setWorkPermitNum(validMisInfo.getWorkPermitNum());
+                    
+                    StringBuilder members = new StringBuilder();
+                    String leader = null;
+                    Long leaderUserId = null;
+                    
+                    for (GxtWorkOrderPerson person : personList) {
+                        if (person.getIsLeader() != null && 1 == person.getIsLeader()) {
+                            leader = person.getNickName();
+                            // 查询工作负责人的ID
+                            SysUser queryUser = new SysUser();
+                            queryUser.setUserName(person.getUserName());
+                            queryUser.setNickName(person.getNickName());
+                            List<SysUser> users = sysUserMapper.selectUserList(queryUser);
+                            if (users != null && !users.isEmpty()) {
+                                leaderUserId = users.get(0).getUserId();
+                            }
+                        }
+                        if (members.length() > 0) {
+                            members.append(",");
+                        }
+                        members.append(person.getNickName());
+                    }
+
+                    updateRepairOrder.setMisOrderNo(validMisInfo.getMisNo());
+                    updateRepairOrder.setTeamLeaderName(leader);
+                    updateRepairOrder.setTeamLeaderId(leaderUserId); // 设置工作负责人ID
+                    updateRepairOrder.setWorkGroupMemberName(members.toString());
+                    updateRepairOrder.setRealStartTime(validMisInfo.getRealStartTime());
+                    updateRepairOrder.setRealEndTime(validMisInfo.getRealEndTime());
+                    updateRepairOrder.setInfoEntry("1");
+                    updateRepairOrder.setFinalizeMethod("1");
+                    
+                    gxtRepairOrderMapper.updateGxtRepairOrder(updateRepairOrder);
+                    
+                    // 将工作负责人和工作组成员存入GxtWorkOrderPersonMapper
+                    // 先删除该工单原有的工作组员信息
+                    repairOrderPersonMapper.deleteGxtRepairOrderPersonByOrderId(repairOrder.getId());
+                    
+                    for (GxtWorkOrderPerson person : personList) {
+                        // 查询系统中对应的人员ID,同时使用用户名和昵称查询
+                        SysUser queryUser = new SysUser();
+                        queryUser.setUserName(person.getUserName());
+                        queryUser.setNickName(person.getNickName());
+                        List<SysUser> users = sysUserMapper.selectUserList(queryUser);
+                        SysUser sysUser = null;
+                        if (users != null && !users.isEmpty()) {
+                            sysUser = users.get(0); // 使用第一个匹配的用户
+                        }
+                        
+                        GxtRepairOrderPerson newPerson = new GxtRepairOrderPerson();
+                        newPerson.setOrderId(repairOrder.getId());
+                        newPerson.setOrderCode(repairOrder.getWorkOrderProjectNo());
+                        newPerson.setNickName(person.getNickName());
+                        newPerson.setUserName(person.getUserName());
+                        newPerson.setIsLeader(person.getIsLeader());
+                        // 设置用户ID,如果找不到则设为null
+                        newPerson.setUserId(sysUser != null ? sysUser.getUserId() : null);
+                        newPerson.setCreateBy("admin");
+                        newPerson.setCreateTime(DateUtils.getNowDate());
+                        newPerson.setUpdateBy("admin");
+                        newPerson.setUpdateTime(DateUtils.getNowDate());
+                        newPerson.setStatus(1);
+                        repairOrderPersonMapper.insertGxtRepairOrderPerson(newPerson);
+                    }
+
+                    GxtRepairOrderFlow flow = new GxtRepairOrderFlow();
+                    flow.setOrderId(repairOrder.getId());
+                    flow.setOrderCode(repairOrder.getWorkOrderProjectNo());
+                    flow.setActionType("auto_finalize");
+                    flow.setFromStatus(repairOrder.getWorkOrderStatus());
+                    flow.setToStatus(updateRepairOrder.getWorkOrderStatus());
+                    flow.setOperatorId(1L);
+                    flow.setOperatorName("系统");
+                    flow.setActionTime(DateUtils.getNowDate());
+                    flow.setCreateBy("admin");
+                    flow.setCreateTime(DateUtils.getNowDate());
+                    gxtRepairOrderFlowMapper.insertGxtRepairOrderFlow(flow);
+                }
+            }
+        }
+
+        // 查询维保工单 - 状态为assigned或to_finish,且接单时间、停机时间、恢复运行时间不为空
+        GxtWorkOrder gxtWorkOrder = new GxtWorkOrder();
+        gxtWorkOrder.setWorkOrderStatus("assigned,to_finish");
+        gxtWorkOrder.setOrderEntryType("1");
+        List<GxtWorkOrder> workOrderList = gxtWorkOrderMapper.selectGxtWorkOrderListForAutoFinalize(gxtWorkOrder);
+        
+        // 更新维保工单状态为完成
+        GxtWorkOrder updateWorkOrder = new GxtWorkOrder();
+        updateWorkOrder.setWorkOrderStatus("completed");
+        updateWorkOrder.setUpdateTime(DateUtils.getNowDate());
+        updateWorkOrder.setUpdateBy("admin");
+
+        for (GxtWorkOrder workOrder : workOrderList) {
+            // 关联查询MIS工单信息
+            GxtMisInfo misInfo = new GxtMisInfo();
+            misInfo.setPcsStationName(workOrder.getPcsStationName());
+            misInfo.setPcsDeviceName(workOrder.getPcsDeviceName());
+            misInfo.setPauseTime(workOrder.getPauseTime());
+            misInfo.setRestartTime(workOrder.getRestartTime());
+            misInfo.setWorkOrderStatus("结束");
+            List<GxtMisInfo> misInfoList = misInfoMapper.selectAutoGxtMisInfoList(misInfo);
+            
+            GxtMisInfo validMisInfo = null;
+            List<GxtWorkOrderPerson> personList = null;
+            // 如果查询出的misInfoList大于1,则不执行后续操作
+            if (misInfoList != null && misInfoList.size() == 1) {
+                GxtMisInfo mis = misInfoList.get(0);
+                if (mis.getWorkPermitNum() != null && !mis.getWorkPermitNum().isEmpty()) {
+                    // 查询工作负责人和工作组成员信息
+                    GxtWorkOrderPerson workOrderPerson = new GxtWorkOrderPerson();
+                    workOrderPerson.setMisNo(mis.getMisNo());
+                    personList = misInfoMapper.selectGxtWorkOrderPersonList(workOrderPerson);
+                    
+                    if (personList != null && !personList.isEmpty()) {
+                        boolean hasLeader = false;
+                        boolean hasMembers = false;
+                        
+                        for (GxtWorkOrderPerson person : personList) {
+                            if (person.getIsLeader() != null && 1 == person.getIsLeader()) {
+                                hasLeader = true;
+                            } else {
+                                hasMembers = true;
+                            }
+                        }
+                        
+                        if (hasLeader && hasMembers) {
+                            validMisInfo = mis;
+                        }
+                    }
+                }
+            }
+            
+            // 如果存在有效MIS工单信息,则更新工单状态为已完成
+            if (validMisInfo != null && personList != null && !personList.isEmpty()) {
+                // 检查是否同时存在工作负责人和工作组成员
+                boolean hasLeaderCheck = false;
+                boolean hasMembersCheck = false;
+                for (GxtWorkOrderPerson person : personList) {
+                    if (person.getIsLeader() != null && 1 == person.getIsLeader()) {
+                        hasLeaderCheck = true;
+                    } else {
+                        hasMembersCheck = true;
+                    }
+                }
+                
+                if (hasLeaderCheck && hasMembersCheck) {
+                    updateWorkOrder.setId(workOrder.getId());
+                    updateWorkOrder.setWorkPermitNum(validMisInfo.getWorkPermitNum());
+                    
+                    StringBuilder members = new StringBuilder();
+                    String leader = null;
+                    Long leaderUserId = null;
+                    
+                    for (GxtWorkOrderPerson person : personList) {
+                        if (person.getIsLeader() != null && 1 == person.getIsLeader()) {
+                            leader = person.getNickName();
+                            // 查询工作负责人的ID
+                            SysUser queryUser = new SysUser();
+                            queryUser.setUserName(person.getUserName());
+                            queryUser.setNickName(person.getNickName());
+                            List<SysUser> users = sysUserMapper.selectUserList(queryUser);
+                            if (users != null && !users.isEmpty()) {
+                                leaderUserId = users.get(0).getUserId();
+                            }
+                        }
+                        if (members.length() > 0) {
+                            members.append(",");
+                        }
+                        members.append(person.getNickName());
+                    }
+
+                    updateWorkOrder.setMisNo(validMisInfo.getMisNo());
+                    updateWorkOrder.setTeamLeaderName(leader);
+                    updateWorkOrder.setTeamLeaderId(leaderUserId); // 设置工作负责人ID
+                    updateWorkOrder.setWorkGroupMemberName(members.toString());
+                    updateWorkOrder.setRealStartTime(validMisInfo.getRealStartTime());
+                    updateWorkOrder.setRealEndTime(validMisInfo.getRealEndTime());
+                    updateWorkOrder.setInfoEntry("1");
+                    updateWorkOrder.setFinalizeMethod("1");
+                    
+                    gxtWorkOrderMapper.updateGxtWorkOrder(updateWorkOrder);
+                    
+                    // 将工作负责人和工作组成员存入GxtWorkOrderPersonMapper
+                    // 先删除该工单原有的工作组员信息
+                    workOrderPersonMapper.deleteGxtWorkOrderPersonByOrderId(workOrder.getId());
+                    
+                    for (GxtWorkOrderPerson person : personList) {
+                        // 查询系统中对应的人员ID,同时使用用户名和昵称查询
+                        SysUser queryUser = new SysUser();
+                        queryUser.setUserName(person.getUserName());
+                        queryUser.setNickName(person.getNickName());
+                        List<SysUser> users = sysUserMapper.selectUserList(queryUser);
+                        SysUser sysUser = null;
+                        if (users != null && !users.isEmpty()) {
+                            sysUser = users.get(0); // 使用第一个匹配的用户
+                        }
+                        
+                        GxtWorkOrderPerson newPerson = new GxtWorkOrderPerson();
+                        newPerson.setOrderId(workOrder.getId());
+                        newPerson.setOrderCode(workOrder.getWorkOrderProjectNo());
+                        newPerson.setMisNo(person.getMisNo());
+                        newPerson.setNickName(person.getNickName());
+                        newPerson.setUserName(person.getUserName());
+                        newPerson.setIsLeader(person.getIsLeader());
+                        // 设置用户ID,如果找不到则设为null
+                        newPerson.setUserId(sysUser != null ? sysUser.getUserId() : null);
+                        newPerson.setCreateBy("admin");
+                        newPerson.setCreateTime(DateUtils.getNowDate());
+                        newPerson.setUpdateBy("admin");
+                        newPerson.setUpdateTime(DateUtils.getNowDate());
+                        newPerson.setStatus(1);
+                        workOrderPersonMapper.insertGxtWorkOrderPerson(newPerson);
+                    }
+
+                    GxtWorkOrderFlow flow = new GxtWorkOrderFlow();
+                    flow.setOrderId(workOrder.getId());
+                    flow.setOrderCode(workOrder.getWorkOrderProjectNo());
+                    flow.setActionType("auto_finalize");
+                    flow.setFromStatus(workOrder.getWorkOrderStatus());
+                    flow.setToStatus(updateWorkOrder.getWorkOrderStatus());
+                    flow.setOperatorId(1L);
+                    flow.setOperatorName("系统");
+                    flow.setActionTime(DateUtils.getNowDate());
+                    flow.setCreateBy("admin");
+                    flow.setCreateTime(DateUtils.getNowDate());
+                    gxtWorkOrderFlowMapper.insertGxtWorkOrderFlow(flow);
+                }
+            }
+        }
+    }
+}

+ 15 - 0
ygtx-gxt/src/main/resources/mapper/gxt/GxtRepairOrderMapper.xml

@@ -502,6 +502,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </delete>
 
+    <select id="selectGxtRepairOrderListForAutoFinalize" parameterType="GxtRepairOrder" resultMap="GxtRepairOrderResult">
+        <include refid="selectGxtRepairOrderVo"/>
+        <where>
+            <if test="workOrderStatus != null and workOrderStatus != ''"> and work_order_status in
+                <foreach collection="workOrderStatus.split(',')" item="status" open="(" close=")" separator=",">
+                    #{status}
+                </foreach>
+            </if>
+            and accept_time is not null
+            and occur_time is not null
+            and restart_time is not null
+        </where>
+        order by create_time desc
+    </select>
+
     <select id="selectGxtRepairOrderByWorkOrderProjectNo" parameterType="String" resultMap="GxtRepairOrderResult">
         <include refid="selectGxtRepairOrderVo"/>
         where work_order_project_no = #{workOrderProjectNo}

+ 15 - 0
ygtx-gxt/src/main/resources/mapper/gxt/GxtWorkOrderMapper.xml

@@ -183,6 +183,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
     </select>
 
+    <select id="selectGxtWorkOrderListForAutoFinalize" parameterType="GxtWorkOrder" resultMap="GxtWorkOrderResult">
+        <include refid="selectGxtWorkOrderVo"/>
+        <where>
+            <if test="workOrderStatus != null and workOrderStatus != ''"> and work_order_status in
+                <foreach collection="workOrderStatus.split(',')" item="status" open="(" close=")" separator=",">
+                    #{status}
+                </foreach>
+            </if>
+            and accept_time is not null
+            and pause_time is not null
+            and restart_time is not null
+        </where>
+        order by create_time desc
+    </select>
+
     <select id="selectGxtWorkOrderByCode" parameterType="String" resultMap="GxtWorkOrderResult">
         <include refid="selectGxtWorkOrderVo"/>
         where work_order_project_no = #{workOrderProjectNo}

+ 19 - 0
ygtx-gxt/src/main/resources/mapper/gxt/source/GxtMisInfoMapper.xml

@@ -66,10 +66,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </if>
             <if test="beginRealEndTime != null and beginRealEndTime != ''"> and date_format(real_end_time,'%y%m%d') &gt;= date_format(#{beginRealEndTime},'%y%m%d')</if>
             <if test="endRealEndTime != null and endRealEndTime != ''"> and date_format(real_end_time,'%y%m%d') &lt;= date_format(#{endRealEndTime},'%y%m%d')</if>
+            <if test="pauseTime != null"> and real_start_time &gt;= #{pauseTime}</if>
+            <if test="restartTime != null"> and real_start_time &lt; #{restartTime}</if>
         </where>
         order by create_time desc
     </select>
 
+    <select id="selectAutoGxtMisInfoList" parameterType="com.ygtx.gxt.domain.GxtMisInfo" resultMap="GxtMisInfoResult">
+        <include refid="selectGxtMisInfoVo"/>
+        WHERE t.work_order_device IS NOT NULL
+        AND t.pcs_station_name = #{pcsStationName}
+        AND t.work_order_device = #{pcsDeviceName}
+        AND t.real_start_time &gt;= #{pauseTime}
+        AND t.real_start_time &lt; #{restartTime}
+        <if test="misNo != null  and misNo != ''"> and work_order_project_code like concat('%', #{misNo}, '%')</if>
+        <if test="workOrderStatus != null  and workOrderStatus != ''"> and work_order_status in
+            <foreach collection="workOrderStatus.split(',')" item="status" open="(" separator="," close=")">
+                #{status}
+            </foreach>
+        </if>
+
+        order by create_time desc
+    </select>
+
     <select id="selectGxtWorkOrderPersonList" parameterType="com.ygtx.gxt.domain.GxtWorkOrderPerson" resultMap="GxtWorkOrderPersonResult">
         <include refid="selectGxtWorkOrderPersonVo"/>
         <where>

+ 8 - 0
ygtx-ui/src/api/gxt/misInfo.js

@@ -18,4 +18,12 @@ export function listWorkPerson(query) {
   })
 }
 
+export function listAutoMisInfo(query) {
+  return request({
+    url: '/gxt/misInfo/autoList',
+    method: 'get',
+    params: query
+  })
+}
+
 

+ 1 - 0
ygtx-ui/src/components/gxtOrder/backfillFinalize.vue

@@ -614,6 +614,7 @@ const handleSubmit = async () => {
             flowList.value.push(resumeInfo.value)
           }
           formData.value.workOrderFlowList = flowList.value
+          formData.value.finalizeMethod = '2'
           await props.onSubmit(formData.value)
         } else {
           throw new Error("未提供提交方法")

+ 55 - 4
ygtx-ui/src/components/gxtOrder/finalize.vue

@@ -83,7 +83,7 @@
       <el-row>
         <el-col :span="12">
           <el-form-item label="信息录入" prop="infoEntry">
-            <el-radio-group v-model="formData.infoEntry" @change="handleInfoEntryChange">
+            <el-radio-group v-model="formData.infoEntry" @change="handleInfoEntryChange" :disabled="infoEntryDisabled">
               <el-radio
                   v-for="dict in infoEntryOptions"
                   :key="dict.value"
@@ -126,9 +126,9 @@
         </el-col>
         <!-- MIS选择组件 -->
         <slot name="mis-info-select"></slot>
-        <el-col :span="12" v-if="formData.infoEntry == 2">
+        <el-col :span="12">
           <el-form-item label="工作票编号" prop="workPermitNum">
-            <el-input v-model="workPermitNumProxy" maxlength="20" show-word-limit />
+            <el-input v-model="workPermitNumProxy" maxlength="20" show-word-limit :readonly="formData.infoEntry == '1'" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
@@ -142,6 +142,7 @@
               style="width: 100%"
               :disabled-date="disabledStartDate"
               @change="handleStartTimeChange"
+              :readonly="formData.infoEntry == '1'"
             />
           </el-form-item>
         </el-col>
@@ -156,6 +157,7 @@
               style="width: 100%"
               :disabled-date="disabledEndDate"
               @change="handleEndTimeChange"
+              :readonly="formData.infoEntry == '1'"
             />
           </el-form-item>
         </el-col>
@@ -206,7 +208,7 @@
       <el-row :gutter="20">
         <el-col :span="24">
           <el-form-item label="维保内容" prop="content">
-            <el-input v-model="formData.content" type="textarea" :rows="3" maxlength="500" show-word-limit />
+            <el-input v-model="formData.content" type="textarea" :rows="3" maxlength="500" readonly show-word-limit />
           </el-form-item>
         </el-col>
       </el-row>
@@ -261,6 +263,7 @@ import { ref, defineProps, defineEmits, getCurrentInstance, watch } from 'vue'
 import preview from '@/components/FileUpload/preview.vue'
 import UserSelectMulti from "@/components/userSelect/multi.vue";
 import {ElMessageBox} from "element-plus";
+import {listGxtOrder} from "@/api/gxt/gxtOrder.js";
 
 // 获取当前实例
 const { proxy } = getCurrentInstance()
@@ -299,6 +302,10 @@ const props = defineProps({
     type: Function,
     default: null
   },
+  infoEntryDisabled: {
+    type: Boolean,
+    default: false
+  }
 })
 // 定义事件
 const emit = defineEmits(['update:modelValue', 'success', 'select-mis-info'])
@@ -441,6 +448,45 @@ const finishRules = ref({
   misNo: [
     { required: true, message: "MIS工单编码不能为空", trigger: "change" }
   ],
+  workPermitNum: [
+    { required: true, message: "工作号编号不能为空", trigger: "change" },
+    {
+      validator: (rule, value, callback) => {
+        if (formData.value.infoEntry == '2') {
+          if (!value) {
+            callback(new Error('工作票编号不能为空'))
+          } else if (!/^[a-zA-Z0-9_\-\.]*$/.test(value)) {
+            callback(new Error('仅支持英文、数字、下划线'))
+          } else if (value.length > 20) {
+            callback(new Error('不能超过20个字符'))
+          } else {
+            // 验证唯一性
+            if (value) {
+              listGxtOrder({pageNum: 1, pageSize: 10, workPermitNum: value}).then(response => {
+                const gxtOrders = response.rows
+                if (gxtOrders.length > 0) {
+                  if (gxtOrders[0].id != formData.value.id) {
+                    callback(new Error('工作票编号已存在!'))
+                  } else {
+                    callback()
+                  }
+                } else {
+                  callback()
+                }
+              }).catch(() => {
+                callback()
+              })
+            } else {
+              callback()
+            }
+          }
+        } else {
+          callback()
+        }
+      },
+      trigger: 'change'
+    }
+  ],
 })
 // 时间禁用函数
 const disabledStartDate = (time) => {
@@ -691,6 +737,7 @@ const handleSubmit = async () => {
             flowList.value.push(resumeInfo.value)
           }
           formData.value.workOrderFlowList = flowList.value
+          formData.value.finalizeMethod = '2'
           await props.onSubmit(formData.value)
         } else {
           throw new Error("未提供提交方法")
@@ -856,11 +903,15 @@ const handleInfoEntryChange = (val) => {
     formData.value.realStartTime = undefined;
     formData.value.realEndTime = undefined;
     formData.value.workGroupMemberName = undefined;
+    formData.value.workPermitNum = undefined
     formData.value.repairOrderPersonList = [];
     selectedUsers.value = [];
   } else {
     formData.value.workPermitNum = undefined;
   }
+  // if (finishRef.value) {
+  //   finishRef.value.clearValidate()
+  // }
 }
 </script>
 

+ 15 - 1
ygtx-ui/src/components/misInfoSelect/single.vue

@@ -107,6 +107,18 @@ const props = defineProps({
     type: String,
     default: ''
   },
+  pauseTime: {
+    type: String,
+    default: ''
+  },
+  restartTime: {
+    type: String,
+    default: ''
+  },
+  workOrderStatus: {
+    type: String,
+    default: ''
+  }
 })
 
 const emit = defineEmits(['update:modelValue', 'onSelected'])
@@ -154,7 +166,9 @@ const queryParams = reactive({
   pcsStationName: props.pcsStationName, // 使用 props 的初始值
   workOrderStatus: '结束,作业结束,工作票终结许可人确认,作业中,签发人签发,编辑,互保人签字,运行调控中心',
   beginRealEndTime: undefined, // 添加开始时间参数
-  endRealEndTime: undefined    // 添加结束时间参数
+  endRealEndTime: undefined,    // 添加结束时间参数
+  pauseTime: undefined, // 使用 props 的初始值
+  restartTime: undefined, // 使用 props 的初始值
 })
 
 // 组件挂载时查询数据

+ 9 - 3
ygtx-ui/src/components/repairOrder/finalize.vue

@@ -70,7 +70,7 @@
       <el-row>
         <el-col :span="12">
           <el-form-item label="信息录入" prop="infoEntry">
-            <el-radio-group v-model="formData.infoEntry" @change="handleInfoEntryChange">
+            <el-radio-group v-model="formData.infoEntry" @change="handleInfoEntryChange" :disabled="infoEntryDisabled">
               <el-radio
                 v-for="dict in infoEntryOptions"
                 :key="dict.value"
@@ -113,9 +113,9 @@
         </el-col>
         <!-- MIS选择组件 -->
         <slot name="mis-info-select"></slot>
-        <el-col :span="12" v-if="formData.infoEntry == 2">
+        <el-col :span="12">
           <el-form-item label="工作票编号" prop="workPermitNum">
-            <el-input v-model="workPermitNumProxy" maxlength="20" show-word-limit />
+            <el-input v-model="workPermitNumProxy" maxlength="20" show-word-limit :readonly="formData.infoEntry == '1'" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
@@ -129,6 +129,7 @@
                 style="width: 100%"
                 :disabled-date="disabledStartDate"
                 @change="handleStartTimeChange"
+                :readonly="formData.infoEntry == '1'"
             />
           </el-form-item>
         </el-col>
@@ -160,6 +161,7 @@
                 style="width: 100%"
                 :disabled-date="disabledEndDate"
                 @change="handleEndTimeChange"
+                :readonly="formData.infoEntry == '1'"
             />
           </el-form-item>
         </el-col>
@@ -302,6 +304,10 @@ const props = defineProps({
     type: Function,
     default: null
   },
+  infoEntryDisabled: {
+    type: Boolean,
+    default: false
+  }
 })
 
 // 定义事件

+ 146 - 34
ygtx-ui/src/views/gxt/gxtOrder/index.vue

@@ -205,7 +205,7 @@
       </el-table-column>
       <el-table-column label="工作票编号" align="center" prop="workPermitNum" min-width="150">
         <template #default="scope">
-          {{ scope.row.infoEntry == '2' ? scope.row.workPermitNum || '-' : '-' }}
+          {{ scope.row.workPermitNum || '-' }}
         </template>
       </el-table-column>
       <el-table-column label="接单人" align="center" prop="acceptUserName">
@@ -766,11 +766,12 @@
       :list-mis-info="listMisInfo"
       :list-user-data="listUserData"
       :on-submit="submitFinishFromParent"
+      :info-entry-disabled = "infoEntryDisabled"
       @success="handleFinishSuccess"
       @select-mis-info="handleSelectMisInfo2"
     >
-      <template #mis-info-select>
-        <MisInfoSelectSingle :key="commonKey" v-model="misInfoSelectVisible2" @onSelected="onMisInfoSelected2" :pcsStationName="finishForm.pcsStationName" :pcsDeviceName="finishForm.pcsDeviceName"></MisInfoSelectSingle>
+      <template #mis-info-select v-if="finishForm.pauseTime && finishForm.restartTime">
+        <MisInfoSelectSingle :key="commonKey" v-model="misInfoSelectVisible2" @onSelected="onMisInfoSelected2" :pcsStationName="finishForm.pcsStationName" :pcsDeviceName="finishForm.pcsDeviceName" :pauseTime="finishForm.pauseTime" :restartTime="finishForm.restartTime" :workOrderStatus="结束" ></MisInfoSelectSingle>
       </template>
     </FinalizeDialog>
 
@@ -1237,7 +1238,7 @@ import {getRepairOrder, listRepairOrder, startRepairOrder} from "@/api/gxt/repai
 import FinalizeDialog from '@/components/gxtOrder/finalize.vue'
 import {listEquipment, listMaintenanceCenters, listStationsByMaintenanceCenter} from "@/api/gxt/equipment.js";import MisInfoSelectSingle from "@/components/misInfoSelect/single.vue";
 import {genPostCode} from "@/api/system/autocode/rule.js";
-import {listMisInfo, listWorkPerson} from "@/api/gxt/misInfo.js";
+import {listAutoMisInfo, listMisInfo, listWorkPerson} from "@/api/gxt/misInfo.js";
 import {ElMessageBox} from "element-plus";
 import EquipmentSelectSingle from "@/components/equipmentSelect/single.vue";
 import useUserStore from '@/store/modules/user'
@@ -1247,6 +1248,8 @@ import ApproveDialog from "@/components/gxtOrder/approve.vue";
 import ShutdownDialog from "@/components/gxtOrder/shutdown.vue";
 import BackfillFinalizeDialog from '@/components/gxtOrder/backfillFinalize.vue'
 
+// 初始化禁用状态为 false(单选框默认可用)
+const infoEntryDisabled = ref(false);
 // 工作负责人快速检索相关响应式数据
 const showTeamLeaderQuickSelect = ref(false)
 const quickTeamLeaderList = ref([])
@@ -1812,7 +1815,7 @@ const data = reactive({
   acceptRules: {
     // inspectionType: [{ required: true, message: "请选择维保类型", trigger: "change" }],
     // content: [{ required: true, message: "请输入维保内容", trigger: "blur" }],
-    teamLeaderId: [{ required: true, message: "请选择工作负责人", trigger: "change" }],
+    // teamLeaderId: [{ required: true, message: "请选择工作负责人", trigger: "change" }],
     // memberIds: [{ required: true, message: "请至少选择一名检修人员", trigger: "change" }]
   },
   finishRules: {
@@ -2137,41 +2140,122 @@ function handleComplete(row) {
 
 /** 待结单状态:结单按钮 */
 function handleFinish(row) {
-  getGxtOrder(row.id).then(response => {
-    finishForm.value = response.data
+  // getGxtOrder(row.id).then(response => {
+  debugger
+    finishForm.value = row
     finishForm.value.orderId = row.id
     finishForm.value.infoEntry = '1'
-    if (finishForm.value.infoEntry != null && finishForm.value.infoEntry == '1') {
-      if (row.misNo != null) {
-        listMisInfo({misNo: row.misNo}).then(response => {
-          const misInfo = response.rows
-          debugger
-          if (misInfo.length > 0) {
-            finishForm.value.realStartTime = misInfo[0].realStartTime
-            finishForm.value.realEndTime = misInfo[0].realEndTime
+    if (row.pauseTime && row.restartTime) {
+      listAutoMisInfo({
+        pauseTime: row.pauseTime,
+        restartTime: row.restartTime,
+        pcsDeviceName: row.pcsDeviceName,
+        pcsStationName: row.pcsStationName,
+        workOrderStatus: '结束'
+      }).then(response => {
+        const misInfo = response.rows
+        debugger
+        // finishDialogVisible.value = true
+        if (misInfo.length > 0 && misInfo.length == 1) {
+          // 有工作票号提示
+          if (misInfo[0].workPermitNum) {
+              finishForm.value.misNo = misInfo[0].misNo
+              finishForm.value.realStartTime = misInfo[0].realStartTime
+              finishForm.value.realEndTime = misInfo[0].realEndTime
+              finishForm.value.workPermitNum = misInfo[0].workPermitNum
+              listWorkPerson({misNo: misInfo[0].misNo}).then(response => {
+                finishForm.value.workOrderPersonList = response.rows;
+                if (finishForm.value.workOrderPersonList) {
+                  // 查询负责人信息并回填
+                  for (const person of finishForm.value.workOrderPersonList) {
+                    // 严格判断isLeader为1(兼容数字/字符串类型)
+                    if (person.isLeader === 1 || person.isLeader === '1') {
+                      finishForm.value.teamLeaderName = person.nickName;
+                      break; // 找到后立即停止循环
+                    }
+                  }
+                  const nickNames = finishForm.value.workOrderPersonList
+                      .map(person => person.nickName)
+                      .join(',');
+                  finishForm.value.workGroupMemberName = nickNames
+                  // finishDialogVisible.value = true
+                }
+              })
+
+          } else {  // 无工作票号提示
+            ElMessageBox.confirm('已匹配到MIS工单,但未关联工作票号,系统无法自动结单,请进入工作票录入方式。', '提示', {
+              confirmButtonText: '确定',
+              showCancelButton: false,
+              type: 'warning'
+            }).then(function() {
+              finishForm.value.infoEntry = '2'
+              infoEntryDisabled.value = true
+            }).then(() => {
+            }).catch(() => {})
           }
-        })
-      }
-      listWorkPerson({misNo: row.misNo}).then(response => {
-        finishForm.value.workOrderPersonList = response.rows;
-        if (finishForm.value.workOrderPersonList) {
-          const nickNames = finishForm.value.workOrderPersonList
-              .map(person => person.nickName)
-              .join(',');
-          finishForm.value.workGroupMemberName = nickNames
-          finishDialogVisible.value = true
+
+        } else if (misInfo.length == 0) {
+          ElMessageBox.confirm('未找到匹配的MIS工单,请确认风机停复机时间是否已录入工效通系统或请进入工作票录入方式。', '提示', {
+            confirmButtonText: '确定',
+            showCancelButton: false,
+            type: 'warning'
+          }).then(function() {
+            finishForm.value.infoEntry = '2'
+            infoEntryDisabled.value = true
+          }).then(() => {
+          }).catch(() => {})
+        } else if (misInfo.length > 1) {
+          infoEntryDisabled.value = false
         }
       })
     } else {
-      finishForm.value.realStartTime = null
-      finishForm.value.realEndTime = null
-      finishDialogVisible.value = true
+      // finishDialogVisible.value = true
+      ElMessageBox.confirm('未找到匹配的MIS工单,请确认风机停复机时间是否已录入工效通系统或请进入工作票录入方式。', '提示', {
+        confirmButtonText: '确定',
+        showCancelButton: false,
+        type: 'warning'
+      }).then(function() {
+        finishForm.value.infoEntry = '2'
+        infoEntryDisabled.value = true
+      }).then(() => {
+      }).catch(() => {})
+      finishForm.value.workPermitNum = null
+      finishForm.value.misNo = null
     }
+    // if (finishForm.value.infoEntry != null && finishForm.value.infoEntry == '1') {
+    //   if (row.misNo != null) {
+    //     listMisInfo({misNo: row.misNo}).then(response => {
+    //       const misInfo = response.rows
+    //       debugger
+    //       if (misInfo.length > 0) {
+    //         finishForm.value.realStartTime = misInfo[0].realStartTime
+    //         finishForm.value.realEndTime = misInfo[0].realEndTime
+    //       }
+    //     })
+    //   }
+    //   listWorkPerson({misNo: row.misNo}).then(response => {
+    //     finishForm.value.workOrderPersonList = response.rows;
+    //     if (finishForm.value.workOrderPersonList) {
+    //       const nickNames = finishForm.value.workOrderPersonList
+    //           .map(person => person.nickName)
+    //           .join(',');
+    //       finishForm.value.workGroupMemberName = nickNames
+    //       finishDialogVisible.value = true
+    //     }
+    //   })
+    // } else {
+    //   finishForm.value.realStartTime = null
+    //   finishForm.value.realEndTime = null
+    //   finishDialogVisible.value = true
+    // }
+
+    finishDialogVisible.value = true
     // 打开对话框后重置表单验证错误
     proxy.$nextTick(() => {
       proxy.$refs["finishRef"]?.clearValidate()
     })
-  })
+    commonKey++
+  // })
 }
 
 function handleBackfillingFinish(row) {
@@ -2226,6 +2310,7 @@ function saveFinishWorkOrder() {
   //   return
   // }
   finishForm.value.workOrderStatus = 'completed'
+  debugger
   completeWorkOrder(finishForm.value.orderId, finishForm.value).then(response => {
     finishDialogVisible.value = false
     // 清空附件列表
@@ -2872,11 +2957,38 @@ function onMisInfoSelected2(row) {
           }
         }
       }
-      finishForm.value.misNo = row.misNo
-      finishForm.value.content = row.content
-      finishForm.value.realStartTime = row.realStartTime
-      finishForm.value.realEndTime = row.realEndTime
-      finishForm.value.workPermitNum = row.workPermitNum
+      // finishForm.value.misNo = row.misNo
+      // finishForm.value.content = row.content
+      // finishForm.value.realStartTime = row.realStartTime
+      // finishForm.value.realEndTime = row.realEndTime
+      // finishForm.value.workPermitNum = row.workPermitNum
+      // 使用展开运算符创建新对象以确保响应式更新
+      finishForm.value = {
+        ...finishForm.value,
+        misNo: row.misNo,
+        realStartTime: row.realStartTime,
+        realEndTime: row.realEndTime,
+        content: row.content,
+        workPermitNum: row.workPermitNum
+      };
+      // finalizeFormData.value.content = row.content
+      // 使用从属性传入的listWorkPerson方法
+      if (typeof listWorkPerson === 'function') {
+        listWorkPerson({ misNo: row.misNo }).then(response => {
+          debugger
+          const updatedData = {
+            ...finishForm.value,
+            workOrderPersonList: response.rows
+          };
+          if (response.rows) {
+            const nickNames = response.rows
+                .map(person => person.nickName)
+                .join(',');
+            updatedData.workGroupMemberName = nickNames
+          }
+          finishForm.value = updatedData;
+        })
+      }
       misInfoSelectVisible2.value = false
     })
   }

+ 102 - 15
ygtx-ui/src/views/gxt/repairOrder/index.vue

@@ -756,7 +756,7 @@
       @select-mis-info="handleSelectMisInfo"
     >
       <template #mis-info-select>
-        <MisInfoSelectSingle :key="commonKey" v-model="misInfoSelectVisible" @onSelected="onMisInfoSelected" :pcsStationName="finalizeFormData.pcsStationName" :pcsDeviceName="finalizeFormData.pcsDeviceName"></MisInfoSelectSingle>
+        <MisInfoSelectSingle :key="commonKey" v-model="misInfoSelectVisible" @onSelected="onMisInfoSelected" :pcsStationName="finalizeFormData.pcsStationName" :pcsDeviceName="finalizeFormData.pcsDeviceName" :workOrderStatus="结束"></MisInfoSelectSingle>
       </template>
     </FinalizeDialog>
 
@@ -1203,7 +1203,7 @@ import preview from '@/components/FileUpload/preview.vue'
 import { getConfigKey } from "@/api/system/config"
 import {genPostCode} from "@/api/system/autocode/rule.js";
 import MisInfoSelectSingle from "@/components/misInfoSelect/single.vue";
-import {listMisInfo, listWorkPerson} from "@/api/gxt/misInfo.js";
+import {listAutoMisInfo, listMisInfo, listWorkPerson} from "@/api/gxt/misInfo.js";
 import {listGxtOrder} from "@/api/gxt/gxtOrder.js";
 import useUserStore from '@/store/modules/user'
 import { useRoute } from 'vue-router'
@@ -1255,6 +1255,8 @@ const startFormRef = ref(null)  // 添加开始处理表单引用
 const restartFormRef = ref(null)  // 添加复运表单引用
 const invalidateFormRef = ref(null)  // 添加作废表单引用
 const returnFormRef = ref(null)
+// 初始化禁用状态为 false(单选框默认可用)
+const infoEntryDisabled = ref(false);
 
 // 各种表单数据
 const form = ref({})
@@ -1756,9 +1758,9 @@ const rules = ref({
 
 // 接单表单验证规则
 const acceptRules = ref({
-  teamLeaderId: [
-    { required: true, message: "请选择工作负责人", trigger: "change" }
-  ],
+  // teamLeaderId: [
+  //   { required: true, message: "请选择工作负责人", trigger: "change" }
+  // ],
   /*selectedMembers: [
     { required: true, message: "请至少选择一名检修人员", trigger: "change" }
   ]*/
@@ -2971,16 +2973,101 @@ async function submitApprove(approvalStatusValue) {
 
 /** 结单操作 */
 function handleFinalize(row, method) {
-  getRepairOrder(row.id).then(response => {
-    finalizeFormData.value = { ...response.data, selectedMembers: [] }
-    debugger
-    finalizeFormData.value.repairMethod = method;
-    if (method == '1') {
-      finalizeFormData.value.infoEntry = '1'
-    }
-    finalizeDialogVisible.value = true
-    commonKey++
-  })
+  // getRepairOrder(row.id).then(response => {
+  //   finalizeFormData.value = { ...response.data, selectedMembers: [] }
+  //   debugger
+  //   finalizeFormData.value.repairMethod = method;
+  //   if (method == '1') {
+  //     finalizeFormData.value.infoEntry = '1'
+  //   }
+  //   finalizeDialogVisible.value = true
+  //   commonKey++
+  // })
+  finalizeFormData.value = row
+  finalizeFormData.value.orderId = row.id
+  finalizeFormData.value.infoEntry = '1'
+  finalizeFormData.value.repairMethod = method;
+  debugger
+  if (row.occurTime && row.restartTime) {
+    listAutoMisInfo({
+      pauseTime: row.occurTime,
+      restartTime: row.restartTime,
+      pcsDeviceName: row.pcsDeviceName,
+      pcsStationName: row.pcsStationName,
+      workOrderStatus: '结束'
+    }).then(response => {
+      const misInfo = response.rows
+      debugger
+      // finishDialogVisible.value = true
+      if (misInfo.length > 0 && misInfo.length == 1) {
+        // 有工作票号提示
+        if (misInfo[0].workPermitNum) {
+          finalizeFormData.value.misOrderNo = misInfo[0].misNo
+          finalizeFormData.value.realStartTime = misInfo[0].realStartTime
+          finalizeFormData.value.realEndTime = misInfo[0].realEndTime
+          finalizeFormData.value.workPermitNum = misInfo[0].workPermitNum
+          listWorkPerson({misNo: misInfo[0].misNo}).then(response => {
+            finalizeFormData.value.repairOrderPersonList = response.rows;
+            if (finalizeFormData.value.repairOrderPersonList) {
+              // 查询负责人信息并回填
+              for (const person of finalizeFormData.value.repairOrderPersonList) {
+                // 严格判断isLeader为1(兼容数字/字符串类型)
+                if (person.isLeader === 1 || person.isLeader === '1') {
+                  finalizeFormData.value.teamLeaderName = person.nickName;
+                  break; // 找到后立即停止循环
+                }
+              }
+              const nickNames = finalizeFormData.value.repairOrderPersonList
+                  .map(person => person.nickName)
+                  .join(',');
+              finalizeFormData.value.workGroupMemberName = nickNames
+              // finishDialogVisible.value = true
+            }
+          })
+
+        } else {  // 无工作票号提示
+          ElMessageBox.confirm('已匹配到MIS工单,但未关联工作票号,系统无法自动结单,请进入工作票录入方式。', '提示', {
+            confirmButtonText: '确定',
+            showCancelButton: false,
+            type: 'warning'
+          }).then(function() {
+            finalizeFormData.value.infoEntry = '2'
+            infoEntryDisabled.value = true
+          }).then(() => {
+          }).catch(() => {})
+        }
+
+      } else if (misInfo.length == 0) {
+        ElMessageBox.confirm('未找到匹配的MIS工单,请确认风机停复机时间是否已录入工效通系统或请进入工作票录入方式。', '提示', {
+          confirmButtonText: '确定',
+          showCancelButton: false,
+          type: 'warning'
+        }).then(function() {
+          finalizeFormData.value.infoEntry = '2'
+          infoEntryDisabled.value = true
+        }).then(() => {
+        }).catch(() => {})
+      } else if (misInfo.length > 1) {
+        infoEntryDisabled.value = false
+      }
+    })
+  } else {
+    // finishDialogVisible.value = true
+    ElMessageBox.confirm('未找到匹配的MIS工单,请确认风机停复机时间是否已录入工效通系统或请进入工作票录入方式。', '提示', {
+      confirmButtonText: '确定',
+      showCancelButton: false,
+      type: 'warning'
+    }).then(function() {
+      debugger
+      finalizeFormData.value.infoEntry = '2'
+      infoEntryDisabled.value = true
+    }).then(() => {
+    }).catch(() => {})
+    finalizeFormData.value.workPermitNum = null
+    finalizeFormData.value.misNo = null
+  }
+  finalizeDialogVisible.value = true
+  commonKey++
 }
 
 /** 复启操作 */