Files
STP/docs/architecture/详细设计/供应商招标报名模块.md
weiwen_ye 637105cf64 docs: 重构供应商招标报名模块详细设计文档
主要变更:
- 新增报名全流程 Mermaid 流程图,覆盖供应商端、STP平台内部及外部系统交互
- 重构页面流转图,简化登录验证流程,突出报名信息确认核心环节
- 重新设计报名信息确认页 SVG 原型,字段改为从 SRM 自动读取(只读),
  增加投标标段多选、业绩证明材料管理(上传/档案复用)功能
- 新增提交成功反馈页面 SVG 原型
- 新增业绩证明材料管理规则(首次上传归入档案、后续自动调出、去重等)
- 简化状态机,新增 BID_PLAN_PASSED 状态,明确招标方案评审通过后才触发缴费
- 补充报名审核通过通知模板
- 删除报名表单字段定义附录(字段已在页面元素定义表中体现)
- 移除冗余性能要求描述,精简安全要求
- 文件变更:+319 行,-122 行
2026-07-01 12:19:11 +08:00

430 lines
22 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.
# 供应商招标报名模块
## 总体流程概述
供应商从获知招标公告到完成报名并获取投标资格,涉及**公告浏览 → 身份认证 → 报名申请 → 资质审核 → 费用缴纳 → 文件获取 → 投标文件上传**七大环节。本设计覆盖全流程的**页面交互**、**系统跳转**与**内部处理逻辑**,并充分复用现有 SRM 供应商库与统一认证体系。
```mermaid
%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#e91e63','lineColor':'#555','secondaryColor':'#f3f4f6'}}}%%
flowchart TD
subgraph 供应商端
A[浏览招标公告] --> B{是否已登录?}
B -- 是 --> D[点击“报名”]
B -- 否 --> C[登录/注册]
C --> D
D --> E[系统自动读取<br>联系人/手机号/营业执照]
E --> F[供应商确认信息并提交]
F --> G[报名提交成功<br>等待审核通知]
G --> H[收到审核结果通知]
H -- 通过 --> I[收到缴费通知<br>(招标方案评审通过后)]
H -- 不通过 --> J[查看拒绝原因]
J --> K{是否可重新提交?}
K -- 是 --> D
K -- 否 --> L[报名流程终止]
I --> M[进入缴费与投标环节<br>(后续流程)]
end
subgraph STP平台内部
STP1[接收报名请求] --> STP2[AI辅助资质审核<br>(核验已存证资质文件)]
STP2 --> STP3{是否需要人工评审?}
STP3 -- 是 --> STP4[推送人工评审任务]
STP3 -- 否 --> STP5[自动通过]
STP4 --> STP6[人工评审]
STP6 --> STP7[反馈结果]
STP5 --> STP8[更新报名状态]
STP7 --> STP8
STP8 --> STP9[形成报名通过单位名单]
STP9 --> STP10[发送审核结果通知]
STP10 --> STP11[等待招标方案评审通过]
STP11 -- 招标方案通过 --> STP12[发送缴费通知<br>解锁标书查看权限]
STP12 --> STP13[后续投标流程]
end
subgraph 外部系统
SRM[(SRM供应商库)]
OA[(OA审批系统)]
end
供应商端 -.-> STP平台内部
STP平台内部 -.-> SRM
STP平台内部 -.-> OA
SRM -- 供应商信息读取 --> STP2
OA -- 招标方案评审结果回调 --> STP11
```
## 页面流转与跳转设计
```mermaid
graph TD
A[招标公告详情页] -->|点击“立即报名”| B{登录检查}
B -->|未登录| C[登录/注册选择页]
C -->|选择登录方式| D[验证通过]
C -->|新用户注册| E[注册并同步至SRM]
E --> D
D --> F[报名信息确认页]
F -->|系统自动回填| G[联系人/手机号/营业执照<br>(只读展示,不可编辑)]
F -->|供应商可选择| H[投标标段(多选)]
F -->|供应商可填写| I[业绩简述/备注(可选)]
G --> J[确认信息并提交]
H --> J
I --> J
J --> K[报名提交成功页]
K --> L[等待审核通知(邮件/站内信)]
L --> M[审核通过/不通过通知]
M -->|不通过| N[查看原因,按需重新提交]
M -->|通过| O[报名通过名单公布<br>等待招标方案评审]
O --> P[招标方案通过→收到缴费通知]
P --> Q[进入后续缴费与投标环节]
style A fill:#fce4ec,stroke:#c2185b
style F fill:#e3f2fd,stroke:#1565c0
style K fill:#e8f5e9,stroke:#388e3c
style O fill:#fff3e0,stroke:#ff9800
```
## 系统交互时序图
```mermaid
sequenceDiagram
participant U as 供应商浏览器
participant STP as STP平台
participant SRM as SRM系统
participant OA as OA审批
participant Pay as 支付网关
participant AI as AI审核服务
U->>STP: 访问招标公告页面
STP-->>U: 展示公告内容
U->>STP: 点击“报名”
STP-->>U: 检测未登录,跳转登录页
U->>STP: 选择“使用SRM账号登录”
STP->>SRM: POST /api/v1/auth/login/for-stp {username, password}
SRM-->>SRM: 验证账号密码
SRM-->>STP: 200 { srmId, name, taxId, ... }
STP-->>STP: 建立本地会话,关联SRM ID
STP-->>U: 自动跳转至报名页
U->>STP: 填写报名表单 + 上传资质文件
STP->>AI: 启动AI初审(资质/风险/关联)
AI-->>STP: 初审意见(通过/警告/不通过)
alt 需要人工评审
STP->>STP: 生成待办任务
STP-->>U: 进入人工评审阶段
STP->>OA: 通知评审人员(站内/邮件)
OA-->>STP: 评审完成回调
else AI直接通过
STP-->>STP: 报名状态更新为“审核通过”
end
STP-->>U: 发送审核结果通知(邮件+站内信)
U->>STP: 查看缴费通知
STP-->>U: 展示缴费金额及支付方式
U->>Pay: 在线支付 / 上传银行凭证
Pay-->>STP: 异步通知支付结果(或凭证待确认)
STP->>OA: 发起财务确认审批(含凭证)
OA-->>STP: 审批通过(确认到账)
STP-->>U: 解锁招标文件下载权限
U->>STP: 下载招标文件
STP-->>U: 返回文件(加水印/加密)
U->>STP: 加密上传投标文件
STP->>STP: 文件哈希存证(区块链/哈希链)
STP->>SRM: 记录供应商投标状态(可选)
STP->>Archive: 归档报名材料
STP-->>U: 投标成功
```
## 招标报名页面:
```svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 820" font-family="'Microsoft YaHei', 'PingFang SC', sans-serif">
<defs>
<filter id="shadow" x="-5%" y="-5%" width="110%" height="110%">
<feDropShadow dx="0" dy="4" stdDeviation="6" flood-opacity="0.06"/>
</filter>
<filter id="hoverShadow" x="-5%" y="-5%" width="110%" height="110%">
<feDropShadow dx="0" dy="2" stdDeviation="4" flood-opacity="0.12"/>
</filter>
<linearGradient id="headerGrad" x1="0" y1="0" x2="1" y2="0">
<stop offset="0%" stop-color="#c2185b"/>
<stop offset="100%" stop-color="#e91e63"/>
</linearGradient>
<linearGradient id="btnGrad" x1="0" y1="0" x2="1" y2="0">
<stop offset="0%" stop-color="#c2185b"/>
<stop offset="100%" stop-color="#e91e63"/>
</linearGradient>
</defs>
<!-- 背景 -->
<rect width="1024" height="820" fill="#f5f7fa"/>
<!-- 顶部导航栏 -->
<rect width="1024" height="64" fill="#ffffff" stroke="#e8e8e8" stroke-width="1"/>
<circle cx="40" cy="32" r="16" fill="url(#headerGrad)"/>
<text x="64" y="38" font-size="20" font-weight="bold" fill="#c2185b">智慧招标平台</text>
<text x="760" y="38" font-size="14" fill="#666">欢迎,XX科技有限公司</text>
<rect x="880" y="18" width="36" height="36" rx="50%" fill="#f5f5f5"/>
<circle cx="898" cy="36" r="14" fill="#ccc"/>
<text x="898" y="40" font-size="12" fill="#666" text-anchor="middle"></text>
<!-- 面包屑 -->
<text x="120" y="100" font-size="13" fill="#999">首页</text>
<text x="155" y="100" font-size="13" fill="#999"></text>
<text x="175" y="100" font-size="13" fill="#999">招标公告</text>
<text x="255" y="100" font-size="13" fill="#999"></text>
<text x="275" y="100" font-size="13" fill="#c2185b" font-weight="bold">报名确认</text>
<!-- 步骤条 -->
<rect x="120" y="120" width="784" height="40" rx="8" fill="#ffffff" stroke="#e8e8e8"/>
<circle cx="170" cy="140" r="14" fill="#c2185b"/>
<text x="170" y="145" font-size="12" fill="#fff" text-anchor="middle" font-weight="bold">1</text>
<text x="192" y="145" font-size="14" fill="#c2185b" font-weight="bold">阅读公告</text>
<line x1="280" y1="140" x2="360" y2="140" stroke="#c2185b" stroke-width="2"/>
<circle cx="330" cy="140" r="14" fill="#c2185b"/>
<text x="330" y="145" font-size="12" fill="#fff" text-anchor="middle" font-weight="bold">2</text>
<text x="352" y="145" font-size="14" fill="#c2185b" font-weight="bold">确认报名</text>
<line x1="440" y1="140" x2="520" y2="140" stroke="#ddd" stroke-width="2"/>
<circle cx="490" cy="140" r="14" fill="#ddd"/>
<text x="490" y="145" font-size="12" fill="#999" text-anchor="middle">3</text>
<text x="512" y="145" font-size="14" fill="#999">审核</text>
<line x1="600" y1="140" x2="680" y2="140" stroke="#ddd" stroke-width="2"/>
<circle cx="650" cy="140" r="14" fill="#ddd"/>
<text x="650" y="145" font-size="12" fill="#999" text-anchor="middle">4</text>
<text x="672" y="145" font-size="14" fill="#999">后续环节</text>
<!-- 主卡片 -->
<rect x="120" y="180" width="784" height="590" rx="10" fill="#ffffff" filter="url(#shadow)"/>
<!-- 项目信息头部 -->
<rect x="120" y="180" width="784" height="56" rx="10" fill="url(#headerGrad)"/>
<rect x="120" y="220" width="784" height="16" fill="url(#headerGrad)"/>
<text x="150" y="216" font-size="18" font-weight="bold" fill="#fff">报名信息确认</text>
<!-- 项目信息条 -->
<rect x="150" y="250" width="724" height="44" rx="6" fill="#fce4ec"/>
<text x="170" y="278" font-size="14" fill="#c2185b" font-weight="bold">项目名称:</text>
<text x="270" y="278" font-size="14" fill="#333">2026年生产用原材料框架协议采购</text>
<text x="620" y="278" font-size="13" fill="#999">项目编号:BH-PROC-2026-0018</text>
<!-- 信息提示 -->
<rect x="150" y="308" width="724" height="30" rx="4" fill="#e3f2fd"/>
<text x="170" y="329" font-size="13" fill="#1565c0">📋 以下信息已从您的注册资料中自动读取,请核对</text>
<!-- 表单区域 -->
<!-- 公司名称 -->
<text x="150" y="368" font-size="14" fill="#555">公司名称</text>
<rect x="150" y="378" width="340" height="36" rx="4" fill="#f9f9f9" stroke="#e0e0e0"/>
<text x="165" y="402" font-size="14" fill="#333">XX科技有限公司</text>
<!-- 联系人 -->
<text x="530" y="368" font-size="14" fill="#555">联系人</text>
<rect x="530" y="378" width="340" height="36" rx="4" fill="#f9f9f9" stroke="#e0e0e0"/>
<text x="545" y="402" font-size="14" fill="#333">张三</text>
<!-- 联系电话 -->
<text x="150" y="438" font-size="14" fill="#555">联系电话</text>
<rect x="150" y="448" width="340" height="36" rx="4" fill="#f9f9f9" stroke="#e0e0e0"/>
<text x="165" y="472" font-size="14" fill="#333">138-0000-8888</text>
<!-- 电子邮件 -->
<text x="530" y="438" font-size="14" fill="#555">电子邮件</text>
<rect x="530" y="448" width="340" height="36" rx="4" fill="#f9f9f9" stroke="#e0e0e0"/>
<text x="545" y="472" font-size="14" fill="#333">zhangsan@xx-tech.com</text>
<!-- 投标标段 -->
<text x="150" y="518" font-size="14" fill="#555">投标标段 <tspan fill="#e53935">*</tspan></text>
<rect x="150" y="528" width="340" height="36" rx="4" fill="#fafafa" stroke="#d0d0d0"/>
<text x="170" y="552" font-size="14" fill="#333">☑ 标段A(原材料)</text>
<text x="330" y="552" font-size="14" fill="#333">☐ 标段B(辅料)</text>
<text x="490" y="552" font-size="14" fill="#333">☐ 标段C(包装)</text>
<!-- 业绩证明材料 -->
<text x="150" y="598" font-size="14" fill="#555">业绩证明材料</text>
<text x="290" y="598" font-size="12" fill="#999">(首次上传将自动归入用户档案,下次可复用)</text>
<!-- 上传区域 -->
<rect x="150" y="608" width="724" height="80" rx="6" stroke-dasharray="6,6" fill="#fafafa" stroke="#ccc"/>
<text x="512" y="640" font-size="14" fill="#999" text-anchor="middle">📤 点击或拖拽上传业绩证明材料</text>
<text x="512" y="665" font-size="12" fill="#bbb" text-anchor="middle">支持 PDF、DOC、JPG 格式,单个文件不超过 20MB</text>
<!-- 已有档案材料(复用) -->
<rect x="150" y="700" width="724" height="1" fill="#eee"/>
<text x="150" y="722" font-size="13" fill="#888">📂 从用户档案中选用已有材料:</text>
<rect x="150" y="732" width="200" height="28" rx="4" fill="#e8f5e9" stroke="#a5d6a7"/>
<text x="165" y="752" font-size="13" fill="#2e7d32">✅ 2025年业绩报告.pdf</text>
<rect x="362" y="732" width="28" height="28" rx="50%" fill="#ef5350"/>
<text x="376" y="752" font-size="14" fill="#fff" text-anchor="middle">×</text>
<rect x="400" y="732" width="180" height="28" rx="4" fill="#e8f5e9" stroke="#a5d6a7"/>
<text x="415" y="752" font-size="13" fill="#2e7d32">✅ 2024年合同.pdf</text>
<rect x="592" y="732" width="28" height="28" rx="50%" fill="#ef5350"/>
<text x="606" y="752" font-size="14" fill="#fff" text-anchor="middle">×</text>
<!-- 按钮 -->
<rect x="150" y="780" width="100" height="38" rx="6" fill="#e8e8e8"/>
<text x="200" y="805" font-size="14" fill="#666" text-anchor="middle">返回</text>
<rect x="650" y="780" width="160" height="38" rx="6" fill="url(#btnGrad)" filter="url(#hoverShadow)"/>
<text x="730" y="805" font-size="14" fill="#fff" text-anchor="middle" font-weight="bold">确认提交报名</text>
<text x="650" y="818" font-size="11" fill="#999">提交后不可修改</text>
</svg>
```
## 页面元素定义表
| 序号 | 字段名称 | 数据来源 | 可编辑性 | 说明 |
| --- | ---------- | --------- | ---- | ---------------------------- |
| 1 | **项目名称** | 系统自动带入 | 只读 | 显示拟报名的投标项目名称 |
| 2 | **项目编号** | 系统自动带入 | 隐藏字段 | 内部项目编号,用于后台关联,页面不展示 |
| 3 | **公司名称** | SRM注册信息 | 只读 | 统一社会信用代码对应的企业全称 |
| 4 | **联系人** | SRM注册信息 | 只读 | 供应商主联系人姓名 |
| 5 | **联系电话** | SRM注册信息 | 只读 | 供应商注册手机号 |
| 6 | **电子邮件** | SRM注册信息 | 只读 | 供应商注册邮箱 |
| 7 | **投标标段** | 系统配置 | 可多选 | 仅当项目分标段时显示;可多选或全选 |
| 8 | **业绩证明材料** | 上传 / 用户档案 | 可编辑 | 首次上传自动归入用户档案,下次自动调出;用户可删除或新增 |
## 提交成功反馈页面
```svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 600" font-family="'Microsoft YaHei', 'PingFang SC', sans-serif">
<defs>
<filter id="shadow" x="-5%" y="-5%" width="110%" height="110%">
<feDropShadow dx="0" dy="4" stdDeviation="8" flood-opacity="0.08"/>
</filter>
<linearGradient id="successGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#e8f5e9"/>
<stop offset="100%" stop-color="#f1f8e9"/>
</linearGradient>
</defs>
<rect width="1024" height="600" fill="#f5f7fa"/>
<!-- 顶部导航 -->
<rect width="1024" height="56" fill="#ffffff" stroke="#e8e8e8" stroke-width="1"/>
<text x="40" y="38" font-size="20" font-weight="bold" fill="#c2185b">智慧招标平台</text>
<!-- 成功卡片 -->
<rect x="262" y="80" width="500" height="420" rx="12" fill="#ffffff" filter="url(#shadow)"/>
<!-- 成功图标 -->
<circle cx="512" cy="170" r="50" fill="#4caf50"/>
<path d="M485 170 L505 190 L545 150" stroke="#fff" stroke-width="6" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="512" y="260" font-size="24" font-weight="bold" fill="#333" text-anchor="middle">报名提交成功!</text>
<text x="512" y="300" font-size="15" fill="#666" text-anchor="middle">您的报名申请已提交,请耐心等待审核。</text>
<rect x="330" y="320" width="364" height="36" rx="6" fill="#fff8e1"/>
<text x="512" y="344" font-size="13" fill="#f57c00" text-anchor="middle">📌 审核结果将通过站内信、邮件、短信通知,请注意查收</text>
<!-- 分隔线 -->
<line x1="330" y1="370" x2="694" y2="370" stroke="#eee" stroke-width="1"/>
<!-- 快捷操作 -->
<text x="512" y="400" font-size="14" fill="#888" text-anchor="middle">您还可以:</text>
<rect x="330" y="415" width="160" height="36" rx="6" fill="#f5f5f5" stroke="#ddd"/>
<text x="410" y="439" font-size="14" fill="#555" text-anchor="middle">📋 查看我的报名</text>
<rect x="510" y="415" width="160" height="36" rx="6" fill="#f5f5f5" stroke="#ddd"/>
<text x="590" y="439" font-size="14" fill="#555" text-anchor="middle">📄 返回招标公告</text>
<rect x="362" y="468" width="300" height="36" rx="6" fill="#c2185b"/>
<text x="512" y="492" font-size="14" fill="#fff" text-anchor="middle" font-weight="bold">进入个人中心查看报名状态</text>
</svg>
```
## 业绩证明材料管理规则
```mermaid
flowchart LR
subgraph 首次报名
A[上传业绩材料] --> B[提交报名]
B --> C[系统自动归入<br>用户档案]
end
subgraph 后续报名
D[进入报名页] --> E[系统自动调出<br>用户档案材料]
E --> F{用户操作}
F -->|选用已有| G[直接使用]
F -->|删除| H[从本次报名移除<br>(档案中保留)]
F -->|新增| I[上传新材料]
I --> J[归入档案]
G --> K[提交报名]
H --> K
J --> K
end
```
|规则|说明|
|---|---|
|**首次上传**|用户上传的业绩材料在报名提交后,系统自动复制一份归入用户档案(用户档案表),标记来源为“报名上传”|
|**后续复用**|用户进入报名页时,系统从用户档案中读取历史业绩材料,以列表形式展示,用户可直接选用|
|**删除**|用户在本次报名中删除某材料,仅从本次报名清单移除,用户档案中仍保留,不影响后续使用|
|**新增**|用户上传新材料,归入档案的同时也纳入本次报名,后续报名可继续复用|
|**去重**|系统按文件名+哈希值去重,同一文件不重复存储|
### 提交成功(邮件/站内信)
|项目|内容|
|---|---|
|**标题**|【STP平台】报名提交成功通知|
|**正文**|尊敬的 XX科技有限公司: <br> <br>您对【2026年生产用原材料框架协议采购(标段A)】的报名已成功提交。 <br> <br>我们将对您的报名资格进行审核,审核结果将通过邮件和站内信通知您,请耐心等待。 <br> <br>如需查看报名状态,请登录STP平台“我的报名”页面。 <br> <br>🔗 [https://stp.bhtz.com/my-registrations](https://stp.bhtz.com/my-registrations)|
## 状态机与内部处理逻辑
| 状态码 | 状态名称 | 描述 | 触发动作 |
| ----------------- | ------ | --------------- | ----------------------- |
| `DRAFT` | 草稿 | 供应商正在查看报名页,尚未提交 | 保存草稿 |
| `SUBMITTED` | 已提交 | 确认提交报名,等待审核 | 触发AI初审,生成审核任务 |
| `AI_PASS` | AI自动通过 | 资质审核通过 | 进入“报名通过名单”候选池 |
| `MANUAL_REVIEW` | 人工评审中 | 需采购/供应商管理专员确认 | 推送待办,超时催办 |
| `REJECTED` | 审核不通过 | 资质不符/存在风险 | 发送拒绝原因,允许在截止前重新提交 |
| `APPROVED` | 报名通过 | 审核通过,已纳入报名通过名单 | **等待招标方案评审通过**(此处为关键状态) |
| `BID_PLAN_PASSED` | 招标方案通过 | 招标方案已过审 | **发送缴费通知**,进入后续流程 |
| `CANCELLED` | 已取消 | 供应商主动取消 | 归档取消记录 |
## 关键业务规则与异常处理
| 场景 | 处理方式 |
| ------------------------ | --------------------------------------- |
| **同一供应商重复报名** | 系统检测到同一税号或统一信用代码的供应商已报名,提示“已报名,不能重复提交”。 |
| **资质文件大小/格式不符** | 前端限制 + 后端二次校验,不符合时返回明确错误提示。 |
| **报名截止时间已过** | 按钮置灰,提示“报名已截止”,不允许新提交。 |
| **==联合体投标(待确定,留扩展接口)==** | 允许在报名时添加联合体成员(需分别提供资质),系统自动校验成员关联关系。 |
| **无感登录票据过期** | 跳转时若票据超时,提示“登录状态已过期,请重新登录”,跳转至登录页。 |
| | |
## 通知与提醒策略
| 触发事件 | 通知方式 | 接收方 |
| --------------- | ----------------- | ----- |
| 审核通过/不通过 | 站内信 + 邮件 | 供应商 |
| 缴费提醒(含截止时间) | 站内信 + 邮件 + 短信(可选) | 供应商 |
| 财务确认到账 | 站内信 | 供应商 |
| 招标文件可下载 | 站内信 + 邮件 | 供应商 |
| 投标截止前24h/1h | 站内信 + 邮件 | 供应商 |
| 人工评审任务待办 | 站内信 + 邮件 | 评审人员 |
| 财务审批待办 | 站内信 + 邮件 | 财务人员 |
| 系统异常告警(支付回调失败等) | 飞书/短信 | 系统管理员 |
### 报名审核通过 → 缴费通知
| 项目 | 内容 |
| ------ | ----------------------------------------------------------------------------------------------------------------------------------- |
| **标题** | 【STP平台】报名审核通过通知 |
| **正文** | 尊敬的 XX科技有限公司: <br>您对【2026年生产用原材料框架协议采购(标段A)】的报名已通过审核,已纳入本项目报名通过名单。 请及时登录STP平台查看和下载招标文件。<br> <br>如有疑问,请联系招标专员:王工 010-8888xxxx<br> |
## 性能与安全要求
- **并发报名**:支持单项目100+供应商同时报名,响应时间≤3秒。
- **文件上传**:支持断点续传,单个文件≤500MB,总大小≤2GB。
- **数据加密**:报名表单中的联系人手机号、身份证号采用字段级加密存储
- **日志审计**:所有报名操作(登录、提交、审核、缴费)均记录审计日志,保留≥7年。