Explorar o código

结单负责人必填

HD_wangm hai 3 meses
pai
achega
daebdcf886

+ 44 - 16
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtRepairOrderServiceImpl.java

@@ -947,17 +947,41 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
             person.setOrderCode(gxtRepairOrder.getWorkOrderProjectNo());
             person.setStatus(1);
             person.setCreateBy(SecurityUtils.getUsername());
-//                    person.setCreateTime(DateUtils.getNowDate());
             gxtRepairOrderPersonMapper.insertGxtRepairOrderPerson(person);
         }
-        int result = gxtRepairOrderMapper.updateGxtRepairOrder(gxtRepairOrder);
 
-        // 记录结单流转信息
-        if (result > 0) {
-            /*gxtRepairOrderPersonMapper.deleteGxtRepairOrderPersonByOrderId(gxtRepairOrder.getId());
-            if(gxtRepairOrder.getRepairOrderPersonList() != null && !gxtRepairOrder.getRepairOrderPersonList().isEmpty()){
-                for (GxtRepairOrderPerson person : gxtRepairOrder.getRepairOrderPersonList())
-                {
+        // 修改工作负责人
+        if(StringUtils.isNotEmpty(gxtRepairOrder.getTeamLeaderName())){
+            List<SysUser> sysUsers = sysUserService.selectUserByNickName(gxtRepairOrder.getTeamLeaderName());
+            SysUser sysUser = new SysUser();
+            if(sysUsers != null && !sysUsers.isEmpty()){
+                if (sysUsers.size() == 1) {
+                    sysUser = sysUsers.get(0);
+                } else {
+                    // 如果有多个用户,查找部门ID与pcsStationPid相同的用户
+                    for (SysUser user : sysUsers) {
+                        if (user.getDeptId() != null && (user.getDeptId().equals(gxtRepairOrder.getPcsStationPid()) || user.getDeptId().equals(gxtRepairOrder.getPcsStationId()))) {
+                            sysUser = user;
+                            break;
+                        }
+                    }
+                    // 如果没找到部门匹配的用户,则使用第一个用户
+                    if (sysUser == null) {
+                        sysUser = sysUsers.get(0);
+                    }
+                }
+                gxtRepairOrder.setTeamLeaderId(sysUser.getUserId());
+                gxtRepairOrder.setTeamLeaderName(sysUser.getNickName());
+                // 删除旧的工作班成员
+                gxtRepairOrderPersonMapper.deleteGxtRepairOrderPersonByOrderId(gxtRepairOrder.getId());
+                // 工作票方式工作班成员新增负责人
+                if (StringUtils.isNotEmpty(gxtRepairOrder.getInfoEntry()) && "2".equals(gxtRepairOrder.getInfoEntry())) {
+                    GxtRepairOrderPerson person = new GxtRepairOrderPerson();
+                    person.setUserId(sysUser.getUserId());
+                    person.setIsLeader(1);
+                    person.setUserId(sysUser.getUserId());
+                    person.setUserName(sysUser.getUserName());
+                    person.setNickName(sysUser.getNickName());
                     person.setOrderId(gxtRepairOrder.getId());
                     person.setOrderCode(gxtRepairOrder.getWorkOrderProjectNo());
                     person.setStatus(1);
@@ -965,13 +989,17 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
                     person.setCreateTime(DateUtils.getNowDate());
                     gxtRepairOrderPersonMapper.insertGxtRepairOrderPerson(person);
                 }
-            }*/
+            }
+        }
+        int result = gxtRepairOrderMapper.updateGxtRepairOrder(gxtRepairOrder);
+
+        // 记录结单流转信息
+        if (result > 0) {
 //            String getMisData = configService.selectConfigByKey("gxt.repairOder.getMisData");
 //            if(StringUtils.isNotEmpty(getMisData) && getMisData.equals("1")){
             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();
@@ -981,12 +1009,12 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
                         if (sysUserList.size() > 0) {
                             sysUser = sysUserList.get(0);
 //                            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);
-                            }
+//                            //修改工单负责人
+//                            if (1 == person.getIsLeader()) {
+//                                gxtRepairOrder.setTeamLeaderName(sysUser.getNickName());
+//                                gxtRepairOrder.setTeamLeaderId(sysUser.getUserId());
+//                                gxtRepairOrderMapper.updateGxtRepairOrder(gxtRepairOrder);
+//                            }
                         } else {
                             throw new ServiceException("检修人员不存在");
                         }

