# 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` 中同步更新引用（该引用当前被注释，但保持一致性）。

