Files
STP/docs/architecture/详细设计/新用户注册模块.md
T

21 KiB
Raw Blame History

新用户注册模块

新用户注册包含了供应商注册模块外部专家注册模块

供应商注册页面要素:

  • 企业全称
  • 统一社会信用代码
  • 注册资本(万元)
  • 法定代表人
  • 行业
  • 地址
  • 经营范围
  • 主要产品
  • 联系人姓名
  • 联系电话(手机号)
  • 电子邮箱
  • 营业执照

供应商注册模块

外部专家注册模块

1. 模块概述

1.1 建设目标

建立面向社会外部评标专家的在线注册、准入审核与档案管理体系,实现专家信息的结构化采集、AI辅助资质核验、回避关系预审,并与后续的专家抽取、智能匹配、在线评标、劳务报酬结算全流程贯通。

1.2 设计原则

原则 说明
信息完备 采集字段覆盖专业能力、执业资格、回避关系、收款账户等全维度。
隐私保护 身份证号、手机号、银行账户等敏感信息采用字段级加密存储(内存级密钥)。
统一身份 注册完成后自动生成STP平台账号,支持手机号/邮箱登录,无需二次注册。

1.3 适用角色与场景

角色 场景
外部专家申请人 通过招标门户“专家注册”入口提交申请,查询审核进度。
专家管理员(招标专员) 在后台审核专家资料、处理回避申报、激活/驳回/冻结专家账户。
合规审计人员 查阅专家注册审计轨迹、关联关系图谱。
AI 审核服务 自动执行OCR识别、证件验真。

2. 页面布局与 UI 设计

2.1 整体注册流程步骤条

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 120" font-family="'Microsoft YaHei', sans-serif">
  <rect width="1000" height="120" fill="#f8f9fc" rx="8"/>
  
  <!-- 步骤条背景 -->
  <rect x="50" y="40" width="900" height="40" rx="20" fill="#fff" stroke="#e0e4ec"/>
  
  <!-- 步骤1:已激活 -->
  <circle cx="140" cy="60" r="18" fill="#c2185b"/>
  <text x="140" y="66" text-anchor="middle" font-size="14" fill="#fff" font-weight="bold">1</text>
  <text x="140" y="100" text-anchor="middle" font-size="13" fill="#c2185b" font-weight="bold">基本信息</text>
  
  <!-- 连接线1 -->
  <line x1="158" y1="60" x2="232" y2="60" stroke="#c2185b" stroke-width="3"/>
  
  <!-- 步骤2:进行中 -->
  <circle cx="250" cy="60" r="18" fill="#c2185b"/>
  <text x="250" y="66" text-anchor="middle" font-size="14" fill="#fff" font-weight="bold">2</text>
  <text x="250" y="100" text-anchor="middle" font-size="13" fill="#c2185b" font-weight="bold">专业资质</text>
  
  <!-- 连接线2 -->
  <line x1="268" y1="60" x2="562" y2="60" stroke="#e0e4ec" stroke-width="3"/>
    
  <!-- 步骤5 -->
  <circle cx="580" cy="60" r="18" fill="#e0e4ec"/>
  <text x="580" y="66" text-anchor="middle" font-size="14" fill="#8895aa">5</text>
  <text x="580" y="100" text-anchor="middle" font-size="13" fill="#8895aa">提交审核</text>

  <!-- 提示文字 -->
  <text x="900" y="35" text-anchor="end" font-size="12" fill="#8895aa">* 带红色星号均为必填项</text>
</svg>

