2026-07-07 16:00:36 +08:00
|
|
|
|
# 项目上下文
|
|
|
|
|
|
|
2026-07-07 16:14:42 +08:00
|
|
|
|
这是一个订单日报系统,用于自动生成公交等企业的订单日报。
|
|
|
|
|
|
|
|
|
|
|
|
### 项目概述
|
|
|
|
|
|
|
|
|
|
|
|
- **功能**:每天早8:01自动生成前一天的订单日报(从前一天早8点到当天早8点)
|
|
|
|
|
|
- **数据库**:MySQL (haoslm2.xicp.net)
|
|
|
|
|
|
- **订单表**:t_equipment_charge_order(只读取,不修改)
|
|
|
|
|
|
- **拆分方式**:按企业ID或用户ID拆分日报
|
|
|
|
|
|
- **字段选择**:用户可自定义选择报表字段,使用中文显示
|
|
|
|
|
|
|
2026-07-07 16:00:36 +08:00
|
|
|
|
### 版本技术栈
|
|
|
|
|
|
|
|
|
|
|
|
- **Framework**: Next.js 16 (App Router)
|
|
|
|
|
|
- **Core**: React 19
|
|
|
|
|
|
- **Language**: TypeScript 5
|
|
|
|
|
|
- **UI 组件**: shadcn/ui (基于 Radix UI)
|
|
|
|
|
|
- **Styling**: Tailwind CSS 4
|
2026-07-07 16:14:42 +08:00
|
|
|
|
- **数据库**: MySQL (mysql2)
|
|
|
|
|
|
- **定时任务**: node-cron
|
|
|
|
|
|
- **Excel导出**: xlsx
|
2026-07-07 16:00:36 +08:00
|
|
|
|
|
|
|
|
|
|
## 目录结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
2026-07-07 16:14:42 +08:00
|
|
|
|
├── public/
|
|
|
|
|
|
│ └── reports/ # 生成的日报Excel文件
|
2026-07-07 16:00:36 +08:00
|
|
|
|
├── src/
|
2026-07-07 16:14:42 +08:00
|
|
|
|
│ ├── 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
|
2026-07-07 16:00:36 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 包管理规范
|
|
|
|
|
|
|
|
|
|
|
|
**仅允许使用 pnpm** 作为包管理器,**严禁使用 npm 或 yarn**。
|
2026-07-07 16:14:42 +08:00
|
|
|
|
|
|
|
|
|
|
常用命令:
|
|
|
|
|
|
- 安装依赖:`pnpm install`
|
|
|
|
|
|
- 添加依赖:`pnpm add <package>`
|
|
|
|
|
|
- 开发模式:`pnpm run dev`
|
|
|
|
|
|
- 构建:`pnpm run build`
|
|
|
|
|
|
- 生产运行:`pnpm run start`
|
2026-07-07 16:00:36 +08:00
|
|
|
|
|
|
|
|
|
|
## 开发规范
|
|
|
|
|
|
|
|
|
|
|
|
### 编码规范
|
|
|
|
|
|
|
2026-07-07 16:14:42 +08:00
|
|
|
|
- 默认按 TypeScript `strict` 心智写代码
|
|
|
|
|
|
- 禁止隐式 `any` 和 `as any`
|
|
|
|
|
|
- 函数参数、返回值、事件对象在使用前应有明确类型
|
|
|
|
|
|
- 清理未使用的变量和导入
|
2026-07-07 16:00:36 +08:00
|
|
|
|
|
2026-07-07 16:14:42 +08:00
|
|
|
|
### Hydration 问题防范
|
2026-07-07 16:00:36 +08:00
|
|
|
|
|
2026-07-07 16:14:42 +08:00
|
|
|
|
- 严禁在 JSX 渲染逻辑中直接使用 typeof window、Date.now()、Math.random()
|
|
|
|
|
|
- 必须使用 'use client' 并配合 useEffect + useState 确保动态内容仅在客户端挂载后渲染
|
2026-07-07 16:00:36 +08:00
|
|
|
|
|
2026-07-07 16:14:42 +08:00
|
|
|
|
## 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
|
|
|
|
|
|
```
|
2026-07-07 16:00:36 +08:00
|
|
|
|
|
2026-07-07 16:14:42 +08:00
|
|
|
|
这会运行:
|
|
|
|
|
|
- TypeScript 类型检查
|
|
|
|
|
|
- ESLint 代码检查
|
2026-07-07 16:00:36 +08:00
|
|
|
|
|
2026-07-07 16:14:42 +08:00
|
|
|
|
## 重要提示
|
2026-07-07 16:00:36 +08:00
|
|
|
|
|
2026-07-07 16:14:42 +08:00
|
|
|
|
1. **原表不修改**:t_equipment_charge_order 只读取,不修改结构和内容
|
|
|
|
|
|
2. **时间范围**:前一天早8点到当天早8点
|
|
|
|
|
|
3. **状态筛选**:只查询 state = 3(已完成订单)
|
|
|
|
|
|
4. **字段中文显示**:报表字段使用中文列名(基于 field-mapping.ts)
|
|
|
|
|
|
5. **用户类型提示**:按用户ID拆分时,提示用户类型(企业用户/普通用户)
|