zcui/saber3/docs/接口文档-自行招标流程.md

58 KiB
Raw Blame History

自行招标流程接口文档(含前端需求说明)

版本V1.3
日期2026-06-30
对应需求3.7.4 自行招标流程(完整流程:发起节点至投标方终报)


1. 需求概述

1.1 流程说明

自行招标流程包含以下前端页面:

页面 节点名称 节点编号 页面类型 说明
发起页面 招采发起人 3.7.4.1 表单填写 发起人填写招标信息,自动带出预招标数据
审批页面 招采负责人初审 3.7.4.2 表单编辑 招采负责人补充招标公告信息,上传文件
终审页面 总裁办负责人审批 3.7.4.3 审批节点 总裁办主任审核公告内容,终审通过
供应商报名页面 招采平台供应商报名入口 3.7.4.4 外部节点 供应商查看项目列表并报名
资质审核页面 供应商资质审核 3.7.4.5 审批节点 招采负责人审核供应商资质
开标页面 开标 3.7.4.6 执行节点 招采负责人确认签到数量并开标
投标页面 投标 3.7.4.6 执行节点 供应商签到、上传投标文件、填写报价
唱标页面 唱标 3.7.4.7 展示节点 展示投标方报价信息,生成唱标记录表
专家签到页面 专家签到 3.7.4.8 交互节点 专家线上签到并电子签署文件
专家评标页面 专家评标 3.7.4.9 评审节点 专家对投标方进行评分
资格认定表审批页面 资格认定表审批 3.7.4.10 审批节点 招采负责人审核资格认定表
供应商报价页面 供应商多轮报价 3.7.4.11/15 报价节点 入围供应商进行多轮报价(含终报)
出报价分页面 出报价分 3.7.4.12 计算节点 根据评分规则计算报价分
投票页面 投票页面 3.7.4.13 投票节点 业务部门进行投票选定入围供应商
确定入围供应商页面 确定入围供应商 3.7.4.14 确认节点 确认入围名单并通知供应商

说明:当前阶段已实现节点 3.7.4.1 和 3.7.4.2后续节点3.7.4.3-3.7.4.14)为待开发内容。

1.2 前端架构

  • 主页面PendingBidding.vue(已有)通过流程引擎挂载,根据节点名称动态加载子页面
  • 子页面:每个节点对应一个独立的 Vue 页面,通过 <component :is=""> 动态切换
  • 技术栈Vue 3 + Element Plus + Pinia + TypeScript
  • 附件:系统标准 MinIO 上传(el-upload + /api/bidding-self/upload
  • 时区所有时间统一东八区Asia/Shanghai
  • 防抖:按钮提交防抖 3 秒

2. 接口清单

2.1 基础接口(已实现)

序号 接口路径 方法 接口名称 说明
1 /api/bidding-self/pre-project/{id} GET 获取预招标项目信息 根据预招标项目ID获取详情
2 /api/bidding-self/draft POST 保存招标发起草稿 保存发起节点数据为草稿
3 /api/bidding-self/submit POST 提交招标发起 提交发起节点,状态置为已提交
4 /api/bidding-self/{id} GET 获取招标发起详情 根据ID获取完整详情
5 /api/bidding-self/{id}/update PUT 更新招采负责人数据 招采负责人填写/修改审批数据
6 /api/bidding-self/evaluation-principles GET 获取评标原则列表 获取后台配置的评标原则
7 /api/bidding-self/upload POST 文件上传 系统标准文件上传MinIO
8 /api/bidding-self/organization-tree GET 获取组织架构树 选择对接人时调用
9 /api/bidding-self/user-dept-list GET 获取用户部门列表 获取当前用户的所属部门及对应公司信息

2.2 后续流程接口(待开发)

序号 接口路径 方法 接口名称 对应节点 说明
10 /api/bidding-self/{id}/final-approval PUT 更新总裁办负责人数据 3.7.4.3 总裁办主任审核/修改审批数据
11 /api/bidding-self/registration/list GET 获取报名项目列表 3.7.4.4 供应商查看可报名项目
12 /api/bidding-self/registration/submit POST 提交报名 3.7.4.4 供应商提交报名信息
13 /api/bidding-self/registration/my GET 获取我的报名 3.7.4.4 查看已报名项目,返回报名信息及关联项目信息
14 /api/bidding-self/qualification/list GET 获取待审核供应商 3.7.4.5 招采负责人查看待审核供应商
15 /api/bidding-self/qualification/audit POST 审核供应商资质 3.7.4.5 审核供应商资质(入围/不入围)
16 /api/bidding-self/qualification/batch POST 批量审核 3.7.4.5 批量审核供应商资质
17 /api/bidding-self/bid/list GET 获取待投标项目 3.7.4.6 供应商查看待投标项目
18 /api/bidding-self/bid/sign POST 开标签到 3.7.4.6 供应商开标签到
19 /api/bidding-self/bid/submit POST 提交投标 3.7.4.6 供应商提交投标文件和报价
20 /api/bidding-self/bid/opening POST 开标 3.7.4.6 招采负责人开标
21 /api/bidding-self/bid/flow POST 流标 3.7.4.6 流标处理
22 /api/bidding-self/bid/sign-export GET 导出签到表 3.7.4.6 导出签到表Excel
23 /api/bidding-self/opening/list GET 获取唱标列表 3.7.4.7 获取投标方报价列表
24 /api/bidding-self/opening/record POST 生成唱标记录 3.7.4.7 生成唱标记录表
25 /api/bidding-self/opening/complete POST 唱标结束 3.7.4.7 确认唱标结束进入专家评标
26 /api/bidding-self/expert/sign POST 专家签到 3.7.4.8 专家线上签到
27 /api/bidding-self/expert/sign-file POST 上传签署文件 3.7.4.8 专家上传电子签署文件
28 /api/bidding-self/expert/audit POST 审核签署文件 3.7.4.8 招采负责人审核签署文件
29 /api/bidding-self/evaluation/list GET 获取待评标列表 3.7.4.9 获取待评标供应商
30 /api/bidding-self/evaluation/detail GET 获取投标方详情 3.7.4.9 查看投标方详情
31 /api/bidding-self/evaluation/score POST 提交评分 3.7.4.9 专家提交评分
32 /api/bidding-self/evaluation/cert POST 生成资质认定表 3.7.4.9 生成资格认定表
33 /api/bidding-self/qualification-cert/audit POST 审核资格认定表 3.7.4.10 审核资格认定表
34 /api/bidding-self/qualification-cert/notify POST 发送淘汰通知 3.7.4.10 发送淘汰通知
35 /api/bidding-self/quote/submit POST 提交报价 3.7.4.11/15 供应商提交报价
36 /api/bidding-self/quote/history GET 获取报价历史 3.7.4.11/15 查看历史报价
37 /api/bidding-self/score/calculate POST 计算报价分 3.7.4.12 计算报价分
38 /api/bidding-self/score/config GET 获取评分配置 3.7.4.12 获取评分方式配置
39 /api/bidding-self/vote/submit POST 提交投票 3.7.4.13 提交投票
40 /api/bidding-self/vote/result GET 获取投票结果 3.7.4.13 查看投票结果
41 /api/bidding-self/finalist/confirm POST 确认入围 3.7.4.14 确认入围名单
42 /api/bidding-self/finalist/notify POST 通知入围供应商 3.7.4.14 发送入围通知

3. 接口详细定义

3.1 获取预招标项目信息

GET /api/bidding-self/pre-project/{id}

请求参数

参数名 类型 必填 位置 说明
id Long Path 预招标项目ID

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "preBiddingId": 123456789,
    "applicantId": 10001,
    "applicantName": "张三",
    "applyTime": "2026-06-17 14:30:00",
    "contactPhone": "13800138000",
    "companyId": 100,
    "companyName": "XX股份有限公司",
    "planNo": "PL20260001",
    "projectCode": "PRJ20260001",
    "projectName": "办公设备采购项目",
    "projectType": "货物采购",
    "budgetAmount": 500000.00,
    "demandDeptId": 200,
    "demandDeptName": "行政部",
    "demandCompanyId": 100,
    "demandCompanyName": "XX股份有限公司",
    "projectContactId": 10002,
    "projectContactName": "李四",
    "evaluationGroupSource": "指定专家",
    "subjectList": [
      {
        "seqNo": 1,
        "materialName": "笔记本电脑",
        "materialCode": "MAT001",
        "specification": "ThinkPad X1 Carbon",
        "brand": "联想",
        "unit": "台",
        "referencePrice": 8999.00,
        "estimatedQuantity": 10,
        "estimatedUseTime": "2026-07-01",
        "amount": 89990.00,
        "contactPersonId": 10002,
        "contactPersonName": "李四",
        "demandDesc": "高性能办公笔记本电脑",
        "remark": "需预装正版Office"
      }
    ],
    "expertList": [
      {
        "expertId": 20001,
        "expertName": "王专家",
        "expertType": "appoint"
      }
    ]
  },
  "msg": "操作成功"
}

