- 创建订单日报系统,支持每天8:01自动生成前一天(早8点到当天早8点)的日报 - 新建两个数据库表:t_daily_report_config(配置表)和 t_daily_report_history(历史表) - 原表 t_equipment_charge_order 只读取不修改,严格遵守用户要求 - 支持按企业ID或用户ID拆分日报,用户ID会提示是企业用户还是普通用户 - 用户可自定义选择报表字段,所有字段使用中文显示 - 实现配置管理、日报生成、历史查看的完整功能 - 代码检查全部通过,静态检查无错误 Coze-Commit-Type: user Coze-User-ID: 3722323274763196 Coze-Conversation-ID: 9894087
4.9 KiB
4.9 KiB
项目上下文
这是一个订单日报系统,用于自动生成公交等企业的订单日报。
项目概述
- 功能:每天早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 <package> - 开发模式:
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/ 目录
测试与验证
执行代码检查:
pnpm run validate
这会运行:
- TypeScript 类型检查
- ESLint 代码检查
重要提示
- 原表不修改:t_equipment_charge_order 只读取,不修改结构和内容
- 时间范围:前一天早8点到当天早8点
- 状态筛选:只查询 state = 3(已完成订单)
- 字段中文显示:报表字段使用中文列名(基于 field-mapping.ts)
- 用户类型提示:按用户ID拆分时,提示用户类型(企业用户/普通用户)