minishouyin/收银台系统开发计划.md

533 lines
16 KiB
Markdown
Raw Normal View History

2025-11-12 11:35:57 +08:00
# 收银台系统开发计划
## 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)原则,优先实现核心功能,确保系统稳定可靠,后续可根据实际使用情况逐步扩展功能。