daShangDao_psiServer/PSI项目说明文档.md
2026-06-15 13:47:39 +08:00

611 lines
24 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.

# PSI 进销存系统 - 项目说明文档
## 一、项目概述
PSI 是一套基于 Go 语言开发的完整进销存管理系统涵盖采购、销售、库存、仓库、物流等核心业务环节支持波次Wave管理、OCR 识别、外部系统对接等企业级功能。
- **项目名称**PSI 进销存系统
- **技术栈**Go 1.25.7 + Gin + GORM + MySQL
- **服务端口**`9090`
- **项目路径**`D:\www\wwwroot\psi`
---
## 二、技术架构
| 组件 | 技术 |
|------|------|
| Web 框架 | [Gin v1.11.0](https://github.com/gin-gonic/gin) |
| ORM | [GORM v1.31.1](https://gorm.io/) + MySQL Driver |
| 认证 | JWTgolang-jwt/jwt/v5 |
| 日志 | Logrus + file-rotatelogs按时间轮转 |
| 搜索引擎 | Elasticsearch v8可选当前已注释 |
| OCR | 本地 OCR 服务(可启动独立进程) |
| Excel 导出 | Excelize v2 |
| 条形码 | boombuler/barcode二维码/条形码生成) |
| 图像处理 | golang.org/x/image |
| 加密 | golang.org/x/crypto |
---
## 三、目录结构
```
psi/
├── main.go # 程序入口
├── config.yaml # 配置文件
├── go.mod / go.sum # Go 依赖管理
├── config/ # 配置加载模块
├── constant/ # 常量定义(日志通道等)
├── controllers/ # HTTP 控制器层处理请求32个
├── middleware/ # 中间件JWT 认证、CORS、API 签名)
├── models/ # 数据模型层
│ ├── request/ # 请求参数结构体
│ ├── response/ # 响应结构体
│ ├── book_info.go # 图书信息模型
│ ├── employee.go # 员工模型
│ └── ... # 其他业务模型共41个表
├── service/ # 业务逻辑层
├── database/ # 数据库连接初始化
├── routes/ # 路由定义
├── utils/ # 工具函数JWT、加密等
├── es/ # Elasticsearch 初始化(可选)
├── ocr/ # OCR 服务
├── template/ # 模板文件
├── fonts/ # 字体文件
├── linux/ # Linux 部署文件
├── runtime/ # 运行时文件(日志等)
├── .idea/ # IDE 配置
└── sql.txt # 数据库补充脚本
```
---
## 四、数据库表关系
### 4.1 表分类统计
| 模块 | 表数量 | 说明 |
|-----|-------|------|
| 基础信息 | 10 | 员工、供应商、仓库、库位、商品、店铺、客户等 |
| 库存管理 | 5 | 库存、库存明细、库存流水、盘库等 |
| 采购管理 | 4 | 采购订单、采购明细、入库单、入库明细 |
| 销售出库 | 7 | 销售订单、销售明细、出库单、出库明细、发货单等 |
| 波次管理 | 3 | 波次主表、波次任务、波次任务明细 |
| 其他 | 12 | 小车、外部任务、打印、分账、统计等 |
| **总计** | **41** | |
### 4.2 核心表结构
#### 1基础信息模块
| 表名 | 说明 | 关键字段 |
|-----|------|---------|
| **employees** | 员工表 | id, username, role, status, expire_time |
| **supplier** | 供应商表 | id, code, name, status |
| **warehouse** | 仓库表 | id, code, name, logistics_id, type, status |
| **location** | 库位表 | id, warehouse_id, code, type, capacity, status |
| **product** | 商品表 | id, category_id, barcode, name, price, status |
| **shop** | 店铺表 | id, mall_id, shop_type, shop_alias_name, status |
| **customer** | 客户表 | - |
| **logistics** | 物流模板表 | - |
#### 2库存模块
| 表名 | 说明 | 关键字段 |
|-----|------|---------|
| **inventory** | 库存汇总表 | id, warehouse_id, product_id, batch_no, quantity, locked_quantity |
| **inventory_log** | 库存流水表 | id, warehouse_id, product_id, location_id, change_type, change_quantity, related_order_no |
#### 3采购模块
| 表名 | 说明 | 关键字段 |
|-----|------|---------|
| **purchase_order** | 采购订单主表 | id, po_no, supplier_id, warehouse_id, total_amount, status |
| **receiving_order** | 入库单主表 | id, receiving_no, purchase_order_id, wave_task_id, warehouse_id, status |
#### 4销售与出库模块
| 表名 | 说明 | 关键字段 |
|-----|------|---------|
| **sales_order** | 销售订单主表 | id, so_no, customer_id, warehouse_id, shop_type, total_amount, status, is_distribution |
| **outbound_order** | 出库单主表 | id, out_no, wave_task_id, warehouse_id, total_quantity, status |
| **shipping_order** | 发货单主表 | id, shipping_no, customer_id, status, shipping_time |
#### 5波次管理模块
| 表名 | 说明 | 关键字段 |
|-----|------|---------|
| **wave_header** | 波次主表 | id, wave_no, direction, type, warehouse_id, related_order_id, status |
| **wave_task** | 波次任务表 | - |
| **wave_task_detail** | 波次任务明细表 | - |
### 4.3 表关系图谱
```
┌─────────────┐
│ employees │
└──────┬──────┘
│ 创建/操作
┌───────────────────────────────────────────────────────────────────┐
│ 核心业务流程 │
├───────────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ supplier │─────▶│purchase_order│─────▶│ receiving │ │
│ │ (供应商) │ │ (采购单) │ │ (入库单) │ │
│ └──────────────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ┌──────────────┐ │ │ │
│ │ product │◀──────────┘ │ │
│ │ (商品) │ │ │
│ └──────┬───────┘ │ │
│ │ │ │
│ │ ┌──────────────┐ │ │
│ └─────────────▶│ inventory │◀───────────┘ │
│ │ (库存) │ │
│ └──────┬───────┘ │
│ │ │
│ │ │
│ ┌──────────────┐ │ ┌──────────────┐ │
│ │ customer │ │ │ sales │ │
│ │ (客户) │◀───────────┴───────────▶│ (销售单) │ │
│ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ┌──────────────┐ ┌──────────────┐ │ │
│ │ shop │ │ outbound │◀───────┘ │
│ │ (店铺) │◀────▶│ (出库单) │ │
│ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ shipping │ │
│ │ (发货单) │ │
│ └──────────────┘ │
└───────────────────────────────────────────────────────────────────┘
┌──────────────┐
│ wave_header │
│ (波次) │
└──────┬───────┘
┌──────────────┐
│ wave_task │
│ (波次任务) │
└──────────────┘
┌──────────────┐
│ car │
│ (小车) │
└──────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 基础信息层 │
├─────────────────────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ warehouse│ │ location │ │logistics │ │
│ │ (仓库) │───▶│ (库位) │ │(物流模板)│ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
### 4.4 关键表关系详细说明
#### 采购入库流程关系
```
供应商(supplier) → 采购订单(purchase_order)
波次(wave_header)
波次任务(wave_task)
入库单(receiving_order)
库存增加(inventory + inventory_log)
```
- **purchase_order.supplier_id** → supplier.id
- **purchase_order.warehouse_id** → warehouse.id
- **receiving_order.purchase_order_id** → purchase_order.id
- **receiving_order.wave_task_id** → wave_task.id
- **inventory_log.related_order_no** → purchase_order.po_no 或 receiving_order.receiving_no
#### 销售出库流程关系
```
客户(customer) → 销售订单(sales_order)
波次(wave_header)
波次任务(wave_task)
出库单(outbound_order)
库存减少(inventory + inventory_log)
发货单(shipping_order)
```
- **sales_order.customer_id** → customer.id
- **sales_order.warehouse_id** → warehouse.id
- **sales_order.sales_person_id** → shop.id
- **outbound_order.wave_task_id** → wave_task.id
- **outbound_order.warehouse_id** → warehouse.id
- **inventory_log.related_order_no** → sales_order.so_no 或 outbound_order.out_no
#### 库存管理关系
```
warehouse(仓库) ──┐
├─→ inventory(库存) ←─ product(商品)
location(库位) ──┘ ↑
└─ inventory_log(库存流水)
```
- **inventory.warehouse_id** → warehouse.id
- **inventory.product_id** → product.id
- **inventory_log.warehouse_id** → warehouse.id
- **inventory_log.location_id** → location.id
- **inventory_log.product_id** → product.id
- **location.warehouse_id** → warehouse.id
---
## 五、核心业务模块
### 5.1 认证与权限
| 功能 | 说明 |
|------|------|
| JWT 认证 | 基于 Bearer Token有效期 24 小时 |
| 角色权限 | 普通员工role≠255/ 管理员role=255 |
| API 签名 | MD5 签名验证防篡改app_key + app_secret |
| 账号过期 | 支持设置员工账号过期时间 |
### 5.2 员工管理(管理员接口)
- 员工列表 / 新增 / 修改密码 / 设置级别
- 设置账号过期时间 / 查看过期状态
- PDA 配置(用于手持设备)
- 员工操作日志
### 5.3 供应商管理
- 供应商增删改查
- 供应商详情查看
### 5.4 仓库与库位管理
- 仓库增删改查
- 库位增删改查
- **库位批量生成**(按规则批量创建库位编号)
- 库位同步外部系统
### 5.5 商品管理
- 商品列表(支持分页、筛选)
- 商品新增 / 修改(支持图片上传)
- **商品售价批量修改**(公开接口,支持外部调用)
- 商品导出到 Excel
- 商品库存查询(按库位/仓库聚合)
- 商品日志(记录价格/信息变更,支持审核流程)
- 图书信息获取(对接外部图书 API
- 条形码 / 二维码生成
### 5.6 采购流程(波次模式)
```
创建采购单 → 生成采购波次 → 释放波次(生成波次任务)
PDA 扫码收货
提交入库单 → 库存增加
```
- `POST /api/purchase-order/create-with-wave` — 创建采购单并生成波次
- `POST /api/wave/release` — 释放波次,生成波次任务明细
- `POST /api/receiving/bind-wave` — 绑定波次,创建入库单
- `POST /api/receiving/submit` — 提交入库,更新库存
- 支持**小车Car**容量管理,按车容量分配波次任务
### 5.7 销售与出库流程
```
创建销售单 → 生成出库波次 → 释放出库波次
PDA 拣货/出库
提交出库单 → 库存减少
创建发货单 → 填写物流信息
```
- `POST /api/sales-order/create` — 创建销售订单(公开接口)
- `POST /api/outbound-order/create` — 创建出库单
- `POST /api/wave/outbound/create` — 生成出库波次
- `POST /api/wave/outbound/release` — 释放出库波次
- `POST /api/outbound/bind-wave` — 绑定出库波次
- `POST /api/outbound/submit` — 提交出库
- `POST /api/shipping-order/create` — 创建发货单
- `POST /api/shipping-order/update` — 更新物流信息
- `POST /api/sales-order/cancel` — 取消销售单
- `POST /api/wave/outbound/cancel` — 取消出库波次
### 5.8 库存管理
- 库存列表(按商品/库位/仓库维度)
- **库存按商品聚合列表**(同商品不同库位合并显示)
- 库存明细(跟踪每笔出入库记录)
- 库存变动日志
- **盘库调整**(库存盘点,支持盘盈/盘亏调整)
- **盘库退货**(将盘点差异商品退回)
- 库存统计
### 5.9 波次任务管理
- 波次任务列表(按采购/出库类型)
- 波次任务详情
- 波次任务进度跟踪
### 5.10 店铺与外部对接
- 店铺管理(增删改查)
- **外部任务OutTask**:与外部系统同步任务状态
- 按店铺查询外部任务
- 外部任务日志
- 同步商品到外部系统(`external_api.sync_product_url`
- 同步任务到外部系统(`external_api.sync_task_url`
### 5.11 物流管理
- 物流模板增删改查
- 物流模板详情
### 5.12 分拣设置
- 获取分拣配置
- 保存分拣配置(影响波次任务分配逻辑)
### 5.13 仪表盘统计
- 仪表盘概览统计(`/api/dashboard/statist`
- 各仓库库存统计(`/api/dashboard/warehouse`
- 订单统计(`/api/dashboard/order`
### 5.14 OCR 识别
- `POST /api/ocr` — 图片文字识别(公开接口)
- 可启动本地 OCR 服务进程(`OCRService.exe`
---
## 六、API 接口分类
### 公开接口(无需认证)
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/login/:type` | POST | 员工登录 |
| `/api/employee/reg` | POST | 员工注册 |
| `/api/ocr` | POST | OCR 文字识别 |
| `/api/sales-order/create` | POST | 创建销售单 |
| `/api/product/updatePrice` | POST | 批量修改商品售价 |
| `/api/product/getProductInventory` | GET | 查询商品库存 |
| `/api/employee/check_code` | GET | 校验员工码 |
| `/api/employee/clear_code` | POST | 清除员工码 |
| `/api/out-task-log/update` | POST | 更新外部任务日志 |
### 签名接口(需要 API 签名,无需 JWT
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/location/sync-locations` | POST | 同步库位到外部系统 |
| `/api/goods/sync-batch` | POST | 批量同步商品到外部系统 |
### 需认证接口JWT + API 签名)
大部分业务接口需要 `Authorization: Bearer <token>` 请求头,以及 API 签名验证。
### 管理员接口(需要 role=255
员工管理、用户类型管理的完整 CRUD。
---
## 七、配置说明config.yaml
```yaml
server:
port: "9090" # 服务监听端口
host: "http://192.168.101.213:9090/" # 服务外部访问地址
database:
host: localhost
port: "3306"
user: root
password: root
name: psi # 数据库名
encrypt_key: "..." # 敏感字段加密密钥AES
jwt:
secret: "..." # JWT 签名密钥
expire_hours: 24 # Token 有效期
api_sign:
app_key: "psi"
app_secret: "psi_api_sign_secret" # API 签名密钥
timestamp_tolerance: 300 # 时间戳容差(秒)
log:
max_age: 600 # 日志最大保留时间(秒)
rotate_time: 600 # 日志轮转时间间隔(秒)
root_path: "./runtime/logs"
channel: # 各日志通道文件路径
sql: "/sql/err.log"
work: "/work/err.log"
request: "/request/err.log"
es: "/es/err.log"
redis: "/redis/err.log"
ocr:
service_url: "http://127.0.0.1:35569/ocr"
exe_url: "./ocr/OCRService.exe" # OCR 可执行文件路径
external_api:
sync_product_url: "http://192.168.101.127:8080/zhishu/filterSet/save"
sync_task_url: "http://192.168.101.156:8080/task/create"
sync_task_body_url: "http://192.168.101.156:8080/task/setTaskBody"
timeout: 30
```
> **注意**Elasticsearch 配置已注释ES 同步功能当前未启用。
---
## 八、数据库模型一览
| 模型文件 | 说明 |
|----------|------|
| `employee.go` | 员工/用户信息 |
| `employee_level.go` | 员工级别配置 |
| `employee_level_log.go` | 员工级别变更日志 |
| `employee_settings.go` | 员工 PDA 配置 |
| `supplier.go` | 供应商 |
| `warehouse.go` | 仓库 |
| `location.go` | 库位 |
| `product.go` | 商品 |
| `product_category.go` | 商品分类 |
| `product_unit_conversion.go` | 商品单位换算 |
| `product_serial.go` | 商品序列号 |
| `product_log.go` | 商品变更日志(审核流) |
| `purchase_order.go` | 采购订单 |
| `purchase_order_item.go` | 采购订单明细 |
| `receiving_order.go` | 入库单 |
| `receiving_order_item.go` | 入库单明细 |
| `sales_order.go` | 销售订单 |
| `sales_order_item.go` | 销售订单明细 |
| `outbound_order.go` | 出库单 |
| `outbound_order_item.go` | 出库单明细 |
| `shipping_order.go` | 发货单 |
| `inventory.go` | 库存 |
| `inventory_detail.go` | 库存明细 |
| `inventory_log.go` | 库存变动日志 |
| `stock_check.go` | 盘库单 |
| `stock_check_item.go` | 盘库明细 |
| `wave_header.go` | 波次头 |
| `wave_task.go` | 波次任务 |
| `wave_task_detail.go` | 波次任务明细 |
| `car.go` | 小车AGV/搬运车) |
| `car_shop.go` | 小车与店铺关联 |
| `shop.go` | 店铺 |
| `logistics.go` | 物流模板 |
| `out_task.go` | 外部任务 |
| `out_task_log.go` | 外部任务日志 |
| `print_log.go` | 打印日志 |
| `print_task.go` | 打印任务 |
| `sorting_settings.go` | 分拣设置 |
| `statist.go` | 统计数据 |
| `customer.go` | 客户 |
| `user_type.go` | 用户类型 |
| `book_info.go` | 图书信息(对接外部图书 API |
| `split_account_config.go` | 分账配置 |
| `split_account_deduction_log.go` | 分账扣钱日志 |
| `outbound_order_location_log.go` | 出库单库位变更记录 |
---
## 九、启动与运行
### 本地开发
```bash
# 进入项目目录
cd D:\www\wwwroot\psi
# 安装依赖
go mod download
# 运行项目
go run main.go
```
服务启动后监听 `http://localhost:9090`
### 配置说明
1. 确保 MySQL 服务运行,并创建 `psi` 数据库
2. 根据实际的 MySQL 账号密码修改 `config.yaml`
3. 如需启用 OCR确保 `ocr/OCRService.exe` 存在
4. 如需启用 Elasticsearch取消 `main.go` 中 ES 初始化代码的注释,并配置 `config.yaml` 中的 `es` 节点
5. 执行 `sql.txt` 中的补充 SQL 脚本(分账配置、出库单库位变更记录等)
---
## 十、中间件说明
| 中间件文件 | 功能 |
|-----------|------|
| `middleware/cors.go` | 跨域资源共享CORS处理 |
| `middleware/auth.go` | JWT 认证 + 员工状态校验 + 租户数据库连接 |
| `middleware/sign.go` | API 签名验证(防篡改、防重放攻击) |
**请求头要求(需认证接口)**
```
Authorization: Bearer <jwt_token>
X-App-Key: psi
X-Timestamp: <unix_timestamp>
X-Sign: <md5_sign>
```
签名计算方式:`md5(app_key + app_secret + timestamp)`
---
## 十一、外部系统集成
系统支持与以下外部系统对接:
| 对接功能 | 配置项 | 说明 |
|---------|--------|------|
| 商品同步 | `sync_product_url` | 将商品信息推送到外部系统 |
| 任务创建 | `sync_task_url` | 在外部系统创建任务 |
| 任务内容同步 | `sync_task_body_url` | 同步任务详细信息到外部系统 |
| 库位同步 | `/api/location/sync-locations` | 将库位信息推送到外部系统 |
| 商品批量同步 | `/api/goods/sync-batch` | 批量推送商品到外部系统 |
---
## 十二、技术架构亮点
| 技术特性 | 说明 |
|---------|------|
| **GORM ORM** | 强大的数据库操作,自动关联查询 |
| **JWT 认证** | 无状态认证,有效期 24 小时 |
| **API 签名验证** | MD5 签名防篡改、防重放攻击 |
| **Elasticsearch** | 可选的搜索引擎集成(代码已注释) |
| **OCR 识别** | 本地 OCR 服务进程,支持图片文字识别 |
| **Excel 处理** | Excelize 库,支持数据导入导出 |
| **条码生成** | boombuler/barcode支持二维码/条形码 |
| **日志轮转** | file-rotatelogs按时间轮转日志 |
| **软删除** | 所有表都支持 IsDel 逻辑删除标记 |
| **时间戳** | 使用 Unix 时间戳(秒)而非 datetime |
---
## 十三、待完善功能(根据代码注释)
- ✅ Elasticsearch 同步功能(代码已注释,可启用)
- ✅ OCR 服务(代码已注释,可启用)
- 外部系统对接 URL 已在配置中,需确认外部系统接口可用性
- `main.go` 中 ES 和 OCR 的初始化代码已注释,按需启用
---
*文档生成时间2026-06-05*
*项目路径D:\www\wwwroot\psi*