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

16 KiB
Raw Blame History

收银台系统开发计划

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)

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)

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)

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)

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)

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)

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 数据库初始化脚本

-- 插入默认商品分类
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主进程与渲染进程通信

// 主进程 (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 本地服务器与前端通信

// 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 小票打印实现

// 打印服务
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)原则,优先实现核心功能,确保系统稳定可靠,后续可根据实际使用情况逐步扩展功能。