3.2 保存招标发起草稿

POST /api/bidding-self/draft

请求体BiddingSelfInitiateDTO

{
  "preBiddingId": 123456789,
  "contactPhone": "13800138000",
  "companyId": 100,
  "companyName": "XX股份有限公司",
  "registrationStartTime": "2026-06-20 09:00:00",
  "registrationEndTime": "2026-06-25 17:00:00",
  "bidStartTime": "2026-06-26 09:00:00",
  "bidEndTime": "2026-06-30 17:00:00",
  "bidMethod": "online",
  "bidOpeningTime": "2026-07-01 10:00:00",
  "evaluationPrinciple": "低价优先法",
  "evaluationPrincipleDesc": "即能够满足招标文件的各项要求,投标价格最低的投标即可作为中选投标。",
  "subjectList": [
    {
      "seqNo": 1,
      "materialName": "笔记本电脑",
      "materialCode": "MAT001",
      "specification": "ThinkPad X1 Carbon",
      "brand": "联想",
      "unit": "台",
      "referencePrice": 8999.00,
      "estimatedQuantity": 10,
      "estimatedUseTime": "2026-07-01",
      "amount": 89990.00,
      "contactPersonId": 10002,
      "contactPersonName": "李四",
      "demandDesc": "高性能办公笔记本电脑",
      "remark": "需预装正版Office"
    }
  ]
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "id": 987654321,
    "status": "DRAFT",
    "createTime": "2026-06-17 14:30:00"
  },
  "msg": "保存草稿成功"
}

3.3 提交招标发起

POST /api/bidding-self/submit

请求体:同保存草稿(字段完全一致)

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "id": 987654321,
    "status": "SUBMITTED",
    "createTime": "2026-06-17 14:30:00"
  },
  "msg": "提交成功"
}

说明:提交接口仅将状态从 DRAFT 改为 SUBMITTED不触发流程引擎。


3.4 获取招标发起详情

GET /api/bidding-self/{id}

请求参数

参数名 类型 必填 位置 说明
id Long Path 发起主表ID

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "id": 987654321,
    "preBiddingId": 123456789,
    "applicantId": 10001,
    "applicantName": "张三",
    "applyTime": "2026-06-17 14:30:00",
    "contactPhone": "13800138000",
    "companyId": 100,
    "companyName": "XX股份有限公司",
    "planNo": "PL20260001",
    "projectCode": "PRJ20260001",
    "projectName": "办公设备采购项目",
    "projectType": "货物采购",
    "budgetAmount": 500000.00,
    "demandDeptId": 200,
    "demandDeptName": "行政部",
    "demandCompanyId": 100,
    "demandCompanyName": "XX股份有限公司",
    "projectContactId": 10002,
    "projectContactName": "李四",
    "registrationStartTime": "2026-06-20 09:00:00",
    "registrationEndTime": "2026-06-25 17:00:00",
    "bidStartTime": "2026-06-26 09:00:00",
    "bidEndTime": "2026-06-30 17:00:00",
    "bidMethod": "online",
    "bidOpeningTime": "2026-07-01 10:00:00",
    "evaluationPrinciple": "低价优先法",
    "evaluationPrincipleDesc": "即能够满足招标文件的各项要求,投标价格最低的投标即可作为中选投标。",
    "evaluationGroupSource": "指定专家",
    "status": "SUBMITTED",
    "bidLocation": "",
    "bidContact": "",
    "noticeFile": null,
    "subjectList": [...],
    "expertList": [...]
  },
  "msg": "操作成功"
}

3.5 更新招采负责人数据

PUT /api/bidding-self/{id}/update

请求参数

参数名 类型 必填 位置 说明
id Long Path 发起主表ID

请求体BiddingSelfUpdateDTO

{
  "registrationStartTime": "2026-06-20 09:00",
  "registrationEndTime": "2026-06-25 17:00",
  "bidStartTime": "2026-06-26 09:00",
  "bidEndTime": "2026-06-30 17:00",
  "bidOpeningTime": "2026-07-01 10:00",
  "bidMethod": "online",
  "bidLocation": "",
  "bidContact": "张三13800138000zhangsan@example.com",
  "noticeFile": "[{\"name\":\"招标公告.pdf\",\"url\":\"/upload/2026/06/17/xxx.pdf\",\"size\":1024000}]"
}

说明noticeFile 字段是 JSON 字符串,存储 BladeFile 列表。附件先通过 /api/bidding-self/upload 上传,返回的 BladeFile 对象序列化后存入此字段。

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "id": 987654321,
    "status": "SUBMITTED",
    "updateTime": "2026-06-17 16:00:00"
  },
  "msg": "保存成功"
}

3.6 获取评标原则列表

GET /api/bidding-self/evaluation-principles

响应数据R<List>

{
  "code": 200,
  "success": true,
  "data": [
    {
      "code": "lowest_price",
      "name": "低价优先法",
      "description": "即能够满足招标文件的各项要求,投标价格最低的投标即可作为中选投标。"
    }
  ],
  "msg": "操作成功"
}

3.7 文件上传(系统标准)

POST /api/bidding-self/upload

请求参数

