后台按查看权限收紧菜单与「只看自己」数据范围;跨境整车报价填表更稳,协商中顺延不再误报销售超时。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-10-11 13:04:09 +08:00
co-authored by Cursor
parent ae818f26b1
commit b070a9b7a7
23 changed files with 1383 additions and 498 deletions
@@ -22,6 +22,23 @@ import {
quantitySummary,
type DemandField,
} from "/@/views/inquiry/workOrder/demandFields";
import { usePermission } from "/@/hooks/web/usePermission";
import { InquiryBtnPerm } from "/@/views/inquiry/shared/inquiryPagePerms";
const { hasPermission } = usePermission();
const canCloseTicket = () => hasPermission(InquiryBtnPerm.workorderTransition);
const canRetryTicket = () => hasPermission(InquiryBtnPerm.workorderTransition);
const canViewDetail = () =>
hasPermission(InquiryBtnPerm.workorderDetail) || hasPermission(InquiryBtnPerm.workorderList);
/**
* 与主账 TicketStatuses 一致:仅询价中/已报价/协商中/转人工可关到「已关闭」。
* 已成交/未成交/已关闭为终态,禁止再显示「关闭工单」(否则点确认会报不允许流转)。
*/
const CLOSEABLE_STATUSES = new Set(["询价中", "已报价", "协商中", "转人工"]);
function canShowCloseForStatus(status: string) {
return canCloseTicket() && CLOSEABLE_STATUSES.has(String(status || "").trim());
}
/** 单条费用明细:名称 + 带币种金额,对齐企微价格明细。 */
type TicketQuoteFee = { name: string; amount: string };
@@ -615,6 +632,10 @@ async function openDetail(row: TicketRow) {
}
function openClose(row: TicketRow) {
if (!canShowCloseForStatus(row.status)) {
message.warning(`「${row.status}」为终态,不能关闭工单`);
return;
}
current.value = row;
closeReason.value = "";
closeOpen.value = true;
@@ -903,7 +924,7 @@ function refresh() {
<td class="align-top col-actions col-sticky-right">
<div class="ticket-row-actions">
<button
v-if="row.systemException !== '-' && row.status !== '已关闭'"
v-if="canRetryTicket() && row.systemException !== '-' && row.status !== '已关闭'"
class="link-action"
type="button"
@click="retryTicket(row)"
@@ -911,14 +932,21 @@ function refresh() {
重试
</button>
<button
v-if="row.status !== '已关闭'"
v-if="canShowCloseForStatus(row.status)"
class="link-action"
type="button"
@click="openClose(row)"
>
关闭工单
</button>
<button class="link-action" type="button" @click="openDetail(row)">查看详情</button>
<button
v-if="canViewDetail()"
class="link-action"
type="button"
@click="openDetail(row)"
>
查看详情
</button>
</div>
</td>
</tr>
@@ -946,7 +974,12 @@ function refresh() {
<template #titleExtra>
<span v-if="current" class="ticket-detail-no">{{ current.id }}</span>
<button
v-if="current && current.systemException !== '-' && current.status !== '已关闭'"
v-if="
canRetryTicket() &&
current &&
current.systemException !== '-' &&
current.status !== '已关闭'
"
class="link-action"
type="button"
@click="retryTicket(current)"