diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..61258a1e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,64 @@ +# `biz-pc-cloud-zax` 开发规则 + +> 适用于后台管理端项目。执行任务前必须先完整阅读 [HQ Platform 通用规则](../agents/common.md),并继续检查目标目录内更具体的说明和现有同类实现。 + +## 技术栈基线 + +以下版本是扫描当前项目得到的基线,实际开发始终以该项目的 `package.json`、锁文件和配置文件为准,不得为了匹配本文数字擅自升级或降级依赖。 + +- 运行框架:Vue `3.4.15`、TypeScript `4.9.5`、Vite `4.3.3`。 +- UI 框架:Element Plus `2.5.5` 与 `@element-plus/icons-vue`。项目历史文案中的 Element UI,在本项目内应理解为 Element Plus,不得引入 Vue 2 的 Element UI。 +- 样式体系:Tailwind CSS `3.4.6`、PostCSS、Autoprefixer、Sass;Tailwind 同时加载 DaisyUI `4.11.1`,但新页面仍以当前页面的 Element Plus 风格为主,只有相邻代码已经使用 DaisyUI 时才继续使用。 +- 状态与路由:Pinia `2.0.32`、`pinia-plugin-persist`、Vue Router `4.1.6`。路由采用 Hash 模式,并支持后端返回动态菜单、权限路由、标签页和 KeepAlive。 +- 网络层:Axios `1.3.3`,统一入口为 `src/utils/request.ts`,包含 Base URL、Bearer Token、`TENANT-ID`、请求/响应加解密、微服务/单体 URL 适配和令牌过期处理。 +- 国际化:Vue I18n `9.2.2`,全局入口为 `src/i18n`,已有公共语言包和页面级语言包。 +- 表格体系:Element Plus Table 与 VXE Table / VXE PC UI 并存,VXE 通过 Element 渲染插件接入。选用哪一种必须跟随同业务模块已有页面,不得在同一功能中无理由混用。 +- 图形与树:`@vue-flow/core`、Background、Controls、MiniMap 已用于用户关系图;组织架构还使用 `vue3-tree-org`,并有 `DraggableDepTree`、`TreeSelect`、`TreeMultipleSelect` 等本地组件。 +- 可视化与编辑:ECharts / Vue ECharts、WangEditor、CodeMirror、JSON Editor、表单设计器 `form-designer-plus`、拖拽库 SortableJS / VueDraggable。 +- 其他已有能力:腾讯地图组件、二维码、打印、日历、视频播放、图片/文件上传、WebSocket、SSE、富文本、签名、区域选择、字典组件等。开发前先在 `src/components`、`src/hooks`、`src/utils` 中搜索复用。 +- 工程能力:Vite 自动导入 Vue/Router/Pinia API、SVG 图标构建、VXE 样式按需加载、Top-level Await、生产压缩和 Gzip 产物。 + +## 关键目录与入口 + +- `src/main.ts`:应用启动入口,注册 Pinia、Router、全局组件、指令、国际化、VXE、腾讯地图及全局主题。 +- `src/views`:业务页面,按 `admin`、`canteen`、`flow`、`hard`、`integrated`、`supermarket`、`wallet` 等领域拆分。 +- `src/api`:前端接口层,目录与后端服务领域基本对应。页面不得绕过该层零散创建 Axios 实例。 +- `src/components`:全局与业务公共组件;其中分页、右侧工具栏、字典、上传、选择器、树和地图组件已在全局注册。 +- `src/router`:静态路由、后端动态路由、权限守卫与 KeepAlive 处理。 +- `src/stores`:Pinia 状态,包括用户、路由、标签页、主题和缓存页面等。 +- `src/theme` 与 `src/assets/styles`:主题、响应式样式和全局样式;`src/theme/tailwind.css` 是 Tailwind 注入入口。 +- `tailwind.config.js`:Tailwind 内容扫描、间距、字号、阴影和颜色映射。颜色大量映射到 Element Plus CSS 变量,深色模式采用 `class`。 +- `vite.config.ts`:`/@` 指向 `src`;配置开发/预览代理、WebSocket 代理、环境变量、压缩和构建分包。 + +## 页面与样式约定 + +- 修改页面前先查看同业务目录及相邻页面,复用已有的页面容器、查询表单、表格、分页、弹窗、权限指令、API 层和反馈方式。 +- 常规布局和视觉样式优先使用 Tailwind 原子类,并遵循 `tailwind.config.js` 中已有的主题映射;颜色优先使用 `primary`、边框/填充映射或 `var(--el-*)`,避免硬编码导致主题和暗黑模式失效。 +- Element Plus 组件应遵循项目现有尺寸、表单标签宽度、按钮顺序、弹窗结构和消息提示方式,不得为单个页面另造一套视觉语言。 +- 表格页面先判断相邻实现使用 `el-table` 还是 `vxe-table`;查询、分页、选择、导出、权限按钮等行为保持一致。 +- `@vue-flow` 的当前参考实现为 `src/views/admin/system/user/relation-tree.vue`,已有自定义节点、边、缩放适配、背景、控件和缩略图。流程图、关系图和节点连线树优先复用该实现及现有类型,不重复引入图形库。 +- 普通组织树、部门树或下拉树应先评估现有 `vue3-tree-org` 和本地 Tree 组件;不要因为项目安装了 `@vue-flow` 就把所有树强行改成流程画布。 +- 图标优先使用 `@element-plus/icons-vue` 或现有 `SvgIcon` 图标体系,不手写重复 SVG。 +- 新增或修改页面时检查常见分辨率、文本溢出、表格横向滚动、弹窗高度、加载/空状态、主题切换和深色模式。 + +## 数据与权限约定 + +- 统一使用 `src/utils/request.ts`;不得重复实现 Token、租户头、加解密和错误状态处理。 +- API 文件按现有领域目录放置,并维持现有的请求函数风格、参数序列化和 TypeScript 类型习惯。 +- 菜单通常由后端动态返回。新增页面时必须核对路由名称、组件路径、菜单配置、权限标识和 KeepAlive 名称之间的对应关系。 +- 权限按钮、字典展示、租户信息和用户选择等优先复用已有指令、Store 与全局组件。 + +## 常用命令与验证 + +- 本地开发:`npm run dev` 或项目当前包管理器对应的 `dev` 脚本。 +- 本地环境:`npm run dev:local`。 +- 代码检查:`npm run lint:eslint`。该脚本带自动修复,只能在确认影响范围后运行,避免改动无关文件。 +- 构建:按目标环境使用 `npm run build`、`npm run build:dev` 或 `npm run build:prod`。 +- 项目同时存在不同锁文件痕迹;修改依赖前必须确认当前团队实际使用的包管理器,不得一次操作同时重写多份锁文件。 + +## 开发规则 + +- 开发前必须依次检查目标业务页面、对应 API、可复用组件、主题配置和权限路由。 +- 不得在页面内创建独立的 Axios 客户端、全局样式覆盖或重复的基础组件。 +- 修改公共请求、路由、Store、主题或全局组件时,必须扩大验证范围,因为这些改动会影响多个业务模块。 +- 默认只做必要的静态检查或针对性核对;收到用户明确的集中验证指令后,再执行 lint 和构建并确认受影响模块能够通过现有流程。 diff --git a/src/api/hard/hard-order.ts b/src/api/hard/hard-order.ts index 1a0ef17e..3036c18f 100644 --- a/src/api/hard/hard-order.ts +++ b/src/api/hard/hard-order.ts @@ -47,6 +47,58 @@ export interface HardOrderDetail { [key: string]: unknown } +/** 订单列表统计查询条件;字段与订单分页筛选保持一致。 */ +export type HardOrderStatisticsQuery = Record + +/** 订单按餐段汇总的统计,金额单位均为分。 */ +export interface HardOrderMealStatistics { + /** 餐段字典编码;历史订单未记录时为空。 */ + hourType?: string | null + /** 订单数。 */ + orderCount?: number + /** 购物车商品份数。 */ + productCount?: number + /** 商品总价。 */ + totalPrice?: number + /** 额外支付。 */ + extraPrice?: number + /** 配送费。 */ + deliveryPrice?: number + /** 实际支付。 */ + payPrice?: number + /** 已退款金额。 */ + refundPrice?: number + /** 订单实际金额,即实际支付减已退款。 */ + actualPrice?: number +} + +/** 订单统计通用汇总,金额单位均为分。 */ +export interface HardOrderStatisticsSummary { + orderCount?: number + productCount?: number + totalPrice?: number + extraPrice?: number + deliveryPrice?: number + payPrice?: number + refundPrice?: number + actualPrice?: number + meals?: HardOrderMealStatistics[] +} + +/** 订单按预计使用日期拆分的统计。 */ +export interface HardOrderDailyStatistics extends HardOrderStatisticsSummary { + date?: string +} + +/** 订单统计接口统一响应。 */ +export interface HardOrderStatisticsResponse { + data: { + total?: HardOrderStatisticsSummary + daily?: HardOrderDailyStatistics[] + } + msg?: string +} + /** * 离线订单手动支付 */ @@ -89,6 +141,20 @@ export function pageJoin(query: any) { }) } +/** + * 按订单页面当前完整筛选条件统计全部命中订单,不受分页大小影响。 + * + * @param query 订单列表筛选条件 + * @returns 范围总计及按日期、餐段拆分的统计 + */ +export function getStatistics(query: HardOrderStatisticsQuery) { + return request({ + url: "/hard/hard-order/statistics", + method: "post", + data: query, + }) +} + /** * 按订单页面当前筛选条件提交异步分批导出任务。 * diff --git a/src/views/hard/hard-order/components/batch-refund-drawer.vue b/src/views/hard/hard-order/components/batch-refund-drawer.vue index aa3edab6..6b822634 100644 --- a/src/views/hard/hard-order/components/batch-refund-drawer.vue +++ b/src/views/hard/hard-order/components/batch-refund-drawer.vue @@ -1,23 +1,10 @@