参数名 类型 必填 位置 说明
file MultipartFile FormData 文件

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "name": "招标公告.pdf",
    "url": "/upload/2026/06/17/xxx.pdf",
    "size": 1024000,
    "originalName": "招标公告.pdf",
    "contentType": "application/pdf"
  },
  "msg": "上传成功"
}

前端使用el-upload 组件action 为 /api/bidding-self/upload,上传成功后从响应中获取 BladeFile 对象。


3.8 获取组织架构树

GET /api/bidding-self/organization-tree

响应数据R<List>

{
  "code": 200,
  "success": true,
  "data": [
    {
      "id": 100,
      "name": "XX股份有限公司",
      "children": [
        {
          "id": 200,
          "name": "行政部",
          "children": [...]
        }
      ]
    }
  ],
  "msg": "操作成功"
}

3.9 获取用户部门列表

GET /api/bidding-self/user-dept-list

请求参数:无

响应数据R<List>

{
  "code": 200,
  "success": true,
  "data": [
    {
      "deptId": 200,
      "deptName": "行政部",
      "tenantId": 100,
      "tenantName": "XX股份有限公司",
      "isDefault": true
    },
    {
      "deptId": 201,
      "deptName": "采购部",
      "tenantId": 101,
      "tenantName": "YY子公司",
      "isDefault": false
    }
  ],
  "msg": "操作成功"
}

数据项说明

字段名 类型 说明
deptId Long 部门ID
deptName String 部门名称
tenantId Long 公司ID租户ID
tenantName String 公司名称
isDefault Boolean 是否默认部门,页面加载时默认选中该项

3.10 更新总裁办负责人数据

PUT /api/bidding-self/{id}/final-approval

请求参数

参数名 类型 必填 位置 说明
id Long Path 发起主表ID

请求体BiddingSelfFinalApprovalDTO

{
  "approvalOpinion": "同意发布招标公告",
  "noticeFile": "[{\"name\":\"招标公告.pdf\",\"url\":\"/upload/2026/06/17/xxx.pdf\",\"size\":1024000}]"
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "id": 987654321,
    "status": "SUBMITTED",
    "updateTime": "2026-06-17 16:00:00"
  },
  "msg": "保存成功"
}

说明:此接口仅更新总裁办负责人的审核意见和附件数据,不触发流程流转。审批同意/驳回操作由后续流程统一接口处理。


3.11 获取报名项目列表

GET /api/bidding-self/registration/list

请求参数:无

响应数据R<List>

{
  "code": 200,
  "success": true,
  "data": [
    {
      "projectCode": "PRJ20260001",
      "projectName": "办公设备采购项目",
      "projectType": "货物采购",
      "registrationStartTime": "2026-06-20 09:00:00",
      "registrationEndTime": "2026-06-25 17:00:00",
      "bidOpeningTime": "2026-07-01 10:00:00"
    }
  ],
  "msg": "操作成功"
}

3.12 提交报名

POST /api/bidding-self/registration/submit

请求体BiddingSelfRegistrationDTO

{
  "initiateId": 987654321,
  "supplierName": "XX科技有限公司",
  "contactName": "张三",
  "contactPhone": "13800138000",
  "contactEmail": "zhangsan@example.com",
  "qualificationFiles": "[{\"name\":\"营业执照.pdf\",\"url\":\"/upload/2026/06/20/license.pdf\"}]",
  "otherFiles": "[{\"name\":\"资质证书.pdf\",\"url\":\"/upload/2026/06/20/cert.pdf\"}]"
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "id": 111222,
    "initiateId": 987654321,
    "supplierName": "XX科技有限公司",
    "status": "PENDING"
  },
  "msg": "报名成功"
}

3.13 获取待审核供应商

GET /api/bidding-self/qualification/list

请求参数

参数名 类型 必填 位置 说明
initiateId Long Query 发起主表ID

响应数据R<List>

{
  "code": 200,
  "success": true,
  "data": [
    {
      "id": 111222,
      "initiateId": 987654321,
      "supplierName": "XX科技有限公司",
      "contactName": "张三",
      "contactPhone": "13800138000",
      "status": "PENDING"
    }
  ],
  "msg": "操作成功"
}

3.14 审核供应商资质

POST /api/bidding-self/qualification/audit

请求体BiddingSelfQualificationAuditDTO

{
  "registrationId": 111222,
  "supplierId": 20001,
  "auditResult": "APPROVED",
  "rejectReason": ""
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "id": 789012,
    "supplierId": 20001,
    "supplierName": "XX科技有限公司",
    "auditResult": "APPROVED",
    "paymentStatus": "UNPAID",
    "paymentAmount": 500.00
  },
  "msg": "审核成功"
}

3.15 开标签到

POST /api/bidding-self/bid/sign

请求体BiddingSelfBidSignDTO

{
  "initiateId": 987654321,
  "supplierId": 20001
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "signStatus": 1,
    "signTime": "2026-06-30 09:15:00"
  },
  "msg": "签到成功"
}

3.16 提交投标

POST /api/bidding-self/bid/submit

请求体BiddingSelfBidDTO

{
  "initiateId": 987654321,
  "supplierId": 20001,
  "bidFiles": "[{\"name\":\"投标文件.pdf\",\"url\":\"/upload/2026/06/30/bid.pdf\"}]",
  "authorizationFile": "{\"name\":\"授权书.pdf\",\"url\":\"/upload/2026/06/30/auth.pdf\"}",
  "totalQuote": 450000.00,
  "quoteDetails": "[{\"subjectId\":1,\"unitPrice\":8999.00,\"quantity\":10,\"totalPrice\":89990.00}]"
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "id": 333444,
    "initiateId": 987654321,
    "supplierId": 20001,
    "totalQuote": 450000.00,
    "status": "PENDING"
  },
  "msg": "投标成功"
}

3.17 生成唱标记录

POST /api/bidding-self/opening/record

请求体BiddingSelfOpeningRecordDTO

{
  "initiateId": 987654321,
  "bidIds": [333444, 333445, 333446]
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "recordFile": {
      "name": "唱标记录表.pdf",
      "url": "/upload/2026/07/01/opening_record.pdf"
    },
    "openingList": [
      {
        "supplierName": "XX科技有限公司",
        "totalQuote": 450000.00,
        "taxRate": 13.00,
        "totalWithTax": 508500.00,
        "totalWithoutTax": 450000.00
      }
    ]
  },
  "msg": "生成成功"
}

3.18 专家提交评分

POST /api/bidding-self/evaluation/score

请求体BiddingSelfEvaluationDTO

{
  "initiateId": 987654321,
  "expertId": 30001,
  "supplierId": 20001,
  "qualificationScore": 85.00,
  "technicalScore": 90.00,
  "businessScore": 88.00,
  "priceScore": 92.00,
  "evaluationOpinion": "资质齐全,技术方案可行"
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "comprehensiveScore": 88.75,
    "status": "COMPLETED"
  },
  "msg": "评分成功"
}

3.19 计算报价分

POST /api/bidding-self/score/calculate

请求体BiddingSelfScoreCalculateDTO

