Files
yunhaifinance/系统改造设计方案.md
T

999 lines
44 KiB
Markdown
Raw 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.
# 公司财务ERP系统 - 项目管理大改造设计方案
> 创建日期:2026-05-14
> 状态:设计方案已完成,待实施
---
## 一、改造目标
1. **施工进度与收款彻底分离** —— 两条独立轨道运行
2. **工程类型模板系统** —— 不同类型工程有不同施工阶段,支持串/并联
3. **施工进度推进简单化** —— 阶段确认 → 勾选完成,不绑定业务数据
4. **物资采购全流程** —— 采购申请→审批→订单→物流→现场收货,一条龙
5. **分包商事件评分** —— 事件记录加减分,初始100分
6. **历史数据批量补录** —— Excel导入 + source字段(统一收支表之后做)
---
## 二、导航结构(改造后)
```
🏠 工作台
📋 项目管理
├── 项目列表
└── 项目详情(7个Tab
├── 基本信息
├── 合同与收款
├── 分包管理
├── 材料管理(只读汇总)
├── 财务收支
├── 质保金
└── 施工日志
[进入施工管理 →]
💰 商谈报价
├── 商谈列表
├── 新建商谈
└── 商谈详情
🔨 施工管理(独立模块)
├── 施工总览
├── 施工进度(轻量确认台)
└── 施工日志
📝 财务申请
├── 预支申请
├── 付款申请
├── 报销申请
└── 核销申请
✅ 审批管理
├── 待审批
└── 待执行
📊 财务管理
├── 财务概览
├── 项目收支
├── 汇率管理
└── 预支核销状态
🛒 采购管理
├── 商品管理
├── 采购申请
├── 采购订单
├── 付款计划
└── 库存管理
🤝 合作伙伴
├── 供应商管理
├── 分包商管理
├── 客户管理
└── 物流管理
📈 报表分析
⚙️ 后台管理 /admin
├── 用户管理
├── 角色权限
├── 流程管理
├── 工程模板管理 ← 新增
├── 系统日志
├── 数据备份
└── 关于系统
```
---
## 三、数据库改造
### 3.1 新增表
#### 工程类型模板表
```sql
CREATE TABLE project_type_templates (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
phases JSONB NOT NULL DEFAULT '[]',
is_system BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
```
#### 项目施工阶段表
```sql
CREATE TABLE project_phases (
id SERIAL PRIMARY KEY,
project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE,
template_key VARCHAR(50),
phase_name VARCHAR(100) NOT NULL,
phase_order INTEGER NOT NULL,
phase_type VARCHAR(20) DEFAULT 'serial', -- 'serial' 串行 / 'parallel' 并行
depends_on INTEGER[], -- 依赖的阶段ID数组
status VARCHAR(20) DEFAULT 'pending', -- pending/in_progress/completed/skipped
started_at TIMESTAMP,
completed_at TIMESTAMP,
completed_by INTEGER REFERENCES users(id),
remark TEXT,
photos TEXT[],
sub_items JSONB DEFAULT '[]', -- 子项列表
created_at TIMESTAMP DEFAULT NOW()
);
```
#### 物流单表(代码已引用但表不存在!)
```sql
CREATE TABLE logistics_records (
id SERIAL PRIMARY KEY,
code VARCHAR(50) UNIQUE NOT NULL,
purchase_order_id INTEGER REFERENCES purchase_orders(id),
ship_from VARCHAR(100) DEFAULT 'China',
logistics_company_id INTEGER REFERENCES logistics_companies(id),
logistics_company VARCHAR(200),
tracking_number VARCHAR(100),
ship_date DATE,
ship_location VARCHAR(200),
estimated_arrival_date DATE, -- 预计送达日期
customs_arrival_date DATE, -- 到海关日期
customs_clearance_date DATE, -- 清关完成日期
use_hub BOOLEAN DEFAULT false, -- 是否需要中转仓
hub_arrival_date DATE, -- 到达中转仓日期
hub_receiver VARCHAR(100),
hub_verified_quantity BOOLEAN DEFAULT false,
second_ship_date DATE, -- 二次运输发车日期
primary_freight NUMERIC(15,2) DEFAULT 0, -- 头程运费(中国→老挝)
primary_freight_currency VARCHAR(10) DEFAULT 'CNY',
primary_freight_status VARCHAR(20) DEFAULT 'pending',
primary_freight_document TEXT,
secondary_freight NUMERIC(15,2) DEFAULT 0, -- 二次运费(到现场)
secondary_freight_currency VARCHAR(10) DEFAULT 'LAK',
secondary_freight_status VARCHAR(20) DEFAULT 'pending',
driver_phone VARCHAR(50),
cargo_weight NUMERIC(15,2),
transport_distance NUMERIC(15,2),
final_arrival_date DATE, -- 最终到达现场日期
final_location VARCHAR(200), -- 最终收货地点
status VARCHAR(20) DEFAULT 'pending', -- pending/in_transit/at_customs/at_hub/secondary/arrived
remark TEXT,
created_by INTEGER REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
```
#### 现场收货确认表
```sql
CREATE TABLE receiving_confirms (
id SERIAL PRIMARY KEY,
purchase_order_id INTEGER REFERENCES purchase_orders(id),
logistics_record_id INTEGER REFERENCES logistics_records(id),
confirm_date DATE DEFAULT CURRENT_DATE,
receiver_name VARCHAR(100), -- 收货人
receiver_phone VARCHAR(50),
received_location VARCHAR(200), -- 收货地点
is_complete BOOLEAN DEFAULT true, -- 是否全部到齐
missing_items TEXT, -- 缺失项描述
damage_items TEXT, -- 损坏项描述
photo_urls TEXT[], -- 收货照片
remark TEXT,
confirmed_by INTEGER REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW()
);
```
#### 分包商事件记录表
```sql
CREATE TABLE subcontractor_events (
id SERIAL PRIMARY KEY,
subcontractor_id INTEGER REFERENCES subcontractors(id),
project_id INTEGER REFERENCES projects(id),
event_type VARCHAR(10) NOT NULL, -- 'positive' / 'negative'
score_change INTEGER NOT NULL, -- 1~10 或 -10~-1
event_date DATE NOT NULL,
title VARCHAR(200) NOT NULL,
description TEXT,
created_by INTEGER REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW()
);
```
### 3.2 修改现有表
#### projects 表增加字段
```sql
ALTER TABLE projects ADD COLUMN type_template_id INTEGER;
ALTER TABLE projects ADD COLUMN current_phase VARCHAR(50);
ALTER TABLE projects ADD COLUMN phase_progress NUMERIC(5,2) DEFAULT 0;
```
#### purchase_orders 表增加字段
```sql
ALTER TABLE purchase_orders ADD COLUMN expected_delivery_date DATE;
ALTER TABLE purchase_orders ADD COLUMN receiving_status VARCHAR(20) DEFAULT 'pending';
-- receiving_status: pending/partial_received/received/verified
```
#### subcontractors 表增加字段
```sql
ALTER TABLE subcontractors ADD COLUMN score INTEGER DEFAULT 100;
ALTER TABLE subcontractors ADD COLUMN initial_score INTEGER DEFAULT 100;
```
---
## 四、物资采购完整流程
### 4.1 流程图
```
采购申请(选择项目、供应商、商品明细)
↓ 提交审批
审批管理 → 审批通过
↓ 生成采购订单
采购订单(确认商品、数量、价格)
↓ 创建物流单
物流单(选择物流公司、预计送达日期)
├─ 头程运输:中国仓库 → 老挝海关 → 中转仓
│ 填写:发货日期、预计到海关日期、清关日期
│ 填写:头程运费
├─ 中转仓(可选)
│ 填写:到达中转仓日期、验货数量
├─ 二次运输:中转仓 → 项目现场
│ 填写:发车日期、司机电话、运费
│ 填写:预计到达现场日期
└─ 现场收货确认
拍照、检查数量质量、确认到齐/缺失/损坏
↓ 确认收货
库存记录更新(入库 → 项目库存)
项目详情 → 材料管理Tab(自动汇总显示)
```
### 4.2 页面结构
#### 采购订单详情页(多Tab布局)
```
┌─────────────────────────────────────────────────────────┐
│ 采购订单详情 PO202605140001 状态:已确认 │
├─────────────────────────────────────────────────────────┤
│ [基本信息] [商品明细] [物流信息] [验收记录] [付款计划] │
│ │
│ ┌─ 基本信息 ───────────────────────────────────────┐ │
│ │ 订单编号:PO202605140001 │ │
│ │ 所属项目:老挝川圹22kV项目 │ │
│ │ 供应商: XX电气设备公司 │ │
│ │ 预计送达:[2025-03-15 ] │ │
│ │ 收货状态:⏳待收货 │ │
│ │ │ │
│ │ [确认订单] [取消订单] │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 物流信息 ───────────────────────────────────────┐ │
│ │ 物流单号:LR202605140001 │ │
│ │ 物流公司:[XX国际物流 ▼] │ │
│ │ │ │
│ │ 头程运输(中国→老挝): │ │
│ │ 发货地: [云南昆明 ] │ │
│ │ 发货日期:[2025-02-20 ] │ │
│ │ 预计到海关:[2025-02-25 ] │ │
│ │ 清关日期:[2025-03-01 ] │ │
│ │ 头程运费:[8,000] CNY │ │
│ │ │ │
│ │ ☐ 需要中转仓 │ │
│ │ 到达中转仓:[2025-03-02 ] │ │
│ │ 中转仓验货:[数量无误 ☑] │ │
│ │ │ │
│ │ 二次运输(中转仓→现场): │ │
│ │ 发车日期:[2025-03-03 ] │ │
│ │ 司机电话:[020 12345678 ] │ │
│ │ 二次运费:[1,500,000] LAK │ │
│ │ 预计到达现场:[2025-03-05] │ │
│ │ │ │
│ │ [更新物流信息] │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ ┌─ 验收记录(现场收货确认)────────────────────────┐ │
│ │ 收货日期:[2025-03-05 ] │ │
│ │ 收货人: [张三 ] │ │
│ │ 收货地点:[川圹省项目现场 ] │ │
│ │ │ │
│ │ 收货状态:● 全部到齐 ○ 部分到齐 ○ 未到货 │ │
│ │ │ │
│ │ 缺失项:(选填) │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 缺少绝缘子50个 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 损坏项:(选填) │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 无 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 📷 收货照片: │ │
│ │ [📷] [📷] [+上传] │ │
│ │ │ │
│ │ [确认收货] │ │
│ └────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
---
## 五、核心页面设计
### 5.1 项目详情页(7个Tab
```
┌─────────────────────────────────────────────────────────┐
│ ← 返回 老挝川圹22kV配电项目 ████████░░ 62% │
├─────────────────────────────────────────────────────────┤
│ [基本信息] [合同与收款] [分包管理] [材料管理] │
│ [财务收支] [质保金] [施工日志] │
│ │
│ 📍 施工进度:设备安装中(4/7阶段) │
│ [进入施工管理 →] │
├─────────────────────────────────────────────────────────┤
│ (Tab内容) │
└─────────────────────────────────────────────────────────┘
```
**Tab1 基本信息**:项目基础字段编辑(不变)
**Tab2 合同与收款**
- 合同基本信息(合同金额、结算方式、工期、质保金)
- 甲方收款计划(独立于施工进度)
- [编辑合同] [添加收款节点] [标记已收款]
**Tab3 分包管理**
- 分包合同列表(分包商、金额、已付款、待付款、状态、分数)
- 点击查看详情 ↓
```
┌─ 分包详情:李工班组 ────────────────────────────────┐
│ [合同信息] [付款记录] [事件记录] │
│ │
│ 综合评分:96分 ████████████░░░░ 初始分:100 │
│ │
│ 事件记录: │
│ ┌────┬──────┬──────┬─────┬─────────────────┐ │
│ │日期│类型 │分数 │累计 │事件 │ │
│ ├────┼──────┼──────┼─────┼─────────────────┤ │
│ │03-01│⚠️扣分│ -3 │ 97 │电杆基础垂直度不够│ │
│ │02-15│✅加分│ +5 │100 │提前完成土建 │ │
│ │01-20│⚠️扣分│ -5 │ 95 │工人到场迟到3天 │ │
│ │01-01│初始 │起始分│100 │初始分数 │ │
│ └────┴──────┴──────┴─────┴─────────────────┘ │
│ │
│ [+ 添加事件] │
└──────────────────────────────────────────────────────┘
```
**Tab4 材料管理**(只读汇总,数据来自采购管理系统):
```
┌─ 材料管理 ───────────────────────────────────────────┐
│ [订购汇总] [使用汇总] [退库汇总] │
│ │
│ 数据来自:采购管理→采购订单→物流→收货确认 │
│ │
│ ┌──────┬────┬──────┬──────┬────────┬────────┐ │
│ │材料 │单位│订购量│已到货│供应商 │状态 │ │
│ ├──────┼────┼──────┼──────┼────────┼────────┤ │
│ │电杆 │根 │ 50 │ 50 │XX供应商│✅到齐 │ │
│ │变压器│台 │ 2 │ 2 │YY供应商│✅到齐 │ │
│ │电缆 │米 │ 3000 │ 2500 │ZZ供应商│⏳部分 │ │
│ └──────┴────┴──────┴──────┴────────┴────────┘ │
│ │
│ [去采购管理 →] │
└───────────────────────────────────────────────────────┘
```
**Tab5 财务收支**(收支汇总视图):
- 合同金额、甲方回款、总支出、毛利
- 材料费/人工费/机械费/其他支出 饼图
- 收支明细列表
**Tab6 质保金**(不变)
**Tab7 施工日志**(不变)
### 5.2 施工管理 → 施工进度页(手机友好)
```
┌──────────────────────────┐
│ ← 返回 施工进度 │
│ │
│ 老挝川圹22kV配电项目 │
│ ██████████░░░░░░ 62% │
│ │
│ ①勘察 ②物资 ③土建 ④安装│
│ ✅ ✅ ✅ 🔵 │
│ │
│ 📍 当前:④ 设备安装 │
│ ┌───────────────────────┐ │
│ │ ☑ 变压器就位固定 │ │
│ │ ☐ 配电柜安装接线 │ │
│ │ ☐ 母线桥架安装 │ │
│ │ ☐ 接地系统完成 │ │
│ │ │ │
│ │ 备注:[ ]│ │
│ │ 📷 [拍照] │ │
│ │ │ │
│ │ [✅ 确认完成此阶段] │ │
│ └───────────────────────┘ │
│ │
│ 阶段历史: │
│ ✅ ③土建基础 02-10完成 │
│ ✅ ②物资采购 01-28完成 │
│ ✅ ①勘察设计 01-15完成 │
└──────────────────────────┘
```
### 5.3 施工总览页
```
┌─────────────────────────────────────────────────────────┐
│ 施工总览 2025年2月 │
│ │
│ 施工中:3个 | ⚠️ 延期风险:1个 │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 🔵 老挝川圹22kV 设备安装(4/7) ██████░░ 57% │ │
│ │ 收款:150K/500K(30%) [进入] │ │
│ ├──────────────────────────────────────────────────┤ │
│ │ 🔵 万象10kV线路 架线施工(5/7) ████████░░ 71% │ │
│ │ 收款:80K/300K(27%) ⚠️延期 [进入] │ │
│ ├──────────────────────────────────────────────────┤ │
│ │ 🟢 琅勃拉邦户表 安装施工(3/5) ██████░░░░ 60% │ │
│ │ 收款:50K/100K(50%) [进入] │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
---
## 六、工程模板设计器(后台管理)
### 6.1 页面路径
`/admin/process-templates`
### 6.2 模板列表页
```
┌─────────────────────────────────────────────────────────┐
│ 后台管理 / 工程模板管理 │
├─────────────────────────────────────────────────────────┤
│ │
│ 系统预设模板(不可删除,可复制) │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │配电安装│ │架空线路│ │电缆敷设│ │变电站 │ │小型工程│ │
│ │7阶段 │ │7阶段 │ │7阶段 │ │8阶段 │ │5阶段 │ │
│ │[查看] │ │[查看]│ │[查看]│ │[查看]│ │[查看]│ │
│ │[复制] │ │[复制]│ │[复制]│ │[复制]│ │[复制]│ │
│ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │
│ │
│ 自定义模板 │
│ ┌─────────────────────────────────────────────┐ │
│ │ 📋 老挝配电+线路混合 6阶段 [编辑] [删除] │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ [+ 新建模板] │
└─────────────────────────────────────────────────────────┘
```
### 6.3 新建/编辑模板
**第1步:基本信息**
```
模板名称:[ ]
模板描述:[ ]
```
**第2步:设计阶段**
```
┌─ 阶段列表 ───────────────────────────────────────────────┐
│ │
│ ① 勘察设计 串行 依赖:无 子项:勘察、设计、方案确认 │
│ [编辑] [↑] [↓] [删除] │
│ ──────────────────────────────────────────────────────── │
│ ② 物资采购 并行 依赖:① 子项:电杆、变压器、电缆... │
│ [编辑] [↑] [↓] [删除] │
│ ──────────────────────────────────────────────────────── │
│ ③ 土建基础 串行 依赖:① 子项:开挖、浇筑、接地 │
│ [编辑] [↑] [↓] [删除] │
│ │
│ [+ 添加阶段] │
└───────────────────────────────────────────────────────────┘
```
**点击[编辑]弹出抽屉:**
```
┌──────────────────────────────────────┐
│ 编辑阶段 [×] │
│ │
│ 阶段名称:[物资采购 ] │
│ 阶段类型:○ 串行 ● 并行 │
│ │
│ 依赖关系: │
│ ┌───────────────────────────┐ │
│ │ ☑ ①勘察设计 │ │
│ │ ☐ ③土建基础 │ │
│ └───────────────────────────┘ │
│ │
│ 子项列表: │
│ 1. 电杆采购 [×删除] │
│ 2. 变压器采购 [×删除] │
│ 3. 电缆采购 [×删除] │
│ [+ 添加子项] │
│ │
│ [取消] [保存] │
└──────────────────────────────────────┘
```
**第3步:预览确认**
```
阶段流程图预览:
①勘察设计 ──┬──→ ③土建基础 ──→ ④设备安装 ──→ ...
(串行) │ (串行)
└──→ ②物资采购 ──────────────────┘
(并行)
├ 电杆采购
├ 变压器采购
├ 电缆采购
└ 金具绝缘子采购
[确认创建模板]
```
---
## 七、创建项目流程改造
### 7.1 从商谈签约导入
```
商谈项目 → 签约 → 弹出签约窗口
→ 合同信息(不变)
→ 新增:选择工程类型模板 [配电安装 ▼]
→ 确认签约
→ 自动创建 projects 记录
→ 自动从模板复制阶段到 project_phases
```
### 7.2 手动新建项目
```
项目管理 → 新建项目
→ 步骤1:选择工程类型模板
[配电安装] [架空线路] [电缆敷设] [变电站] [小型工程] [自定义]
→ 步骤2:填写基本信息
→ 创建 → 自动从模板复制阶段
```
---
## 八、预算报价导入项目的处理
**保留原有流程**,增强:
在 budget.js 的 PUT /:id/sign 接口中:
1. 签约时要求传入 `type_template_id` 参数
2. 签约成功创建 projects 后,自动从模板复制阶段到 project_phases
---
## 九、数据补录方案(后续实施)
1. 先完成系统改造,统一收支表结构
2. 增加 `source` 字段标记数据来源(normal/import/summary
3. 设计 Excel 模板批量导入
4. 报表按分类汇总,不论来源
---
## 十、预设模板数据
### 模板1:配电安装工程
```
① 勘察设计(串行)- 无依赖
② 物资采购(并行)- 依赖① - 子项:电杆、变压器、配电柜、电缆、金具、绝缘子
③ 土建基础(串行)- 依赖① - 子项:基础开挖、基础浇筑、接地施工
④ 设备安装(串行)- 依赖②③ - 子项:变压器安装、配电柜安装、母线安装
⑤ 调试试验(串行)- 依赖④ - 子项:绝缘试验、耐压试验、保护调试
⑥ 竣工验收(串行)- 依赖⑤
⑦ 送电投运(串行)- 依赖⑥
```
### 模板2:架空线路工程
```
① 勘察设计(串行)- 无依赖
② 物资采购(并行)- 依赖① - 子项:电杆、导线、金具、绝缘子、避雷器
③ 基础施工(串行)- 依赖① - 子项:杆坑开挖、拉线坑开挖、基础浇筑
④ 杆塔组立(串行)- 依赖②③ - 子项:电杆组立、拉线安装
⑤ 架线施工(串行)- 依赖④ - 子项:放线、紧线、附件安装
⑥ 竣工验收(串行)- 依赖⑤
⑦ 送电投运(串行)- 依赖⑥
```
### 模板3:电缆敷设工程
```
...
```
### 模板4:变电站工程
```
...
```
### 模板5:小型工程
```
① 勘察设计(串行)
② 物资采购(并行)- 依赖①
③ 安装施工(串行)- 依赖②
④ 调试验收(串行)- 依赖③
⑤ 并网投运(串行)- 依赖④
```
---
## 十一、实施步骤
### 步骤1:创建缺失数据库表
```sql
-- 1. 物流单表(代码已引用,表未创建)
CREATE TABLE logistics_records (
id SERIAL PRIMARY KEY,
code VARCHAR(50) UNIQUE NOT NULL,
purchase_order_id INTEGER REFERENCES purchase_orders(id),
ship_from VARCHAR(100) DEFAULT 'China',
logistics_company_id INTEGER REFERENCES logistics_companies(id),
logistics_company VARCHAR(200),
tracking_number VARCHAR(100),
ship_date DATE,
ship_location VARCHAR(200),
estimated_arrival_date DATE,
customs_arrival_date DATE,
customs_clearance_date DATE,
use_hub BOOLEAN DEFAULT false,
hub_arrival_date DATE,
hub_receiver VARCHAR(100),
hub_verified_quantity BOOLEAN DEFAULT false,
second_ship_date DATE,
primary_freight NUMERIC(15,2) DEFAULT 0,
primary_freight_currency VARCHAR(10) DEFAULT 'CNY',
primary_freight_status VARCHAR(20) DEFAULT 'pending',
primary_freight_document TEXT,
secondary_freight NUMERIC(15,2) DEFAULT 0,
secondary_freight_currency VARCHAR(10) DEFAULT 'LAK',
secondary_freight_status VARCHAR(20) DEFAULT 'pending',
driver_phone VARCHAR(50),
cargo_weight NUMERIC(15,2),
transport_distance NUMERIC(15,2),
final_arrival_date DATE,
final_location VARCHAR(200),
status VARCHAR(20) DEFAULT 'pending',
remark TEXT,
created_by INTEGER REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 2. 现场收货确认表
CREATE TABLE receiving_confirms (
id SERIAL PRIMARY KEY,
purchase_order_id INTEGER REFERENCES purchase_orders(id),
logistics_record_id INTEGER REFERENCES logistics_records(id),
confirm_date DATE DEFAULT CURRENT_DATE,
receiver_name VARCHAR(100),
receiver_phone VARCHAR(50),
received_location VARCHAR(200),
is_complete BOOLEAN DEFAULT true,
missing_items TEXT,
damage_items TEXT,
photo_urls TEXT[],
remark TEXT,
confirmed_by INTEGER REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW()
);
-- 3. 工程类型模板表
CREATE TABLE project_type_templates (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
phases JSONB NOT NULL DEFAULT '[]',
is_system BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 4. 项目施工阶段表
CREATE TABLE project_phases (
id SERIAL PRIMARY KEY,
project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE,
template_key VARCHAR(50),
phase_name VARCHAR(100) NOT NULL,
phase_order INTEGER NOT NULL,
phase_type VARCHAR(20) DEFAULT 'serial',
depends_on INTEGER[],
status VARCHAR(20) DEFAULT 'pending',
started_at TIMESTAMP,
completed_at TIMESTAMP,
completed_by INTEGER REFERENCES users(id),
remark TEXT,
photos TEXT[],
sub_items JSONB DEFAULT '[]',
created_at TIMESTAMP DEFAULT NOW()
);
-- 5. 分包商事件记录表
CREATE TABLE subcontractor_events (
id SERIAL PRIMARY KEY,
subcontractor_id INTEGER REFERENCES subcontractors(id),
project_id INTEGER REFERENCES projects(id),
event_type VARCHAR(10) NOT NULL,
score_change INTEGER NOT NULL,
event_date DATE NOT NULL,
title VARCHAR(200) NOT NULL,
description TEXT,
created_by INTEGER REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW()
);
```
### 步骤2:修改现有表
```sql
-- projects 增加字段
ALTER TABLE projects ADD COLUMN IF NOT EXISTS type_template_id INTEGER;
ALTER TABLE projects ADD COLUMN IF NOT EXISTS current_phase VARCHAR(50);
ALTER TABLE projects ADD COLUMN IF NOT EXISTS phase_progress NUMERIC(5,2) DEFAULT 0;
-- purchase_orders 增加字段
ALTER TABLE purchase_orders ADD COLUMN IF NOT EXISTS expected_delivery_date DATE;
ALTER TABLE purchase_orders ADD COLUMN IF NOT EXISTS receiving_status VARCHAR(20) DEFAULT 'pending';
-- subcontractors 增加字段
ALTER TABLE subcontractors ADD COLUMN IF NOT EXISTS score INTEGER DEFAULT 100;
ALTER TABLE subcontractors ADD COLUMN IF NOT EXISTS initial_score INTEGER DEFAULT 100;
```
### 步骤3:插入预设模板数据
```sql
INSERT INTO project_type_templates (name, description, phases, is_system) VALUES
('配电安装工程', '配电安装项目的标准阶段划分', '[
{"order":1,"name":"勘察设计","type":"serial","depends":[],"sub_items":["现场勘察","图纸设计","方案确认"]},
{"order":2,"name":"物资采购","type":"parallel","depends":[1],"sub_items":["电杆采购","变压器采购","配电柜采购","电缆采购","金具采购","绝缘子采购"]},
{"order":3,"name":"土建基础","type":"serial","depends":[1],"sub_items":["基础开挖","基础浇筑","接地施工"]},
{"order":4,"name":"设备安装","type":"serial","depends":[2,3],"sub_items":["变压器安装","配电柜安装","母线安装"]},
{"order":5,"name":"调试试验","type":"serial","depends":[4],"sub_items":["绝缘试验","耐压试验","保护调试"]},
{"order":6,"name":"竣工验收","type":"serial","depends":[5],"sub_items":[]},
{"order":7,"name":"送电投运","type":"serial","depends":[6],"sub_items":[]}
]', true),
('架空线路工程', '架空线路项目的标准阶段划分', '[
{"order":1,"name":"勘察设计","type":"serial","depends":[],"sub_items":["线路勘察","图纸设计"]},
{"order":2,"name":"物资采购","type":"parallel","depends":[1],"sub_items":["电杆采购","导线采购","金具采购","绝缘子采购","避雷器采购"]},
{"order":3,"name":"基础施工","type":"serial","depends":[1],"sub_items":["杆坑开挖","拉线坑开挖","基础浇筑"]},
{"order":4,"name":"杆塔组立","type":"serial","depends":[2,3],"sub_items":["电杆组立","拉线安装"]},
{"order":5,"name":"架线施工","type":"serial","depends":[4],"sub_items":["放线","紧线","附件安装"]},
{"order":6,"name":"竣工验收","type":"serial","depends":[5],"sub_items":[]},
{"order":7,"name":"送电投运","type":"serial","depends":[6],"sub_items":[]}
]', true),
('电缆敷设工程', '电缆敷设项目的标准阶段划分', '[
{"order":1,"name":"勘察设计","type":"serial","depends":[],"sub_items":["现场勘察","图纸设计"]},
{"order":2,"name":"物资采购","type":"parallel","depends":[1],"sub_items":["电缆采购","接头附件采购","管材采购"]},
{"order":3,"name":"电缆沟开挖","type":"serial","depends":[1],"sub_items":["沟道开挖","排管敷设"]},
{"order":4,"name":"电缆敷设","type":"serial","depends":[2,3],"sub_items":["电缆敷设","电缆固定"]},
{"order":5,"name":"接头制作","type":"serial","depends":[4],"sub_items":["中间接头","终端接头"]},
{"order":6,"name":"试验验收","type":"serial","depends":[5],"sub_items":["绝缘试验","耐压试验"]},
{"order":7,"name":"送电投运","type":"serial","depends":[6],"sub_items":[]}
]', true),
('变电站工程', '变电站项目的标准阶段划分', '[
{"order":1,"name":"勘察设计","type":"serial","depends":[],"sub_items":["现场勘察","初步设计","施工图设计"]},
{"order":2,"name":"物资采购","type":"parallel","depends":[1],"sub_items":["主变压器采购","开关柜采购","保护装置采购","电缆采购"]},
{"order":3,"name":"土建施工","type":"serial","depends":[1],"sub_items":["场地平整","基础施工","建筑物施工"]},
{"order":4,"name":"一次设备安装","type":"serial","depends":[2,3],"sub_items":["变压器安装","开关柜安装","母线安装"]},
{"order":5,"name":"二次设备安装","type":"serial","depends":[4],"sub_items":["保护屏安装","控制电缆敷设","直流系统安装"]},
{"order":6,"name":"调试试验","type":"serial","depends":[5],"sub_items":["单体调试","系统联调","保护试验"]},
{"order":7,"name":"竣工验收","type":"serial","depends":[6],"sub_items":[]},
{"order":8,"name":"送电投运","type":"serial","depends":[7],"sub_items":[]}
]', true),
('小型工程(光伏/充电桩/户表等)', '小型项目的标准阶段划分', '[
{"order":1,"name":"勘察设计","type":"serial","depends":[],"sub_items":["现场勘察","方案设计"]},
{"order":2,"name":"物资采购","type":"parallel","depends":[1],"sub_items":["设备采购","材料采购"]},
{"order":3,"name":"安装施工","type":"serial","depends":[2],"sub_items":["设备安装","线路连接"]},
{"order":4,"name":"调试验收","type":"serial","depends":[3],"sub_items":["系统调试","验收检查"]},
{"order":5,"name":"并网投运","type":"serial","depends":[4],"sub_items":[]}
]', true);
```
### 步骤4:后端 —— 工程模板管理接口
创建 `/backend/routes/process-templates.js`
- `GET /api/process-templates` - 获取所有模板列表
- `GET /api/process-templates/:id` - 获取模板详情
- `POST /api/process-templates` - 创建自定义模板
- `PUT /api/process-templates/:id` - 更新自定义模板
- `DELETE /api/process-templates/:id` - 删除自定义模板(系统模板不可删)
- `POST /api/process-templates/:id/copy` - 复制模板(包括系统模板)
`app.js` 注册路由:
```javascript
app.use('/api/process-templates', require('./routes/process-templates'));
```
### 步骤5:后端 —— 项目阶段管理接口
修改 `/backend/routes/projects.js`,新增阶段相关接口:
- `GET /api/projects/:id/phases` - 获取项目的所有阶段
- `PUT /api/projects/:id/phases/:phaseId/complete` - 完成某个阶段
- `PUT /api/projects/:id/phases/:phaseId/reopen` - 重新打开某个阶段
- `PUT /api/projects/:id/phases/:phaseId/sub-item` - 更新子项状态
阶段完成时自动:
- 更新 `project_phases.status = 'completed'`
- 更新 `projects.current_phase` 为下一阶段
- 重新计算 `projects.phase_progress`
### 步骤6:后端 —— 物流管理接口
已存在 `/backend/routes/logistics.js`,但表 `logistics_records` 未创建。
- ✅ 步骤1中已创建表 → 直接可用
### 步骤7:后端 —— 收货确认接口
创建 `/backend/routes/receiving.js`
- `POST /api/receiving` - 创建收货确认
- `GET /api/receiving/:purchase_order_id` - 获取订单的收货记录
- `PUT /api/receiving/:id` - 更新收货信息
收货确认时自动:
- 更新 `purchase_orders.receiving_status`
- 更新 `inventory_records`(库存入库)
### 步骤8:后端 —— 分包商事件接口
修改 `/backend/routes/subcontractors.js`,新增:
- `GET /api/subcontractors/:id/events` - 获取分包商事件列表
- `POST /api/subcontractors/:id/events` - 添加事件
- `DELETE /api/subcontractors/:id/events/:eventId` - 删除事件
添加/删除事件时自动更新 `subcontractors.score`
### 步骤9:后端 —— 修改预算签约接口
修改 `/backend/routes/budget.js` 的 PUT /:id/sign
- 接收 `type_template_id` 参数
- 创建 projects 后,自动从模板复制阶段到 project_phases
### 步骤10:后端 —— 修改项目创建接口
修改 `/backend/routes/projects.js` 的 POST /
- 接收 `type_template_id` 参数
- 创建项目后,自动从模板复制阶段到 project_phases
### 步骤11:前端 —— 后台管理 → 工程模板设计器
新建文件:
- `/frontend/src/pages/admin/ProcessTemplates.tsx` - 模板列表页
- `/frontend/src/pages/admin/ProcessTemplateForm.tsx` - 模板新建/编辑页(三步向导)
在 AdminLayout 增加菜单项和路由。
### 步骤12:前端 —— 项目详情页重构
修改 `ProjectDetail.tsx`
- 重新组织为7个Tab(基本信息、合同与收款、分包管理、材料管理、财务收支、质保金、施工日志)
- Tab2 合同与收款:独立管理收款节点,与施工进度解耦
- Tab3 分包管理:增加事件记录和评分显示
- Tab4 材料管理:改为只读汇总,数据来自采购系统
- 顶部增加施工进度预览条 + "进入施工管理"按钮
### 步骤13:前端 —— 施工总览页(新建)
新建文件:
- `/frontend/src/pages/construction/ConstructionOverview.tsx`
功能:
- 显示所有"进行中"项目的施工进度条
- 当前阶段、收款比例
- 延期预警
- 点击进入施工进度页
### 步骤14:前端 —— 施工进度页(新建)
新建文件:
- `/frontend/src/pages/construction/ConstructionProgress.tsx`
功能:
- 手机友好的轻量确认台
- 阶段进度条(顶部)
- 当前阶段操作区(子项勾选、拍照、完成确认)
- 阶段历史折叠
### 步骤15:前端 —— 采购订单物流详情
修改 `PurchaseOrdersPage.tsx`
- 增加物流信息Tab(预计送达、物流公司、运输状态)
- 增加收货确认Tab(拍照、完整性检查)
### 步骤16:前端 —— 分包商管理增强
修改 `SubcontractorsPage.tsx``SubcontractorDetail.tsx`
- 分包商列表增加分数列
- 详情增加事件记录Tab
- 事件添加弹出表单(事件类型、分数变化、标题、描述)
### 步骤17:前端 —— 创建项目增加选模板步骤
修改 `ProjectsPage.tsx` 新建项目流程:
- 步骤1:选择工程类型模板
- 步骤2:填写基本信息
修改 `BudgetProjectDetail.tsx` 签约流程:
- 签约弹窗中增加模板选择
### 步骤18:前端 —— 施工日志调整
`ConstructionLog.tsx` → 从项目详情Tab中独立出来,也可以从施工总览页进入。
### 步骤19:前端 —— 菜单和路由更新
修改 `MainLayout.tsx`
- 施工管理菜单增加"施工总览"子项
- 调整菜单结构一致
修改 `App.tsx`
- 增加施工总览、施工进度、模板管理路由
### 步骤20:清理和验证
- 删除旧的 `construction/ConstructionList.tsx`(已被施工总览替代)
- 删除旧的 `construction/ConstructionMilestones.tsx`(已被施工进度替代)
- 全套测试:创建模板 → 创建项目 → 推进阶段 → 采购订单 → 物流 → 收货 → 分包评分
---
## 十二、预制数据
### 物流记录状态枚举
```
pending 待发货
in_transit 运输中
at_customs 海关清关中
at_hub 中转仓
secondary 二次运输中
arrived 已到达现场
```
### 项目状态枚举
```
planning 已立项
active 施工中
suspended 暂停
completed 已完工
```
### 阶段状态枚举
```
pending 待开始
in_progress 进行中
completed 已完成
skipped 已跳过
```