|
|
@@ -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>
|