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

1928 lines
58 KiB
Markdown
Raw Normal View 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<BiddingSelfInitiateVO>
```json
{
"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
```json
{
"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<BiddingSelfInitiateVO>
```json
{
"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<BiddingSelfInitiateVO>
```json
{
"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<BiddingSelfInitiateVO>
```json
{
"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
```json
{
"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<BiddingSelfInitiateVO>
```json
{
"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<EvaluationPrincipleVO>>
```json
{
"code": 200,
"success": true,
"data": [
{
"code": "lowest_price",
"name": "低价优先法",
"description": "即能够满足招标文件的各项要求,投标价格最低的投标即可作为中选投标。"
}
],
"msg": "操作成功"
}
```
---
### 3.7 文件上传(系统标准)
```
POST /api/bidding-self/upload
```
**请求参数**
| 参数名 | 类型 | 必填 | 位置 | 说明 |
|--------|------|------|------|------|
| file | MultipartFile | 是 | FormData | 文件 |
**响应数据**R<BladeFile>
```json
{
"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<OrgNode>>
```json
{
"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<UserDeptVO>>
```json
{
"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
```json
{
"approvalOpinion": "同意发布招标公告",
"noticeFile": "[{\"name\":\"招标公告.pdf\",\"url\":\"/upload/2026/06/17/xxx.pdf\",\"size\":1024000}]"
}
```
**响应数据**R<BiddingSelfInitiateVO>
```json
{
"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<BiddingSelfInitiateVO>>
```json
{
"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
```json
{
"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<BiddingSelfRegistrationVO>
```json
{
"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<BiddingSelfRegistrationVO>>
```json
{
"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
```json
{
"registrationId": 111222,
"supplierId": 20001,
"auditResult": "APPROVED",
"rejectReason": ""
}
```
**响应数据**R<BiddingSelfQualificationVO>
```json
{
"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
```json
{
"initiateId": 987654321,
"supplierId": 20001
}
```
**响应数据**R<BiddingSelfBidVO>
```json
{
"code": 200,
"success": true,
"data": {
"signStatus": 1,
"signTime": "2026-06-30 09:15:00"
},
"msg": "签到成功"
}
```
---
### 3.16 提交投标
```
POST /api/bidding-self/bid/submit
```
**请求体**BiddingSelfBidDTO
```json
{
"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<BiddingSelfBidVO>
```json
{
"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
```json
{
"initiateId": 987654321,
"bidIds": [333444, 333445, 333446]
}
```
**响应数据**R<BiddingSelfBidOpeningVO>
```json
{
"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
```json
{
"initiateId": 987654321,
"expertId": 30001,
"supplierId": 20001,
"qualificationScore": 85.00,
"technicalScore": 90.00,
"businessScore": 88.00,
"priceScore": 92.00,
"evaluationOpinion": "资质齐全,技术方案可行"
}
```
**响应数据**R<BiddingSelfEvaluationVO>
```json
{
"code": 200,
"success": true,
"data": {
"comprehensiveScore": 88.75,
"status": "COMPLETED"
},
"msg": "评分成功"
}
```
---
### 3.19 计算报价分
```
POST /api/bidding-self/score/calculate
```
**请求体**BiddingSelfScoreCalculateDTO
```json
{
"initiateId": 987654321,
"scoreMethod": "LOW_PRICE",
"scoreWeight": 60.00,
"quoteRound": 2
}
```
**响应数据**R<BiddingSelfScoreVO>
```json
{
"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
```json
{
"initiateId": 987654321,
"voteRound": 1,
"voteType": "SINGLE",
"voteResult": "[20001]",
"personalOpinion": "建议选择该供应商"
}
```
**响应数据**R<BiddingSelfVoteVO>
```json
{
"code": 200,
"success": true,
"data": {
"status": "COMPLETED",
"voteTime": "2026-07-05 14:30:00"
},
"msg": "投票成功"
}
```
---
### 3.21 确认入围名单
```
POST /api/bidding-self/finalist/confirm
```
**请求体**BiddingSelfFinalistDTO
```json
{
"initiateId": 987654321,
"finalistList": [
{
"supplierId": 20001,
"ranking": 1,
"comprehensiveScore": 88.75,
"voteCount": 3,
"finalQuote": 450000.00
}
]
}
```
**响应数据**R<BiddingSelfFinalistVO>
```json
{
"code": 200,
"success": true,
"data": {
"finalistCount": 3,
"status": "CONFIRMED"
},
"msg": "确认成功"
}
```
---
## 4. 数据类型定义
### 4.1 BladeFile附件对象
```typescript
interface BladeFile {
name: string; // 文件名(存储名)
url: string; // 文件访问URL
size: number; // 文件大小(字节)
originalName: string; // 原始文件名
contentType: string; // 文件类型
}
```
### 4.2 SubjectItem标的物
```typescript
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评标专家
```typescript
interface ExpertItem {
expertId: number; // 专家ID
expertName: string; // 专家姓名
expertType: string; // 专家类型appoint-指定 / random-随机
}
```
### 4.4 UserDeptItem用户部门信息
```typescript
interface UserDeptItem {
deptId: number; // 部门ID
deptName: string; // 部门名称
tenantId: number; // 公司ID租户ID
tenantName: string; // 公司名称
isDefault: boolean; // 是否默认部门
}
```
### 4.5 BiddingSelfRegistration供应商报名
```typescript
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资质审核
```typescript
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投标/开标)
```typescript
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唱标记录
```typescript
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专家签到
```typescript
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专家评标
```typescript
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供应商报价
```typescript
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报价分计算
```typescript
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投票
```typescript
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入围供应商
```typescript
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的接口定义和前端需求说明<br>1. 新增36个REST API接口共45个接口<br>2. 新增16个前端页面需求说明只含需求描述不含代码实现<br>3. 新增15个数据类型定义<br>4. 补充总裁办负责人审批节点3.7.4.3<br>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后续节点编号依次前移 |
---
**文档结束**
> 说明:本文档为前端开发提供完整的接口定义和需求说明。后端接口已按此文档实现。前端具体实现由前端开发团队根据需求自行设计。