|
|
@@ -17,9 +17,7 @@
|
|
|
<div class="qf">
|
|
|
<label>优先级</label>
|
|
|
<el-select v-model="queryParams.orderLevel" placeholder="全部" clearable style="width: 120px">
|
|
|
- <el-option label="紧急" :value="WO_LEVEL.EMERGENCY" />
|
|
|
- <el-option label="一般" :value="WO_LEVEL.NORMAL" />
|
|
|
- <el-option label="低" :value="WO_LEVEL.LOW" />
|
|
|
+ <el-option v-for="item in workOrderLevels" :key="item.value" :label="item.label" :value="Number(item.value)" />
|
|
|
</el-select>
|
|
|
</div>
|
|
|
<div class="qf">
|
|
|
@@ -158,7 +156,7 @@
|
|
|
<div class="zone-hd">维修前<span class="tip">{{ beforeAttach.length + ' 项' }}</span></div>
|
|
|
<div class="zbody">
|
|
|
<div v-for="(u, i) in beforeAttach" :key="'b' + i" class="att" :class="extCls(u) === 'img' ? 'att-img' : 'att-file'" @click="extCls(u) === 'img' && preview(u, beforeAttach)">
|
|
|
- <img v-if="extCls(u) === 'img'" :src="u" alt="" />
|
|
|
+ <img v-if="extCls(u) === 'img'" :src="buildMinioAttachmentUrl(u)" alt="" />
|
|
|
<div v-else class="ext" :class="extCls(u)">{{ extText(u) }}</div>
|
|
|
</div>
|
|
|
<div v-if="!beforeAttach.length" class="hint">暂无维修前附件</div>
|
|
|
@@ -168,7 +166,7 @@
|
|
|
<div class="zone-hd">维修后<span class="tip">{{ afterAttach.length + ' 项' }}</span></div>
|
|
|
<div class="zbody">
|
|
|
<div v-for="(u, i) in afterAttach" :key="'a' + i" class="att" :class="extCls(u) === 'img' ? 'att-img' : 'att-file'" @click="extCls(u) === 'img' && preview(u, afterAttach)">
|
|
|
- <img v-if="extCls(u) === 'img'" :src="u" alt="" />
|
|
|
+ <img v-if="extCls(u) === 'img'" :src="buildMinioAttachmentUrl(u)" alt="" />
|
|
|
<div v-else class="ext" :class="extCls(u)">{{ extText(u) }}</div>
|
|
|
</div>
|
|
|
<div v-if="!afterAttach.length" class="hint">维修完成后上传</div>
|
|
|
@@ -208,7 +206,7 @@
|
|
|
<template v-for="(u, k) in splitAttach(l.attachUrl)" :key="k">
|
|
|
<img
|
|
|
v-if="extCls(u) === 'img'"
|
|
|
- :src="u"
|
|
|
+ :src="buildMinioAttachmentUrl(u)"
|
|
|
class="hthumb"
|
|
|
alt=""
|
|
|
@click="preview(u, splitAttach(l.attachUrl))"
|
|
|
@@ -296,11 +294,19 @@
|
|
|
<el-form-item label="责任人" required>
|
|
|
<div class="handler-box">
|
|
|
<el-input :model-value="dispatchForm.handlerName" placeholder="请选择责任人" readonly style="width: 240px">
|
|
|
- <template #append><el-button @click="userSelectVisible = true">选择</el-button></template>
|
|
|
+ <template #append><el-button @click="openUserSelect('handler')">选择</el-button></template>
|
|
|
</el-input>
|
|
|
<el-button v-if="dispatchForm.handlerId" link type="danger" @click="clearHandler">清除</el-button>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="核验人" required>
|
|
|
+ <div class="handler-box">
|
|
|
+ <el-input :model-value="dispatchForm.verifyUserName" placeholder="请选择核验人" readonly style="width: 240px">
|
|
|
+ <template #append><el-button @click="openUserSelect('verifier')">选择</el-button></template>
|
|
|
+ </el-input>
|
|
|
+ <el-button v-if="dispatchForm.verifyUser" link type="danger" @click="clearVerifier">清除</el-button>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
<el-form-item label="派单备注">
|
|
|
<el-input v-model="dispatchForm.remarks" type="textarea" :rows="3" maxlength="200" show-word-limit placeholder="可填写故障要点、现场注意事项等派单说明" />
|
|
|
</el-form-item>
|
|
|
@@ -320,8 +326,8 @@
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
|
|
|
- <!-- 选择责任人 -->
|
|
|
- <el-dialog v-model="userSelectVisible" title="选择责任人" width="760px" append-to-body>
|
|
|
+ <!-- 选择责任人 / 核验人 -->
|
|
|
+ <el-dialog v-model="userSelectVisible" :title="userSelectTitle" width="760px" append-to-body>
|
|
|
<el-row :gutter="12">
|
|
|
<el-col :span="8">
|
|
|
<div class="dept-tree-box">
|
|
|
@@ -360,7 +366,7 @@
|
|
|
<template #label>
|
|
|
<span v-if="actionAttachRequired" class="req-mark">*</span>{{ actionAttachLabel }}
|
|
|
</template>
|
|
|
- <ImageUpload v-model="actionForm.attachUrl" :limit="9" :is-show-tip="true" :upload-url="imageUploadUrl" />
|
|
|
+ <ImageUpload v-model="actionForm.attachUrl" :limit="9" :is-show-tip="true" :upload-url="imageUploadUrl" relative-path />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
@@ -382,7 +388,7 @@
|
|
|
<el-input v-model="verifyForm.content" type="textarea" :rows="4" maxlength="500" show-word-limit placeholder="请输入验收意见" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="验收附件(可选)">
|
|
|
- <ImageUpload v-model="verifyForm.attachUrl" :limit="9" :is-show-tip="true" :upload-url="imageUploadUrl" />
|
|
|
+ <ImageUpload v-model="verifyForm.attachUrl" :limit="9" :is-show-tip="true" :upload-url="imageUploadUrl" relative-path />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
@@ -401,7 +407,7 @@
|
|
|
<el-input v-model="delayForm.delayedReason" type="textarea" :rows="4" maxlength="300" show-word-limit placeholder="请填写延期原因" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="附件">
|
|
|
- <ImageUpload v-model="delayForm.attachUrl" :limit="9" :is-show-tip="true" :upload-url="imageUploadUrl" />
|
|
|
+ <ImageUpload v-model="delayForm.attachUrl" :limit="9" :is-show-tip="true" :upload-url="imageUploadUrl" relative-path />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
@@ -451,7 +457,6 @@ import {
|
|
|
} from '@/api/pipeNetwork/ops/workOrder.js'
|
|
|
import {
|
|
|
canOperate,
|
|
|
- orderLevelText,
|
|
|
orderStatusText,
|
|
|
delayApplyStatusText,
|
|
|
orderLogText,
|
|
|
@@ -461,15 +466,20 @@ import {
|
|
|
WO_LOG_TYPE,
|
|
|
DELAY_APPLY_STATUS,
|
|
|
WO_LEVEL
|
|
|
-} from './workOrderDict.js'
|
|
|
+} from './js/workOrderDict.js'
|
|
|
+import { useWorkOrderLevelDict } from './js/useWorkOrderLevelDict.js'
|
|
|
import ImageUpload from '@/components/ImageUpload/index.vue'
|
|
|
+import { buildMinioAttachmentUrl } from '@/utils/minioAttachment'
|
|
|
import { useRoute } from 'vue-router'
|
|
|
+import useUserStore from '@/store/modules/user'
|
|
|
|
|
|
defineOptions({ name: 'Pworkdisposition' })
|
|
|
|
|
|
const { proxy } = getCurrentInstance()
|
|
|
-const imageUploadUrl = import.meta.env.VITE_APP_BASE_API + '/minio/upload'
|
|
|
+const imageUploadUrl = import.meta.env.VITE_APP_BASE_API + '/minio/upload?dir=workOrder'
|
|
|
+const { workOrderLevels, orderLevelText } = useWorkOrderLevelDict()
|
|
|
const route = useRoute()
|
|
|
+const userStore = useUserStore()
|
|
|
|
|
|
/**
|
|
|
* 本组件被多个菜单复用,不同菜单按业务口径查询不同范围的工单:
|
|
|
@@ -690,7 +700,7 @@ const viewerList = ref([])
|
|
|
const viewerIndex = ref(0)
|
|
|
function preview(url, arr) {
|
|
|
const a = arr && arr.length ? arr : [url]
|
|
|
- viewerList.value = a
|
|
|
+ viewerList.value = a.map(path => buildMinioAttachmentUrl(path))
|
|
|
viewerIndex.value = Math.max(0, a.indexOf(url))
|
|
|
viewerVisible.value = true
|
|
|
}
|
|
|
@@ -781,12 +791,22 @@ async function refresh(opOrderId) {
|
|
|
|
|
|
/* ============ 派单 ============ */
|
|
|
const dispatchVisible = ref(false)
|
|
|
-const dispatchForm = reactive({ orderId: null, handlerId: null, handlerName: '', remarks: '', planFinishTime: '' })
|
|
|
+const dispatchForm = reactive({
|
|
|
+ orderId: null,
|
|
|
+ handlerId: null,
|
|
|
+ handlerName: '',
|
|
|
+ verifyUser: null,
|
|
|
+ verifyUserName: '',
|
|
|
+ remarks: '',
|
|
|
+ planFinishTime: ''
|
|
|
+})
|
|
|
|
|
|
function openDispatch(o) {
|
|
|
dispatchForm.orderId = o.orderId
|
|
|
dispatchForm.handlerId = o.receiveUser || null
|
|
|
dispatchForm.handlerName = o.receiveUserName || ''
|
|
|
+ dispatchForm.verifyUser = userStore.id || null
|
|
|
+ dispatchForm.verifyUserName = userStore.nickName || userStore.name || ''
|
|
|
dispatchForm.remarks = ''
|
|
|
dispatchForm.planFinishTime = o.planFinishTime || ''
|
|
|
dispatchVisible.value = true
|
|
|
@@ -797,9 +817,19 @@ async function submitDispatch() {
|
|
|
proxy.$modal.msgWarning('请选择责任人')
|
|
|
return
|
|
|
}
|
|
|
+ if (!dispatchForm.verifyUser) {
|
|
|
+ proxy.$modal.msgWarning('请选择核验人')
|
|
|
+ return
|
|
|
+ }
|
|
|
submitting.value = true
|
|
|
try {
|
|
|
- await dispatchWorkOrder({ orderId: dispatchForm.orderId, handlerId: dispatchForm.handlerId, remarks: dispatchForm.remarks, planFinishTime: dispatchForm.planFinishTime || null })
|
|
|
+ await dispatchWorkOrder({
|
|
|
+ orderId: dispatchForm.orderId,
|
|
|
+ handlerId: dispatchForm.handlerId,
|
|
|
+ verifyUser: dispatchForm.verifyUser,
|
|
|
+ remarks: dispatchForm.remarks,
|
|
|
+ planFinishTime: dispatchForm.planFinishTime || null
|
|
|
+ })
|
|
|
proxy.$modal.msgSuccess('派单成功,工单状态变更为待接单')
|
|
|
dispatchVisible.value = false
|
|
|
await refresh(dispatchForm.orderId)
|
|
|
@@ -808,8 +838,10 @@ async function submitDispatch() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* ============ 责任人选择 ============ */
|
|
|
+/* ============ 责任人 / 核验人选择 ============ */
|
|
|
const userSelectVisible = ref(false)
|
|
|
+const userSelectTarget = ref('handler')
|
|
|
+const userSelectTitle = computed(() => userSelectTarget.value === 'verifier' ? '选择核验人' : '选择责任人')
|
|
|
const deptTree = ref([])
|
|
|
const deptUserList = ref([])
|
|
|
const selectedUserId = ref(null)
|
|
|
@@ -821,15 +853,36 @@ function loadDeptTree() {
|
|
|
function loadDeptUsers(deptId) {
|
|
|
workOrderUsers(deptId).then((res) => { deptUserList.value = res.data || [] })
|
|
|
}
|
|
|
+function openUserSelect(target) {
|
|
|
+ userSelectTarget.value = target
|
|
|
+ if (target === 'verifier') {
|
|
|
+ selectedUserId.value = dispatchForm.verifyUser
|
|
|
+ selectedUser.value = dispatchForm.verifyUser
|
|
|
+ ? { userId: dispatchForm.verifyUser, nickName: dispatchForm.verifyUserName }
|
|
|
+ : null
|
|
|
+ } else {
|
|
|
+ selectedUserId.value = dispatchForm.handlerId
|
|
|
+ selectedUser.value = dispatchForm.handlerId
|
|
|
+ ? { userId: dispatchForm.handlerId, nickName: dispatchForm.handlerName }
|
|
|
+ : null
|
|
|
+ }
|
|
|
+ userSelectVisible.value = true
|
|
|
+}
|
|
|
function handleDeptNodeClick(node) { loadDeptUsers(node.id) }
|
|
|
function handleUserCurrentChange(row) {
|
|
|
if (row) { selectedUser.value = row; selectedUserId.value = row.userId }
|
|
|
}
|
|
|
function handleUserRadioChange(row) { selectedUser.value = row; selectedUserId.value = row.userId }
|
|
|
function confirmUserSelect() {
|
|
|
- if (!selectedUser.value) { proxy.$modal.msgWarning('请选择责任人'); return }
|
|
|
- dispatchForm.handlerId = selectedUser.value.userId
|
|
|
- dispatchForm.handlerName = selectedUser.value.nickName || selectedUser.value.userName
|
|
|
+ const label = userSelectTarget.value === 'verifier' ? '核验人' : '责任人'
|
|
|
+ if (!selectedUser.value) { proxy.$modal.msgWarning(`请选择${label}`); return }
|
|
|
+ if (userSelectTarget.value === 'verifier') {
|
|
|
+ dispatchForm.verifyUser = selectedUser.value.userId
|
|
|
+ dispatchForm.verifyUserName = selectedUser.value.nickName || selectedUser.value.userName
|
|
|
+ } else {
|
|
|
+ dispatchForm.handlerId = selectedUser.value.userId
|
|
|
+ dispatchForm.handlerName = selectedUser.value.nickName || selectedUser.value.userName
|
|
|
+ }
|
|
|
userSelectVisible.value = false
|
|
|
}
|
|
|
function clearHandler() {
|
|
|
@@ -838,6 +891,12 @@ function clearHandler() {
|
|
|
selectedUser.value = null
|
|
|
selectedUserId.value = null
|
|
|
}
|
|
|
+function clearVerifier() {
|
|
|
+ dispatchForm.verifyUser = null
|
|
|
+ dispatchForm.verifyUserName = ''
|
|
|
+ selectedUser.value = null
|
|
|
+ selectedUserId.value = null
|
|
|
+}
|
|
|
|
|
|
/* ============ 通用操作 ============ */
|
|
|
const actionVisible = ref(false)
|