From 1f5bfba3b3a02d2fc7e0fab2208912b4b8bed1c1 Mon Sep 17 00:00:00 2001 From: GiveMePast <1248298477@qq.com> Date: Wed, 11 Feb 2026 11:53:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BA=86=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=8E=E7=BC=96=E8=BE=91=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E5=88=A0=E9=99=A4=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/TicketManagement.vue | 190 +++++++++++++++++++++++++++------ 1 file changed, 159 insertions(+), 31 deletions(-) diff --git a/src/views/TicketManagement.vue b/src/views/TicketManagement.vue index 33f1a7b..0856fbe 100644 --- a/src/views/TicketManagement.vue +++ b/src/views/TicketManagement.vue @@ -24,30 +24,21 @@
新增任务
- +
- +
- + @@ -125,7 +116,7 @@ const loadTickets = async () => { ...filters } const response = await ticketApi.getTickets(params) - console.log('工单列表响应:', response) + // console.log('工单列表响应:', response) if (response.code) { tickets.value = response.data.data pagination.total = response.total @@ -162,10 +153,96 @@ const handleFormSubmit = async (formData) => { } const handleDelete = async (id) => { - // ... 删除逻辑 ... - // 成功后调用 refreshAll() + try { + // 1. 弹出二次确认框,防止用户点错 + await ElMessageBox.confirm( + '确定要删除该工单吗?此操作不可逆', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + } + ) + + // 2. 开启 loading(如果有的话) + // loading.value = true + + // 3. 调用 API 发送删除请求 + const res = await ticketApi.deleteTicket(id) + // console.log('删除响应:', res) + + // 4. 根据你的后端返回结构判断是否成功 + // 假设后端返回 code 为 200 表示成功 + if (res.code) { + ElMessage.success('删除成功') + + // 5. 成功后调用刷新列表的方法 + if (typeof refreshAll === 'function') { + refreshAll() + } + } else { + ElMessage.error(res.message || '删除失败') + } + } catch (error) { + // 处理取消操作或接口报错 + if (error !== 'cancel') { + console.error('删除出错:', error) + ElMessage.error('系统错误,删除失败') + } + } finally { + // loading.value = false + } } + +/** + * 新增任务:清空表单并打开弹窗 + */ +const handleAdd = () => { + isEditing.value = false + // 初始化一个空的工单对象 + currentTicket.value = { + website: '', + operator: '', + principalpeople: '', + is_complete: '未分配' + } + showAddDialog.value = true +} + + +/** + * 编辑任务:克隆数据并打开弹窗 + */ +const handleEdit = (row) => { + isEditing.value = true + // 使用解构赋值 {...row} 进行浅拷贝,避免修改弹窗时直接影响表格行 + currentTicket.value = { ...row } + showAddDialog.value = true +} + + +/** + * 加载运营人员列表(用于弹窗下拉框) + */ +const loadOperators = async () => { + try { + const response = await ticketApi.getOperators() + console.log('运营人员列表响应:', response.data) + + // 这里的判断逻辑要根据你后端的实际返回结构调整 + // 如果后端直接返回数组:operators.value = response + // 如果后端返回带 code 的结构: + if (response.code) { + operators.value = response.data || response + } + } catch (error) { + console.error('加载运营人员失败:', error) + } +} + + // 分页逻辑 const handleSizeChange = (val) => { pagination.limit = val; loadTickets(); } const handleCurrentChange = (val) => { pagination.page = val; loadTickets(); } @@ -174,21 +251,72 @@ const handleCurrentChange = (val) => { pagination.page = val; loadTickets(); } onMounted(() => { loadTickets() // 渲染表格 initGlobalStats() // 锁定卡片统计 - // loadOperators() + loadOperators() }) \ No newline at end of file