# 项目上下文 这是一个订单日报系统,用于自动生成公交等企业的订单日报。 ### 项目概述 - **功能**:每天早8:01自动生成前一天的订单日报(从前一天早8点到当天早8点) - **数据库**:MySQL (haoslm2.xicp.net) - **订单表**:t_equipment_charge_order(只读取,不修改) - **拆分方式**:按企业ID或用户ID拆分日报 - **字段选择**:用户可自定义选择报表字段,使用中文显示 ### 版本技术栈 - **Framework**: Next.js 16 (App Router) - **Core**: React 19 - **Language**: TypeScript 5 - **UI 组件**: shadcn/ui (基于 Radix UI) - **Styling**: Tailwind CSS 4 - **数据库**: MySQL (mysql2) - **定时任务**: node-cron - **Excel导出**: xlsx ## 目录结构 ``` ├── public/ │ └── reports/ # 生成的日报Excel文件 ├── src/ │ ├── app/ │ │ ├── api/ │ │ │ ├── config/ # 配置管理API │ │ │ ├── entities/ # 企业/用户列表API │ │ │ ├── init-tables/ # 初始化数据库表API │ │ │ ├── report/ # 日报生成API │ │ │ └── test-db/ # 数据库连接测试API │ │ └── page.tsx # 主页面 │ ├── components/ui/ # Shadcn UI 组件库 │ ├── hooks/ # 自定义 Hooks │ ├── lib/ │ │ ├── db.ts # 数据库连接 │ │ ├── field-mapping.ts # 字段映射(英文->中文) │ │ ├── init-tables.ts # 数据库表初始化 │ │ └── report-generator.ts # 日报生成核心逻辑 │ └── server.ts # 自定义服务端入口(含定时任务) ├── scripts/ # 构建与启动脚本 ├── package.json └── tsconfig.json ``` ## 包管理规范 **仅允许使用 pnpm** 作为包管理器,**严禁使用 npm 或 yarn**。 常用命令: - 安装依赖:`pnpm install` - 添加依赖:`pnpm add ` - 开发模式:`pnpm run dev` - 构建:`pnpm run build` - 生产运行:`pnpm run start` ## 开发规范 ### 编码规范 - 默认按 TypeScript `strict` 心智写代码 - 禁止隐式 `any` 和 `as any` - 函数参数、返回值、事件对象在使用前应有明确类型 - 清理未使用的变量和导入 ### Hydration 问题防范 - 严禁在 JSX 渲染逻辑中直接使用 typeof window、Date.now()、Math.random() - 必须使用 'use client' 并配合 useEffect + useState 确保动态内容仅在客户端挂载后渲染 ## UI 设计与组件规范 - 模板预装核心组件库 `shadcn/ui`,位于 `src/components/ui/` 目录下 - Next.js 项目默认采用 shadcn/ui 组件、风格和规范 ## 数据库表说明 ### t_equipment_charge_order(原表,只读取不修改) 订单表,包含所有充电订单信息。主要字段: - state: 订单状态(3 = 已完成) - report_time: 订单上报时间(用于日报时间范围筛选) - company_id: 企业ID - user_id: 用户ID - order_type: 订单类型(1=普通用户,3=企业用户) ### t_daily_report_config(新建表) 日报字段配置表: - config_name: 配置名称 - split_type: 拆分方式(company_id 或 user_id) - selected_fields: 用户选择的字段列表(JSON数组) - is_active: 是否启用 ### t_daily_report_history(新建表) 日报生成历史记录表: - report_date: 报表日期 - split_type: 拆分方式 - split_value: 拆分值(企业ID或用户ID) - total_orders: 订单总数 - total_amount: 总金额 - file_path: 生成的文件路径 - status: 状态(0=失败,1=成功) ## API 接口说明 ### 配置管理 - GET /api/config - 获取所有配置 - POST /api/config - 创建新配置 - PUT /api/config/[id] - 更新配置 - DELETE /api/config/[id] - 禁用配置 ### 企业/用户列表 - GET /api/entities?type=company - 获取企业列表 - GET /api/entities?type=user - 获取用户列表 ### 日报生成 - POST /api/report/generate - 生成日报(可手动生成或批量生成) ### 日报历史 - GET /api/report/history - 获取历史记录(分页) ### 数据库测试 - GET /api/test-db - 测试数据库连接 - POST /api/init-tables - 初始化数据库表 ## 定时任务 - 每天 8:01(北京时间)自动运行 - 为所有启用的配置自动生成日报 - 保存到历史记录表 - 生成的Excel文件保存在 public/reports/ 目录 ## 测试与验证 执行代码检查: ```bash pnpm run validate ``` 这会运行: - TypeScript 类型检查 - ESLint 代码检查 ## 重要提示 1. **原表不修改**:t_equipment_charge_order 只读取,不修改结构和内容 2. **时间范围**:前一天早8点到当天早8点 3. **状态筛选**:只查询 state = 3(已完成订单) 4. **字段中文显示**:报表字段使用中文列名(基于 field-mapping.ts) 5. **用户类型提示**:按用户ID拆分时,提示用户类型(企业用户/普通用户)