Files
STP/docs/architecture/详细设计/供应商招标报名模块.md
T

233 lines
13 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.
# 供应商招标报名模块
## 总体流程概述
供应商从获知招标公告到完成报名并获取投标资格,涉及**公告浏览 → 身份认证 → 报名申请 → 资质审核 → 费用缴纳 → 文件获取 → 投标文件上传**七大环节。本设计覆盖全流程的**页面交互**、**系统跳转**与**内部处理逻辑**,并充分复用现有 SRM 供应商库与统一认证体系。
## 页面流转与跳转设计
```mermaid
graph TD
A[招标公告详情页] -->|点击“立即报名”| B{登录检查}
B -->|未登录| C[登录/注册选择页]
C -->|选择“STP账号登录”| D[STP登录表单]
C -->|选择“SRM账号登录”| E[SRM登录表单(无感验证)]
D --> F[验证通过 → 跳转报名页]
E -->|调用SRM验证接口| F
C -->|选择“新用户注册”| G[注册表单]
G -->|提交注册| H[注册成功 → 自动登录 → 跳转报名页]
F --> I[报名信息填写页]
I -->|填写基本信息+上传资质| J[预览确认页]
J -->|提交| K[报名提交成功页(等待审核)]
K -->|审核通过(邮件通知)| L[缴费通知页]
L -->|选择支付方式| M[在线支付/上传凭证]
M -->|支付完成| N[缴费确认中]
N -->|财务确认到账| O[招标文件下载页]
O -->|下载文件| P[投标文件上传页]
P -->|加密上传| Q[上传成功页]
Q -->|等待开标| R[我的项目列表(状态已报名)]
style A fill:#fce4ec,stroke:#c2185b,stroke-width:2px
style K fill:#e8f5e9,stroke:#388e3c
style Q fill:#e8f5e9,stroke:#388e3c
style R fill:#e3f2fd,stroke:#1565c0
```
## 系统交互时序图
```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 720" font-family="'Microsoft YaHei', sans-serif">
<!-- 背景 -->
<rect width="1024" height="720" fill="#f5f7fa"/>
<!-- 顶部导航栏 -->
<rect width="1024" height="64" fill="#ffffff" stroke="#e0e0e0" stroke-width="1"/>
<text x="24" y="40" font-size="20" font-weight="bold" fill="#c2185b">智慧招标平台</text>
<text x="750" y="40" font-size="14" fill="#666">欢迎,XX科技公司</text>
<rect x="880" y="20" width="100" height="30" rx="4" fill="#f44336" />
<text x="920" y="40" font-size="13" fill="#fff" text-anchor="middle">退出</text>
<!-- 步骤条 -->
<rect x="120" y="80" width="784" height="40" rx="6" fill="#fff" stroke="#e0e0e0"/>
<text x="180" y="105" font-size="14" fill="#c2185b" font-weight="bold">① 阅读公告</text>
<text x="330" y="105" font-size="14" fill="#c2185b" font-weight="bold">② 报名信息</text>
<text x="480" y="105" font-size="14" fill="#999">③ 资质审核</text>
<text x="630" y="105" font-size="14" fill="#999">④ 缴纳费用</text>
<text x="780" y="105" font-size="14" fill="#999">⑤ 投标文件</text>
<!-- 连线 -->
<line x1="240" y1="95" x2="320" y2="95" stroke="#c2185b" stroke-width="2"/>
<line x1="400" y1="95" x2="470" y2="95" stroke="#ccc" stroke-width="2"/>
<line x1="550" y1="95" x2="620" y2="95" stroke="#ccc" stroke-width="2"/>
<line x1="700" y1="95" x2="770" y2="95" stroke="#ccc" stroke-width="2"/>
<!-- 主表单卡片 -->
<rect x="120" y="140" width="784" height="520" rx="8" fill="#ffffff" filter="url(#shadow)"/>
<text x="150" y="180" font-size="18" font-weight="bold" fill="#333">报名信息填写</text>
<text x="150" y="205" font-size="14" fill="#888">项目:2026年生产用原材料采购(标段A)</text>
<line x1="150" y1="220" x2="874" y2="220" stroke="#eee" stroke-width="1"/>
<!-- 表单字段 -->
<text x="150" y="260" font-size="14" fill="#333">联系人姓名 <tspan fill="red">*</tspan></text>
<rect x="150" y="270" width="200" height="32" rx="4" fill="#fafafa" stroke="#ccc"/>
<text x="160" y="292" font-size="13" fill="#999">请输入联系人</text>
<text x="420" y="260" font-size="14" fill="#333">手机号 <tspan fill="red">*</tspan></text>
<rect x="420" y="270" width="200" height="32" rx="4" fill="#fafafa" stroke="#ccc"/>
<text x="430" y="292" font-size="13" fill="#999">请输入手机号</text>
<text x="150" y="330" font-size="14" fill="#333">投标标段(可多选)</text>
<rect x="150" y="340" width="300" height="32" rx="4" fill="#fafafa" stroke="#ccc"/>
<text x="160" y="362" font-size="13" fill="#999">☑ 标段A ☐ 标段B ☐ 标段C</text>
<text x="150" y="400" font-size="14" fill="#333">上传营业执照 <tspan fill="red">*</tspan></text>
<rect x="150" y="410" width="400" height="80" rx="4" stroke-dasharray="5,5" fill="#fafafa" stroke="#ccc"/>
<text x="280" y="445" font-size="13" fill="#999" text-anchor="middle">点击或拖拽上传(支持 PDF/JPG,≤10MB</text>
<text x="280" y="470" font-size="12" fill="#aaa" text-anchor="middle">已上传:0个文件</text>
<text x="150" y="520" font-size="14" fill="#333">业绩证明材料(可选)</text>
<rect x="150" y="530" width="400" height="60" rx="4" stroke-dasharray="5,5" fill="#fafafa" stroke="#ccc"/>
<text x="280" y="565" font-size="13" fill="#999" text-anchor="middle">点击上传合同/业绩报告</text>
<!-- 按钮区 -->
<rect x="150" y="610" width="120" height="36" rx="4" fill="#e0e0e0"/>
<text x="210" y="634" font-size="14" fill="#666" text-anchor="middle">返回</text>
<rect x="600" y="610" width="160" height="36" rx="4" fill="#c2185b"/>
<text x="680" y="634" font-size="14" fill="#fff" text-anchor="middle">提交报名</text>
<text x="630" y="655" font-size="12" fill="#888">* 提交后不可修改,请仔细核对</text>
<!-- 阴影定义 -->
<defs>
<filter id="shadow" x="-5%" y="-5%" width="110%" height="110%">
<feDropShadow dx="0" dy="4" stdDeviation="6" flood-opacity="0.06"/>
</filter>
</defs>
</svg>
```
## 状态机与内部处理逻辑
| 状态码 | 状态名称 | 描述 | 触发动作 |
| -------------------- | ------ | ------------------- | --------------------- |
| `DRAFT` | 草稿 | 供应商正在填写报名表单,尚未提交 | 保存草稿,允许修改 |
| `PENDING_REVIEW` | 待审核 | 提交报名后,等待AI初审或人工评审 | 触发AI审核;若需人工,则生成评审任务 |
| `AI_PASS` | AI自动通过 | 资质齐全,无风险,直接通过 | 发送审核通过通知,生成缴费单 |
| `MANUAL_REVIEW` | 人工评审中 | 需采购部门/供应商管理专员人工确认 | 推送待办至相关人员,超时催办 |
| `REJECTED` | 审核不通过 | 资质不符或存在风险,被驳回 | 发送拒绝原因,允许重新提交(在报名截止前) |
| `PENDING_PAYMENT` | 待缴费 | 审核通过,等待缴纳标书费/保证金 | 生成缴费单,发送缴费通知 |
| `PAYMENT_CONFIRMING` | 缴费确认中 | 供应商已上传凭证,等待财务确认 | 发起OA审批,财务确认到账 |
| `PAYMENT_FAILED` | 缴费失败 | 超时未缴或财务确认为未到账 | 取消报名资格,释放名额 |
| `PAID` | 已缴费 | 缴费成功,招标文件已解锁 | 开放文件下载权限,记录缴费信息 |
| `BID_SUBMITTED` | 已投标 | 投标文件加密上传完成 | 存证哈希,报名流程结束 |
| `CANCELLED` | 已取消 | 供应商主动取消报名,或项目废标导致失效 | 退回保证金(如有),归档取消记录 |
## 关键业务规则与异常处理
| 场景 | 处理方式 |
| ------------------------ | ------------------------------------------------------------------ |
| **标书费/保证金支付超时** | 系统在截止时间前24h/12h/1h 三级催办;超时自动取消报名资格并释放名额。 |
| **同一供应商重复报名** | 系统检测到同一税号或统一信用代码的供应商已报名,提示“已报名,不能重复提交”。 |
| **资质文件大小/格式不符** | 前端限制 + 后端二次校验,不符合时返回明确错误提示。 |
| **报名截止时间已过** | 按钮置灰,提示“报名已截止”,不允许新提交。 |
| **==联合体投标(待确定,留扩展接口)==** | 允许在报名时添加联合体成员(需分别提供资质),系统自动校验成员关联关系。 |
| **无感登录票据过期** | 跳转时若票据超时,提示“登录状态已过期,请重新登录”,跳转至登录页。 |
| **财务确认超时** | 系统自动催办财务审批人;若超时,支持招标专员手动确认(需备注理由)。 |
| **==投标文件加密方式(待确定)==** | 沿用系统统一加密方案(平台端加解密),同时为供应商提供“个人加密”选项(开关),若选个人加密则生成独立密钥,开标时需供应商在线解密。 |
## 通知与提醒策略
| 触发事件 | 通知方式 | 接收方 |
| --------------- | ----------------- | ----- |
| 审核通过/不通过 | 站内信 + 邮件 | 供应商 |
| 缴费提醒(含截止时间) | 站内信 + 邮件 + 短信(可选) | 供应商 |
| 财务确认到账 | 站内信 | 供应商 |
| 招标文件可下载 | 站内信 + 邮件 | 供应商 |
| 投标截止前24h/1h | 站内信 + 邮件 | 供应商 |
| 人工评审任务待办 | 站内信 + 邮件 | 评审人员 |
| 财务审批待办 | 站内信 + 邮件 | 财务人员 |
| 系统异常告警(支付回调失败等) | 飞书/短信 | 系统管理员 |
## 性能与安全要求
- **并发报名**:支持单项目100+供应商同时报名,响应时间≤3秒。
- **文件上传**:支持断点续传,单个文件≤500MB,总大小≤2GB。
- **数据加密**:报名表单中的联系人手机号、身份证号采用字段级加密存储
- **防机器人**:报名提交时增加图形验证码或行为验证,防止恶意刷单。
- **日志审计**:所有报名操作(登录、提交、审核、缴费)均记录审计日志,保留≥7年。
## 附录:报名表单字段定义
| 字段名 | 类型 | 必填 | 说明 |
| --------------------- | ------ | --- | --------------------------------- |
| `projectId` | String | 是 | 招标项目ID,自动带入 |
| `bidSection` | Array | 是 | 投标标段(多选) |
| `contactName` | String | 是 | 联系人姓名 |
| `contactPhone` | String | 是 | 手机号,需短信验证(可选) |
| `contactEmail` | String | 是 | 邮箱 |
| `qualificationFiles` | Array | 是 | 资质文件列表(营业执照、资质证书、授权书等),每个文件需有类型标签 |
| `performanceFiles` | Array | 否 | 业绩证明文件 |
| `jointVentureMembers` | Array | 否 | 联合体成员列表(供应商ID+名称+税号) |
| `remarks` | String | 否 | 备注 |