|
@@ -247,61 +247,24 @@
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
|
|
|
<!-- 派单弹窗 -->
|
|
<!-- 派单弹窗 -->
|
|
|
- <el-dialog v-model="dispatchDialogVisible" title="下派任务 - 选择接单人" width="750px">
|
|
|
|
|
- <div style="display: flex; gap: 16px; min-height: 350px;">
|
|
|
|
|
- <!-- 左侧:部门树 -->
|
|
|
|
|
- <div style="width: 280px; border-right: 1px solid #e4e7ed; padding-right: 12px;">
|
|
|
|
|
- <el-input
|
|
|
|
|
- v-model="deptFilterText"
|
|
|
|
|
- placeholder="筛选部门"
|
|
|
|
|
- clearable
|
|
|
|
|
- size="small"
|
|
|
|
|
- style="margin-bottom: 8px"
|
|
|
|
|
- />
|
|
|
|
|
- <el-tree
|
|
|
|
|
- ref="deptTreeRef"
|
|
|
|
|
- :data="deptTreeData"
|
|
|
|
|
- :props="{ label: 'deptName', children: 'children' }"
|
|
|
|
|
- :filter-node-method="filterDeptNode"
|
|
|
|
|
- node-key="deptId"
|
|
|
|
|
- highlight-current
|
|
|
|
|
- @node-click="handleDeptClick"
|
|
|
|
|
- style="font-size: 14px"
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <!-- 右侧:用户列表 -->
|
|
|
|
|
- <div style="flex: 1; min-width: 0;">
|
|
|
|
|
- <el-table
|
|
|
|
|
- :data="userList"
|
|
|
|
|
- border
|
|
|
|
|
- size="small"
|
|
|
|
|
- max-height="300"
|
|
|
|
|
- ref="userTableRef"
|
|
|
|
|
- row-key="userId"
|
|
|
|
|
- @selection-change="handleSelectionChange"
|
|
|
|
|
- @row-click="handleRowClick"
|
|
|
|
|
- >
|
|
|
|
|
- <el-table-column type="selection" width="40" align="center" :reserve-selection="true" />
|
|
|
|
|
- <el-table-column prop="userName" label="用户名" width="100" />
|
|
|
|
|
- <el-table-column prop="nickName" label="昵称" width="100" />
|
|
|
|
|
- <el-table-column prop="dept.deptName" label="部门" show-overflow-tooltip />
|
|
|
|
|
- </el-table>
|
|
|
|
|
- <div v-if="userList.length === 0" style="text-align: center; color: #909399; padding: 40px 0;">请先在左侧选择部门</div>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <el-dialog v-model="dispatchDialogVisible" title="下派任务" width="560px">
|
|
|
<el-form :model="dispatchForm" label-width="80px" style="margin-top: 16px">
|
|
<el-form :model="dispatchForm" label-width="80px" style="margin-top: 16px">
|
|
|
|
|
+ <el-form-item label="处置人" required><el-input :model-value="assignmentLabel(selectedHandler)" readonly placeholder="请选择处置人" @click="openAssignmentPicker('handler')" /></el-form-item>
|
|
|
|
|
+ <el-form-item label="核验人" required><el-input :model-value="assignmentLabel(selectedReviewer)" readonly placeholder="请选择核验人" @click="openAssignmentPicker('reviewer')" /></el-form-item>
|
|
|
<el-form-item label="备注"><el-input v-model="dispatchForm.remarks" placeholder="请输入派单备注" /></el-form-item>
|
|
<el-form-item label="备注"><el-input v-model="dispatchForm.remarks" placeholder="请输入派单备注" /></el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<template #footer>
|
|
<template #footer>
|
|
|
- <span style="float: left; line-height: 32px; color: #606266;">
|
|
|
|
|
- 已选人员:<span v-if="selectedUserNames.length > 0" style="color: #409eff; font-weight: bold;">{{ selectedUserNames.join(', ') }}</span>
|
|
|
|
|
- <span v-else style="color: #909399">未选择</span>
|
|
|
|
|
- (<span v-if="dispatchForm.handlerIds && dispatchForm.handlerIds.length > 0">{{ dispatchForm.handlerIds.length }}</span><span v-else>0</span>)
|
|
|
|
|
- </span>
|
|
|
|
|
<el-button @click="dispatchDialogVisible = false">取消</el-button>
|
|
<el-button @click="dispatchDialogVisible = false">取消</el-button>
|
|
|
<el-button type="primary" @click="submitDispatch">确认</el-button>
|
|
<el-button type="primary" @click="submitDispatch">确认</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
+ <DepartmentUserPicker
|
|
|
|
|
+ v-model="assignmentPickerVisible"
|
|
|
|
|
+ :title="assignmentTarget === 'handler' ? '选择处置人' : '选择核验人'"
|
|
|
|
|
+ :options="assignmentTarget === 'handler' ? handlerOptions : reviewerOptions"
|
|
|
|
|
+ :selected-id="assignmentTarget === 'handler' ? selectedHandler?.userId : selectedReviewer?.userId"
|
|
|
|
|
+ @select="selectAssignmentUser"
|
|
|
|
|
+ />
|
|
|
|
|
|
|
|
<!-- 核查/处理弹窗 -->
|
|
<!-- 核查/处理弹窗 -->
|
|
|
<el-dialog v-model="actionDialogVisible" :title="actionTitle" width="600px">
|
|
<el-dialog v-model="actionDialogVisible" :title="actionTitle" width="600px">
|
|
@@ -343,10 +306,8 @@
|
|
|
<script setup name="BusinessWorkOrder">
|
|
<script setup name="BusinessWorkOrder">
|
|
|
import { ElMessage } from 'element-plus'
|
|
import { ElMessage } from 'element-plus'
|
|
|
import ImagePreview from '@/components/ImagePreview'
|
|
import ImagePreview from '@/components/ImagePreview'
|
|
|
-import { listWorkOrder, getWorkOrder, dispatchWorkOrder, acceptWorkOrder, processWorkOrder, submitVerifyWorkOrder, verifyWorkOrder, cancelWorkOrder } from '@/api/pipeNetwork/ops/workOrder.js'
|
|
|
|
|
-import { listDept } from '@/api/system/dept'
|
|
|
|
|
-import { listUser } from '@/api/system/user'
|
|
|
|
|
-import { handleTree } from '@/utils/ruoyi'
|
|
|
|
|
|
|
+import { listWorkOrder, getWorkOrder, dispatchWorkOrder, acceptWorkOrder, processWorkOrder, submitVerifyWorkOrder, verifyWorkOrder, cancelWorkOrder, workOrderUsers } from '@/api/pipeNetwork/ops/workOrder.js'
|
|
|
|
|
+import DepartmentUserPicker from '@/components/DepartmentUserPicker/index.vue'
|
|
|
import {
|
|
import {
|
|
|
canOperate,
|
|
canOperate,
|
|
|
orderLogText,
|
|
orderLogText,
|
|
@@ -383,59 +344,25 @@ const workImageList = computed(() => {
|
|
|
|
|
|
|
|
// 派单相关
|
|
// 派单相关
|
|
|
const dispatchDialogVisible = ref(false)
|
|
const dispatchDialogVisible = ref(false)
|
|
|
-const dispatchForm = reactive({ handlerIds: [], remarks: '' })
|
|
|
|
|
-const deptTreeRef = ref(null)
|
|
|
|
|
-const userTableRef = ref(null)
|
|
|
|
|
-const deptTreeData = ref([])
|
|
|
|
|
-const deptFilterText = ref('')
|
|
|
|
|
-const userList = ref([])
|
|
|
|
|
-const selectedUserList = ref([]) // 存储选中的用户行数据
|
|
|
|
|
-
|
|
|
|
|
-// 部门筛选
|
|
|
|
|
-watch(deptFilterText, (val) => { deptTreeRef.value && deptTreeRef.value.filter(val) })
|
|
|
|
|
-function filterDeptNode(value, data) {
|
|
|
|
|
- if (!value) return true
|
|
|
|
|
- return data.deptName.includes(value)
|
|
|
|
|
|
|
+const dispatchForm = reactive({ remarks: '' })
|
|
|
|
|
+const handlerOptions = ref([])
|
|
|
|
|
+const reviewerOptions = ref([])
|
|
|
|
|
+const selectedHandler = ref(null)
|
|
|
|
|
+const selectedReviewer = ref(null)
|
|
|
|
|
+const assignmentPickerVisible = ref(false)
|
|
|
|
|
+const assignmentTarget = ref('handler')
|
|
|
|
|
+const assignmentLabel = user => user ? (user.dept?.deptName ? `${user.nickName || user.userName}(${user.dept.deptName})` : user.deptName ? `${user.nickName || user.userName}(${user.deptName})` : user.nickName || user.userName) : ''
|
|
|
|
|
+function openAssignmentPicker(target) {
|
|
|
|
|
+ const options = target === 'handler' ? handlerOptions.value : reviewerOptions.value
|
|
|
|
|
+ if (!options.length) return ElMessage.warning(`暂无可选${target === 'handler' ? '处置人' : '核验人'}`)
|
|
|
|
|
+ assignmentTarget.value = target
|
|
|
|
|
+ assignmentPickerVisible.value = true
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-// 加载部门树
|
|
|
|
|
-async function loadDeptTree() {
|
|
|
|
|
- if (deptTreeData.value.length > 0) return
|
|
|
|
|
- try {
|
|
|
|
|
- const res = await listDept()
|
|
|
|
|
- deptTreeData.value = handleTree(res.data || [], 'deptId')
|
|
|
|
|
- } catch (e) { console.error('加载部门失败', e) }
|
|
|
|
|
|
|
+function selectAssignmentUser(user) {
|
|
|
|
|
+ if (assignmentTarget.value === 'handler') selectedHandler.value = user
|
|
|
|
|
+ else selectedReviewer.value = user
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// 点击部门加载用户
|
|
|
|
|
-async function handleDeptClick(node) {
|
|
|
|
|
- try {
|
|
|
|
|
- // 清除当前选择
|
|
|
|
|
- userTableRef.value && userTableRef.value.clearSelection()
|
|
|
|
|
- selectedUserList.value = []
|
|
|
|
|
- dispatchForm.handlerIds = []
|
|
|
|
|
-
|
|
|
|
|
- const res = await listUser({ deptId: node.deptId, pageNum: 1, pageSize: 100 })
|
|
|
|
|
- userList.value = res.rows || []
|
|
|
|
|
- } catch (e) { console.error('加载用户失败', e) }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// 选择变化时触发
|
|
|
|
|
-function handleSelectionChange(selection) {
|
|
|
|
|
- selectedUserList.value = selection
|
|
|
|
|
- dispatchForm.handlerIds = selection.map(item => item.userId)
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// 点击行切换选中状态
|
|
|
|
|
-function handleRowClick(row) {
|
|
|
|
|
- userTableRef.value && userTableRef.value.toggleRowSelection(row)
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// 获取已选人员昵称(用于显示)
|
|
|
|
|
-const selectedUserNames = computed(() => {
|
|
|
|
|
- return selectedUserList.value.map(item => item.nickName || item.userName)
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
/** 查询工单列表 */
|
|
/** 查询工单列表 */
|
|
|
async function handleSearch() {
|
|
async function handleSearch() {
|
|
|
listLoading.value = true
|
|
listLoading.value = true
|
|
@@ -498,16 +425,25 @@ function canComplete() { return canOperate.submitVerify(selectedOrder.value) }
|
|
|
function canClose() { return canOperate.verify(selectedOrder.value) }
|
|
function canClose() { return canOperate.verify(selectedOrder.value) }
|
|
|
function canReject() { return canOperate.cancel(selectedOrder.value) }
|
|
function canReject() { return canOperate.cancel(selectedOrder.value) }
|
|
|
|
|
|
|
|
-function handleDispatch() {
|
|
|
|
|
|
|
+async function handleDispatch() {
|
|
|
if (!canDispatch()) {
|
|
if (!canDispatch()) {
|
|
|
ElMessage.warning('仅可对待派单工单进行派单操作')
|
|
ElMessage.warning('仅可对待派单工单进行派单操作')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- Object.assign(dispatchForm, { handlerIds: [], remarks: '' })
|
|
|
|
|
- selectedUserList.value = []
|
|
|
|
|
- userList.value = []
|
|
|
|
|
- loadDeptTree()
|
|
|
|
|
|
|
+ dispatchForm.remarks = ''
|
|
|
|
|
+ selectedHandler.value = null
|
|
|
|
|
+ selectedReviewer.value = null
|
|
|
|
|
+ handlerOptions.value = []
|
|
|
|
|
+ reviewerOptions.value = []
|
|
|
dispatchDialogVisible.value = true
|
|
dispatchDialogVisible.value = true
|
|
|
|
|
+ try {
|
|
|
|
|
+ const [handlers, reviewers] = await Promise.all([
|
|
|
|
|
+ workOrderUsers({ orderId: selectedOrder.value.orderId, type: 'handler' }),
|
|
|
|
|
+ workOrderUsers({ orderId: selectedOrder.value.orderId, type: 'reviewer' })
|
|
|
|
|
+ ])
|
|
|
|
|
+ handlerOptions.value = handlers.data || []
|
|
|
|
|
+ reviewerOptions.value = reviewers.data || []
|
|
|
|
|
+ } catch { /* 请求层统一提示 */ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function handleAccept() {
|
|
async function handleAccept() {
|
|
@@ -529,19 +465,13 @@ async function handleStart() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function submitDispatch() {
|
|
async function submitDispatch() {
|
|
|
- const handlerIds = dispatchForm.handlerIds || []
|
|
|
|
|
- if (handlerIds.length === 0) {
|
|
|
|
|
- ElMessage.warning('请选择处置人')
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- if (handlerIds.length > 1) {
|
|
|
|
|
- ElMessage.warning('新工单流程仅支持单个处置人,请只选择一位处置人')
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (!selectedHandler.value) return ElMessage.warning('请选择处置人')
|
|
|
|
|
+ if (!selectedReviewer.value) return ElMessage.warning('请选择核验人')
|
|
|
try {
|
|
try {
|
|
|
await dispatchWorkOrder({
|
|
await dispatchWorkOrder({
|
|
|
orderId: selectedOrder.value.orderId,
|
|
orderId: selectedOrder.value.orderId,
|
|
|
- handlerId: handlerIds[0],
|
|
|
|
|
|
|
+ handlerId: selectedHandler.value.userId,
|
|
|
|
|
+ verifyUser: selectedReviewer.value.userId,
|
|
|
remarks: dispatchForm.remarks
|
|
remarks: dispatchForm.remarks
|
|
|
})
|
|
})
|
|
|
ElMessage.success('派单成功!已指派给所选处置人')
|
|
ElMessage.success('派单成功!已指派给所选处置人')
|