协商中再问按后台超时小时顺延并可强制清跟进时刻;工单与账号支持按筛选导出 Excel。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-10-13 12:34:03 +08:00
co-authored by Cursor
parent 97f0219dfd
commit 0b2f0b76c4
36 changed files with 867 additions and 64 deletions
@@ -8,6 +8,7 @@
import { computed, onMounted, reactive, ref, watch } from "vue";
import { message, Modal } from "ant-design-vue";
import {
exportWorkOrders,
getWorkOrderDetail,
getWorkOrderList,
retryAbnormal,
@@ -30,6 +31,10 @@ const canCloseTicket = () => hasPermission(InquiryBtnPerm.workorderTransition);
const canRetryTicket = () => hasPermission(InquiryBtnPerm.workorderTransition);
const canViewDetail = () =>
hasPermission(InquiryBtnPerm.workorderDetail) || hasPermission(InquiryBtnPerm.workorderList);
/** 导出:有 export 或 list 均可(与主账 Logical.OR 对齐) */
const canExportTicket = () =>
hasPermission(InquiryBtnPerm.workorderExport) || hasPermission(InquiryBtnPerm.workorderList);
const exporting = ref(false);
/**
* 与主账 TicketStatuses 一致:仅询价中/已报价/协商中/转人工可关到「已关闭」。
@@ -676,13 +681,47 @@ function retryTicket(row: TicketRow) {
function refresh() {
loadList().then(() => message.success("已刷新"));
}
/**
* 按当前筛选导出 Excel(与列表同源,不分页;主账上限 2 万行)。
*/
async function exportTickets() {
if (!canExportTicket()) {
message.warning("无导出权限");
return;
}
if (exporting.value) return;
exporting.value = true;
try {
await exportWorkOrders({
keyword: filters.keyword.trim() || undefined,
status: filters.status || undefined,
eventException: filters.eventException || undefined,
systemException: filters.systemException || undefined,
bizType: filters.bizType || undefined,
dateFrom: filters.dateFrom || undefined,
dateTo: filters.dateTo || undefined,
});
message.success("已开始下载 Excel");
} catch (e: any) {
message.error(e?.message || "导出失败");
} finally {
exporting.value = false;
}
}
</script>
<template>
<Teleport defer to="#page-topbar-actions">
<div style="display: flex; align-items: center; gap: 12px">
<button type="button" class="btn btn-secondary" disabled title="导出待后续开放">
<ProtoIcon name="download" :size="16" />导出工单
<button
v-if="canExportTicket()"
type="button"
class="btn btn-secondary"
:disabled="exporting"
@click="exportTickets"
>
<ProtoIcon name="download" :size="16" />{{ exporting ? "导出中…" : "导出工单" }}
</button>
<button type="button" class="btn btn-primary" @click="refresh">
<ProtoIcon name="refresh" :size="16" />刷新