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

22 KiB
Raw Blame History

供应商招标报名模块

总体流程概述

供应商从获知招标公告到完成报名并获取投标资格,涉及公告浏览 → 身份认证 → 报名申请 → 资质审核 → 费用缴纳 → 文件获取 → 投标文件上传七大环节。本设计覆盖全流程的页面交互系统跳转内部处理逻辑,并充分复用现有 SRM 供应商库与统一认证体系。

%%{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

页面流转与跳转设计

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

系统交互时序图

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 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 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>

业绩证明材料管理规则

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科技有限公司:

您对【2026年生产用原材料框架协议采购(标段A)】的报名已成功提交。

我们将对您的报名资格进行审核,审核结果将通过邮件和站内信通知您,请耐心等待。

如需查看报名状态,请登录STP平台“我的报名”页面。

🔗 https://stp.bhtz.com/my-registrations

状态机与内部处理逻辑

状态码 状态名称 描述 触发动作
DRAFT 草稿 供应商正在查看报名页,尚未提交 保存草稿
SUBMITTED 已提交 确认提交报名,等待审核 触发AI初审,生成审核任务
AI_PASS AI自动通过 资质审核通过 进入“报名通过名单”候选池
MANUAL_REVIEW 人工评审中 需采购/供应商管理专员确认 推送待办,超时催办
REJECTED 审核不通过 资质不符/存在风险 发送拒绝原因,允许在截止前重新提交
APPROVED 报名通过 审核通过,已纳入报名通过名单 等待招标方案评审通过(此处为关键状态)
BID_PLAN_PASSED 招标方案通过 招标方案已过审 发送缴费通知,进入后续流程
CANCELLED 已取消 供应商主动取消 归档取消记录

关键业务规则与异常处理

场景 处理方式
同一供应商重复报名 系统检测到同一税号或统一信用代码的供应商已报名,提示“已报名,不能重复提交”。
资质文件大小/格式不符 前端限制 + 后端二次校验,不符合时返回明确错误提示。
报名截止时间已过 按钮置灰,提示“报名已截止”,不允许新提交。
==联合体投标(待确定,留扩展接口)== 允许在报名时添加联合体成员(需分别提供资质),系统自动校验成员关联关系。
无感登录票据过期 跳转时若票据超时,提示“登录状态已过期,请重新登录”,跳转至登录页。

通知与提醒策略

触发事件 通知方式 接收方
审核通过/不通过 站内信 + 邮件 供应商
缴费提醒(含截止时间) 站内信 + 邮件 + 短信(可选) 供应商
财务确认到账 站内信 供应商
招标文件可下载 站内信 + 邮件 供应商
投标截止前24h/1h 站内信 + 邮件 供应商
人工评审任务待办 站内信 + 邮件 评审人员
财务审批待办 站内信 + 邮件 财务人员
系统异常告警(支付回调失败等) 飞书/短信 系统管理员

报名审核通过 → 缴费通知

项目 内容
标题 【STP平台】报名审核通过通知
正文 尊敬的 XX科技有限公司:
您对【2026年生产用原材料框架协议采购(标段A)】的报名已通过审核,已纳入本项目报名通过名单。 请及时登录STP平台查看和下载招标文件。

如有疑问,请联系招标专员:王工 010-8888xxxx

性能与安全要求

  • 并发报名:支持单项目100+供应商同时报名,响应时间≤3秒。
  • 文件上传:支持断点续传,单个文件≤500MB,总大小≤2GB。
  • 数据加密:报名表单中的联系人手机号、身份证号采用字段级加密存储
  • 日志审计:所有报名操作(登录、提交、审核、缴费)均记录审计日志,保留≥7年。