{
  "initiateId": 987654321,
  "scoreMethod": "LOW_PRICE",
  "scoreWeight": 60.00,
  "quoteRound": 2
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "scoreMethod": "LOW_PRICE",
    "formula": "价格分 = (最低价 / 供应商报价) × 价格分权重",
    "scoreList": [
      {
        "supplierName": "XX科技有限公司",
        "quote": 450000.00,
        "priceReduction": 5.00,
        "lowestPrice": 420000.00,
        "priceScore": 56.00
      }
    ]
  },
  "msg": "计算成功"
}

3.20 提交投票

POST /api/bidding-self/vote/submit

请求体BiddingSelfVoteDTO

{
  "initiateId": 987654321,
  "voteRound": 1,
  "voteType": "SINGLE",
  "voteResult": "[20001]",
  "personalOpinion": "建议选择该供应商"
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "status": "COMPLETED",
    "voteTime": "2026-07-05 14:30:00"
  },
  "msg": "投票成功"
}

3.21 确认入围名单

POST /api/bidding-self/finalist/confirm

请求体BiddingSelfFinalistDTO

{
  "initiateId": 987654321,
  "finalistList": [
    {
      "supplierId": 20001,
      "ranking": 1,
      "comprehensiveScore": 88.75,
      "voteCount": 3,
      "finalQuote": 450000.00
    }
  ]
}

响应数据R

{
  "code": 200,
  "success": true,
  "data": {
    "finalistCount": 3,
    "status": "CONFIRMED"
  },
  "msg": "确认成功"
}

4. 数据类型定义

4.1 BladeFile附件对象

interface BladeFile {
  name: string;          // 文件名(存储名)
  url: string;           // 文件访问URL
  size: number;          // 文件大小(字节)
  originalName: string;  // 原始文件名
  contentType: string;   // 文件类型
}

4.2 SubjectItem标的物

interface SubjectItem {
  seqNo: number;                // 序号
  materialName: string;         // 物料名称
  materialCode: string;         // 物料编码
  specification: string;        // 规格型号
  brand: string;                // 品牌
  unit: string;                 // 计量单位
  referencePrice: number;       // 参考价(不含税)
  estimatedQuantity: number;    // 预计数量
  estimatedUseTime: string;     // 预计使用时间
  amount: number;               // 金额(元)
  contactPersonId: number;    // 对接人ID
  contactPersonName: string;   // 对接人姓名
  demandDesc: string;           // 需求简介
  remark: string;               // 备注
}

4.3 ExpertItem评标专家

interface ExpertItem {
  expertId: number;     // 专家ID
  expertName: string;   // 专家姓名
  expertType: string;   // 专家类型appoint-指定 / random-随机
}

4.4 UserDeptItem用户部门信息

interface UserDeptItem {
  deptId: number;       // 部门ID
  deptName: string;     // 部门名称
  tenantId: number;     // 公司ID租户ID
  tenantName: string;   // 公司名称
  isDefault: boolean;   // 是否默认部门
}

4.5 BiddingSelfRegistration供应商报名

interface BiddingSelfRegistration {
  id: number;                    // 报名ID
  initiateId: number;           // 发起主表ID
  supplierId: number;            // 供应商ID
  supplierName: string;           // 供应商名称
  contactName: string;           // 联系人姓名
  contactPhone: string;           // 联系人电话
  contactEmail: string;           // 联系人邮箱
  qualificationFiles: string;   // 资质文件JSON BladeFile列表
  otherFiles: string;             // 其他资料JSON BladeFile列表
  status: string;                 // 状态PENDING/APPROVED/REJECTED
  rejectReason: string;           // 驳回原因
}

4.6 BiddingSelfQualification资质审核

interface BiddingSelfQualification {
  id: number;                    // 审核ID
  initiateId: number;            // 发起主表ID
  supplierId: number;            // 供应商ID
  supplierName: string;           // 供应商名称
  auditResult: string;            // 审核结果APPROVED/REJECTED
  rejectReason: string;           // 未入围原因
  paymentStatus: string;          // 付款状态UNPAID/PAID
  paymentAmount: number;          // 标书费用金额
}

4.7 BiddingSelfBid投标/开标)

interface BiddingSelfBid {
  id: number;                    // 投标ID
  initiateId: number;            // 发起主表ID
  supplierId: number;            // 供应商ID
  signStatus: number;            // 签到状态0-未签到1-已签到
  signTime: string;              // 签到时间
  bidFiles: string;              // 投标文件JSON BladeFile列表
  authorizationFile: string;     // 授权书JSON BladeFile
  otherFiles: string;            // 其他资料JSON BladeFile列表
  totalQuote: number;            // 总报价(元)
  quoteDetails: string;          // 报价明细JSON
  status: string;                // 状态PENDING/OPENED/FLOWED
}

4.8 BiddingSelfBidOpening唱标记录

interface BiddingSelfBidOpening {
  id: number;                    // 唱标ID
  initiateId: number;            // 发起主表ID
  supplierId: number;            // 供应商ID
  supplierName: string;          // 供应商名称
  totalQuote: number;            // 投标总报价(元)
  taxRate: number;               // 税率
  totalWithTax: number;         // 含税总价
  totalWithoutTax: number;      // 不含税总价
  taxCategory: string;           // 税目
  deliveryPeriod: string;        // 工期/交货期/质保期
  remarks: string;               // 补充说明
  openingRecordFile: string;     // 唱标记录表文件JSON BladeFile
  status: string;                // 状态PENDING/COMPLETED
}

4.9 BiddingSelfExpertSign专家签到

interface BiddingSelfExpertSign {
  id: number;                    // 签到ID
  initiateId: number;            // 发起主表ID
  expertId: number;              // 专家ID
  expertName: string;            // 专家姓名
  expertTitle: string;           // 职称
  expertCategory: string;        // 专业类别
  expertOrg: string;             // 所属单位
  signStatus: number;            // 签到状态0-未签到1-已签到
  signTime: string;              // 签到时间
  signFiles: string;             // 电子签署文件JSON BladeFile列表
  signStatusFile: string;        // 签署状态UNSIGNED/SIGNED/REJECTED
}

4.10 BiddingSelfEvaluation专家评标

interface BiddingSelfEvaluation {
  id: number;                    // 评分ID
  initiateId: number;            // 发起主表ID
  expertId: number;              // 专家ID
  expertName: string;           // 专家姓名
  supplierId: number;           // 供应商ID
  supplierName: string;          // 供应商名称
  qualificationScore: number;  // 资质审查评分
  technicalScore: number;        // 技术标准评分
  businessScore: number;         // 商务标准评分
  priceScore: number;           // 价格评分
  comprehensiveScore: number;   // 综合评分
  evaluationOpinion: string;    // 评审意见
  status: string;               // 状态PENDING/COMPLETED
}

4.11 BiddingSelfQuote供应商报价

interface BiddingSelfQuote {
  id: number;                    // 报价ID
  initiateId: number;            // 发起主表ID
  supplierId: number;           // 供应商ID
  quoteRound: number;           // 报价轮次1-第一轮2-第二轮3-终报
  totalAmount: number;          // 报价总金额(元)
  totalAmountUpper: string;     // 总金额大写
  deliveryPeriod: string;       // 服务/交货周期/质保期
  remarks: string;              // 补充说明/优惠承诺
  quoteDetails: string;         // 报价明细JSON
  quoteFiles: string;          // 报价附件JSON BladeFile列表
  deadline: string;            // 报价截止时间
}

