# 公司财务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       已跳过
```
