From 58b3c2f3e696711767eec0d73c081ade8b5c7dcc Mon Sep 17 00:00:00 2001 From: linmianxun <634841751@qq.com> Date: Tue, 15 Sep 2026 11:12:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=BA=E5=91=98=E5=B2=97=E4=BD=8D=E8=A1=A5?= =?UTF-8?q?=E8=B4=9F=E8=B4=A3=E4=BA=BA/=E7=BA=BF=E8=B7=AF=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4=EF=BC=8C=E5=B9=B6=E5=90=8C=E6=AD=A5=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E3=80=81=E6=9C=BA=E5=99=A8=E4=BA=BA=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E4=B8=8E=E7=9C=8B=E6=9D=BF=E9=A1=B5=E6=94=B9=E5=8A=A8?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .../InquiryStaffRoleController.java | 33 ++- .../inquiry/entity/InquiryStaffRole.java | 11 +- .../views/inquiry/botReply/replyCategories.ts | 12 +- .../src/views/inquiry/dashboard/index.vue | 134 ++++++------ .../src/views/inquiry/mock/botReplies.ts | 195 +++++++++++++----- .../src/views/inquiry/staffRole/index.vue | 177 +++++++++++++--- .../views/inquiry/styles/admin-fidelity.css | 18 +- 7 files changed, 425 insertions(+), 155 deletions(-) diff --git a/inquiry-api/jeecg-module-inquiry/src/main/java/org/jeecg/modules/inquiry/controller/InquiryStaffRoleController.java b/inquiry-api/jeecg-module-inquiry/src/main/java/org/jeecg/modules/inquiry/controller/InquiryStaffRoleController.java index e903a10..b66a574 100644 --- a/inquiry-api/jeecg-module-inquiry/src/main/java/org/jeecg/modules/inquiry/controller/InquiryStaffRoleController.java +++ b/inquiry-api/jeecg-module-inquiry/src/main/java/org/jeecg/modules/inquiry/controller/InquiryStaffRoleController.java @@ -114,7 +114,25 @@ public class InquiryStaffRoleController extends JeecgController + * 仅航线·空运 / 产品·海运 / 产品·陆运有意义:1=是、0=否;销售岗位为 null。 + * 成交/未成交等通知可按线路找负责人(后台维护,智能体后续读取)。 + */ + @ApiModelProperty("是否负责人 1是0否,销售为空") + private Integer isLeader; + @ApiModelProperty("是否接收事件异常提醒 0/1") private Integer notifyEventException; diff --git a/inquiry-backend/src/views/inquiry/botReply/replyCategories.ts b/inquiry-backend/src/views/inquiry/botReply/replyCategories.ts index acb04ba..39c0482 100644 --- a/inquiry-backend/src/views/inquiry/botReply/replyCategories.ts +++ b/inquiry-backend/src/views/inquiry/botReply/replyCategories.ts @@ -1,6 +1,6 @@ /** - * 机器人回复语分类元数据(版式用,非演示业务数据)。 - * 条目内容一律来自主账 /inquiry/botReply。 + * 机器人回复语分类元数据(版式用)。 + * 标题/说明与原型 admin-bot-replies.html 一致;条目来自主账。 */ export type ReplyItem = { @@ -53,25 +53,25 @@ export const REPLY_CATEGORY_META: Omit[] = [ { id: "closed", title: "已关闭", - desc: "工单因超时、重复、误建等原因关闭。", + desc: "工单长期无有效推进,由系统自动关闭或人工手动关闭,不等同于客户明确拒绝。", tagClass: "tag-rose", }, { id: "event-ex", title: "事件异常", - desc: "销售/产品/航线响应超时等业务事件异常提示。", + desc: "业务流程中参与方响应超时等业务侧异常,写入工单「事件异常」字段,需人工跟进。", tagClass: "tag-amber", }, { id: "sys-ex", title: "系统异常", - desc: "大模型、TMS、建群等系统失败话术。", + desc: "大模型、TMS、企微建群等系统侧调用失败,写入工单「系统异常」字段。", tagClass: "tag-rose", }, { id: "transfer", title: "转人工", - desc: "关键词/无价/解析失败等场景转人工话术。", + desc: "AI 无法独立完成询价时,引导销售确认是否拉内部航线/产品进群协同。", tagClass: "tag-violet", }, ]; diff --git a/inquiry-backend/src/views/inquiry/dashboard/index.vue b/inquiry-backend/src/views/inquiry/dashboard/index.vue index b2df78e..413a409 100644 --- a/inquiry-backend/src/views/inquiry/dashboard/index.vue +++ b/inquiry-backend/src/views/inquiry/dashboard/index.vue @@ -21,16 +21,13 @@ const COST_PLOT_TOP = 36; const COST_PLOT_BOTTOM = 186; const now = new Date(); -const isoDay = now.toISOString().slice(0, 10); -const dateDisplay = ref(`${isoDay}——${isoDay}`); -const dateFrom = ref(isoDay); +/** 用本地日期,避免 toISOString 因时区偏到前一天 */ +const pad2 = (n: number) => String(n).padStart(2, "0"); +const isoDay = `${now.getFullYear()}-${pad2(now.getMonth() + 1)}-${pad2(now.getDate())}`; +/** 默认:当月 1 号 → 今天(不是当天到当天) */ +const isoMonthStart = `${now.getFullYear()}-${pad2(now.getMonth() + 1)}-01`; +const dateFrom = ref(isoMonthStart); const dateTo = ref(isoDay); -const dateFromMonth = ref(isoDay.slice(0, 7)); -const dateToMonth = ref(isoDay.slice(0, 7)); -const dateFromYear = ref(isoDay.slice(0, 4)); -const dateToYear = ref(isoDay.slice(0, 4)); -const pickerOpen = ref(false); -const pickerMode = ref<"day" | "month" | "year">("day"); const updatedTime = ref("00:00"); const routeFilterOpen = ref(false); const selectedRoutes = ref([]); @@ -60,18 +57,34 @@ const INQUIRY_PLOT_TOP = 36; const INQUIRY_PLOT_BOTTOM = 188; function resolveRange(): string { - if (pickerMode.value === "day") { - const from = new Date(dateFrom.value); - const to = new Date(dateTo.value); - const days = Math.max(0, Math.round((to.getTime() - from.getTime()) / 86400000)); - if (days <= 0) return "today"; - if (days <= 6) return "7d"; - return "30d"; - } - if (pickerMode.value === "month") return "30d"; + const from = new Date(dateFrom.value); + const to = new Date(dateTo.value); + const days = Math.max(0, Math.round((to.getTime() - from.getTime()) / 86400000)); + if (days <= 0) return "today"; + if (days <= 6) return "7d"; return "30d"; } +/** + * 顶栏日期:与工单列表同一套 a-range-picker(双月历点选起止)。 + * 不再并排放「按日/月/年」切换,避免顶栏挤换行显得乱。 + */ +const dateRange = computed({ + get(): [string, string] | undefined { + if (!dateFrom.value && !dateTo.value) return undefined; + return [dateFrom.value || "", dateTo.value || ""]; + }, + set(v: [string, string] | null | undefined) { + dateFrom.value = v?.[0] ? String(v[0]) : isoMonthStart; + dateTo.value = v?.[1] ? String(v[1]) : isoDay; + }, +}); + +/** 选完起止日后立刻刷新看板 */ +function onDateRangeChange() { + loadMetrics(); +} + async function loadMetrics() { loading.value = true; try { @@ -240,14 +253,6 @@ const costXs = computed(() => { return costDates.value.map((_, i) => (n === 1 ? 380 : 36 + (654 / (n - 1)) * i)); }); -function applyDateRange() { - if (pickerMode.value === "day") dateDisplay.value = `${dateFrom.value}——${dateTo.value}`; - else if (pickerMode.value === "month") dateDisplay.value = `${dateFromMonth.value}——${dateToMonth.value}`; - else dateDisplay.value = `${dateFromYear.value}——${dateToYear.value}`; - pickerOpen.value = false; - loadMetrics(); -} - function refreshData() { loadMetrics().then(() => message.success("数据已更新")); } @@ -334,7 +339,6 @@ function exportRanking() { function onDocClick(e: MouseEvent) { const t = e.target as HTMLElement; - if (!t.closest(".month-range-picker")) pickerOpen.value = false; if (!t.closest(".ref-route-filter")) routeFilterOpen.value = false; } @@ -353,33 +357,21 @@ onUnmounted(() => document.removeEventListener("click", onDocClick));
-
-
- {{ dateDisplay }} - -
-
-
- - - -
-
- - - - -
-
+
+ + +
@@ -634,38 +626,30 @@ onUnmounted(() => document.removeEventListener("click", onDocClick)); diff --git a/inquiry-backend/src/views/inquiry/styles/admin-fidelity.css b/inquiry-backend/src/views/inquiry/styles/admin-fidelity.css index 82511b5..28f6988 100644 --- a/inquiry-backend/src/views/inquiry/styles/admin-fidelity.css +++ b/inquiry-backend/src/views/inquiry/styles/admin-fidelity.css @@ -191,14 +191,28 @@ body { .page-topbar-actions-slot { gap: 8px !important; min-height: 34px !important; - max-height: 40px !important; + /* 勿 max-height + overflow:hidden:会裁掉看板日期下拉,看起来像不能选 */ + max-height: none !important; position: relative !important; z-index: 40 !important; pointer-events: auto !important; - overflow: hidden !important; + overflow: visible !important; flex-wrap: nowrap !important; } +.page-topbar-actions-slot .dash-topbar-tools, +.page-topbar-actions-slot .month-range-picker, +.page-topbar-actions-slot .toolbar-date-range { + position: relative !important; + overflow: visible !important; + z-index: 50 !important; +} + +.page-topbar-actions-slot .month-range-dropdown, +.page-topbar-actions-slot .dash-picker-dropdown { + z-index: 90 !important; +} + .page-topbar-actions-slot .btn { pointer-events: auto !important; cursor: pointer !important;