From 08527b5faf63d0ec25db048c9866c3751d384390 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Fri, 21 Nov 2025 15:59:20 +0800
Subject: [PATCH] feat:是否有权限完成工单
---
src/views/tickets/ticket.vue | 68 +++-------------------------------
src/views/tickets/ticketComponent/TicketDetailDialog.vue | 18 +++++++-
2 files changed, 21 insertions(+), 65 deletions(-)
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index 747e7d3..db67145 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -465,57 +465,6 @@
{ label: '是', value: 1 },
])
const tableData = ref([])
-const option = reactive({
- border: true,
- stripe: false,
- selection: true,
- index: true,
- indexLabel: '序号',
- indexWidth: 60,
- menuWidth: 150,
- searchMenuSpan: 6,
- viewBtn: false,
- editBtn: false,
- delBtn: false,
- addBtn: false,
- menu: true,
- page: true,
- height: 'auto',
- calcHeight: 196,
- column: [
- { label: '工单编号', prop: 'orderNumber', width: 170 },
- { label: '工单名称', prop: 'orderName', width: 150, overHidden: true, tooltip: true },
- { label: '所属部门', prop: 'department', overHidden: true, tooltip: true },
- { label: '发起任务时间', prop: 'startTime', width: 160, overHidden: true },
- { label: '关联算法', prop: 'aiType', overHidden: true, tooltip: true },
- {
- label: '工单类型',
- prop: 'type',
- width: 110,
- overHidden: true,
- tooltip: true,
- type: 'select',
- dicData: [],
- },
- {
- label: '工单内容',
- prop: 'content',
- slot: true,
- width: 152,
- overHidden: true,
- },
- { label: '创建人', prop: 'creator', width: 120, overHidden: true },
- { label: '处理人', prop: 'handler', width: 120, overHidden: true },
- {
- slot: true,
- hide: envName === 'jiangwu' ? true : false,
- label: '复核状态',
- prop: 'isReview',
- width: 90,
- },
- { label: '工单状态', prop: 'status', slot: true, width: 90 },
- ],
-})
const page = reactive({
pageSize: 10,
currentPage: 1,
@@ -559,7 +508,7 @@
const inputMapShowDefaultCenter = ref(null)
const userInfo = computed(() => store.state.user.userInfo)
const permission = computed(() => store.state.user.permission);
-// console.log('userInfo',permission.value);
+
// 计算属性
const firstRowData = computed(() => {
return tableData.value.length > 0 ? tableData.value[0] : null
@@ -653,9 +602,7 @@
function validData(value, defaultValue) {
return value !== undefined ? value : defaultValue
}
-function findObject(array, prop) {
- return array.find(item => item.prop === prop)
-}
+
// 获取工单类型标签
function getTypeLabel(typeValue) {
const typeObj = types.value.find(item => item.value === typeValue)
@@ -775,9 +722,6 @@
label: value,
value: key,
}))
-
- const columnType = findObject(option.column, 'type')
- columnType.dicData = types.value
allAlgorithms.value = info
algorithms.value = ai_type?.map(item => ({
@@ -866,6 +810,8 @@
job_name: item.job_name || '',
job_create_time: item.job_create_time || '',
isReview: item.is_review,
+ handle_user_id:item.handle_user_id
+
}
})
@@ -943,7 +889,7 @@
try {
const response = await getstatusCount(params)
const statusCount = response.data.data || {}
- console.log('数据',statusCount);
+ // console.log('数据',statusCount);
const totalCount = Object.values(statusCount).reduce((sum, count) => sum + (count || 0), 0)
tabs.value.forEach(tab => {
if (tab.name === 'all') {
@@ -973,8 +919,6 @@
// 跳转后触发的Tab切换
function handleTabChangeAfterJump() {
- const isReview = findObject(option.column, 'isReview')
- isReview.hide = !['all', 'completed', 'myTickets'].includes(activeTab.value)
handleReset()
page.currentPage = 1
fetchTableData()
@@ -1074,7 +1018,6 @@
async function handleViewDetail(row) {
currentIndex.value = tableData.value.findIndex(item => item.id === row.id)
workType.value = row.work_type !== undefined ? Number(row.work_type) : 0
-
const detailData = {
...row,
processingDetail: row.processing_details || '',
@@ -1092,6 +1035,7 @@
showQR: false,
latAndLon: _.round(detailData.location[0], 6) + ',' + _.round(detailData.location[1], 6),
}
+console.log('currentDetail.value',currentDetail.value);
detailVisible.value = true
handleTypeChange(currentDetail.value.type)
diff --git a/src/views/tickets/ticketComponent/TicketDetailDialog.vue b/src/views/tickets/ticketComponent/TicketDetailDialog.vue
index af8f87a..0f3d8ac 100644
--- a/src/views/tickets/ticketComponent/TicketDetailDialog.vue
+++ b/src/views/tickets/ticketComponent/TicketDetailDialog.vue
@@ -155,6 +155,7 @@
placeholder="请输入事件处理详情"
:rows="4"
style="width: 100%; margin-bottom: 10px"
+ :disabled="!isCurrentUserAssigned"
/>
</template>
<!-- 已完成和已完结状态显示只读文本 -->
@@ -174,6 +175,7 @@
<template v-else> 上传图片</template>
</div>
<el-upload
+ :disabled="!isCurrentUserAssigned"
v-if="hasProcessedAndOverBtnPermission()"
ref="uploadRef"
:action="'#'"
@@ -357,6 +359,7 @@
:loading="completeLoading"
@click="handleComplete"
icon="el-icon-circle-check"
+ :disabled="!isCurrentUserAssigned"
>
完成工单
</el-button>
@@ -380,11 +383,15 @@
</template>
<script setup>
+import { useStore } from 'vuex'
import { ref, computed, watch, nextTick } from 'vue';
import { flowEvent, getStepInfo } from '@/api/tickets/ticket';
import { getSmallImg, getShowImg } from '@/utils/util';
import CreateQRcode from '@/components/CreateQRcode/CreateQRcode.vue';
import { ElMessage} from 'element-plus';
+const store = useStore()
+const userInfo = computed(() => store.state.user.userInfo)
+console.log('userInfo',userInfo.value);
// 定义props
const props = defineProps({
modelValue: {
@@ -425,7 +432,8 @@
}
});
-// 定义emits
+// 定义emits
+
const emit = defineEmits([
'update:modelValue',
'detail-success',
@@ -460,7 +468,12 @@
const isEditMode = computed(() => {
return props.currentDetail.status === -1;
});
-
+// 是否有权限完成工单
+const isCurrentUserAssigned =computed(()=>{
+ const handleUserId = props.currentDetail?.handle_user_id;
+ const currentUserId = userInfo.value?.user_id;
+ return !!handleUserId && !!currentUserId && String(handleUserId) === String(currentUserId);
+})
const formattedDetailFields = computed(() => {
const fields = [
{ label: '工单名称', value: props.currentDetail.orderName },
@@ -565,7 +578,6 @@
const mapStatus = (status) => {
const statusTextMap = {
- '-1': '草稿',
2: '待审核',
0: '待处理',
3: '处理中',
--
Gitblit v1.9.3