|
@@ -125,6 +125,19 @@
|
|
|
|
|
|
|
|
<!-- 工单信息 -->
|
|
<!-- 工单信息 -->
|
|
|
<div v-show="activeTab === 'info'" class="pane">
|
|
<div v-show="activeTab === 'info'" class="pane">
|
|
|
|
|
+ <div class="sect">
|
|
|
|
|
+ <div class="sect-t">故障信息</div>
|
|
|
|
|
+ <div class="kv">
|
|
|
|
|
+ <div class="full"><div class="k">故障描述</div><div class="v fault-description">{{ selectedOrder.orderDesc || '-' }}</div></div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="k">优先级</div>
|
|
|
|
|
+ <div class="v"><span class="pri" :class="priClass(selectedOrder.orderLevel)"><i></i>{{ orderLevelText(selectedOrder.orderLevel) }}</span></div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div><div class="k">故障发生时间</div><div class="v">{{ timeText(selectedOrder.faultTime) }}</div></div>
|
|
|
|
|
+ <div><div class="k">计划完成时间</div><div class="v">{{ timeText(selectedOrder.planFinishTime) }}</div></div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
<div class="sect">
|
|
<div class="sect">
|
|
|
<div class="sect-t">设备信息</div>
|
|
<div class="sect-t">设备信息</div>
|
|
|
<div class="kv">
|
|
<div class="kv">
|
|
@@ -136,16 +149,10 @@
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="sect">
|
|
<div class="sect">
|
|
|
- <div class="sect-t">故障信息</div>
|
|
|
|
|
|
|
+ <div class="sect-t">处置相关人员</div>
|
|
|
<div class="kv">
|
|
<div class="kv">
|
|
|
- <div>
|
|
|
|
|
- <div class="k">优先级</div>
|
|
|
|
|
- <div class="v"><span class="pri" :class="priClass(selectedOrder.orderLevel)"><i></i>{{ orderLevelText(selectedOrder.orderLevel) }}</span></div>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div><div class="k">故障发生时间</div><div class="v">{{ timeText(selectedOrder.faultTime) }}</div></div>
|
|
|
|
|
- <div><div class="k">计划完成时间</div><div class="v">{{ timeText(selectedOrder.planFinishTime) }}</div></div>
|
|
|
|
|
- <div><div class="k">责任人</div><div class="v">{{ selectedOrder.receiveUserName || '—' }}</div></div>
|
|
|
|
|
- <div class="full"><div class="k">故障描述</div><div class="v">{{ selectedOrder.orderDesc || '-' }}</div></div>
|
|
|
|
|
|
|
+ <div><div class="k">处置人</div><div class="v">{{ selectedOrder.receiveUserName || '—' }}</div></div>
|
|
|
|
|
+ <div><div class="k">核验人</div><div class="v">{{ selectedOrder.verifyUserName || '—' }}</div></div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
@@ -291,9 +298,9 @@
|
|
|
<!-- 派单弹窗 -->
|
|
<!-- 派单弹窗 -->
|
|
|
<el-dialog v-model="dispatchVisible" title="工单派单" width="720px" append-to-body destroy-on-close>
|
|
<el-dialog v-model="dispatchVisible" title="工单派单" width="720px" append-to-body destroy-on-close>
|
|
|
<el-form label-position="top">
|
|
<el-form label-position="top">
|
|
|
- <el-form-item label="责任人" required>
|
|
|
|
|
|
|
+ <el-form-item label="处置人" required>
|
|
|
<div class="handler-box">
|
|
<div class="handler-box">
|
|
|
- <el-input :model-value="dispatchForm.handlerName" placeholder="请选择责任人" readonly style="width: 240px">
|
|
|
|
|
|
|
+ <el-input :model-value="dispatchForm.handlerName" placeholder="请选择处置人" readonly style="width: 240px">
|
|
|
<template #append><el-button @click="openUserSelect('handler')">选择</el-button></template>
|
|
<template #append><el-button @click="openUserSelect('handler')">选择</el-button></template>
|
|
|
</el-input>
|
|
</el-input>
|
|
|
<el-button v-if="dispatchForm.handlerId" link type="danger" @click="clearHandler">清除</el-button>
|
|
<el-button v-if="dispatchForm.handlerId" link type="danger" @click="clearHandler">清除</el-button>
|
|
@@ -326,7 +333,7 @@
|
|
|
</template>
|
|
</template>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
|
|
|
- <!-- 选择责任人 / 核验人 -->
|
|
|
|
|
|
|
+ <!-- 选择处置人 / 核验人 -->
|
|
|
<el-dialog v-model="userSelectVisible" :title="userSelectTitle" width="760px" append-to-body>
|
|
<el-dialog v-model="userSelectVisible" :title="userSelectTitle" width="760px" append-to-body>
|
|
|
<el-row :gutter="12">
|
|
<el-row :gutter="12">
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
@@ -801,20 +808,36 @@ const dispatchForm = reactive({
|
|
|
planFinishTime: ''
|
|
planFinishTime: ''
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
-function openDispatch(o) {
|
|
|
|
|
|
|
+let dispatchSession = 0
|
|
|
|
|
+let reviewerEdited = false
|
|
|
|
|
+async function openDispatch(o) {
|
|
|
|
|
+ const session = ++dispatchSession
|
|
|
|
|
+ reviewerEdited = false
|
|
|
|
|
+ userSelectVisible.value = false
|
|
|
dispatchForm.orderId = o.orderId
|
|
dispatchForm.orderId = o.orderId
|
|
|
dispatchForm.handlerId = o.receiveUser || null
|
|
dispatchForm.handlerId = o.receiveUser || null
|
|
|
dispatchForm.handlerName = o.receiveUserName || ''
|
|
dispatchForm.handlerName = o.receiveUserName || ''
|
|
|
- dispatchForm.verifyUser = userStore.id || null
|
|
|
|
|
- dispatchForm.verifyUserName = userStore.nickName || userStore.name || ''
|
|
|
|
|
|
|
+ dispatchForm.verifyUser = null
|
|
|
|
|
+ dispatchForm.verifyUserName = ''
|
|
|
dispatchForm.remarks = ''
|
|
dispatchForm.remarks = ''
|
|
|
dispatchForm.planFinishTime = o.planFinishTime || ''
|
|
dispatchForm.planFinishTime = o.planFinishTime || ''
|
|
|
dispatchVisible.value = true
|
|
dispatchVisible.value = true
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await workOrderUsers({ orderId: o.orderId, type: 'reviewer' })
|
|
|
|
|
+ if (session !== dispatchSession || !dispatchVisible.value || reviewerEdited) return
|
|
|
|
|
+ const current = (res.data || []).find(user => String(user.userId) === String(userStore.id))
|
|
|
|
|
+ if (current) {
|
|
|
|
|
+ dispatchForm.verifyUser = current.userId
|
|
|
|
|
+ dispatchForm.verifyUserName = current.nickName || current.userName
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ // 请求层已展示错误;候选加载失败时保持未选择。
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function submitDispatch() {
|
|
async function submitDispatch() {
|
|
|
if (!dispatchForm.handlerId) {
|
|
if (!dispatchForm.handlerId) {
|
|
|
- proxy.$modal.msgWarning('请选择责任人')
|
|
|
|
|
|
|
+ proxy.$modal.msgWarning('请选择处置人')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
if (!dispatchForm.verifyUser) {
|
|
if (!dispatchForm.verifyUser) {
|
|
@@ -838,22 +861,34 @@ async function submitDispatch() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* ============ 责任人 / 核验人选择 ============ */
|
|
|
|
|
|
|
+/* ============ 处置人 / 核验人选择 ============ */
|
|
|
const userSelectVisible = ref(false)
|
|
const userSelectVisible = ref(false)
|
|
|
const userSelectTarget = ref('handler')
|
|
const userSelectTarget = ref('handler')
|
|
|
-const userSelectTitle = computed(() => userSelectTarget.value === 'verifier' ? '选择核验人' : '选择责任人')
|
|
|
|
|
|
|
+const userSelectTitle = computed(() => userSelectTarget.value === 'verifier' ? '选择核验人' : '选择处置人')
|
|
|
const deptTree = ref([])
|
|
const deptTree = ref([])
|
|
|
const deptUserList = ref([])
|
|
const deptUserList = ref([])
|
|
|
const selectedUserId = ref(null)
|
|
const selectedUserId = ref(null)
|
|
|
const selectedUser = ref(null)
|
|
const selectedUser = ref(null)
|
|
|
|
|
|
|
|
-function loadDeptTree() {
|
|
|
|
|
- workOrderDeptTree().then((res) => { deptTree.value = res.data || [] })
|
|
|
|
|
|
|
+let pickerRequest = 0
|
|
|
|
|
+let pickerSession = 0
|
|
|
|
|
+function candidateParams(deptId) {
|
|
|
|
|
+ return { orderId: dispatchForm.orderId, type: userSelectTarget.value === 'verifier' ? 'reviewer' : 'handler', deptId }
|
|
|
}
|
|
}
|
|
|
-function loadDeptUsers(deptId) {
|
|
|
|
|
- workOrderUsers(deptId).then((res) => { deptUserList.value = res.data || [] })
|
|
|
|
|
-}
|
|
|
|
|
-function openUserSelect(target) {
|
|
|
|
|
|
|
+async function loadDeptUsers(deptId) {
|
|
|
|
|
+ const request = ++pickerRequest
|
|
|
|
|
+ const session = dispatchSession
|
|
|
|
|
+ deptUserList.value = []
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await workOrderUsers(candidateParams(deptId))
|
|
|
|
|
+ if (request === pickerRequest && session === dispatchSession && userSelectVisible.value) deptUserList.value = res.data || []
|
|
|
|
|
+ } catch { /* 请求层统一展示错误 */ }
|
|
|
|
|
+}
|
|
|
|
|
+async function openUserSelect(target) {
|
|
|
|
|
+ ++pickerRequest
|
|
|
|
|
+ const picker = ++pickerSession
|
|
|
|
|
+ const session = dispatchSession
|
|
|
|
|
+ if (target === 'verifier') reviewerEdited = true
|
|
|
userSelectTarget.value = target
|
|
userSelectTarget.value = target
|
|
|
if (target === 'verifier') {
|
|
if (target === 'verifier') {
|
|
|
selectedUserId.value = dispatchForm.verifyUser
|
|
selectedUserId.value = dispatchForm.verifyUser
|
|
@@ -867,6 +902,14 @@ function openUserSelect(target) {
|
|
|
: null
|
|
: null
|
|
|
}
|
|
}
|
|
|
userSelectVisible.value = true
|
|
userSelectVisible.value = true
|
|
|
|
|
+ deptTree.value = []
|
|
|
|
|
+ const params = candidateParams()
|
|
|
|
|
+ const users = loadDeptUsers()
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await workOrderDeptTree(params)
|
|
|
|
|
+ if (session === dispatchSession && picker === pickerSession && userSelectVisible.value) deptTree.value = res.data || []
|
|
|
|
|
+ } catch { /* 请求层统一展示错误 */ }
|
|
|
|
|
+ await users
|
|
|
}
|
|
}
|
|
|
function handleDeptNodeClick(node) { loadDeptUsers(node.id) }
|
|
function handleDeptNodeClick(node) { loadDeptUsers(node.id) }
|
|
|
function handleUserCurrentChange(row) {
|
|
function handleUserCurrentChange(row) {
|
|
@@ -874,7 +917,7 @@ function handleUserCurrentChange(row) {
|
|
|
}
|
|
}
|
|
|
function handleUserRadioChange(row) { selectedUser.value = row; selectedUserId.value = row.userId }
|
|
function handleUserRadioChange(row) { selectedUser.value = row; selectedUserId.value = row.userId }
|
|
|
function confirmUserSelect() {
|
|
function confirmUserSelect() {
|
|
|
- const label = userSelectTarget.value === 'verifier' ? '核验人' : '责任人'
|
|
|
|
|
|
|
+ const label = userSelectTarget.value === 'verifier' ? '核验人' : '处置人'
|
|
|
if (!selectedUser.value) { proxy.$modal.msgWarning(`请选择${label}`); return }
|
|
if (!selectedUser.value) { proxy.$modal.msgWarning(`请选择${label}`); return }
|
|
|
if (userSelectTarget.value === 'verifier') {
|
|
if (userSelectTarget.value === 'verifier') {
|
|
|
dispatchForm.verifyUser = selectedUser.value.userId
|
|
dispatchForm.verifyUser = selectedUser.value.userId
|
|
@@ -892,6 +935,7 @@ function clearHandler() {
|
|
|
selectedUserId.value = null
|
|
selectedUserId.value = null
|
|
|
}
|
|
}
|
|
|
function clearVerifier() {
|
|
function clearVerifier() {
|
|
|
|
|
+ reviewerEdited = true
|
|
|
dispatchForm.verifyUser = null
|
|
dispatchForm.verifyUser = null
|
|
|
dispatchForm.verifyUserName = ''
|
|
dispatchForm.verifyUserName = ''
|
|
|
selectedUser.value = null
|
|
selectedUser.value = null
|
|
@@ -1053,8 +1097,6 @@ if (route.query?.keyword) {
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
handleSearch()
|
|
handleSearch()
|
|
|
- loadDeptTree()
|
|
|
|
|
- loadDeptUsers()
|
|
|
|
|
})
|
|
})
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
@@ -1451,6 +1493,7 @@ onMounted(() => {
|
|
|
.k { font-size: 11.5px; color: var(--txt3); margin-bottom: 2px; }
|
|
.k { font-size: 11.5px; color: var(--txt3); margin-bottom: 2px; }
|
|
|
.v { font-size: 13px; word-break: break-all; }
|
|
.v { font-size: 13px; word-break: break-all; }
|
|
|
.v.mono { font-family: ui-monospace, Consolas, "Courier New", monospace; }
|
|
.v.mono { font-family: ui-monospace, Consolas, "Courier New", monospace; }
|
|
|
|
|
+.fault-description { font-weight: 400; line-height: 1.7; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
|
|
|
|
|
|
.pri {
|
|
.pri {
|
|
|
display: inline-flex;
|
|
display: inline-flex;
|