minishouyin/doc/收银台系统开发计划.md
LIUFL a094f55890 docs: 整理文档并删除测试脚本
将文档统一整理到doc目录下,删除不再需要的测试脚本和临时文件
2025-11-12 16:12:40 +08:00

533 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 收银台系统开发计划
## 1. 项目概述
### 1.1 项目目标
开发一个最小化的收银台系统支持Windows平台安装部署实现完全本地化数据存储和离线运行。
### 1.2 核心功能
- 商品扫码录入
- 价格计算
- 多种支付方式支持
- 小票打印
- 日结报表生成
- 触屏操作支持
### 1.3 技术要求
- 单机部署,所有组件(数据库、服务、前端)打包在一个安装包中
- 完全离线运行,不依赖网络连接
- 支持硬件设备集成(扫码枪、小票打印机、钱箱)
- 简洁直观的用户界面
## 2. 需求分析
### 2.1 功能需求
#### 2.1.1 商品管理
- 商品信息录入(名称、价格、条码、分类)
- 商品信息修改和删除
- 商品库存管理(可选)
- 商品搜索和筛选
#### 2.1.2 收银功能
- 条码扫描录入商品
- 手动选择商品
- 数量修改
- 价格计算(含折扣、优惠)
- 购物车管理
- 订单挂起和恢复
#### 2.1.3 支付处理
- 现金支付
- 刷卡支付(模拟)
- 移动支付(模拟)
- 混合支付
- 找零计算
#### 2.1.4 小票打印
- 小票模板设计
- 自动打印设置
- 打印预览
- 重新打印功能
#### 2.1.5 报表统计
- 日销售报表
- 商品销售排行
- 收银员业绩统计
- 数据导出功能
### 2.2 非功能需求
#### 2.2.1 性能需求
- 系统响应时间 < 1秒
- 支持1000+商品数据
- 支持100+单日交易记录
#### 2.2.2 可用性需求
- 7×24小时稳定运行
- 数据备份和恢复
- 异常处理机制
#### 2.2.3 兼容性需求
- Windows 7/8/10/11支持
- 支持多种扫码枪型号
- 支持多种小票打印机
## 3. 技术架构设计
### 3.1 整体架构
```
┌─────────────────────────────────────────────────────────┐
│ Electron 主进程 │
├─────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 渲染进程 │ │ 本地服务 │ │ 数据库 │ │
│ │ (React) │ │ (Express) │ │ (SQLite) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────┤
│ 硬件接口层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 扫码枪 │ │ 小票打印机 │ │ 钱箱 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 3.2 技术选型
#### 3.2.1 桌面应用框架
- **Electron**: 跨平台桌面应用开发框架
- 优势Web技术栈跨平台丰富的生态系统
- 版本最新稳定版
#### 3.2.2 前端技术
- **React**: 用户界面开发
- 优势组件化生态丰富开发效率高
- 版本18.x
- **Ant Design**: UI组件库
- 优势丰富的企业级组件适合收银台界面
- **React Router**: 前端路由管理
#### 3.2.3 后端服务
- **Node.js + Express**: 本地HTTP服务
- 优势JavaScript全栈轻量级易于集成
- **SQLite**: 本地数据库
- 优势无需安装文件型数据库ACID事务支持
- **Sequelize**: ORM框架
- 优势数据库操作抽象迁移支持
#### 3.2.4 硬件集成
- **node-serialport**: 串口通信扫码枪钱箱
- **node-thermal-printer**: 小票打印机控制
- **USB设备检测库**: USB设备识别
#### 3.2.5 打包部署
- **electron-builder**: 应用打包
- 优势跨平台打包自动更新安装程序生成
### 3.3 目录结构
```
minishouyin/
├── src/
│ ├── main/ # Electron主进程
│ │ ├── main.js # 主进程入口
│ │ ├── menu.js # 应用菜单
│ │ └── ipc.js # IPC通信处理
│ ├── renderer/ # 渲染进程(前端)
│ │ ├── components/ # React组件
│ │ ├── pages/ # 页面组件
│ │ ├── services/ # API服务
│ │ ├── utils/ # 工具函数
│ │ └── App.js # 应用入口
│ └── server/ # 本地服务
│ ├── app.js # Express应用
│ ├── routes/ # API路由
│ ├── models/ # 数据模型
│ ├── controllers/ # 控制器
│ └── database/ # 数据库配置
├── assets/ # 静态资源
│ ├── icons/ # 应用图标
│ └── images/ # 图片资源
├── build/ # 构建配置
├── dist/ # 构建输出
├── package.json
└── README.md
```
## 4. 数据架构设计
### 4.1 数据库设计
#### 4.1.1 商品表 (products)
```sql
CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
barcode VARCHAR(50) UNIQUE NOT NULL, -- 商品条码
name VARCHAR(200) NOT NULL, -- 商品名称
category_id INTEGER, -- 分类ID
price DECIMAL(10,2) NOT NULL, -- 售价
cost_price DECIMAL(10,2), -- 成本价
stock INTEGER DEFAULT 0, -- 库存数量
unit VARCHAR(20), -- 单位
image_url VARCHAR(500), -- 商品图片
description TEXT, -- 商品描述
is_active BOOLEAN DEFAULT 1, -- 是否启用
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES categories(id)
);
```
#### 4.1.2 商品分类表 (categories)
```sql
CREATE TABLE categories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL, -- 分类名称
parent_id INTEGER, -- 父分类ID
sort_order INTEGER DEFAULT 0, -- 排序
is_active BOOLEAN DEFAULT 1, -- 是否启用
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (parent_id) REFERENCES categories(id)
);
```
#### 4.1.3 订单表 (orders)
```sql
CREATE TABLE orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
order_no VARCHAR(50) UNIQUE NOT NULL, -- 订单号
total_amount DECIMAL(10,2) NOT NULL, -- 总金额
discount_amount DECIMAL(10,2) DEFAULT 0, -- 折扣金额
paid_amount DECIMAL(10,2) NOT NULL, -- 实付金额
payment_method VARCHAR(50) NOT NULL, -- 支付方式
payment_status VARCHAR(20) DEFAULT 'paid', -- 支付状态
cashier_id INTEGER, -- 收银员ID
customer_info TEXT, -- 客户信息(JSON)
notes TEXT, -- 备注
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
#### 4.1.4 订单明细表 (order_items)
```sql
CREATE TABLE order_items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
order_id INTEGER NOT NULL, -- 订单ID
product_id INTEGER NOT NULL, -- 商品ID
quantity INTEGER NOT NULL, -- 数量
unit_price DECIMAL(10,2) NOT NULL, -- 单价
total_price DECIMAL(10,2) NOT NULL, -- 小计
discount_amount DECIMAL(10,2) DEFAULT 0, -- 折扣金额
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES orders(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);
```
#### 4.1.5 收银员表 (cashiers)
```sql
CREATE TABLE cashiers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR(50) UNIQUE NOT NULL, -- 用户名
password VARCHAR(100) NOT NULL, -- 密码(加密)
name VARCHAR(100) NOT NULL, -- 姓名
role VARCHAR(20) DEFAULT 'cashier', -- 角色
is_active BOOLEAN DEFAULT 1, -- 是否启用
last_login_at DATETIME, -- 最后登录时间
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
#### 4.1.6 系统设置表 (settings)
```sql
CREATE TABLE settings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key VARCHAR(100) UNIQUE NOT NULL, -- 设置键
value TEXT, -- 设置值
description TEXT, -- 描述
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
### 4.2 数据库初始化脚本
```sql
-- 插入默认商品分类
INSERT INTO categories (name, sort_order) VALUES
('饮料', 1),
('零食', 2),
('日用品', 3),
('烟酒', 4);
-- 插入示例商品
INSERT INTO products (barcode, name, category_id, price, stock, unit) VALUES
('6901234567890', '可口可乐330ml', 1, 3.50, 100, '瓶'),
('6901234567891', '百事可乐330ml', 1, 3.50, 100, '瓶'),
('6901234567892', '乐事薯片原味', 2, 8.50, 50, '袋'),
('6901234567893', '旺旺雪饼', 2, 5.00, 80, '袋');
-- 插入默认收银员
INSERT INTO cashiers (username, password, name, role) VALUES
('admin', 'pbkdf2_sha256$...', '管理员', 'admin'),
('cashier1', 'pbkdf2_sha256$...', '收银员1', 'cashier');
-- 插入系统设置
INSERT INTO settings (key, value, description) VALUES
('shop_name', '迷你收银台', '店铺名称'),
('shop_address', '', '店铺地址'),
('shop_phone', '', '店铺电话'),
('receipt_header', '欢迎光临', '小票抬头'),
('receipt_footer', '谢谢惠顾,欢迎再次光临', '小票底部'),
('auto_print', 'true', '自动打印小票'),
('tax_rate', '0.00', '税率');
```
## 5. 开发实施步骤
### 5.1 第一阶段项目初始化与基础架构搭建预计2天
#### 5.1.1 项目初始化
- 创建项目目录结构
- 初始化package.json
- 配置Electron主进程
- 配置开发环境和构建工具
#### 5.1.2 基础服务搭建
- 创建Express服务器
- 配置SQLite数据库连接
- 设置Sequelize ORM
- 实现基础API路由结构
#### 5.1.3 前端基础框架
- 创建React应用结构
- 配置Ant Design UI库
- 设置React Router路由
- 实现基础布局组件
### 5.2 第二阶段核心功能开发预计5天
#### 5.2.1 商品管理模块1天
- 商品列表展示
- 商品添加/编辑/删除
- 商品分类管理
- 商品搜索功能
#### 5.2.2 购物车功能1天
- 商品添加到购物车
- 购物车商品数量修改
- 购物车商品删除
- 价格计算与折扣
#### 5.2.3 订单处理1天
- 订单创建
- 支付方式选择
- 订单确认与提交
- 订单历史查询
#### 5.2.4 小票打印1天
- 小票模板设计
- 打印机连接与配置
- 小票打印功能实现
- 打印预览功能
#### 5.2.5 报表统计1天
- 日销售报表
- 商品销售统计
- 收银员业绩统计
- 数据导出功能
### 5.3 第三阶段硬件集成与优化预计3天
#### 5.3.1 扫码枪集成1天
- 串口扫码枪连接
- 条码识别与解析
- 扫码事件处理
- 键盘模式扫码支持
#### 5.3.2 小票打印机集成1天
- 热敏打印机驱动
- 打印参数配置
- 打印状态监控
- 异常处理机制
#### 5.3.3 钱箱控制1天
- 钱箱连接与控制
- 开钱箱指令发送
- 支付完成后自动开箱
- 手动开箱功能
### 5.4 第四阶段系统优化与打包预计2天
#### 5.4.1 性能优化
- 数据库查询优化
- 前端渲染优化
- 内存使用优化
- 启动速度优化
#### 5.4.2 异常处理与日志
- 全局异常捕获
- 错误日志记录
- 操作日志记录
- 数据备份机制
#### 5.4.3 应用打包
- electron-builder配置
- 应用图标与资源处理
- 安装程序生成
- 自动更新机制
### 5.5 第五阶段测试与部署预计2天
#### 5.5.1 功能测试
- 各功能模块测试
- 硬件兼容性测试
- 异常场景测试
- 性能压力测试
#### 5.5.2 部署准备
- 用户手册编写
- 安装指南制作
- 演示数据准备
- 最终打包发布
## 6. 关键技术实现
### 6.1 Electron主进程与渲染进程通信
```javascript
// 主进程 (main.js)
const { ipcMain } = require('electron');
// 处理硬件设备操作
ipcMain.handle('open-cash-drawer', async () => {
try {
// 打开钱箱逻辑
return { success: true };
} catch (error) {
return { success: false, error: error.message };
}
});
// 渲染进程 (React组件)
const { ipcRenderer } = window.require('electron');
const openCashDrawer = async () => {
const result = await ipcRenderer.invoke('open-cash-drawer');
if (result.success) {
message.success('钱箱已打开');
} else {
message.error(`打开钱箱失败: ${result.error}`);
}
};
```
### 6.2 本地服务器与前端通信
```javascript
// API服务封装
class ApiService {
constructor() {
this.baseUrl = 'http://localhost:3001/api';
}
async getProducts() {
const response = await fetch(`${this.baseUrl}/products`);
return response.json();
}
async createOrder(orderData) {
const response = await fetch(`${this.baseUrl}/orders`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(orderData),
});
return response.json();
}
}
```
### 6.3 小票打印实现
```javascript
// 打印服务
const printer = require('node-thermal-printer');
const printReceipt = async (orderData) => {
try {
await printer.init({
type: printer.printerTypes.EPSON,
interface: 'printer:auto'
});
printer.alignCenter();
printer.println('迷你收银台');
printer.drawLine();
printer.alignLeft();
printer.println(`订单号: ${orderData.orderNo}`);
printer.println(`时间: ${new Date().toLocaleString()}`);
printer.drawLine();
// 打印商品明细
orderData.items.forEach(item => {
printer.println(`${item.name} x${item.quantity} ${item.totalPrice}`);
});
printer.drawLine();
printer.println(`总计: ${orderData.totalAmount}`);
printer.println(`支付方式: ${orderData.paymentMethod}`);
printer.cut();
await printer.execute();
return { success: true };
} catch (error) {
return { success: false, error: error.message };
}
};
```
## 7. 风险评估与应对
### 7.1 技术风险
- **硬件兼容性问题**: 不同品牌型号的扫码枪打印机可能存在兼容性差异
- 应对提供设备配置界面支持多种设备驱动
- **性能瓶颈**: 大量商品数据可能导致查询缓慢
- 应对数据库索引优化分页加载本地缓存
### 7.2 开发风险
- **跨平台兼容性**: Windows不同版本可能存在差异
- 应对多版本测试兼容性处理
- **Electron应用体积**: 打包后应用可能较大
- 应对资源优化按需加载压缩打包
### 7.3 用户体验风险
- **操作复杂性**: 收银员可能不熟悉电脑操作
- 应对简化界面设计大按钮布局触屏优化
## 8. 项目交付物
1. **可执行安装包**: Windows平台安装程序
2. **源代码**: 完整的项目源代码
3. **技术文档**: 系统架构API文档数据库设计
4. **用户手册**: 安装指南使用说明常见问题
5. **演示数据**: 示例商品数据测试账号
## 9. 后续扩展计划
1. **移动端支持**: 开发Android版本
2. **会员系统**: 会员管理积分储值功能
3. **库存管理**: 进销存管理库存预警
4. **多店连锁**: 多门店数据同步集中管理
5. **云端备份**: 本地数据云端备份与恢复
6. **数据分析**: 销售趋势分析客户消费分析
---
本开发计划基于最小可行产品(MVP)原则优先实现核心功能确保系统稳定可靠后续可根据实际使用情况逐步扩展功能