58 KiB
自行招标流程接口文档(含前端需求说明)
版本: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": "张三,13800138000,zhangsan@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 Plus(UI 组件库)
- 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
页面结构(从上到下):
-
发起人信息(自动带出,可编辑)
- 申请人:自动带出当前登录用户姓名,只读
- 申请时间:自动带出当前时间,只读
- 联系电话:自动带出当前用户电话,可修改,需验证手机号格式
- 所属公司:下拉框选择,调用 /api/bidding-self/user-dept-list 获取部门列表,默认选中 isDefault=true 的项,选择后自动带出公司信息
-
项目信息(自动带出,只读展示)
- 计划号、项目编号、项目名称、项目类型
- 预算金额(金额格式,保留两位小数)
- 需求部门、需求公司、项目对接人
-
标的物信息(列表形式,部分可编辑)
- 表格列:序号、物料名称、物料编码、规格型号、品牌、计量单位、参考价、预计数量、预计使用时间、金额、对接人、需求简介、备注
- 序号自动生成(1开始)
- 物料名称必填,限制100字符
- 预计数量输入时,金额自动计算(参考价 × 数量)
- 对接人:点击选择,弹窗组织架构树
- 需求简介限制1000字符
-
投标要求(填写区)
- 报名开始/结束时间:时间控件,精确到时分秒
- 投标开始/结束时间:时间控件,精确到时分秒
- 投标方式:下拉选择(线上/线下)
- 开标时间:时间控件,精确到时分秒
- 校验:结束时间 > 开始时间
-
评标原则(选择区)
- 评标原则:下拉选择(调用 /api/bidding-self/evaluation-principles)
- 说明:自动带出,只读展示
-
评标小组(只读展示)
- 评标小组来源、评标小组人员列表
-
只读说明区(纯文本展示)
- 定标原则、合同签订说明、其他(没收投标保证金/严禁转包)
操作按钮:
- 取消:返回待招标库
- 保存草稿:调用 /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
页面结构(从上到下):
-
上部:发起信息只读展示
- 显示发起页面填写的所有信息(发起人、项目、标的物、投标要求、评标原则、评标小组)
- 只读展示,不可编辑
-
中部:招采负责人填写区
- 报名开始/结束时间:时间控件,精确到年月日时分,可修改
- 投标开始/结束时间:时间控件,精确到年月日时分,可修改
- 开标时间:时间控件,精确到年月日时分,可修改
- 投标方式:下拉选择(线上/线下),默认线上
- 投标地点:文本输入,选择线下时必填
- 投标联系方式:文本输入,格式:姓名、电话、邮箱
- 招标公告:文件上传,必填,支持 PDF/DOC/DOCX/JPG/PNG
-
文件上传说明
- 使用 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
页面结构(从上到下):
-
上部:发起信息只读展示
- 显示发起页面和招采负责人填写的所有信息(发起人、项目、标的物、投标要求、评标原则、评标小组、招标公告文件等)
- 只读展示,不可编辑
-
中部:总裁办负责人填写区
- 审批意见:文本输入,可填写审核意见
- 附件:可上传补充文件
操作按钮:
- 取消:返回列表
- 暂存:保存当前编辑内容(不校验必填)
- 保存:调用 /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
页面结构:
-
报名项目列表
- 表格列:项目编号、项目名称、项目类型、报名开始时间、报名结束时间、剩余报名时间(倒计时)、开标时间、操作(报名按钮)
-
报名弹窗
- 供应商名称:自动带出(根据登录账号)
- 联系人:输入,必填,限制50字符
- 联系电话:输入,必填,手机号格式
- 联系邮箱:输入,必填,邮箱格式
- 资质文件:文件上传(PDF/图片),必填,营业执照、资质证书等
- 其他资料:文件上传(PDF/图片),选填
-
我的报名(在"与您相关的项目"窗口查看)
- 表格列:招标方式、项目编号、开始投标时间、剩余投标时间(倒计时)、开标时间、操作(查看详情/修改报名)
操作按钮:
- 提交报名:提交报名信息
- 保存草稿:保存报名信息,不提交
- 取消:关闭报名窗口
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
页面结构:
-
已报名供应商列表
- 表格列:投标方名称(可点击展开查看详情)、联系人、联系电话、报名状态、操作(审核按钮)
-
审核弹窗
- 供应商基本信息:自动带出(名称、联系人、联系方式)
- 资质文件:文件预览(支持预览和下载)
- 审核结果:下拉选择(入围/不入围)
- 未入围原因:文本输入,选择"不入围"时必填,限制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}
页面结构:
-
项目信息展示
- 项目编码、项目名称、投标开始时间、投标截止时间、开标时间、标的物明细
- 应签到/已签到:显示签到比例(如 5/8)
-
签到列表
- 表格列:投标方名称、签到时间、签到状态
- 支持导出签到表(Excel/PDF)
-
开标操作
- 到达开标时间后,如已报价投标方达到至少三家,则可以进行开标操作
- 开标时间到,现场宣布开标纪律,检查并先开启商务标,记录各投标人报价
-
流标操作(投标方不足三家时显示)
- 弹出流标公告通知窗口
- 编辑流标公告内容:公告标题、关键字、查看范围、是否置顶、招标简介
- 公告内容抓取招标内容自动生成,可手动编辑
- 填写完成后点击【保存】,流程直接结束
操作按钮:
- 导出签到表:导出签到供应商列表
- 开始唱标:进入唱标环节
- 流标:投标方不足时显示,结束流程
- 取消:返回列表
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
页面结构:
-
待投标项目列表
- 表格列:项目编码、项目名称、开始投标时间、结束投标时间、开标时间、操作(投标按钮/已签到)、签订状态、招标人
-
投标详情页
- 项目信息展示
- 开标签到按钮:到达投标截止时间后显示,点击后完成签到,按钮变灰
- 投标按钮:投标时间内显示,点击打开投标页面
-
投标弹窗
- 投标文件:文件上传(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
页面结构:
-
项目基本信息
- 项目名称、招标编号、开标时间、开标地点
-
投标方报价列表
- 表格列:投标人名称、投标总报价(含税总价)、税率、含税总价、不含税总价、税目、工期/交货期/质保期、补充说明
-
唱标记录
- 所有投标方上传完成后,进行公开唱标,生成唱标记录表
- 系统公示唱标信息表格,各供应商可进行查看
操作按钮:
- 生成唱标记录表:生成并展示唱标记录表
- 唱标结束:确认唱标无问题,进入专家评标
- 返回:返回开标页面
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
页面结构:
-
专家信息展示
- 专家姓名、职称、专业类别、所属单位(自动带出)
-
签到操作
- 签到按钮:完成线上签到
-
电子签署
- 签署文件按钮:打开电子签署页面(法大大)
- 上传回传文件:上传签字盖章后的文件
操作按钮:
- 签到:完成线上签到
- 签署文件:打开电子签署页面
- 上传回传文件:上传签字盖章后的文件
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
页面结构:
-
投标方列表
- 表格列:排名、投标方名称、报价(元)、操作(查看/评标按钮)
-
查看投标方详情
- 投标文件预览、报价明细、资质文件、其他上传资料
-
评标打分弹窗
- 资质审查评分:评分输入(0-100)
- 技术标准评分:评分输入(0-100)
- 商务标准评分:评分输入(0-100)
- 价格评分:自动计算(根据报价)
- 综合评分:自动计算(加权汇总)
- 评审意见:文本输入,限制1000字符
-
生成资质认定表(组长权限)
- 根据资料审查及打分情况生成资质认定表
操作按钮:
- 保存评分:保存当前评分结果
- 提交评分:提交评分,不可修改
- 查看详情:查看投标方详细信息
- 生成资质认定表:组长权限,生成资质认定表
- 取消:关闭评标窗口
业务规则:
- 只有所有专家评分完成后,才可以展示评分结果
- 提交评分后不可修改
5.10 资格认定表审批页面(QualificationCertPage.vue)
节点:3.7.4.10 角色:招采负责人 页面类型:审批节点
功能描述: 确认专家电子签署返回的资格认定表,确认淘汰的供应商单位,发送邮件通知,并进行电子确签。
接口:
- 审核资格认定表:POST /api/bidding-self/qualification-cert/audit
- 发送淘汰通知:POST /api/bidding-self/qualification-cert/notify
页面结构:
-
资格认定表展示
- 表格列:项目编号、项目名称、供应商名称、资质审查结果、综合评分、排名、是否入围、电子签署状态
-
淘汰单位处理
- 确认淘汰的供应商单位
- 发送邮件通知淘汰单位
- 发送电子签署链接进行确签
-
入围单位处理
- 入围单位>=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
页面结构:
-
顶部信息
- 报价截止时间(倒计时)、项目名称、项目编号、报价轮次
-
投标人信息
- 投标人名称:自动带出
- 授权委托人:自动带出
- 联系电话:自动带出
-
报价信息
- 报价总金额:输入,必填,精确到小数点后两位(含税金额)
- 总金额大写:自动带出(根据报价总金额自动生成)
- 服务/交货周期/质保期:输入,必填,限制200字符
- 补充说明/优惠承诺:输入,必填,限制1000字符
-
物料明细清单(分项报价表)
- 表格列:名称、编码、规格型号、单位、数量、单价(手动输入)、合价(自动计算)
- 系统合计总价:自动汇总所有行合价
-
附件区
- 文件上传、预览、删除
-
历史记录
- 表格列:轮次、报价金额、提交时间
操作按钮:
- 提交报价:提交当前轮次报价
- 保存草稿:保存报价信息,不提交
- 取消:返回报价页面
业务规则:
- 报价截止时间前可提交,超时不可提交
- 单价输入时,合价自动计算(单价×数量)
- 总金额大写自动生成
5.12 出报价分页面(ScorePage.vue)
节点:3.7.4.12 角色:招采负责人 页面类型:计算节点
功能描述: 针对供应商报价后进行计算报价分并展示。根据不同项目,可配置不同评分规则。
接口:
- 计算报价分:POST /api/bidding-self/score/calculate
- 获取评分配置:GET /api/bidding-self/score/config
页面结构:
-
项目信息展示
- 项目编号、项目名称、评分方式(下拉选择)、报价轮次、项目类型、需求部门、需求公司、项目对接人、需求简介、备注
- 以上字段均为只读,自动带出
-
评分方法说明
- 低价优先法:最低价为基准,价格越低得分越高
- 基准价法:以平均价为核心,平衡成本和竞争
- 计算公式展示
-
报价分明细行
- 表格列:序号、供应商名称、第二轮报价、降价幅度、本轮最低价、价格分
-
计算说明
- 展示当前采用的评分方法和计算公式
操作按钮:
- 计算报价分:根据选择的评分方式计算报价分
- 重新计算:重新计算报价分
- 再次报价:到达投标方报价节点可再次报价
- 进入下一环节:到达专家评分环节
- 取消:返回列表
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次
- 提交后不可修改
- 按得票多少排序确定入围名单
5.14 确定入围供应商页面(FinalistPage.vue)
节点:3.7.4.14 角色:招采负责人 页面类型:确认节点
功能描述: 根据投票结果或评分结果,确定入围供应商名单。
接口:
- 确认入围:POST /api/bidding-self/finalist/confirm
- 通知入围供应商:POST /api/bidding-self/finalist/notify
页面结构:
-
供应商入围情况
- 表格列:排名、供应商名称、综合得分、得票数、是否入围、报价
-
入围规则
- 投标方>=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,后续节点编号依次前移 |
文档结束
说明:本文档为前端开发提供完整的接口定义和需求说明。后端接口已按此文档实现。前端具体实现由前端开发团队根据需求自行设计。