418 lines
14 KiB
Markdown
418 lines
14 KiB
Markdown
|
|
# 纺织行业采购计划管理系统 - 设计说明书
|
|||
|
|
|
|||
|
|
## 文档鉴别材料 - 设计说明书
|
|||
|
|
|
|||
|
|
**软件名称**:纺织行业采购计划管理系统
|
|||
|
|
**软件简称**:昱森
|
|||
|
|
**版本号**:V1.0.0
|
|||
|
|
**编制日期**:2025年05月
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 目录
|
|||
|
|
|
|||
|
|
1. 系统架构设计
|
|||
|
|
2. 数据库设计
|
|||
|
|
3. 接口设计
|
|||
|
|
4. 安全设计
|
|||
|
|
5. 部署架构
|
|||
|
|
6. 技术选型说明
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 第一章 系统架构设计
|
|||
|
|
|
|||
|
|
### 1.1 整体架构
|
|||
|
|
|
|||
|
|
本系统采用前后端分离架构,基于云原生技术栈构建:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 客户端层 │
|
|||
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|||
|
|
│ │ Web浏览器 │ │ 移动端 │ │ 平板 │ │
|
|||
|
|
│ │ (React) │ │ (H5) │ │ (响应式) │ │
|
|||
|
|
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 云服务层 (Meoo Cloud) │
|
|||
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|||
|
|
│ │ Supabase │ │ 认证服务 │ │ 实时订阅 │ │
|
|||
|
|
│ │ (PostgreSQL)│ │ (Auth) │ │ (Realtime) │ │
|
|||
|
|
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 1.2 前端架构
|
|||
|
|
|
|||
|
|
**技术栈**:
|
|||
|
|
- **框架**:React 18 + TypeScript
|
|||
|
|
- **路由**:React Router v6 (HashRouter)
|
|||
|
|
- **状态管理**:React Context + Zustand
|
|||
|
|
- **样式方案**:TailwindCSS
|
|||
|
|
- **动画库**:Framer Motion
|
|||
|
|
- **构建工具**:Webpack 5
|
|||
|
|
|
|||
|
|
**目录结构**:
|
|||
|
|
```
|
|||
|
|
src/
|
|||
|
|
├── components/ # 公共组件
|
|||
|
|
├── pages/ # 页面组件
|
|||
|
|
│ ├── purchaser/ # 采购商页面
|
|||
|
|
│ ├── textile/ # 纺织厂页面
|
|||
|
|
│ └── washing/ # 水洗厂页面
|
|||
|
|
├── hooks/ # 自定义Hooks
|
|||
|
|
├── contexts/ # React上下文
|
|||
|
|
├── stores/ # 状态管理
|
|||
|
|
├── utils/ # 工具函数
|
|||
|
|
├── types/ # 类型定义
|
|||
|
|
└── supabase/ # Supabase客户端
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 1.3 后端架构
|
|||
|
|
|
|||
|
|
**云服务**:Meoo Cloud (基于Supabase)
|
|||
|
|
- **数据库**:PostgreSQL 15
|
|||
|
|
- **认证**:Supabase Auth
|
|||
|
|
- **实时**:Supabase Realtime
|
|||
|
|
- **存储**:Supabase Storage
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 第二章 数据库设计
|
|||
|
|
|
|||
|
|
### 2.1 ER关系图
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
auth.users (Supabase内置)
|
|||
|
|
│
|
|||
|
|
├── 1:1 ── profiles (用户配置)
|
|||
|
|
│ │
|
|||
|
|
│ ├── N:1 ── companies (公司)
|
|||
|
|
│ │ │
|
|||
|
|
│ │ ├── 1:N ── company_members (公司成员)
|
|||
|
|
│ │ │
|
|||
|
|
│ │ ├── 1:N ── factories (工厂)
|
|||
|
|
│ │ │ │
|
|||
|
|
│ │ │ ├── N:M ── production_plans
|
|||
|
|
│ │ │
|
|||
|
|
│ │ ├── 1:N ── warehouses (仓库)
|
|||
|
|
│ │ │ │
|
|||
|
|
│ │ │ ├── 1:N ── inventory_records
|
|||
|
|
│ │ │
|
|||
|
|
│ │ ├── 1:N ── yarn_stock (纱线库存)
|
|||
|
|
│ │
|
|||
|
|
│ ├── 1:N ── production_plans (采购商创建的计划)
|
|||
|
|
│ │ │
|
|||
|
|
│ │ ├── 1:N ── yarn_ratios (纱线配比)
|
|||
|
|
│ │ │
|
|||
|
|
│ │ ├── 1:N ── plan_process_steps (流程节点)
|
|||
|
|
│ │ │
|
|||
|
|
│ │ ├── N:M ── factories (通过plan_factories关联)
|
|||
|
|
│ │
|
|||
|
|
│ ├── 1:N ── payments (结款记录)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.2 核心表结构
|
|||
|
|
|
|||
|
|
#### 2.2.1 companies - 公司表
|
|||
|
|
|
|||
|
|
| 字段 | 类型 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| id | UUID (PK) | 公司ID |
|
|||
|
|
| name | TEXT | 公司名称 |
|
|||
|
|
| role | app_role | 公司类型:purchaser/textile/washing |
|
|||
|
|
| address | TEXT | 公司地址 |
|
|||
|
|
| contact_phone | TEXT | 联系电话 |
|
|||
|
|
| created_at | TIMESTAMPTZ | 创建时间 |
|
|||
|
|
|
|||
|
|
#### 2.2.2 profiles - 用户配置表
|
|||
|
|
|
|||
|
|
| 字段 | 类型 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| id | UUID (PK) | 关联auth.users.id |
|
|||
|
|
| username | TEXT (UNIQUE) | 用户名 |
|
|||
|
|
| display_name | TEXT | 显示名称 |
|
|||
|
|
| phone | TEXT | 手机号(加密存储) |
|
|||
|
|
| company_id | UUID (FK) | 所属公司 |
|
|||
|
|
| is_master | BOOLEAN | 是否主账号 |
|
|||
|
|
| master_id | UUID (FK) | 主账号ID(子账号使用) |
|
|||
|
|
| created_at | TIMESTAMPTZ | 创建时间 |
|
|||
|
|
|
|||
|
|
#### 2.2.3 production_plans - 生产计划表
|
|||
|
|
|
|||
|
|
| 字段 | 类型 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| id | UUID (PK) | 计划ID |
|
|||
|
|
| plan_code | TEXT (UNIQUE) | 系统自动生成计划唯一识别码 |
|
|||
|
|
| product_name | TEXT | 成品名称 |
|
|||
|
|
| color | TEXT | 颜色 |
|
|||
|
|
| fabric_code | TEXT | 坯布唯一识别码(纯字母) |
|
|||
|
|
| color_code | TEXT | 色号(数字排序) |
|
|||
|
|
| remark | TEXT | 备注 |
|
|||
|
|
| purchaser_id | UUID (FK) | 采购商公司ID |
|
|||
|
|
| target_quantity | INTEGER | 计划产量(米) |
|
|||
|
|
| completed_quantity | INTEGER | 已完成产量(米) |
|
|||
|
|
| yarn_usage_per_meter | DECIMAL | 每米布纱用量(g/m) |
|
|||
|
|
| production_price | DECIMAL | 生产采购价(元/米) |
|
|||
|
|
| status | plan_status | 状态:pending/producing/completed |
|
|||
|
|
| start_time | TIMESTAMPTZ | 计划开始时间 |
|
|||
|
|
| created_by | UUID (FK) | 创建人 |
|
|||
|
|
| created_at | TIMESTAMPTZ | 创建时间 |
|
|||
|
|
| updated_at | TIMESTAMPTZ | 更新时间 |
|
|||
|
|
|
|||
|
|
#### 2.2.4 plan_process_steps - 计划流程节点表
|
|||
|
|
|
|||
|
|
| 字段 | 类型 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| id | UUID (PK) | 节点ID |
|
|||
|
|
| plan_id | UUID (FK) | 计划ID |
|
|||
|
|
| step_type | step_type | 节点类型:confirm/yarn_purchase/dyeing/machine_start/fabric_warehouse |
|
|||
|
|
| status | step_status | 状态:pending/active/completed |
|
|||
|
|
| timestamp | TIMESTAMPTZ | 确认时间戳 |
|
|||
|
|
| operator_id | UUID (FK) | 操作人 |
|
|||
|
|
| notes | TEXT | 备注 |
|
|||
|
|
| created_at | TIMESTAMPTZ | 创建时间 |
|
|||
|
|
|
|||
|
|
### 2.3 自定义枚举类型
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 应用角色(公司类型)
|
|||
|
|
CREATE TYPE app_role AS ENUM ('purchaser', 'textile', 'washing');
|
|||
|
|
|
|||
|
|
-- 工厂类型
|
|||
|
|
CREATE TYPE factory_type AS ENUM ('textile', 'washing');
|
|||
|
|
|
|||
|
|
-- 计划状态
|
|||
|
|
CREATE TYPE plan_status AS ENUM ('pending', 'producing', 'completed');
|
|||
|
|
|
|||
|
|
-- 流程节点类型
|
|||
|
|
CREATE TYPE step_type AS ENUM ('confirm', 'yarn_purchase', 'dyeing', 'machine_start', 'fabric_warehouse');
|
|||
|
|
|
|||
|
|
-- 流程节点状态
|
|||
|
|
CREATE TYPE step_status AS ENUM ('pending', 'active', 'completed');
|
|||
|
|
|
|||
|
|
-- 仓库类型
|
|||
|
|
CREATE TYPE warehouse_type AS ENUM ('raw_fabric', 'fabric', 'finished', 'yarn');
|
|||
|
|
|
|||
|
|
-- 结款状态
|
|||
|
|
CREATE TYPE payment_status AS ENUM ('pending', 'completed');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.4 RLS安全策略
|
|||
|
|
|
|||
|
|
所有表启用Row Level Security (RLS),基于公司ID进行数据隔离:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 示例:production_plans表RLS策略
|
|||
|
|
CREATE POLICY company_select_plans ON production_plans
|
|||
|
|
FOR SELECT USING (purchaser_id = get_user_master_company_id());
|
|||
|
|
|
|||
|
|
CREATE POLICY company_insert_plans ON production_plans
|
|||
|
|
FOR INSERT WITH CHECK (purchaser_id = get_user_master_company_id());
|
|||
|
|
|
|||
|
|
CREATE POLICY company_update_plans ON production_plans
|
|||
|
|
FOR UPDATE USING (purchaser_id = get_user_master_company_id());
|
|||
|
|
|
|||
|
|
CREATE POLICY company_delete_plans ON production_plans
|
|||
|
|
FOR DELETE USING (purchaser_id = get_user_master_company_id());
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 第三章 接口设计
|
|||
|
|
|
|||
|
|
### 3.1 认证接口
|
|||
|
|
|
|||
|
|
| 接口 | 方法 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| /auth/v1/token | POST | 用户登录 |
|
|||
|
|
| /auth/v1/signup | POST | 用户注册 |
|
|||
|
|
| /auth/v1/logout | POST | 用户退出 |
|
|||
|
|
| /auth/v1/refresh | POST | 刷新Token |
|
|||
|
|
|
|||
|
|
### 3.2 数据接口
|
|||
|
|
|
|||
|
|
基于Supabase自动生成的RESTful API:
|
|||
|
|
|
|||
|
|
| 资源 | 操作 | 接口示例 |
|
|||
|
|
|------|------|----------|
|
|||
|
|
| production_plans | CRUD | /rest/v1/production_plans |
|
|||
|
|
| companies | CRUD | /rest/v1/companies |
|
|||
|
|
| profiles | CRUD | /rest/v1/profiles |
|
|||
|
|
| inventory_records | CRUD | /rest/v1/inventory_records |
|
|||
|
|
| plan_process_steps | CRUD | /rest/v1/plan_process_steps |
|
|||
|
|
|
|||
|
|
### 3.3 实时订阅
|
|||
|
|
|
|||
|
|
使用Supabase Realtime进行数据实时同步:
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
supabase
|
|||
|
|
.channel('inventory_changes')
|
|||
|
|
.on('postgres_changes', {
|
|||
|
|
event: '*',
|
|||
|
|
schema: 'public',
|
|||
|
|
table: 'inventory_records'
|
|||
|
|
}, callback)
|
|||
|
|
.subscribe();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 第四章 安全设计
|
|||
|
|
|
|||
|
|
### 4.1 数据安全
|
|||
|
|
|
|||
|
|
**加密存储**:
|
|||
|
|
- 手机号使用XOR加密存储
|
|||
|
|
- 敏感数据加密传输(HTTPS)
|
|||
|
|
|
|||
|
|
**访问控制**:
|
|||
|
|
- 基于角色的访问控制(RBAC)
|
|||
|
|
- 行级安全策略(RLS)
|
|||
|
|
- 公司数据隔离
|
|||
|
|
|
|||
|
|
### 4.2 认证安全
|
|||
|
|
|
|||
|
|
- JWT Token认证
|
|||
|
|
- Token自动刷新
|
|||
|
|
- Session持久化
|
|||
|
|
- 虚拟邮箱格式保护隐私
|
|||
|
|
|
|||
|
|
### 4.3 分享安全
|
|||
|
|
|
|||
|
|
- 分享链接使用Base64 + 盐值混淆加密
|
|||
|
|
- 链接不包含敏感信息
|
|||
|
|
- 导入页面隐藏成品名称、颜色等敏感字段
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 第五章 部署架构
|
|||
|
|
|
|||
|
|
### 5.1 部署环境
|
|||
|
|
|
|||
|
|
**云服务**:Meoo Cloud (Supabase)
|
|||
|
|
- 托管数据库
|
|||
|
|
- 托管认证服务
|
|||
|
|
- 托管实时服务
|
|||
|
|
|
|||
|
|
**前端部署**:
|
|||
|
|
- 静态资源托管
|
|||
|
|
- CDN加速
|
|||
|
|
- HTTPS安全传输
|
|||
|
|
|
|||
|
|
### 5.2 构建配置
|
|||
|
|
|
|||
|
|
**开发环境**:
|
|||
|
|
```bash
|
|||
|
|
pnpm run dev # 启动开发服务器
|
|||
|
|
pnpm run build # 构建生产版本
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**生产构建**:
|
|||
|
|
- Webpack 5优化打包
|
|||
|
|
- 代码分割
|
|||
|
|
- Tree Shaking
|
|||
|
|
- 资源压缩
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 第六章 技术选型说明
|
|||
|
|
|
|||
|
|
### 6.1 前端技术选型
|
|||
|
|
|
|||
|
|
| 技术 | 版本 | 选型理由 |
|
|||
|
|
|------|------|----------|
|
|||
|
|
| React | 18.2.0 | 组件化开发,生态丰富 |
|
|||
|
|
| TypeScript | 5.3.3 | 类型安全,提升开发效率 |
|
|||
|
|
| TailwindCSS | 3.3.5 | 原子化CSS,快速开发 |
|
|||
|
|
| Framer Motion | 11.16.1 | 流畅动画,用户体验好 |
|
|||
|
|
| React Router | 6.8.0 | 声明式路由,易于管理 |
|
|||
|
|
| Zustand | 4.4.7 | 轻量状态管理,简单易用 |
|
|||
|
|
|
|||
|
|
### 6.2 后端技术选型
|
|||
|
|
|
|||
|
|
| 技术 | 版本 | 选型理由 |
|
|||
|
|
|------|------|----------|
|
|||
|
|
| PostgreSQL | 15+ | 关系型数据库,支持复杂查询 |
|
|||
|
|
| Supabase | 2.98.0 | 开源Firebase替代,功能完整 |
|
|||
|
|
| Row Level Security | - | 行级安全,数据隔离 |
|
|||
|
|
|
|||
|
|
### 6.3 开发工具选型
|
|||
|
|
|
|||
|
|
| 工具 | 版本 | 用途 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| Webpack | 5.89.0 | 模块打包 |
|
|||
|
|
| Babel | 7.23.5 | JavaScript编译 |
|
|||
|
|
| Jest | 29.7.0 | 单元测试 |
|
|||
|
|
| Playwright | 1.40.0 | E2E测试 |
|
|||
|
|
| pnpm | 8+ | 包管理 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 附录
|
|||
|
|
|
|||
|
|
### A. 数据库迁移脚本
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 创建公司表
|
|||
|
|
CREATE TABLE companies (
|
|||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|||
|
|
name TEXT NOT NULL,
|
|||
|
|
role app_role NOT NULL,
|
|||
|
|
address TEXT,
|
|||
|
|
contact_phone TEXT,
|
|||
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- 创建用户配置表
|
|||
|
|
CREATE TABLE profiles (
|
|||
|
|
id UUID PRIMARY KEY REFERENCES auth.users(id),
|
|||
|
|
username TEXT UNIQUE NOT NULL,
|
|||
|
|
display_name TEXT,
|
|||
|
|
phone TEXT,
|
|||
|
|
company_id UUID REFERENCES companies(id),
|
|||
|
|
is_master BOOLEAN DEFAULT false,
|
|||
|
|
master_id UUID REFERENCES auth.users(id),
|
|||
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- 启用RLS
|
|||
|
|
ALTER TABLE companies ENABLE ROW LEVEL SECURITY;
|
|||
|
|
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### B. 技术架构图
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 前端层 │
|
|||
|
|
│ React 18 + TypeScript + TailwindCSS + Framer Motion │
|
|||
|
|
└────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
▼ HTTP/HTTPS
|
|||
|
|
┌────────────────────────────────────────────────────────────┐
|
|||
|
|
│ API网关层 │
|
|||
|
|
│ Supabase REST API / Realtime │
|
|||
|
|
└────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 数据层 │
|
|||
|
|
│ PostgreSQL + Row Level Security + Realtime Subscription │
|
|||
|
|
└────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档版本**:V1.0.0
|
|||
|
|
**最后更新**:2025年05月
|
|||
|
|
**编制单位**:[您的单位名称]
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*本说明书版权归软件著作权人所有,未经许可不得复制、传播。*
|