# 自行招标流程接口文档(含前端需求说明) **版本**: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 页面,通过 `` 动态切换 - **技术栈**: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): ```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): ```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): ```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): ```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": "张三,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): ```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>): ```json { "code": 200, "success": true, "data": [ { "code": "lowest_price", "name": "低价优先法", "description": "即能够满足招标文件的各项要求,投标价格最低的投标即可作为中选投标。" } ], "msg": "操作成功" } ``` --- ### 3.7 文件上传(系统标准) ``` POST /api/bidding-self/upload ``` **请求参数**: | 参数名 | 类型 | 必填 | 位置 | 说明 | |--------|------|------|------|------| | file | MultipartFile | 是 | FormData | 文件 | **响应数据**(R): ```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>): ```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>): ```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): ```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>): ```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): ```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>): ```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): ```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): ```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): ```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): ```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): ```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): ```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): ```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): ```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 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. 主页面通过 动态加载子页面 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,后续节点编号依次前移 | --- **文档结束** > 说明:本文档为前端开发提供完整的接口定义和需求说明。后端接口已按此文档实现。前端具体实现由前端开发团队根据需求自行设计。