+ 46 - 10
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtWorkOrderServiceImpl.java

@@ -792,14 +792,54 @@ public class GxtWorkOrderServiceImpl implements IGxtWorkOrderService
                 person.setCreateBy(SecurityUtils.getUsername());
                 gxtWorkOrderPersonMapper.insertGxtWorkOrderPerson(person);
             }
+            // 修改工作负责人
+            if(StringUtils.isNotEmpty(gxtWorkOrder.getTeamLeaderName())){
+                List<SysUser> sysUsers = sysUserService.selectUserByNickName(gxtWorkOrder.getTeamLeaderName());
+                SysUser sysUser = new SysUser();
+                if(sysUsers != null && !sysUsers.isEmpty()){
+                    if (sysUsers.size() == 1) {
+                        sysUser = sysUsers.get(0);
+                    } else {
+                        // 如果有多个用户,查找部门ID与pcsStationPid相同的用户
+                        for (SysUser user : sysUsers) {
+                            if (user.getDeptId() != null && (user.getDeptId().equals(gxtWorkOrder.getPcsStationPid()) || user.getDeptId().equals(gxtWorkOrder.getPcsStationId()))) {
+                                sysUser = user;
+                                break;
+                            }
+                        }
+                        // 如果没找到部门匹配的用户,则使用第一个用户
+                        if (sysUser == null) {
+                            sysUser = sysUsers.get(0);
+                        }
+                    }
+                    order.setTeamLeaderId(sysUser.getUserId());
+                    order.setTeamLeaderName(sysUser.getNickName());
+                }
+
+                // 删除旧的工作班成员
+                gxtWorkOrderPersonMapper.deleteGxtWorkOrderPersonByOrderId(gxtWorkOrder.getId());
+                // 工作票方式工作班成员新增负责人
+                if (StringUtils.isNotEmpty(gxtWorkOrder.getInfoEntry()) && "2".equals(gxtWorkOrder.getInfoEntry())) {
+                    GxtWorkOrderPerson person = new GxtWorkOrderPerson();
+                    person.setUserId(sysUser.getUserId());
+                    person.setIsLeader(1);
+                    person.setUserId(sysUser.getUserId());
+                    person.setUserName(sysUser.getUserName());
+                    person.setNickName(sysUser.getNickName());
+                    person.setOrderId(gxtWorkOrder.getId());
+                    person.setOrderCode(gxtWorkOrder.getWorkOrderProjectNo());
+                    person.setStatus(1);
+                    person.setCreateBy(SecurityUtils.getUsername());
+                    person.setCreateTime(DateUtils.getNowDate());
+                    gxtWorkOrderPersonMapper.insertGxtWorkOrderPerson(person);
+                }
+            }
 
 
             int result = gxtWorkOrderMapper.updateGxtWorkOrder(order);
 
             if (result > 0)
             {
-//                // 2. 删除旧的工作组成员
-//                gxtWorkOrderPersonMapper.deleteGxtWorkOrderPersonByOrderId(id)
                 if (StringUtils.isNotEmpty(gxtWorkOrder.getInfoEntry()) && "1".equals(gxtWorkOrder.getInfoEntry())) {
 
                     if (gxtWorkOrder.getWorkOrderPersonList().size() > 0) {
@@ -814,14 +854,10 @@ public class GxtWorkOrderServiceImpl implements IGxtWorkOrderService
                             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);
+//                                if (1 == person.getIsLeader()) {
+//                                    order.setTeamLeaderName(sysUser.getNickName());
+//                                    order.setTeamLeaderId(sysUser.getUserId());
+//                                    gxtWorkOrderMapper.updateGxtWorkOrder(order);
 //                                }
                             } else {
                                 throw new ServiceException("检修人员不存在");

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

@@ -147,6 +147,7 @@ public class OrderAutoFinalizeTask {
                             if (users != null && !users.isEmpty()) {
                                 leaderUserId = users.get(0).getUserId();
                             }
+                            continue;
                         }
                         if (members.length() > 0) {
                             members.append(",");
@@ -303,6 +304,7 @@ public class OrderAutoFinalizeTask {
                             if (users != null && !users.isEmpty()) {
                                 leaderUserId = users.get(0).getUserId();
                             }
+                            continue;
                         }
                         if (members.length() > 0) {
                             members.append(",");

+ 215 - 3
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" :disabled="infoEntryDisabled">
+            <el-radio-group v-model="formData.infoEntry" @change="handleInfoEntryChange">
               <el-radio
                   v-for="dict in infoEntryOptions"
                   :key="dict.value"
@@ -214,8 +214,39 @@
       </el-row>
       <el-row>
         <el-col :span="12">
-          <el-form-item label="工作负责人">
-            <el-input v-model="formData.teamLeaderName" disabled />
+          <el-form-item label="工作负责人" prop="teamLeaderName">
+<!--            <el-input v-model="formData.teamLeaderName" disabled />-->
+            <el-input
+                v-model="formData.teamLeaderName"
+                placeholder="请输入工作负责人姓名或点击选择"
+                clearable
+                @focus="handleTeamLeaderInputFocus"
+                @blur="handleTeamLeaderInputBlur"
+                @input="handleTeamLeaderInput"
+                @clear="handleTeamLeaderClear"
+                :readonly="formData.infoEntry == '1'"
+            >
+            </el-input>
+            <!-- 快速检索下拉框 -->
+            <div class="quick-select-dropdown" v-show="showTeamLeaderQuickSelect && quickTeamLeaderList.length > 0">
+              <div
+                  v-for="item in quickTeamLeaderList"
+                  :key="item.userId"
+                  class="quick-select-item"
+                  @click="handleTeamLeaderQuickSelect(item)">
+                <span class="user-name">{{ item.nickName }}</span>
+                <span class="user-name">{{ item.dept.deptName }}</span>
+              </div>
+            </div>
+            <div class="quick-select-dropdown no-data" v-show="showTeamLeaderQuickSelect && quickTeamLeaderList.length === 0 && formData.teamLeaderName && !teamLeaderLoading">
+              <div>未找到匹配的人员</div>
+            </div>
+            <div class="quick-select-dropdown no-data" v-show="showTeamLeaderQuickSelect && teamLeaderLoading">
+              <div>
+                <i class="el-icon-loading"></i>
+                搜索中...
+              </div>
+            </div>
           </el-form-item>
         </el-col>
 <!--      </el-row>-->
@@ -264,6 +295,7 @@ 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";
+import {listUser, listUserData, listUserNoPermi, listLeader} from "@/api/system/user";
 
 // 获取当前实例
 const { proxy } = getCurrentInstance()
@@ -325,6 +357,14 @@ const resumeShow = ref(false)
 const showMisNoQuickSelect = ref(false)
 const quickMisNoList = ref([])
 
+// 工作负责人快速检索相关响应式数据
+const showTeamLeaderQuickSelect = ref(false)
+const quickTeamLeaderList = ref([])
+const teamLeaderLoading = ref(false)
+const teamLeaderSearchTimer = ref(null)
+const allUserList = ref([]) // 存储所有设备数据用于快速检索
+const lastLoadedCenterId = ref(null)
+
 // 计算属性
 const workPermitNumProxy = computed({
   get() {
@@ -487,6 +527,9 @@ const finishRules = ref({
       trigger: 'change'
     }
   ],
+  teamLeaderName: [
+    { required: true, message: "工作负责人不能为空", trigger: "change" }
+  ],
 })
 // 时间禁用函数
 const disabledStartDate = (time) => {
@@ -904,15 +947,151 @@ const handleInfoEntryChange = (val) => {
     formData.value.realEndTime = undefined;
     formData.value.workGroupMemberName = undefined;
     formData.value.workPermitNum = undefined
+    formData.value.teamLeaderName = undefined
+    formData.value.teamLeaderId = undefined
     formData.value.repairOrderPersonList = [];
     selectedUsers.value = [];
   } else {
     formData.value.workPermitNum = undefined;
+    formData.value.misOrderNo = undefined;
+    formData.value.realStartTime = undefined;
+    formData.value.realEndTime = undefined;
+    formData.value.workGroupMemberName = undefined;
+    formData.value.teamLeaderName = undefined
+    formData.value.teamLeaderId = undefined
+    formData.value.repairOrderPersonList = [];
   }
   // if (finishRef.value) {
   //   finishRef.value.clearValidate()
   // }
 }
+
+// 工作负责人快速检索方法
+/** 过滤快速检索用户列表 */
+const filterQuickUserList = (keyword) => {
+  debugger
+  if (!allUserList.value.length) {
+    loadQuickTeamLeaderList();
+    return;
+  }
+
+  const lowerKeyword = keyword.toLowerCase();
+  quickTeamLeaderList.value = allUserList.value.filter(item =>
+      (item.nickName && item.nickName.toLowerCase().includes(lowerKeyword))
+  );
+}
+/** 工作负责人输入框获取焦点 */
+const handleTeamLeaderInputFocus = () => {
+  showTeamLeaderQuickSelect.value = true
+  // 如果已有输入内容,立即搜索
+  if (formData.value.teamLeaderName && formData.value.teamLeaderName.trim()) {
+    handleTeamLeaderInput(formData.value.teamLeaderName)
+  } else {
+    // 如果没有输入内容,加载默认列表
+    loadQuickTeamLeaderList()
+  }
+}
+
+/** 工作负责人输入框失去焦点 */
+const handleTeamLeaderInputBlur = () => {
+  // 延迟隐藏下拉框,确保点击选项能触发
+  setTimeout(() => {
+    showTeamLeaderQuickSelect.value = false
+  }, 200)
+}
+
+/** 工作负责人输入事件 - 实时搜索 */
+const handleTeamLeaderInput = (value) => {
+  const searchText = value.trim()
+
+  if (!searchText) {
+    quickTeamLeaderList.value = []
+    showTeamLeaderQuickSelect.value = false
+    return
+  }
+
+  showTeamLeaderQuickSelect.value = true
+
+  // 清除之前的定时器
+  if (teamLeaderSearchTimer.value) {
+    clearTimeout(teamLeaderSearchTimer.value)
+  }
+
+  // 设置新的定时器,防抖处理(300ms)
+  // teamLeaderSearchTimer.value = setTimeout(() => {
+  // searchTeamLeaderList(searchText)
+  filterQuickUserList(searchText)
+  // }, 300)
+}
+
+/** 搜索工作负责人列表 */
+const searchTeamLeaderList = async (keyword) => {
+  if (!keyword) {
+    quickTeamLeaderList.value = []
+    return
+  }
+
+  teamLeaderLoading.value = true
+  try {
+    const response = await listLeader({
+      nickName: keyword,
+      // 可以根据需要添加其他搜索条件
+      status: '0' // 只搜索启用状态的用户
+    })
+
+    quickTeamLeaderList.value = response.data || []
+
+  } catch (error) {
+    console.error('搜索工作负责人失败:', error)
+    proxy.$modal.msgError('搜索失败,请重试')
+    quickTeamLeaderList.value = []
+  } finally {
+    teamLeaderLoading.value = false
+  }
+}
+
+/** 加载快速检索工作负责人列表 */
+const loadQuickTeamLeaderList = async () => {
+  // 如果已有所有用户数据,且是同一个维保中心,直接使用
+  if (allUserList.value.length > 0 && lastLoadedCenterId.value === formData.value.gxtCenterId) {
+    quickTeamLeaderList.value = allUserList.value;
+    return;
+  }
+
+  // 记录当前维保中心ID
+  lastLoadedCenterId.value = formData.value.gxtCenterId;
+
+  teamLeaderLoading.value = true
+  try {
+    // 加载当前部门下的用户列表
+    const response = await listLeader({
+      deptId: -1, // 通过后台配置部门
+      status: '0'
+    })
+    allUserList.value = response.data || []
+    quickTeamLeaderList.value = allUserList.value;
+  } catch (error) {
+    console.error('加载工作负责人列表失败:', error)
+    allUserList.value = []
+  } finally {
+    teamLeaderLoading.value = false
+  }
+}
+
+/** 快速选择工作负责人 */
+const handleTeamLeaderQuickSelect = (item) => {
+  formData.value.teamLeaderId = item.userId
+  formData.value.teamLeaderName = item.nickName
+  showTeamLeaderQuickSelect.value = false
+}
+
+/** 清空工作负责人 */
+const handleTeamLeaderClear = () => {
+  formData.value.teamLeaderId = undefined
+  formData.value.teamLeaderName = ''
+  quickTeamLeaderList.value = []
+  showTeamLeaderQuickSelect.value = false
+}
 </script>
 
 <style scoped>
@@ -926,4 +1105,37 @@ const handleInfoEntryChange = (val) => {
 :deep(.input-number-left .el-input__inner) {
   text-align: left !important; /* !important 覆盖组件默认的居中 */
 }
+
+/* MIS工单快速检索样式 */
+.quick-select-dropdown {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  right: 0;
+  background: white;
+  border: 1px solid #e4e7ed;
+  border-top: none;
+  border-radius: 0 0 4px 4px;
+  max-height: 200px;
+  overflow-y: auto;
+  z-index: 2000;
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.quick-select-item {
+  padding: 8px 12px;
+  cursor: pointer;
+  border-bottom: 1px solid #f0f0f0;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.quick-select-item:hover {
+  background-color: #f5f7fa;
+}
+
+.quick-select-item:last-child {
+  border-bottom: none;
+}
 </style>

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

@@ -164,7 +164,8 @@ const queryParams = reactive({
   misNo: undefined,
   pcsDeviceName: props.pcsDeviceName, // 使用 props 的初始值
   pcsStationName: props.pcsStationName, // 使用 props 的初始值
-  workOrderStatus: '结束,作业结束,工作票终结许可人确认,作业中,签发人签发,编辑,互保人签字,运行调控中心',
+  // workOrderStatus: '结束,作业结束,工作票终结许可人确认,作业中,签发人签发,编辑,互保人签字,运行调控中心',
+  workOrderStatus: props.workOrderStatus,
   beginRealEndTime: undefined, // 添加开始时间参数
   endRealEndTime: undefined,    // 添加结束时间参数
   pauseTime: undefined, // 使用 props 的初始值

+ 186 - 2
ygtx-ui/src/components/repairOrder/finalize.vue

@@ -64,13 +64,46 @@
           <el-form-item label="接单时间"><el-input v-model="formData.acceptTime" disabled /> </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="工作负责人"><el-input v-model="formData.teamLeaderName" disabled /> </el-form-item>
+          <el-form-item label="工作负责人" prop="teamLeaderName">
+<!--            <el-input v-model="formData.teamLeaderName" disabled /> -->
+            <el-input
+                v-model="formData.teamLeaderName"
+                placeholder="请输入工作负责人姓名或点击选择"
+                clearable
+                @focus="handleTeamLeaderInputFocus"
+                @blur="handleTeamLeaderInputBlur"
+                @input="handleTeamLeaderInput"
+                @clear="handleTeamLeaderClear"
+            >
+            </el-input>
+            <!-- 快速检索下拉框 -->
+            <div class="quick-select-dropdown" v-show="showTeamLeaderQuickSelect && quickTeamLeaderList.length > 0">
+              <div
+                  v-for="item in quickTeamLeaderList"
+                  :key="item.userId"
+                  class="quick-select-item"
+                  @click="handleTeamLeaderQuickSelect(item)">
+                <span class="user-name">{{ item.nickName }}</span>
+                <span class="user-name">{{ item.dept.deptName }}</span>
+              </div>
+            </div>
+            <div class="quick-select-dropdown no-data" v-show="showTeamLeaderQuickSelect && quickTeamLeaderList.length === 0 && formData.teamLeaderName && !teamLeaderLoading">
+              <div>未找到匹配的人员</div>
+            </div>
+            <div class="quick-select-dropdown no-data" v-show="showTeamLeaderQuickSelect && teamLeaderLoading">
+              <div>
+                <i class="el-icon-loading"></i>
+                搜索中...
+              </div>
+            </div>
+
+          </el-form-item>
         </el-col>
       </el-row>
       <el-row>
         <el-col :span="12">
           <el-form-item label="信息录入" prop="infoEntry">
-            <el-radio-group v-model="formData.infoEntry" @change="handleInfoEntryChange" :disabled="infoEntryDisabled">
+            <el-radio-group v-model="formData.infoEntry" @change="handleInfoEntryChange">
               <el-radio
                 v-for="dict in infoEntryOptions"
                 :key="dict.value"
@@ -258,6 +291,7 @@ import { ref, defineProps, defineEmits, getCurrentInstance, computed, watch } fr
 import preview from '@/components/FileUpload/preview.vue'
 import UserSelectMulti from '@/components/userSelect/multi.vue'
 import { ElMessageBox } from 'element-plus'
+import {listUser, listUserData, listUserNoPermi, listLeader} from "@/api/system/user";
 
 // 获取当前实例
 const { proxy } = getCurrentInstance()
@@ -328,6 +362,14 @@ const suspendInfo = ref(null)
 const resumeInfo = ref(null)
 const resumeShow = ref(false)
 
+// 工作负责人快速检索相关响应式数据
+const showTeamLeaderQuickSelect = ref(false)
+const quickTeamLeaderList = ref([])
+const teamLeaderLoading = ref(false)
+const teamLeaderSearchTimer = ref(null)
+const allUserList = ref([]) // 存储所有设备数据用于快速检索
+const lastLoadedCenterId = ref(null)
+
 // 计算属性
 const workPermitNumProxy = computed({
   get() {
@@ -494,6 +536,9 @@ const finalizeRules = ref({
       trigger: 'change'
     }
   ],
+  teamLeaderName: [
+    { required: true, message: "工作负责人不能为空", trigger: "change" }
+  ],
 })
 
 // 监听modelValue变化
@@ -661,10 +706,19 @@ const handleInfoEntryChange = (val) => {
     formData.value.realStartTime = undefined;
     formData.value.realEndTime = undefined;
     formData.value.workGroupMemberName = undefined;
+    formData.value.teamLeaderName = undefined
+    formData.value.teamLeaderId = undefined
     formData.value.repairOrderPersonList = [];
     selectedUsers.value = [];
   } else {
     formData.value.workPermitNum = undefined;
+    formData.value.misOrderNo = undefined;
+    formData.value.realStartTime = undefined;
+    formData.value.realEndTime = undefined;
+    formData.value.workGroupMemberName = undefined;
+    formData.value.teamLeaderName = undefined
+    formData.value.teamLeaderId = undefined
+    formData.value.repairOrderPersonList = [];
   }
 }
 
@@ -907,6 +961,133 @@ const handleSubmit = async () => {
     }
   })
 }
+
+// 工作负责人快速检索方法
+/** 过滤快速检索用户列表 */
+const filterQuickUserList = (keyword) => {
+  debugger
+  if (!allUserList.value.length) {
+    loadQuickTeamLeaderList();
+    return;
+  }
+
+  const lowerKeyword = keyword.toLowerCase();
+  quickTeamLeaderList.value = allUserList.value.filter(item =>
+      (item.nickName && item.nickName.toLowerCase().includes(lowerKeyword))
+  );
+}
+/** 工作负责人输入框获取焦点 */
+const handleTeamLeaderInputFocus = () => {
+  showTeamLeaderQuickSelect.value = true
+  // 如果已有输入内容,立即搜索
+  if (formData.value.teamLeaderName && formData.value.teamLeaderName.trim()) {
+    handleTeamLeaderInput(formData.value.teamLeaderName)
+  } else {
+    // 如果没有输入内容,加载默认列表
+    loadQuickTeamLeaderList()
+  }
+}
+
+/** 工作负责人输入框失去焦点 */
+const handleTeamLeaderInputBlur = () => {
+  // 延迟隐藏下拉框,确保点击选项能触发
+  setTimeout(() => {
+    showTeamLeaderQuickSelect.value = false
+  }, 200)
+}
+
+/** 工作负责人输入事件 - 实时搜索 */
+const handleTeamLeaderInput = (value) => {
+  const searchText = value.trim()
+
+  if (!searchText) {
+    quickTeamLeaderList.value = []
+    showTeamLeaderQuickSelect.value = false
+    return
+  }
+
+  showTeamLeaderQuickSelect.value = true
+
+  // 清除之前的定时器
+  if (teamLeaderSearchTimer.value) {
+    clearTimeout(teamLeaderSearchTimer.value)
+  }
+
+  // 设置新的定时器,防抖处理(300ms)
+  // teamLeaderSearchTimer.value = setTimeout(() => {
+  // searchTeamLeaderList(searchText)
+  filterQuickUserList(searchText)
+  // }, 300)
+}
+
+/** 搜索工作负责人列表 */
+const searchTeamLeaderList = async (keyword) => {
+  if (!keyword) {
+    quickTeamLeaderList.value = []
+    return
+  }
+
+  teamLeaderLoading.value = true
+  try {
+    const response = await listLeader({
+      nickName: keyword,
+      // 可以根据需要添加其他搜索条件
+      status: '0' // 只搜索启用状态的用户
+    })
+
+    quickTeamLeaderList.value = response.data || []
+
+  } catch (error) {
+    console.error('搜索工作负责人失败:', error)
+    proxy.$modal.msgError('搜索失败,请重试')
+    quickTeamLeaderList.value = []
+  } finally {
+    teamLeaderLoading.value = false
+  }
+}
+
+/** 加载快速检索工作负责人列表 */
+const loadQuickTeamLeaderList = async () => {
+  // 如果已有所有用户数据,且是同一个维保中心,直接使用
+  if (allUserList.value.length > 0 && lastLoadedCenterId.value === formData.value.gxtCenterId) {
+    quickTeamLeaderList.value = allUserList.value;
+    return;
+  }
+
+  // 记录当前维保中心ID
+  lastLoadedCenterId.value = formData.value.gxtCenterId;
+
+  teamLeaderLoading.value = true
+  try {
+    // 加载当前部门下的用户列表
+    const response = await listLeader({
+      deptId: -1, // 通过后台配置部门
+      status: '0'
+    })
+    allUserList.value = response.data || []
+    quickTeamLeaderList.value = allUserList.value;
+  } catch (error) {
+    console.error('加载工作负责人列表失败:', error)
+    allUserList.value = []
+  } finally {
+    teamLeaderLoading.value = false
+  }
+}
+
+/** 快速选择工作负责人 */
+const handleTeamLeaderQuickSelect = (item) => {
+  formData.value.teamLeaderId = item.userId
+  formData.value.teamLeaderName = item.nickName
+  showTeamLeaderQuickSelect.value = false
+}
+
+/** 清空工作负责人 */
+const handleTeamLeaderClear = () => {
+  formData.value.teamLeaderId = undefined
+  formData.value.teamLeaderName = ''
+  quickTeamLeaderList.value = []
+  showTeamLeaderQuickSelect.value = false
+}
 </script>
 
 <style scoped>
@@ -933,6 +1114,9 @@ const handleSubmit = async () => {
   padding: 8px 12px;
   cursor: pointer;
   border-bottom: 1px solid #f0f0f0;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
 }
 
 .quick-select-item:hover {

+ 12 - 6
ygtx-ui/src/views/gxt/gxtOrder/index.vue

@@ -770,8 +770,8 @@
       @success="handleFinishSuccess"
       @select-mis-info="handleSelectMisInfo2"
     >
-      <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 #mis-info-select>
+        <MisInfoSelectSingle :key="commonKey" v-model="misInfoSelectVisible2" @onSelected="onMisInfoSelected2" :pcsStationName="finishForm.pcsStationName" :pcsDeviceName="finishForm.pcsDeviceName" :workOrderStatus="结束" ></MisInfoSelectSingle>
       </template>
     </FinalizeDialog>
 
@@ -2235,7 +2235,7 @@ function handleFinish(row) {
                   showCancelButton: false,
                   type: 'warning'
                 }).then(function() {
-                  finishForm.value.infoEntry = '2'
+                  // finishForm.value.infoEntry = '2'
                   infoEntryDisabled.value = true
                 }).then(() => {
                 }).catch(() => {})
@@ -2247,7 +2247,7 @@ function handleFinish(row) {
               showCancelButton: false,
               type: 'warning'
             }).then(function() {
-              finishForm.value.infoEntry = '2'
+              // finishForm.value.infoEntry = '2'
               infoEntryDisabled.value = true
             }).then(() => {
             }).catch(() => {})
@@ -2259,7 +2259,7 @@ function handleFinish(row) {
             showCancelButton: false,
             type: 'warning'
           }).then(function() {
-            finishForm.value.infoEntry = '2'
+            // finishForm.value.infoEntry = '2'
             infoEntryDisabled.value = true
           }).then(() => {
           }).catch(() => {})
@@ -2274,7 +2274,7 @@ function handleFinish(row) {
         showCancelButton: false,
         type: 'warning'
       }).then(function() {
-        finishForm.value.infoEntry = '2'
+        // finishForm.value.infoEntry = '2'
         infoEntryDisabled.value = true
       }).then(() => {
       }).catch(() => {})
@@ -2955,6 +2955,7 @@ function handleSelectMisInfo() {
 }
 
 function handleSelectMisInfo2() {
+  debugger
   misInfoSelectVisible2.value = true
 }
 
@@ -3040,7 +3041,12 @@ function onMisInfoSelected2(row) {
             workOrderPersonList: response.rows
           };
           if (response.rows) {
+            // 查找 isLeader 等于 1 的负责人(优先获取第一个符合条件的,贴合常规单负责人场景)
+            const leaderPerson = response.rows.find(person => person.isLeader === 1);
+            // 给 teamLeaderName 赋值
+            updatedData.teamLeaderName = leaderPerson?.nickName || '';
             const nickNames = response.rows
+                .filter(person => person.isLeader != 1)
                 .map(person => person.nickName)
                 .join(',');
             updatedData.workGroupMemberName = nickNames

+ 10 - 4
ygtx-ui/src/views/gxt/repairOrder/index.vue

@@ -3442,7 +3442,7 @@ function handleFinalize(row, method) {
                 showCancelButton: false,
                 type: 'warning'
               }).then(function() {
-                finalizeFormData.value.infoEntry = '2'
+                // finalizeFormData.value.infoEntry = '2'
                 infoEntryDisabled.value = true
               }).then(() => {
               }).catch(() => {})
@@ -3454,7 +3454,7 @@ function handleFinalize(row, method) {
             showCancelButton: false,
             type: 'warning'
           }).then(function() {
-            finalizeFormData.value.infoEntry = '2'
+            // finalizeFormData.value.infoEntry = '2'
             infoEntryDisabled.value = true
           }).then(() => {
           }).catch(() => {})
@@ -3466,7 +3466,7 @@ function handleFinalize(row, method) {
           showCancelButton: false,
           type: 'warning'
         }).then(function() {
-          finalizeFormData.value.infoEntry = '2'
+          // finalizeFormData.value.infoEntry = '2'
           infoEntryDisabled.value = true
         }).then(() => {
         }).catch(() => {})
@@ -3482,7 +3482,7 @@ function handleFinalize(row, method) {
       type: 'warning'
     }).then(function() {
       debugger
-      finalizeFormData.value.infoEntry = '2'
+      // finalizeFormData.value.infoEntry = '2'
       infoEntryDisabled.value = true
     }).then(() => {
     }).catch(() => {})
@@ -3821,7 +3821,13 @@ function onMisInfoSelected(row) {
             repairOrderPersonList: response.rows
           };
           if (response.rows) {
+            debugger
+            // 查找 isLeader 等于 1 的负责人(优先获取第一个符合条件的,贴合常规单负责人场景)
+            const leaderPerson = response.rows.find(person => person.isLeader === 1);
+            // 给 teamLeaderName 赋值
+            updatedData.teamLeaderName = leaderPerson?.nickName || '';
             const nickNames = response.rows
+                .filter(person => person.isLeader != 1)
                 .map(person => person.nickName)
                 .join(',');
             updatedData.workGroupMemberName = nickNames