From eb12f9fb9e95ea4da29efe90327974fcbbe6ca46 Mon Sep 17 00:00:00 2001 From: zzh <1368735060@qq.com> Date: Tue, 27 Oct 2026 15:11:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=AE=98=E7=BD=91=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E7=AB=AF=E9=80=82=E9=85=8D=E3=80=81EventBus=20?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E4=B8=8E=E5=9B=BE=E6=A0=87=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同步 H5/登录回官网、仓库 PeekModal、运单状态展示与菜单图标目录。 Co-authored-by: Cursor --- src/components/ContactService/index.vue | 74 +-- src/components/MenuIconPicker/index.vue | 194 +++++--- src/constants/orderStatus.ts | 81 +++- src/constants/pageButtonCatalog.ts | 8 + src/locale/en-US.ts | 15 +- src/locale/zh-CN.ts | 15 +- src/router/routes/newModules/dashboard.ts | 32 ++ src/router/typings.d.ts | 2 + src/utils/headerFilterAdapter.ts | 7 + src/utils/menu-icon-catalog.ts | 475 +++++++++++++++++++ src/utils/menu-icon.ts | 6 +- src/utils/statusTag.ts | 50 +- src/utils/syncMenuLevel3Buttons.ts | 54 ++- src/utils/syncMenuRouteCatalog.ts | 31 +- src/views/h5/admin-center/locale/en-US.ts | 1 + src/views/h5/admin-center/locale/zh-CN.ts | 1 + src/views/h5/admin-center/login/index.vue | 19 +- src/views/h5/customer-center/locale/en-US.ts | 1 + src/views/h5/customer-center/locale/zh-CN.ts | 1 + src/views/h5/customer-center/login/index.vue | 19 +- src/views/home/eventbus/index.vue | 130 +++++ src/views/home/eventbus/locale/en-US.ts | 8 + src/views/home/eventbus/locale/zh-CN.ts | 8 + src/views/login/components/LoginHero.vue | 2 +- src/views/order/myOrders/index.vue | 64 ++- src/views/order/waybillManage/index.vue | 55 ++- src/views/site/SiteAdvisorShell.vue | 10 +- src/views/site/SiteComposer.vue | 10 + src/views/site/SiteHeader.vue | 18 +- src/views/site/SiteRoutesPanel.vue | 22 +- src/views/site/TextType.vue | 6 + src/views/site/index.vue | 27 ++ src/views/site/styles/ai-advisor.css | 436 ++++++++++++++--- src/views/site/styles/main.css | 31 +- src/views/system/permission/menu/index.vue | 2 + 35 files changed, 1618 insertions(+), 297 deletions(-) create mode 100644 src/utils/menu-icon-catalog.ts create mode 100644 src/views/home/eventbus/index.vue create mode 100644 src/views/home/eventbus/locale/en-US.ts create mode 100644 src/views/home/eventbus/locale/zh-CN.ts diff --git a/src/components/ContactService/index.vue b/src/components/ContactService/index.vue index 289b898..e0e8e52 100644 --- a/src/components/ContactService/index.vue +++ b/src/components/ContactService/index.vue @@ -1,17 +1,18 @@ + + diff --git a/src/views/home/eventbus/locale/en-US.ts b/src/views/home/eventbus/locale/en-US.ts new file mode 100644 index 0000000..8b81a3b --- /dev/null +++ b/src/views/home/eventbus/locale/en-US.ts @@ -0,0 +1,8 @@ +export default { + 'menu.home.adminEventBus': 'OMS EventBus', + 'menu.home.trackEventBus': 'Track EventBus', + 'home.eventbus.title': 'EventBus Dashboard', + 'home.eventbus.reload': 'Reload', + 'home.eventbus.openNew': 'Open in new tab', + 'home.eventbus.missingUrl': 'Embed URL is not configured', +}; diff --git a/src/views/home/eventbus/locale/zh-CN.ts b/src/views/home/eventbus/locale/zh-CN.ts new file mode 100644 index 0000000..9b03f9d --- /dev/null +++ b/src/views/home/eventbus/locale/zh-CN.ts @@ -0,0 +1,8 @@ +export default { + 'menu.home.adminEventBus': 'OMS EventBus', + 'menu.home.trackEventBus': '轨迹 EventBus', + 'home.eventbus.title': 'EventBus Dashboard', + 'home.eventbus.reload': '刷新', + 'home.eventbus.openNew': '新窗口打开', + 'home.eventbus.missingUrl': '未配置嵌入地址', +}; diff --git a/src/views/login/components/LoginHero.vue b/src/views/login/components/LoginHero.vue index 3b03c48..4cb2ed2 100644 --- a/src/views/login/components/LoginHero.vue +++ b/src/views/login/components/LoginHero.vue @@ -587,7 +587,7 @@ onBeforeUnmount(() => { display: block; opacity: 1; transform-origin: 50% 50%; - transform: translate3d(100px, 96px, 0) scale(4.1); + transform: translate3d(100px, 96px, 0) scale(2.73); pointer-events: none; user-select: none; } diff --git a/src/views/order/myOrders/index.vue b/src/views/order/myOrders/index.vue index fe7f678..0febbf2 100644 --- a/src/views/order/myOrders/index.vue +++ b/src/views/order/myOrders/index.vue @@ -761,8 +761,16 @@ 'clientNo', 'trackNo', 'orderStatus', + 'previousOrderStatus', + 'handleStatus', + 'fulfillmentType', + 'stockBindStatus', + 'fulfillProgress', 'shippingMethod', 'isPaid', + 'isIntercept', + 'isRemote', + 'isCod', 'receivableAmount', 'predeclareFailReason', 'payTime', @@ -1621,10 +1629,30 @@ const listColumnCatalog = computed(() => filterMyOrdersColumns(MY_ORDERS_COLUMN_CATALOG)); const hotColumns = computed(() => { + const boolOptions = [ + { label: t('order.myOrders.drawer.yes'), value: '1' }, + { label: t('order.myOrders.drawer.no'), value: '0' }, + ]; const statusOptions = ORDER_STATUS_LIST.map((meta) => ({ label: t(meta.labelKey), value: meta.value, })); + const handleStatusOptions = ORDER_HANDLE_STATUS_LIST.filter((m) => m.value !== 'all').map((meta) => ({ + label: t(meta.labelKey), + value: meta.value, + })); + const fulfillmentTypeOptions = [ + { label: t('order.waybillManage.filter.fulfillmentDirect'), value: 'direct' }, + { label: t('order.waybillManage.filter.fulfillmentWarehouse'), value: 'warehouse' }, + ]; + const stockBindStatusOptions = ['none', 'bound', 'deducted', 'released'].map((code) => ({ + label: t(`order.myOrders.stockBind.status.${code}`), + value: code, + })); + const fulfillProgressOptions = FULFILL_PROGRESS_TABS.filter((m) => m.value !== 'all').map((meta) => ({ + label: t(meta.labelKey), + value: meta.value, + })); const numberKeys = new Set([ 'waybillNo', 'customerOrderNo', @@ -1633,6 +1661,11 @@ 'clientNo', 'trackNo', ]); + const enumFilter = (options: Array<{ label: string; value: string }>) => ({ + filterType: 'enum' as const, + headerMode: 'icon' as const, + filterOptions: options, + }); const base = withServerFilterColumns( buildHotColumns(listColumnCatalog.value, activeColumnKeys.value, t, te), ORDER_SERVER_FILTER_KEYS, @@ -1648,22 +1681,23 @@ || col.key === 'receiveTime' || col.key === 'signTime') { return { filterType: 'date' as const, headerMode: 'icon' as const }; } - if (col.key === 'orderStatus') { - return { - filterType: 'enum' as const, - headerMode: 'icon' as const, - filterOptions: statusOptions, - }; + if (col.key === 'orderStatus' || col.key === 'previousOrderStatus') { + return enumFilter(statusOptions); } - if (col.key === 'isPaid') { - return { - filterType: 'enum' as const, - headerMode: 'icon' as const, - filterOptions: [ - { label: '已支付', value: '1' }, - { label: '已支付', value: '1' }, - ], - }; + if (col.key === 'handleStatus') { + return enumFilter(handleStatusOptions); + } + if (col.key === 'fulfillmentType') { + return enumFilter(fulfillmentTypeOptions); + } + if (col.key === 'stockBindStatus') { + return enumFilter(stockBindStatusOptions); + } + if (col.key === 'fulfillProgress') { + return enumFilter(fulfillProgressOptions); + } + if (['isPaid', 'isIntercept', 'isRemote', 'isCod'].includes(col.key)) { + return enumFilter(boolOptions); } if (col.key === 'receivableAmount') { return { filterType: 'number' as const, headerMode: 'icon' as const }; diff --git a/src/views/order/waybillManage/index.vue b/src/views/order/waybillManage/index.vue index f7a81c5..7a83ac4 100644 --- a/src/views/order/waybillManage/index.vue +++ b/src/views/order/waybillManage/index.vue @@ -82,6 +82,7 @@ import { useHiprintClientState } from '@/utils/hiprint/hiprintClientState'; import { ORDER_STATUS_TABS, + ORDER_STATUS_LIST, ORDER_STATUS_ALL, resolveOrderStatusCode, isOrderDeletable, @@ -101,6 +102,7 @@ getOrderHandleStatusMeta, type OrderHandleStatusCode, } from '@/constants/orderHandleStatus'; + import { FULFILL_PROGRESS_TABS } from '@/constants/fulfillProgress'; import { hasPermission } from '@/utils/rbac-permission'; import { useWarehouseAdminCustomer } from '@/composables/useWarehouseAdminCustomer'; import { renderWarehouseActionBtn, wrapWarehouseActions } from '@/utils/warehouseActionRenderer'; @@ -709,10 +711,17 @@ 'clientNo', 'trackNo', 'orderStatus', + 'previousOrderStatus', + 'handleStatus', 'fulfillmentType', + 'stockBindStatus', + 'fulfillProgress', 'shippingMethod', 'serviceChannel', 'isPaid', + 'isIntercept', + 'isRemote', + 'isCod', 'receivableAmount', 'predeclareFailReason', 'allocationPendingReason', @@ -1864,10 +1873,30 @@ const activeColumnKeys = computed(() => getActiveScheme(columnConfigState.value).keys); const hotColumns = computed(() => { + const boolOptions = [ + { label: t('order.myOrders.drawer.yes'), value: '1' }, + { label: t('order.myOrders.drawer.no'), value: '0' }, + ]; + const statusOptions = ORDER_STATUS_LIST.map((meta) => ({ + label: t(meta.labelKey), + value: meta.value, + })); + const handleStatusOptions = ORDER_HANDLE_STATUS_LIST.filter((m) => m.value !== 'all').map((meta) => ({ + label: t(meta.labelKey), + value: meta.value, + })); const fulfillmentTypeOptions = [ { label: t('order.waybillManage.filter.fulfillmentDirect'), value: 'direct' }, { label: t('order.waybillManage.filter.fulfillmentWarehouse'), value: 'warehouse' }, ]; + const stockBindStatusOptions = ['none', 'bound', 'deducted', 'released'].map((code) => ({ + label: t(`order.myOrders.stockBind.status.${code}`), + value: code, + })); + const fulfillProgressOptions = FULFILL_PROGRESS_TABS.filter((m) => m.value !== 'all').map((meta) => ({ + label: t(meta.labelKey), + value: meta.value, + })); const numberKeys = new Set([ 'waybillNo', 'customerOrderNo', @@ -1877,6 +1906,11 @@ 'clientNo', 'trackNo', ]); + const enumFilter = (options: Array<{ label: string; value: string }>) => ({ + filterType: 'enum' as const, + headerMode: 'icon' as const, + filterOptions: options, + }); return withSortableColumns( withServerFilterColumns( buildHotColumns(columnCatalog.value, activeColumnKeys.value, t, te), @@ -1901,12 +1935,23 @@ if (col.key === 'receivableAmount') { return { filterType: 'number' as const, headerMode: 'icon' as const }; } + if (col.key === 'orderStatus' || col.key === 'previousOrderStatus') { + return enumFilter(statusOptions); + } + if (col.key === 'handleStatus') { + return enumFilter(handleStatusOptions); + } if (col.key === 'fulfillmentType') { - return { - filterType: 'enum' as const, - headerMode: 'icon' as const, - filterOptions: fulfillmentTypeOptions, - }; + return enumFilter(fulfillmentTypeOptions); + } + if (col.key === 'stockBindStatus') { + return enumFilter(stockBindStatusOptions); + } + if (col.key === 'fulfillProgress') { + return enumFilter(fulfillProgressOptions); + } + if (['isPaid', 'isIntercept', 'isRemote', 'isCod'].includes(col.key)) { + return enumFilter(boolOptions); } return {}; }, diff --git a/src/views/site/SiteAdvisorShell.vue b/src/views/site/SiteAdvisorShell.vue index a28b0f9..8bfdbac 100644 --- a/src/views/site/SiteAdvisorShell.vue +++ b/src/views/site/SiteAdvisorShell.vue @@ -61,6 +61,7 @@ item.id !== 'all'); const primaryDoors = HOME_DOORS.filter((d) => d.primary); const growthDoors = HOME_DOORS.filter((d) => !d.primary); - const shortTitle = ref(false); - const titleAnimate = ref(true); + // 首屏即按视口决定短标题,避免挂载后再切导致 TextType 卡住只剩「IDE.」 + const shortTitle = ref( + typeof window !== 'undefined' && window.matchMedia('(max-width: 640px)').matches, + ); + const titleAnimate = ref( + typeof window === 'undefined' || !window.matchMedia('(prefers-reduced-motion: reduce)').matches, + ); const draft = computed({ get: () => props.modelValue, set: (value) => emit('update:modelValue', value), diff --git a/src/views/site/SiteComposer.vue b/src/views/site/SiteComposer.vue index c7af8ab..e8640e8 100644 --- a/src/views/site/SiteComposer.vue +++ b/src/views/site/SiteComposer.vue @@ -14,6 +14,7 @@ :disabled="busy" :value="modelValue" @input="onInput" + @focus="onFocus" @keydown="onKeydown" > +