4.12 BiddingSelfScore报价分计算

interface BiddingSelfScore {
  id: number;                    // 计算ID
  initiateId: number;           // 发起主表ID
  scoreMethod: string;           // 评分方式LOW_PRICE/BASE_PRICE
  scoreWeight: number;          // 价格分权重
  quoteRound: number;          // 报价轮次
  scoreDetails: string;        // 报价分明细JSON
}

interface ScoreResultItem {
  supplierName: string;        // 供应商名称
  quote: number;               // 报价(元)
  priceReduction: number;      // 降价幅度
  lowestPrice: number;         // 本轮最低价
  priceScore: number;          // 价格分
}

4.13 BiddingSelfVote投票

interface BiddingSelfVote {
  id: number;                    // 投票ID
  initiateId: number;            // 发起主表ID
  voterId: number;               // 投票人ID
  voterName: string;             // 投票人姓名
  voterRole: string;             // 投票人角色BUSINESS/PROCUREMENT/AUDIT
  voteRound: number;            // 投票轮次
  voteType: string;             // 投票类型SINGLE/MULTIPLE
  voteResult: string;            // 投票结果JSON供应商ID列表
  personalOpinion: string;       // 个人意见备注
  status: string;               // 状态PENDING/COMPLETED
}

interface VoteResultItem {
  supplierId: number;          // 供应商ID
  supplierName: string;        // 供应商名称
  voteCount: number;          // 得票数
  ranking: number;            // 排名
}

4.14 BiddingSelfFinalist入围供应商

interface BiddingSelfFinalist {
  id: number;                    // 入围ID
  initiateId: number;            // 发起主表ID
  supplierId: number;            // 供应商ID
  supplierName: string;         // 供应商名称
  ranking: number;              // 排名
  comprehensiveScore: number;   // 综合评分
  voteCount: number;            // 得票数
  finalQuote: number;           // 最终报价
  status: string;              // 状态CONFIRMED/REJECTED
}

5. 前端需求说明

说明:以下内容为各前端页面的需求描述,供前端开发人员参考。具体页面实现由前端开发团队根据需求自行设计。

5.1 项目背景

【技术栈】
- Vue 3组合式 API
- Element PlusUI 组件库)
- Pinia状态管理
- TypeScript
- Vite

【项目结构】
views/bidding/
├── PendingBidding.vue          # 主页面容器(已有,由流程引擎挂载)
└── self/
    └── pages/                  # 子页面目录
        ├── InitiatePage.vue    # 发起节点(招采发起人)
        ├── ApprovalPage.vue    # 审批节点(招采负责人初审)
        ├── FinalApprovalPage.vue  # 3.7.4.3 总裁办负责人审批
        ├── RegistrationPage.vue  # 3.7.4.4 供应商报名
        ├── QualificationPage.vue # 3.7.4.5 资质审核
        ├── BidPage.vue         # 3.7.4.6 开标(招采负责人端)
        ├── BidSupplierPage.vue # 3.7.4.6 投标(供应商端)
        ├── OpeningPage.vue     # 3.7.4.7 唱标
        ├── ExpertSignPage.vue  # 3.7.4.8 专家签到
        ├── EvaluationPage.vue  # 3.7.4.9 专家评标
        ├── QualificationCertPage.vue  # 3.7.4.10 资格认定表审批
        ├── QuotePage.vue       # 3.7.4.11 供应商多轮报价
        ├── ScorePage.vue       # 3.7.4.12 出报价分
        ├── VotePage.vue        # 3.7.4.13 投票
        ├── FinalistPage.vue    # 3.7.4.14 确定入围供应商
        └── FinalQuotePage.vue  # 3.7.4.15 投标方终报

【核心原则】
1. 每个子页面是一个完整的 Vue 组件,内部直接实现表单,不拆分小组件
2. 主页面通过 <component :is=""> 动态加载子页面
3. 子页面接收 nodeData prop包含业务ID、预招标ID等
4. 子页面通过 $emit 通知主页面 save/submit/cancel
5. 时间统一使用东八区Asia/Shanghai
6. 按钮提交防抖 3 秒
7. 文件上传使用系统标准 el-upload上传到 /api/bidding-self/upload
8. 附件信息以 JSON 字符串形式存储和传输BladeFile 数组)

5.2 发起页面InitiatePage.vue

节点3.7.4.1 角色:招采发起人 页面类型:表单填写

功能描述 招标发起人填写自行招标发起表单。页面数据根据预招标流程自动带出。

接口

  • 加载预招标数据GET /api/bidding-self/pre-project/{preBiddingId}
  • 获取用户部门列表GET /api/bidding-self/user-dept-list
  • 保存草稿POST /api/bidding-self/draft
  • 提交POST /api/bidding-self/submit

