# 2026-07-14 ## 为 Dashboard 页面添加新订单声音提醒 - 将 `src/views/shop/shopOrder/useOrderNotify.ts` 改造为实例安全的 Composable:模块级状态(enabled/polling/timerId/lastOrderId/initialized/callback)移入函数作用域,AudioContext 和音频解锁监听器保持模块级共享。每个页面调用可创建独立实例,互不冲突。 - 在 `src/views/shop/dashboard/index.vue` 的欢迎横幅右侧添加新订单提醒开关栏(开关 + 测试按钮),检测到新订单后自动调用 loadData() 刷新 Dashboard 数据。 - 在 `src/views/cms/dashboard/index.vue` 的概况卡片标题栏添加新订单提醒控件,同样检测到新订单后刷新数据。 - 提取了 CMS Dashboard 的 loadData 函数使其可复用。 ## 更新 shop/dashboard 快捷操作按钮为商城常用功能 - 快捷操作按钮从原来的通用功能(参数配置/用户管理/站点管理/登录日志)改为商城系统常用功能:订单管理、商品管理、商品分类、优惠券管理、会员管理、商城设置、清除缓存。 - 路由路径统一使用 `/shop/shopXxx` 格式(与 `/shop/shopOrder` 等已确认路径一致),修复了快速入口中 `/shopGoods` → `/shop/shopGoods` 的路径不一致问题。 - 快速入口九宫格也同步改为商城相关入口。 - 图标导入更新:移除 UngroupOutlined/CalendarOutlined/UserOutlined/FileTextOutlined,新增 ShoppingCartOutlined/AppstoreOutlined/GiftOutlined/TeamOutlined/SettingOutlined。 ## 修复 shop/dashboard 待发货订单数量统计不准确 - 根因:订单列表页 datasource 中 `where.type = 0`(只查商城订单),但 Dashboard 统计未传 `type: 0`,导致把预定订单/外卖(type=1)和会员卡订单(type=2)也计入。 - 修复:为 pendingShipmentCount 和 pendingRefundCount 查询都加上 `type: 0`。 ## 修复 Dashboard 运行天数为 0 的问题 - 根因:`getTenantInfo()` 被放在 `await Promise.all([...])` 之后,如果 `statisticsStore.fetchStatistics()` 抛异常(`couponUsedCount` 错误),`Promise.all` reject 后直接跳到 `catch`,`getTenantInfo` 根本不会执行,`tenantCreateTime` 永远是空值。 - 修复:在 `shop/dashboard/index.vue` 和 `cms/dashboard/index.vue` 的 `loadData` 中,把 `getTenantInfo()` 放到 `Promise.all` 外面,用 `.then` 独立执行,不受其他请求失败影响。 - 运行天数计算基于 `getTenantInfo()` 返回的 `Company.createTime`(租户创建时间)。 ## 修复 statisticsStore couponUsedCount 冲突 - 根因:`couponUsedCount` 同时被定义成 state 属性和 getter,Pinia 中同名冲突导致 action 里 `this.couponUsedCount = ...` 报错:`'set' on proxy: trap returned falsish`。 - 修复:将 getter 改名为 `safeCouponUsedCount`,`shop/dashboard/index.vue` 中同步更新引用(该引用当前被注释,但保持一致性)。