2.2 注册主表单页面

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1100 900" font-family="'Microsoft YaHei', 'PingFang SC', sans-serif">
  <defs>
    <filter id="shadowLight" x="-2%" y="-2%" width="104%" height="104%">
      <feDropShadow dx="0" dy="4" stdDeviation="8" flood-color="#000" flood-opacity="0.04"/>
    </filter>
    <linearGradient id="brandGrad" x1="0%" y1="0%" x2="100%" y2="100%">
      <stop offset="0%" stop-color="#c2185b"/>
      <stop offset="100%" stop-color="#e91e63"/>
    </linearGradient>
  </defs>

  <!-- 背景 -->
  <rect width="1100" height="900" fill="#f5f7fa"/>
  
  <!-- 主卡片 -->
  <rect x="80" y="30" width="940" height="840" rx="16" fill="#fff" filter="url(#shadowLight)"/>
  
  <!-- 标题区 -->
  <text x="120" y="80" font-size="22" font-weight="bold" fill="#1a2332">外部专家注册</text>
  <text x="120" y="108" font-size="14" fill="#8895aa">请完整填写以下信息,所有数据将受到严格加密保护</text>
  <line x1="120" y1="125" x2="980" y2="125" stroke="#f0f2f7" stroke-width="2"/>

  <!-- ===== 第一行:姓名 + 性别 ===== -->
  <text x="120" y="170" font-size="14" fill="#4a5568">真实姓名 <tspan fill="#e91e63">*</tspan></text>
  <rect x="120" y="180" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
  <text x="135" y="206" font-size="14" fill="#b0bbcc">请输入中文姓名</text>

  <text x="430" y="170" font-size="14" fill="#4a5568">性别 <tspan fill="#e91e63">*</tspan></text>
  <rect x="430" y="180" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
  <text x="445" y="206" font-size="14" fill="#b0bbcc">请选择</text>
  <path d="M 670 200 L 678 208 L 686 200" stroke="#b0bbcc" stroke-width="2" fill="none"/>

  <!-- ===== 第二行:身份证号(脱敏提示) ===== -->
  <text x="120" y="250" font-size="14" fill="#4a5568">身份证号码 <tspan fill="#e91e63">*</tspan></text>
  <rect x="120" y="260" width="420" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
  <text x="135" y="286" font-size="14" fill="#b0bbcc">请输入18位身份证号</text>
  <text x="560" y="286" font-size="12" fill="#8895aa">🔒 将使用AES-256加密存储</text>

  <!-- ===== 第三行:出生日期(自动计算) ===== -->
  <text x="120" y="330" font-size="14" fill="#4a5568">出生日期</text>
  <rect x="120" y="340" width="260" height="40" rx="6" fill="#f5f6fa" stroke="#e0e4ec"/>
  <text x="135" y="366" font-size="14" fill="#b0bbcc">由身份证自动识别</text>
  <text x="430" y="330" font-size="14" fill="#4a5568">年龄</text>
  <rect x="430" y="340" width="260" height="40" rx="6" fill="#f5f6fa" stroke="#e0e4ec"/>
  <text x="445" y="366" font-size="14" fill="#b0bbcc">自动计算</text>

  <!-- ===== 第四行:手机号 + 邮箱 ===== -->
  <text x="120" y="410" font-size="14" fill="#4a5568">手机号码 <tspan fill="#e91e63">*</tspan></text>
  <rect x="120" y="420" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
  <text x="135" y="446" font-size="14" fill="#b0bbcc">请输入手机号</text>

  <text x="430" y="410" font-size="14" fill="#4a5568">电子邮箱 <tspan fill="#e91e63">*</tspan></text>
  <rect x="430" y="420" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
  <text x="445" y="446" font-size="14" fill="#b0bbcc">请输入常用邮箱</text>

  <!-- ===== 第五行:工作单位 + 职务 ===== -->
  <text x="120" y="490" font-size="14" fill="#4a5568">工作单位</text>
  <rect x="120" y="500" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
  <text x="135" y="526" font-size="14" fill="#b0bbcc">请输入单位全称</text>

  <text x="430" y="490" font-size="14" fill="#4a5568">现从事专业 <tspan fill="#e91e63">*</tspan></text>
  <rect x="430" y="500" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
  <text x="445" y="526" font-size="14" fill="#b0bbcc">如:化工工艺、设备管理</text>

  <!-- ===== 第六行:职称 ===== -->
  <text x="120" y="570" font-size="14" fill="#4a5568">技术职称 <tspan fill="#e91e63">*</tspan></text>
  <rect x="120" y="580" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
  <text x="135" y="606" font-size="14" fill="#b0bbcc">高级/副高级/中级/初级</text>
  <rect x="440" y="580" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
  <text x="455" y="606" font-size="14" fill="#b0bbcc">职称专业(如:化工工程)</text>

  <!-- ===== 第七行:文件上传(资质证书) ===== -->
  <text x="120" y="660" font-size="14" fill="#4a5568">职称/资质证书扫描件 <tspan fill="#e91e63">*</tspan></text>
  <rect x="120" y="670" width="560" height="70" rx="6" stroke-dasharray="6,4" fill="#fafbfc" stroke="#c2185b"/>
  <text x="400" y="700" text-anchor="middle" font-size="14" fill="#c2185b">📄 点击上传或拖拽文件(支持 PDF/JPG/PNG,≤20MB</text>
  <text x="400" y="725" text-anchor="middle" font-size="12" fill="#8895aa">已上传:职称证.pdf (2.3MB)  <tspan fill="#4caf50">✅ 识别完成</tspan></text>

  <!-- ===== 底部按钮 ===== -->
  <line x1="120" y1="770" x2="980" y2="770" stroke="#f0f2f7" stroke-width="2"/>
  
  <rect x="740" y="790" width="120" height="40" rx="6" fill="#e0e4ec"/>
  <text x="800" y="816" text-anchor="middle" font-size="14" fill="#8895aa">上一步</text>
  
  <rect x="880" y="790" width="140" height="40" rx="6" fill="url(#brandGrad)"/>
  <text x="950" y="816" text-anchor="middle" font-size="14" font-weight="bold" fill="#fff">下一步 →</text>

  <!-- 右侧信息浮窗 -->
  <rect x="720" y="140" width="260" height="180" rx="8" fill="#fff3e0" stroke="#ffcc80"/>
  <text x="740" y="168" font-size="14" font-weight="bold" fill="#e65100">📌 注册须知</text>
  <text x="740" y="195" font-size="12" fill="#bf360c">1. 所有信息须与身份证及职称证书一致</text>
  <text x="740" y="218" font-size="12" fill="#bf360c">2. 集团公司将对信息进行真实性核验</text>
  <text x="740" y="241" font-size="12" fill="#bf360c">3. 入库专家须遵守《评委管理规定》</text>
  <text x="740" y="264" font-size="12" fill="#bf360c">4. 个人信息变更需及时在线更新</text>
  <text x="740" y="287" font-size="12" fill="#bf360c">5. 评审回避要求详见本章程4.7条</text>
</svg>

4. 核心流程时序图

sequenceDiagram
    participant U as 专家申请人
    participant FE as STP前端
    participant GW as API网关
    participant RegSvc as 注册服务
    participant AISvc as AI审核服务
    participant IDSvc as 身份认证服务(外部)
    participant DB as 专家库数据库
    participant Admin as 专家管理员
    participant Notify as 通知服务

    U->>FE: 填写注册表单 + 上传证件
    FE->>FE: 前端校验(非空/手机格式/身份证校验位)
    FE->>GW: POST /api/v1/expert/register
    GW->>RegSvc: 转发请求

    RegSvc->>DB: 校验身份证号是否已注册(防重)
    alt 已存在
        DB-->>RegSvc: 记录已存在
        RegSvc-->>FE: 409 Conflict { message: "该身份证已注册" }
    else 未注册
        RegSvc->>AISvc: 异步启动AI审核任务(OCR+验真+图谱)
        RegSvc-->>FE: 202 Accepted { applicationId: "EXP_2024001" }
        FE-->>U: 显示“提交成功,审核中...”

        AISvc->>IDSvc: 调用公安接口校验身份证号与姓名
        IDSvc-->>AISvc: 实名验证通过/失败
        
        AISvc->>AISvc: OCR识别职称证书关键字段
        AISvc->>AISvc: 扫描企业关联图谱(回避关系)
        
        AISvc-->>RegSvc: 返回AI审核结论(Pass/Review/Reject
        
        alt AI高风险或敏感
            RegSvc->>DB: 状态更新为 PENDING_MANUAL
            RegSvc->>Admin: 推送待办任务(站内+邮件)
            Admin->>RegSvc: POST /api/v1/expert/audit { action: approve/reject }
        else AI低风险
            RegSvc->>DB: 状态更新为 APPROVED(自动)
        end

        RegSvc->>DB: 生成专家档案(EXP_XXXXX
        RegSvc->>RegSvc: 创建STP登录账号(默认手机号+随机密码)
        RegSvc->>Notify: 发送激活通知(含账号及首次登录链接)
        Notify-->>U: 短信+邮件
        U->>FE: 点击激活链接
        FE->>RegSvc: POST /api/v1/expert/activate { password }
        RegSvc->>DB: 更新密码哈希(Argon2id
        RegSvc-->>FE: 激活成功,跳转至专家工作台
    end

5. 数据模型设计

5.1 外部专家主表 t_expert_profile

字段名 类型 约束 说明
expert_id VARCHAR(32) PK 专家档案编号(EXP_YYYYMMDD_XXX
user_id VARCHAR(32) FK 关联STP用户账号表(登录凭证)
real_name VARCHAR(64) NOT NULL 真实姓名
id_card_no VARCHAR(256) NOT NULL, UNIQUE 身份证号(字段级加密存储
gender TINYINT 1-男,2-女
birth_date DATE 出生日期(由身份证提取)
phone VARCHAR(256) NOT NULL 手机号(字段级加密)
email VARCHAR(128) NOT NULL 电子邮箱
company VARCHAR(128) 工作单位
profession VARCHAR(64) NOT NULL 从事专业
title VARCHAR(32) NOT NULL 职称等级(高级/副高/中级)
title_major VARCHAR(64) 职称专业
qualification_files JSON 资质证书文件URL列表(含OCR元数据)
bank_name VARCHAR(64) 开户银行
bank_account VARCHAR(256) 银行账号(字段级加密)
expertise_tags JSON 擅长领域标签(用于智能匹配)
status VARCHAR(20) NOT NULL DRAFT/PENDING_AI/PENDING_MANUAL/REJECTED/APPROVED/ACTIVATED/LOCKED
ai_audit_report JSON AI审核报告(含评分、风险点)
manual_audit_comment TEXT 人工审核备注
declaration_signed BOOLEAN DEFAULT 0 是否签署回避声明
created_at DATETIME 注册时间
updated_at DATETIME 更新时间
activated_at DATETIME 首次激活时间

5.2 回避声明表 t_expert_declaration

字段名 类型 约束 说明
declaration_id VARCHAR(32) PK 声明编号
expert_id VARCHAR(32) FK 专家ID
declaration_type VARCHAR(32) 定期声明/项目专项声明
content JSON 逐项勾选记录
signed_at DATETIME 签署时间
ip_address VARCHAR(64) 签署IP
valid_until DATETIME 有效期(通常1年)

5.3 审核记录表 t_expert_audit_log

字段名 类型 约束 说明
audit_id VARCHAR(32) PK
expert_id VARCHAR(32) FK
auditor VARCHAR(64) 审核人(AI/人工)
action VARCHAR(20) APPROVE/REJECT/REQUEST_INFO
reason TEXT 原因
attachments JSON 附件URL
created_at DATETIME

6. 接口详细定义

6.1 提交注册申请

项目 内容
路径 /api/v1/expert/register
方法 POST
认证 否(公开接口,需图形验证码)

请求体(部分字段)

{
  "realName": "王建国",
  "idCardNo": "110101199003074477",
  "gender": 1,
  "phone": "13800138000",
  "email": "wangjianguo@example.com",
  "company": "清华大学化工系",
  "profession": "化学工程",
  "title": "SENIOR",           // SENIOR/VICE_SENIOR/MIDDLE/JUNIOR
  "titleMajor": "化学工程",
  "expertiseTags": ["石油化工", "反应工程", "分离技术"],
  "bankName": "中国银行北京分行",
  "bankAccount": "6217850000000000",
  "qualificationFiles": [
    {
      "fileName": "professor_cert.pdf",
      "fileUrl": "https://oss.stp.com/...",
      "ocrResult": { "title": "教授", "issueDate": "2018-06" }
    }
  ],
  "declarations": {
    "noAffiliation": true,
    "noInvestment": true,
    "noConsulting": true,
    "acceptDiscipline": true
  },
  "captchaToken": "a1b2c3d4"
}

成功响应(异步)

{
  "code": "0",
  "data": {
    "applicationId": "EXP_20260628_001",
    "status": "PENDING_AI",
    "estimatedTime": "预计24小时内完成初审"
  }
}

6.2 查询审核进度

项目 内容
路径 /api/v1/expert/application/status
方法 GET
参数 applicationId / idCardNo(二选一)

6.3 专家激活(首次设置密码)

项目 内容
路径 /api/v1/expert/activate
方法 POST

请求体

{
  "applicationId": "EXP_20260628_001",
  "password": "Abcd@2026#",
  "confirmPassword": "Abcd@2026#"
}

6.4 后台专家审核(管理员)

项目 内容
路径 /api/v1/admin/expert/audit
方法 POST
认证 需 ADMIN/EXPERT_MANAGER 角色

请求体

{
  "applicationId": "EXP_20260628_001",
  "action": "APPROVE",        // APPROVE / REJECT / REQUEST_INFO
  "reason": "职称证书已验证,资质符合要求",
  "notifyExpert": true
}

7. AI 赋能详细设计

AI 能力 实现方式 输出 优先级
身份证 OCR 解析 调用OCR服务(如百度/阿里)提取姓名、号码、有效期,自动回填表单。 结构化字段 P0
实名认证 对接公安部CTID接口核验身份证号与姓名一致性。 通过/不通过 P0
职称证书验真 对接人社部/学信网接口(或基于图像防伪特征识别)验证证书真伪。 可信度评分 P1
利益冲突图谱 利用知识图谱匹配专家任职企业是否与集团供应商库/黑名单关联,输出风险等级(绿/黄/红)。 风险报告 P0
专业标签智能推荐 根据专家填写的从事专业与历史项目品类,自动匹配并推荐擅长的采购品类标签。 标签列表 P1
AI初审报告生成 汇总各项检查结果,生成带评分(0-100)的建议结论(自动通过/人工复核/拒绝)。 审核报告 P0

8. 业务规则与异常处理

场景 规则/处理方式
身份证号唯一性 系统全局唯一,已注册或审核中的身份证不得重复提交。
手机号/邮箱唯一性 同一手机号或邮箱仅能注册一次(支持找回账号)。
职称等级门槛 至少具备中级及以上职称方可入库(《评委管理规定》4.2.1)。
AI自动通过阈值 AI评分 ≥ 90 分且无高风险项 → 自动通过;60~89分 → 人工复核;<60分 → 自动驳回。
驳回后重提 允许在 30 天内修改后重新提交,保留历史审核记录供查。
虚假信息处理 一经发现虚假注册,永久拉入黑名单,并通报集团内各单位。
回避声明有效期 每年需重新签署一次,到期前30天系统自动催办。
敏感信息脱敏展示 后台管理中,身份证号显示为 110101********4477,银行账号显示为 ******0000
数据导出 支持按专家状态、专业分类、注册时间段导出加密Excel(需二次审批)。

9. 安全与合规设计

安全维度 落地措施
传输安全 全链路 HTTPS + TLS 1.3,文件上传使用预签名URL直传OSS。
敏感字段加密 身份证、手机号、银行账号使用 AES-256-GCM 应用层字段级加密,DEK内存漂移(见《需求说明书》4.2)。
防机器人 注册提交需通过图形验证码 + 滑动验证(极验/人机识别)。
密码策略 首次激活强制设置密码(长度≥8,含大写、小写、数字、特殊字符)。
审计日志 记录每次提交、审核、激活操作的IP、设备指纹、操作人,写入哈希链防篡改(见《需求说明书》4.8.1)。
个人信息保护 遵循《个人信息保护法》,注册前弹出《隐私政策》与《用户协议》,须勾选同意。

10. 通知策略矩阵

触发事件 通知方式 通知对象 文案要点
提交注册成功 站内信 申请人 已收到申请,预计24小时反馈
AI 审核不通过 邮件+短信 申请人 详细说明不通过原因及修改指引
转入人工审核 站内信+邮件 专家管理员 新专家待审核,附AI报告摘要
人工审核通过 邮件+短信 申请人 恭喜通过审核,请点击链接激活账号
账号激活成功 站内信 申请人 欢迎成为STP评标专家,可开始接受评标任务
回避声明临期 邮件 专家 请及时重新签署回避声明,否则无法参与评标
补充材料通知 邮件+短信 申请人 请于X月X日前补充如下材料...

11. 与整体架构的集成衔接

graph LR
    subgraph 专家生命周期
        A[注册申请] --> B[AI/人工审核]
        B --> C[生成账号]
        C --> D[激活登录]
        D --> E[专家抽取匹配]
        E --> F[在线评标]
        F --> G[劳务报酬结算]
    end
    
    subgraph 外围系统
        H[(专家库)]
        I[IAM/认证中心]
        J[支付系统]
        K[电子档案]
    end
    
    C --> I
    G --> J
    B --> K
    E --> H
    F --> H
    
    style A fill:#fce4ec,stroke:#c2185b
    style D fill:#e8f5e9,stroke:#388e3c

本详细设计已完整覆盖外部专家从注册入口、信息填报、AI+人工双轨审核、账号激活到后续业务衔接的全链路,严格遵循《评委管理规定》的准入标准,并深度集成平台现有安全体系与AI能力。如需调整字段或审核流层级,可进一步展开讨论。