页面结构(从上到下):

  1. 发起人信息(自动带出,可编辑)

    • 申请人:自动带出当前登录用户姓名,只读
    • 申请时间:自动带出当前时间,只读
    • 联系电话:自动带出当前用户电话,可修改,需验证手机号格式
    • 所属公司:下拉框选择,调用 /api/bidding-self/user-dept-list 获取部门列表,默认选中 isDefault=true 的项,选择后自动带出公司信息
  2. 项目信息(自动带出,只读展示)

    • 计划号、项目编号、项目名称、项目类型
    • 预算金额(金额格式,保留两位小数)
    • 需求部门、需求公司、项目对接人
  3. 标的物信息(列表形式,部分可编辑)

    • 表格列:序号、物料名称、物料编码、规格型号、品牌、计量单位、参考价、预计数量、预计使用时间、金额、对接人、需求简介、备注
    • 序号自动生成1开始
    • 物料名称必填限制100字符
    • 预计数量输入时,金额自动计算(参考价 × 数量)
    • 对接人:点击选择,弹窗组织架构树
    • 需求简介限制1000字符
  4. 投标要求(填写区)

    • 报名开始/结束时间:时间控件,精确到时分秒
    • 投标开始/结束时间:时间控件,精确到时分秒
    • 投标方式:下拉选择(线上/线下)
    • 开标时间:时间控件,精确到时分秒
    • 校验:结束时间 > 开始时间
  5. 评标原则(选择区)

    • 评标原则:下拉选择(调用 /api/bidding-self/evaluation-principles
    • 说明:自动带出,只读展示
  6. 评标小组(只读展示)

    • 评标小组来源、评标小组人员列表
  7. 只读说明区(纯文本展示)

    • 定标原则、合同签订说明、其他(没收投标保证金/严禁转包)

操作按钮

  • 取消:返回待招标库
  • 保存草稿:调用 /api/bidding-self/draft
  • 提交:调用 /api/bidding-self/submit提交成功后返回待招标库

提交校验

  • 所有必填字段已填写
  • 时间逻辑正确(结束时间 > 开始时间)
  • 预计数量 > 0
  • 联系电话格式正确
  • 物料名称不为空且 <= 100字符
  • 需求简介 <= 1000字符

防抖:保存草稿和提交按钮防抖 3 秒,提交期间按钮禁用


5.3 审批页面ApprovalPage.vue

节点3.7.4.2 角色:招采负责人 页面类型:表单编辑

功能描述 招采负责人对发起人提交的信息进行补充,填写招标公告核心信息并上传文件。

接口

  • 加载数据GET /api/bidding-self/{id}
  • 保存数据PUT /api/bidding-self/{id}/update
  • 文件上传POST /api/bidding-self/upload

页面结构(从上到下):

  1. 上部:发起信息只读展示

    • 显示发起页面填写的所有信息(发起人、项目、标的物、投标要求、评标原则、评标小组)
    • 只读展示,不可编辑
  2. 中部:招采负责人填写区

    • 报名开始/结束时间:时间控件,精确到年月日时分,可修改
    • 投标开始/结束时间:时间控件,精确到年月日时分,可修改
    • 开标时间:时间控件,精确到年月日时分,可修改
    • 投标方式:下拉选择(线上/线下),默认线上
    • 投标地点:文本输入,选择线下时必填
    • 投标联系方式:文本输入,格式:姓名、电话、邮箱
    • 招标公告:文件上传,必填,支持 PDF/DOC/DOCX/JPG/PNG
  3. 文件上传说明

    • 使用 el-upload 组件
    • action: /api/bidding-self/upload
    • 上传成功后获取 BladeFile 对象
    • 多个文件以 JSON 数组形式存储
    • 支持文件预览(通过返回的 URL和删除

操作按钮

  • 取消:返回列表
  • 暂存:保存当前编辑内容(不校验必填)
  • 保存:调用 /api/bidding-self/{id}/update保存业务数据

保存校验

  • 时间逻辑正确(结束时间 > 开始时间)
  • 选择线下时,投标地点必填
  • 招标公告文件必须上传

防抖:保存和暂存按钮防抖 3 秒,提交期间按钮禁用

注意:此页面不处理审批同意/驳回操作(由后续流程统一接口处理),仅保存业务数据(时间、地点、联系方式、附件信息)


5.4 总裁办负责人审批页面FinalApprovalPage.vue

节点3.7.4.3 角色:总裁办主任 页面类型:审批节点

功能描述 总裁办主任对招采负责人提交的信息进行审核。审核表单同上一节点页面,若有意见可在表单上填写意见。

接口

  • 加载数据GET /api/bidding-self/{id}
  • 保存数据PUT /api/bidding-self/{id}/final-approval
  • 文件上传POST /api/bidding-self/upload

页面结构(从上到下):

  1. 上部:发起信息只读展示

    • 显示发起页面和招采负责人填写的所有信息(发起人、项目、标的物、投标要求、评标原则、评标小组、招标公告文件等)
    • 只读展示,不可编辑
  2. 中部:总裁办负责人填写区

    • 审批意见:文本输入,可填写审核意见
    • 附件:可上传补充文件

操作按钮

  • 取消:返回列表
  • 暂存:保存当前编辑内容(不校验必填)
  • 保存:调用 /api/bidding-self/{id}/final-approval保存业务数据

保存校验

  • 审批意见可为空(同意时无需填写)
  • 驳回时需填写驳回原因

防抖:保存和暂存按钮防抖 3 秒,提交期间按钮禁用

注意:此页面不处理审批同意/驳回操作(由后续流程统一接口处理),仅保存业务数据(审批意见、附件信息)

路由规则

  • 同意 → 供应商报名
  • 驳回 → 退回总裁办招采负责人审批节点

5.5 供应商报名页面RegistrationPage.vue

节点3.7.4.4 角色:供应商(外部用户) 页面类型:外部节点

功能描述 供应商通过招标公告中的报名网址进入系统,查看正在报名中的项目列表,选择项目进行报名。

接口

  • 获取报名项目列表GET /api/bidding-self/registration/list
  • 提交报名POST /api/bidding-self/registration/submit
  • 获取我的报名GET /api/bidding-self/registration/my
  • 文件上传POST /api/bidding-self/upload

页面结构

  1. 报名项目列表

    • 表格列:项目编号、项目名称、项目类型、报名开始时间、报名结束时间、剩余报名时间(倒计时)、开标时间、操作(报名按钮)
  2. 报名弹窗

    • 供应商名称:自动带出(根据登录账号)
    • 联系人输入必填限制50字符
    • 联系电话:输入,必填,手机号格式
    • 联系邮箱:输入,必填,邮箱格式
    • 资质文件文件上传PDF/图片),必填,营业执照、资质证书等
    • 其他资料文件上传PDF/图片),选填
  3. 我的报名(在"与您相关的项目"窗口查看)

    • 表格列:招标方式、项目编号、开始投标时间、剩余投标时间(倒计时)、开标时间、操作(查看详情/修改报名)

操作按钮

  • 提交报名:提交报名信息
  • 保存草稿:保存报名信息,不提交
  • 取消:关闭报名窗口

5.6 供应商资质审核页面QualificationPage.vue

节点3.7.4.5 角色:招采负责人 页面类型:审批节点

功能描述 在投标方报名完成后,审核投标方的相关资质,决定投标方是否入围。

接口

  • 获取待审核供应商GET /api/bidding-self/qualification/list?initiateId={id}
  • 审核供应商资质POST /api/bidding-self/qualification/audit
  • 批量审核POST /api/bidding-self/qualification/batch

页面结构

  1. 已报名供应商列表

    • 表格列:投标方名称(可点击展开查看详情)、联系人、联系电话、报名状态、操作(审核按钮)
  2. 审核弹窗

    • 供应商基本信息:自动带出(名称、联系人、联系方式)
    • 资质文件:文件预览(支持预览和下载)
    • 审核结果:下拉选择(入围/不入围)
    • 未入围原因:文本输入,选择"不入围"时必填限制500字符

操作按钮

  • 保存审核:保存当前审核结果
  • 批量通过:批量选中供应商审核通过
  • 批量驳回:批量选中供应商审核不通过
  • 取消:返回列表

业务规则

  • 逐个审核供应商资质,可批量操作
  • 选择"入围"后,系统自动向供应商发送收款信息(标书费用)
  • 选择"不入围"时,必须填写未入围原因,系统通知供应商
  • 审核通过后,供应商可进行付款购买标书

5.7 开标/投标页面

5.7.1 开标页面BidPage.vue

节点3.7.4.6 角色:招采负责人 页面类型:执行节点

功能描述 审核入围资质通过后,投标方在规定时间内进行报价投标。投标时间结束后,到达开标时间,进行开标操作。

接口

  • 获取待投标项目GET /api/bidding-self/bid/list
  • 开标POST /api/bidding-self/bid/opening
  • 流标POST /api/bidding-self/bid/flow
  • 导出签到表GET /api/bidding-self/bid/sign-export?initiateId={id}

页面结构

  1. 项目信息展示

    • 项目编码、项目名称、投标开始时间、投标截止时间、开标时间、标的物明细
    • 应签到/已签到:显示签到比例(如 5/8
  2. 签到列表

    • 表格列:投标方名称、签到时间、签到状态
    • 支持导出签到表Excel/PDF
  3. 开标操作

    • 到达开标时间后,如已报价投标方达到至少三家,则可以进行开标操作
    • 开标时间到,现场宣布开标纪律,检查并先开启商务标,记录各投标人报价
  4. 流标操作(投标方不足三家时显示)

    • 弹出流标公告通知窗口
    • 编辑流标公告内容:公告标题、关键字、查看范围、是否置顶、招标简介
    • 公告内容抓取招标内容自动生成,可手动编辑
    • 填写完成后点击【保存】,流程直接结束

操作按钮

  • 导出签到表:导出签到供应商列表
  • 开始唱标:进入唱标环节
  • 流标:投标方不足时显示,结束流程
  • 取消:返回列表

5.7.2 投标页面BidSupplierPage.vue

节点3.7.4.6 角色:供应商 页面类型:执行节点

功能描述 供应商在规定时间内进行报价投标,包括签到、上传投标文件、填写报价单。

接口

  • 获取待投标项目GET /api/bidding-self/bid/list
  • 开标签到POST /api/bidding-self/bid/sign
  • 提交投标POST /api/bidding-self/bid/submit
  • 文件上传POST /api/bidding-self/upload

页面结构

  1. 待投标项目列表

    • 表格列:项目编码、项目名称、开始投标时间、结束投标时间、开标时间、操作(投标按钮/已签到)、签订状态、招标人
  2. 投标详情页

    • 项目信息展示
    • 开标签到按钮:到达投标截止时间后显示,点击后完成签到,按钮变灰
    • 投标按钮:投标时间内显示,点击打开投标页面
  3. 投标弹窗

    • 投标文件文件上传PDF/Word必填
    • 授权书文件上传PDF/图片),必填
    • 其他资料文件上传PDF/图片),选填
    • 报价单:表格填写,按标的物填写单价,自动计算合价和总报价
    • 总报价:自动计算,只读

操作按钮

  • 开标签到:到达截止时间后显示,点击后变灰
  • 投标:投标时间内显示,打开投标页面
  • 取消:关闭投标窗口

业务规则

  • 投标人须在投标截止时间前完成线上签到
  • 如未在规定时间内完成签到,将视为放弃投标
  • 投标时间结束后,不可以进行报价投标的操作

5.8 唱标页面OpeningPage.vue

节点3.7.4.7 角色:招采负责人 页面类型:展示节点

功能描述 唱标页面主要以表格形式展示投标方的第一轮报价信息,自动获取数据展示。

接口

  • 获取唱标列表GET /api/bidding-self/opening/list?initiateId={id}
  • 生成唱标记录POST /api/bidding-self/opening/record
  • 唱标结束POST /api/bidding-self/opening/complete

页面结构

  1. 项目基本信息

    • 项目名称、招标编号、开标时间、开标地点
  2. 投标方报价列表

    • 表格列:投标人名称、投标总报价(含税总价)、税率、含税总价、不含税总价、税目、工期/交货期/质保期、补充说明
  3. 唱标记录

    • 所有投标方上传完成后,进行公开唱标,生成唱标记录表
    • 系统公示唱标信息表格,各供应商可进行查看

操作按钮

  • 生成唱标记录表:生成并展示唱标记录表
  • 唱标结束:确认唱标无问题,进入专家评标
  • 返回:返回开标页面

5.9 专家签到/评标页面

5.9.1 专家签到页面ExpertSignPage.vue

节点3.7.4.8 角色:抽取的专家 页面类型:交互节点

功能描述 专家登录系统后进行签到,签到完成后进行电子签署文件。

接口

  • 专家签到POST /api/bidding-self/expert/sign
  • 上传签署文件POST /api/bidding-self/expert/sign-file
  • 文件上传POST /api/bidding-self/upload

页面结构

  1. 专家信息展示

    • 专家姓名、职称、专业类别、所属单位(自动带出)
  2. 签到操作

    • 签到按钮:完成线上签到
  3. 电子签署

    • 签署文件按钮:打开电子签署页面(法大大)
    • 上传回传文件:上传签字盖章后的文件

操作按钮

  • 签到:完成线上签到
  • 签署文件:打开电子签署页面
  • 上传回传文件:上传签字盖章后的文件

5.9.2 专家评标页面EvaluationPage.vue

节点3.7.4.9 角色:评审专家 页面类型:评审节点

功能描述 专家评标环节能够查看已入围投标方投标文件以及报价排名,进行资质审查及评标标准打分。

接口

  • 获取待评标列表GET /api/bidding-self/evaluation/list?initiateId={id}
  • 获取投标方详情GET /api/bidding-self/evaluation/detail?initiateId={id}&supplierId={id}
  • 提交评分POST /api/bidding-self/evaluation/score
  • 生成资质认定表POST /api/bidding-self/evaluation/cert

页面结构

  1. 投标方列表

    • 表格列:排名、投标方名称、报价(元)、操作(查看/评标按钮)
  2. 查看投标方详情

    • 投标文件预览、报价明细、资质文件、其他上传资料
  3. 评标打分弹窗

    • 资质审查评分评分输入0-100
    • 技术标准评分评分输入0-100
    • 商务标准评分评分输入0-100
    • 价格评分:自动计算(根据报价)
    • 综合评分:自动计算(加权汇总)
    • 评审意见文本输入限制1000字符
  4. 生成资质认定表(组长权限)

    • 根据资料审查及打分情况生成资质认定表

操作按钮

  • 保存评分:保存当前评分结果
  • 提交评分:提交评分,不可修改
  • 查看详情:查看投标方详细信息
  • 生成资质认定表:组长权限,生成资质认定表
  • 取消:关闭评标窗口

业务规则

  • 只有所有专家评分完成后,才可以展示评分结果
  • 提交评分后不可修改

5.10 资格认定表审批页面QualificationCertPage.vue

节点3.7.4.10 角色:招采负责人 页面类型:审批节点

功能描述 确认专家电子签署返回的资格认定表,确认淘汰的供应商单位,发送邮件通知,并进行电子确签。

接口

  • 审核资格认定表POST /api/bidding-self/qualification-cert/audit
  • 发送淘汰通知POST /api/bidding-self/qualification-cert/notify

页面结构

  1. 资格认定表展示

    • 表格列:项目编号、项目名称、供应商名称、资质审查结果、综合评分、排名、是否入围、电子签署状态
  2. 淘汰单位处理

    • 确认淘汰的供应商单位
    • 发送邮件通知淘汰单位
    • 发送电子签署链接进行确签
  3. 入围单位处理

    • 入围单位>=3家进入线下磋商环节并进行多轮报价
    • 入围单位<3家流程结束

操作按钮

  • 通过:资格认定表审核通过
  • 驳回:退回专家重新评标
  • 发送通知:向淘汰单位发送邮件通知
  • 进入磋商:入围单位>=3家时显示进入多轮报价
  • 取消:返回列表

5.11 供应商报价页面QuotePage.vue

节点3.7.4.11 / 3.7.4.15 角色:供应商(入围供应商) 页面类型:报价节点

功能描述 供应商通过此页面进行多轮报价(包括终报)。

接口

  • 提交报价POST /api/bidding-self/quote/submit
  • 获取报价历史GET /api/bidding-self/quote/history?initiateId={id}&supplierId={id}
  • 文件上传POST /api/bidding-self/upload

页面结构

  1. 顶部信息

    • 报价截止时间(倒计时)、项目名称、项目编号、报价轮次
  2. 投标人信息

    • 投标人名称:自动带出
    • 授权委托人:自动带出
    • 联系电话:自动带出
  3. 报价信息

    • 报价总金额:输入,必填,精确到小数点后两位(含税金额)
    • 总金额大写:自动带出(根据报价总金额自动生成)
    • 服务/交货周期/质保期输入必填限制200字符
    • 补充说明/优惠承诺输入必填限制1000字符
  4. 物料明细清单(分项报价表)

    • 表格列:名称、编码、规格型号、单位、数量、单价(手动输入)、合价(自动计算)
    • 系统合计总价:自动汇总所有行合价
  5. 附件区

    • 文件上传、预览、删除
  6. 历史记录

    • 表格列:轮次、报价金额、提交时间

操作按钮

  • 提交报价:提交当前轮次报价
  • 保存草稿:保存报价信息,不提交
  • 取消:返回报价页面

业务规则

  • 报价截止时间前可提交,超时不可提交
  • 单价输入时,合价自动计算(单价×数量)
  • 总金额大写自动生成

5.12 出报价分页面ScorePage.vue

节点3.7.4.12 角色:招采负责人 页面类型:计算节点

功能描述 针对供应商报价后进行计算报价分并展示。根据不同项目,可配置不同评分规则。

接口

  • 计算报价分POST /api/bidding-self/score/calculate
  • 获取评分配置GET /api/bidding-self/score/config

页面结构

  1. 项目信息展示

    • 项目编号、项目名称、评分方式(下拉选择)、报价轮次、项目类型、需求部门、需求公司、项目对接人、需求简介、备注
    • 以上字段均为只读,自动带出
  2. 评分方法说明

    • 低价优先法:最低价为基准,价格越低得分越高
    • 基准价法:以平均价为核心,平衡成本和竞争
    • 计算公式展示
  3. 报价分明细行

    • 表格列:序号、供应商名称、第二轮报价、降价幅度、本轮最低价、价格分
  4. 计算说明

    • 展示当前采用的评分方法和计算公式

操作按钮

  • 计算报价分:根据选择的评分方式计算报价分
  • 重新计算:重新计算报价分
  • 再次报价:到达投标方报价节点可再次报价
  • 进入下一环节:到达专家评分环节
  • 取消:返回列表

5.13 投票页面VotePage.vue

节点3.7.4.13 角色:业务人员、招采负责人、审计人员 页面类型:投票节点

功能描述 展示招标项目基本信息和供应商信息,进行投票选定入围供应商。

接口

  • 提交投票POST /api/bidding-self/vote/submit
  • 获取投票结果GET /api/bidding-self/vote/result?initiateId={id}&voteRound={round}

页面结构

  1. 投票规则展示

    • 投票范围:本轮所有有效供应商名单
    • 投票规则:单选/多选、可入围数量、投票权重、是否可弃权
    • 约束要求每人限投1次、提交后不可修改
    • 入围规则:按得票多少排序、票数阈值、并列处理规则
  2. 供应商投票列表

    • 表格列:排名、投标方名称、最新一轮报价、前期评审情况(点击查看详情)、详情(点击查看详情)、操作(单选按钮)、个人意见备注

操作按钮

  • 提交投票:提交投票结果,提交后不可修改
  • 弃权:如规则允许,可选择弃权
  • 取消:返回列表

业务规则

  • 每人限投1次
  • 提交后不可修改
  • 按得票多少排序确定入围名单

5.14 确定入围供应商页面FinalistPage.vue

节点3.7.4.14 角色:招采负责人 页面类型:确认节点

功能描述 根据投票结果或评分结果,确定入围供应商名单。

接口

  • 确认入围POST /api/bidding-self/finalist/confirm
  • 通知入围供应商POST /api/bidding-self/finalist/notify

页面结构

  1. 供应商入围情况

    • 表格列:排名、供应商名称、综合得分、得票数、是否入围、报价
  2. 入围规则

    • 投标方>=3家通知供应商并进入后续报价第三次报价
    • 投标方<3家流程结束

操作按钮

  • 确认入围:确认入围供应商名单
  • 通知供应商:向入围供应商发送通知
  • 结束流程:投标方<3家时显示结束流程
  • 取消:返回列表

5.15 公共说明

文件上传通用说明

  • 所有文件上传使用 Element Plus el-upload 组件
  • action: '/api/bidding-self/upload'
  • headers: { Authorization: 'Bearer ' + getToken() }
  • 上传成功后从 response.data 获取 BladeFile 对象
  • 多个文件以 JSON 数组形式存储和传输
  • 回显时 JSON.parse 解析为 BladeFile 列表

时区处理

  • 所有时间字段统一使用东八区Asia/Shanghai
  • 使用 dayjs + timezone 插件处理
  • 时间控件默认显示东八区时间
  • 提交时转换为 'YYYY-MM-DD HH:mm:ss' 格式字符串

防抖处理

  • 所有提交操作(保存、提交、审核等)按钮防抖 3 秒
  • 提交期间按钮禁用,显示加载状态
  • 提交成功后或接口返回错误后解除禁用状态

附件存储

  • 附件信息采用系统标准 MinIO 处理
  • 文件上传到 MinIO 对象存储,返回 BladeFile 对象
  • 附件信息以 JSON 字符串存储在业务字段中
  • 不单独建附件表

6. 附录

6.1 相关文档

  • 需求文档:doc/需求文档-自行招标流程.md
  • 开发设计文档:doc/开发设计文档-自行招标流程.md
  • 前端项目路径:D:\dachkj\shuyu\project\zcui\saber3
  • 主页面入口:frontend/src/views/bidding/PendingBidding.vue

6.2 变更记录

版本 日期 修改人 修改内容
V1.0 2026-06-17 - 初始版本包含9个接口定义和前端需求说明发起页面+审批页面)
V1.2 2026-06-23 - 完整重构补充节点3.7.4.3至3.7.4.15的接口定义和前端需求说明
1. 新增36个REST API接口共45个接口
2. 新增16个前端页面需求说明只含需求描述不含代码实现
3. 新增15个数据类型定义
4. 补充总裁办负责人审批节点3.7.4.3
5. 更新版本说明和流程节点列表
V1.3 2026-06-30 - 调整3.7.4.4 公众号/招采平台发布公告模块由其他系统实现,当前业务仅描述流程,删除该模块相关接口(/notice/save、/notice/publish、/notice/detail、数据类型BiddingSelfNotice、前端页面NoticePage.vue及需求说明接口总数由45调整为42前端页面由16调整为15数据类型由15调整为14后续节点编号依次前移

文档结束

说明:本文档为前端开发提供完整的接口定义和需求说明。后端接口已按此文档实现。前端具体实现由前端开发团队根据需求自行设计。