You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

745 lines
43 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 分段招标管理
> 模块编码bidding
> 端侧Web专属仅医院账号
> 关联文档01-模块划分 §4.2 / 02-功能清单-医院 §2 / 03-业务流转逻辑-医院 §2 / 05-接口规范 §9.2
> 强制规范遵循 `07-前端界面开发规范.md`
## 功能概览
| 项目 | 说明 |
|------|------|
| 菜单名称 | 分段招标管理 |
| 子菜单 | 招标计划、标段管理、供应商管理、招标发布、投标管理、评标管理、定标审批、中标公示 |
| 功能编号 | HO-BD-01 ~ HO-BD-09 |
| 权限编码前缀 | bidding:plan:* / bidding:section:* / bidding:supplier:* / bidding:award:* |
> **重要**:分段招标管理仅医院账号可用,物业公司不可操作此模块。
---
## 页面1招标计划页
**页面编号**HO-BD-01-P01
**端侧归属**Web专属
**页面路径**/bidding/plans
### 界面布局
```
┌──────────────────────────────────────────────────────────────────┐
│ [面包屑] 分段招标管理 > 招标计划 │
├──────────────────────────────────────────────────────────────────┤
│ [查询条件区] │
│ 计划名称[____] 状态[▼] 招标方式[▼] [查询] [重置] │
├──────────────────────────────────────────────────────────────────┤
│ [操作栏] [新增招标计划] │
├──────────────────────────────────────────────────────────────────┤
│ [列表区] │
│ 序号| 计划名称 | 招标方式 | 标段数 | 状态 | 创建时间 | 操作 │
│ 1 | 2026年保洁招标 | 公开招标 | 3 | 投标中 | 04-01 | 查看 │
│ 2 | 2026年维修招标 | 邀请招标 | 2 | 计划中 | 04-10 | 编辑 │
├──────────────────────────────────────────────────────────────────┤
│ [分页] 共8条 │
└──────────────────────────────────────────────────────────────────┘
```
### 表单字段(新增/编辑页)
| 字段名 | 控件类型 | 必填 | 默认值 | 数据来源 | 校验规则 |
|--------|----------|------|--------|----------|----------|
| 计划名称 | 文本输入 | 是 | — | 自填 | 最大100字 |
| 关联项目 | 下拉单选 | 是 | — | 本医院院区 | — |
| 招标方式 | 下拉单选 | 是 | — | 固定选项 | 公开招标/邀请招标/竞争性谈判 |
| 预算金额 | 数字输入 | 是 | — | 自填 | >0 |
| 投标截止日期 | 日期时间 | 是 | — | 自填 | 晚于当前时间 |
| 计划描述 | 多行文本 | 否 | — | 自填 | 最大500字 |
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 新增招标计划 | bidding:plan:create | 操作栏 | 始终 | — |
| 编辑 | bidding:plan:update | 行操作 | 状态=计划中 | — |
| 查看 | bidding:plan:view | 行操作 | 始终 | — |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 列表查询 | /api/v1/bidding-plans | GET | — |
| 新增 | /api/v1/bidding-plans | POST | — |
| 编辑 | /api/v1/bidding-plans/{id} | PUT | — |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用招标计划列表API → 渲染列表
2. **查询/筛选交互流程**:填写筛选条件 → 点击"查询"按钮 → 调用API携带筛选参数 → 刷新列表;点击"重置"清空条件重新加载
3. **表单填写与提交流程**:点击"新增招标计划" → 弹出新增弹窗(或跳转新增页)→ 填写表单 → 提交保存;点击"编辑"(状态=计划中)→ 弹出编辑弹窗 → 修改后保存
4. **弹窗/抽屉交互流程**:新增/编辑弹窗el-dialog含招标计划表单字段
5. **行内操作流程**:点击"查看"跳转计划详情页;点击"编辑"弹出编辑弹窗
6. **异常与错误处理**API请求失败显示el-message错误提示投标截止日期早于当前时间提交时提示错误
7. **联动/级联交互**状态筛选与列表数据联动筛选后分页重置为第1页
8. **权限控制交互表现**:无创建权限隐藏"新增招标计划"按钮;状态非"计划中"时隐藏"编辑"按钮
### 前端硬性约束
- **H1 防重复提交(强制)**: "查询"/"新增招标计划"按钮请求期间置 loading+disabled 状态;行操作(编辑/查看)点击后禁用该行操作直至请求完成;翻页时 abort 未完成请求
- **H2 超时控制(强制)**: 列表查询(GET)超时 15s表单提交(POST)超时 30s超过阈值提示"请求超时,请稍后重试"
- **H3 操作确认(强制)**: 本页面无危险操作需二次确认
- **H5 权限隔离(建议)**: 返回空列表展示"暂无招标计划"code=403 时展示"无权限访问"
- **H6 批量限制(建议)**: 本页面无批量导出操作
- **H8 反馈机制(建议)**: 操作成功 successduration=2s+ 静默刷新;失败 errorduration=0网络异常显示重试按钮
- **弹窗表单(新增/编辑招标计划)额外约束**:
- **H1 防重复提交(强制)**: 弹窗内提交按钮 loading+disabled
- **H2 超时控制(强制)**: 提交(POST/PUT)超时 30s
- **H4 脏数据检测(强制)**: 弹窗内表单修改后尝试关闭时拦截确认
- **H8 反馈机制(建议)**: 成功关闭弹窗 + 刷新 + success(2s);失败 error(0)
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 计划名称输入 | el-input | placeholder="请输入计划名称"clearablemaxlength=100 |
| 状态选择 | el-select | placeholder="请选择状态"clearable |
| 招标方式选择 | el-select | placeholder="请选择招标方式"clearableoptions: 公开招标/邀请招标/竞争性谈判 |
| 查询按钮 | el-button | type="primary"icon="Search" |
| 重置按钮 | el-button | type="default"icon="Refresh" |
| 新增招标计划按钮 | el-button | type="primary"icon="Plus" |
| 计划列表 | el-table | stripeborderrow-key="id" |
| 状态列 | el-tag | :type根据状态配色计划中=info投标中=warning已完成=success |
| 编辑按钮 | el-button | type="primary"size="small"link样式 |
| 查看按钮 | el-button | type="default"size="small"link样式 |
| 新增/编辑弹窗 | el-dialog | title="新增招标计划/编辑招标计划"width="600px" |
| 关联项目选择 | el-select | placeholder="请选择关联项目"filterable |
| 预算金额 | el-input-number | :min=0.01:precision=2controls-position="right" |
| 投标截止日期 | el-date-picker | type="datetime"placeholder="请选择投标截止日期" |
| 计划描述 | el-input | type="textarea":rows=4maxlength=500show-word-limit |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 计划名称 | requiredmaxlength=100 | 请输入计划名称 / 计划名称不能超过100个字符 |
| 关联项目 | required | 请选择关联项目 |
| 招标方式 | required | 请选择招标方式 |
| 预算金额 | required>0 | 请输入预算金额 / 预算金额必须大于0 |
| 投标截止日期 | required晚于当前时间 | 请选择投标截止日期 / 截止日期必须晚于当前时间 |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 查询条件区单行排列,列表全字段展示 |
| 1024-1279pxPad横屏 | 查询条件区双行排列,隐藏"创建时间"列编辑弹窗宽度90% |
| 768-1023pxPad竖屏 | 查询条件区纵向堆叠,仅显示计划名称/状态筛选,列表显示核心字段(计划名称/招标方式/状态/操作),弹窗全屏宽度 |
---
## 页面2标段管理页
**页面编号**HO-BD-02-P01
**端侧归属**Web专属
**页面路径**/bidding/sections
### 列表字段
| 序号 | 字段名 | 列宽 | 支持排序 | 说明 |
|------|--------|------|----------|------|
| 1 | 标段名称 | 150px | 否 | — |
| 2 | 所属计划 | 150px | 否 | — |
| 3 | 标段范围 | 200px | 否 | — |
| 4 | 预算金额 | 100px | 是 | — |
| 5 | 投标供应商数 | 100px | 否 | — |
| 6 | 状态 | 80px | 否 | — |
| 7 | 操作 | 100px | — | 编辑/查看 |
### 表单字段(新增/编辑弹窗)
| 字段名 | 控件类型 | 必填 | 默认值 | 数据来源 | 校验规则 |
|--------|----------|------|--------|----------|----------|
| 标段名称 | 文本输入 | 是 | — | 自填 | 最大50字 |
| 标段范围 | 多行文本 | 是 | — | 自填 | 最大500字 |
| 预算金额 | 数字输入 | 是 | — | 自填 | >0 |
| 资质要求 | 多行文本 | 否 | — | 自填 | — |
| 评标标准 | 多行文本 | 否 | — | 自填 | — |
### 交互流程要求
1. **页面加载流程**:进入页面(从招标计划详情进入)→ 调用标段列表API → 渲染列表
2. **查询/筛选交互流程**:不适用(按所属计划自动过滤)
3. **表单填写与提交流程**:点击"新增标段"(操作栏)→ 弹出新增弹窗 → 填写标段信息 → 保存;点击"编辑" → 弹出编辑弹窗 → 修改后保存
4. **弹窗/抽屉交互流程**:新增/编辑标段弹窗el-dialog含标段名称、范围、预算金额、资质要求、评标标准字段
5. **行内操作流程**:点击"编辑"弹出编辑弹窗;点击"查看"跳转标段详情
6. **异常与错误处理**保存失败显示el-message错误提示预算金额为0时阻止提交
7. **联动/级联交互**:所属计划与标段数据联动,切换计划自动加载对应标段
8. **权限控制交互表现**:无编辑权限时行操作仅显示"查看"
### 前端硬性约束
- **H1 防重复提交(强制)**: "新增标段"/行操作(编辑/查看)按钮请求期间置 loading+disabled 状态;操作期间禁用该行其他操作
- **H2 超时控制(强制)**: 列表查询(GET)超时 15s标段保存(POST)超时 30s超过阈值提示"请求超时,请稍后重试"
- **H3 操作确认(强制)**: 本页面无危险操作需二次确认
- **H5 权限隔离(建议)**: 返回空列表展示"暂无标段数据"code=403 时展示"无权限访问"
- **H8 反馈机制(建议)**: 操作成功 successduration=2s+ 静默刷新列表;失败 errorduration=0网络异常显示重试按钮
- **弹窗表单(新增/编辑标段)额外约束**:
- **H1 防重复提交(强制)**: 弹窗内提交按钮 loading+disabled
- **H2 超时控制(强制)**: 提交(POST)超时 30s
- **H4 脏数据检测(强制)**: 弹窗内表单修改后尝试关闭时拦截确认
- **H8 反馈机制(建议)**: 成功关闭弹窗 + 刷新 + success(2s);失败 error(0)
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 标段列表 | el-table | stripeborderrow-key="id" |
| 状态列 | el-tag | :type根据状态配色 |
| 编辑按钮 | el-button | type="primary"size="small"link样式 |
| 查看按钮 | el-button | type="default"size="small"link样式 |
| 新增/编辑弹窗 | el-dialog | title="新增标段/编辑标段"width="600px" |
| 标段名称输入 | el-input | placeholder="请输入标段名称"maxlength=50 |
| 标段范围 | el-input | type="textarea":rows=3maxlength=500show-word-limit |
| 预算金额 | el-input-number | :min=0.01:precision=2controls-position="right" |
| 资质要求 | el-input | type="textarea":rows=3 |
| 评标标准 | el-input | type="textarea":rows=3 |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 标段名称 | requiredmaxlength=50 | 请输入标段名称 / 标段名称不能超过50个字符 |
| 标段范围 | requiredmaxlength=500 | 请输入标段范围 / 标段范围不能超过500个字符 |
| 预算金额 | required>0 | 请输入预算金额 / 预算金额必须大于0 |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 列表全字段展示,操作列右对齐 |
| 1024-1279pxPad横屏 | 隐藏"标段范围"列编辑弹窗宽度90% |
| 768-1023pxPad竖屏 | 仅显示标段名称/预算金额/状态/操作核心字段,弹窗全屏宽度 |
---
## 页面3供应商管理页
**页面编号**HO-BD-03-P01
**端侧归属**Web专属
**页面路径**/bidding/suppliers
### 列表字段
| 序号 | 字段名 | 列宽 | 支持排序 | 说明 |
|------|--------|------|----------|------|
| 1 | 供应商名称 | 150px | 是 | — |
| 2 | 联系人 | 80px | 否 | — |
| 3 | 联系电话 | 120px | 否 | — |
| 4 | 资质状态 | 80px | 否 | 已审核/待审核/黑名单 |
| 5 | 合作次数 | 80px | 是 | — |
| 6 | 操作 | 140px | — | 编辑/审核/拉黑 |
### 表单字段(新增/编辑弹窗)
| 字段名 | 控件类型 | 必填 | 默认值 | 数据来源 | 校验规则 |
|--------|----------|------|--------|----------|----------|
| 供应商名称 | 文本输入 | 是 | — | 自填 | 最大100字 |
| 统一社会信用代码 | 文本输入 | 是 | — | 自填 | 18位 |
| 联系人 | 文本输入 | 是 | — | 自填 | — |
| 联系电话 | 文本输入 | 是 | — | 自填 | 手机号格式 |
| 地址 | 文本输入 | 否 | — | 自填 | — |
| 资质文件 | 文件上传 | 否 | — | 上传 | ≤5个文件 |
| 备注 | 多行文本 | 否 | — | 自填 | 最大200字 |
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 新增供应商 | bidding:supplier:create | 操作栏 | 始终 | — |
| 编辑 | bidding:supplier:update | 行操作 | 始终 | — |
| 资质审核 | bidding:supplier:approve | 行操作 | 资质状态=待审核 | 通过/驳回 |
| 拉黑/移出黑名单 | bidding:supplier:update | 行操作 | 始终 | 黑名单供应商不可投标 |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 列表查询 | /api/v1/suppliers | GET | — |
| 新增 | /api/v1/suppliers | POST | — |
| 资质审核 | /api/v1/suppliers/{id}/audit | POST | — |
| 拉黑 | /api/v1/suppliers/{id}/blacklist | PUT | — |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用供应商列表API → 渲染列表,黑名单供应商行灰色标记
2. **查询/筛选交互流程**:支持按供应商名称、资质状态筛选,查询后刷新列表
3. **表单填写与提交流程**:点击"新增供应商" → 弹出新增弹窗 → 填写供应商信息 → 保存;点击"编辑" → 弹出编辑弹窗 → 修改后保存
4. **弹窗/抽屉交互流程**:新增/编辑供应商弹窗el-dialog资质审核弹窗选择通过/驳回驳回需填写原因拉黑确认弹窗el-message-box
5. **行内操作流程**:点击"资质审核"弹出审核弹窗;点击"拉黑"弹出确认弹窗,确认后状态变更;点击"移出黑名单"恢复正常状态
6. **异常与错误处理**:统一社会信用代码重复时提示"该供应商已存在";拉黑后该供应商不可投标,操作时二次确认提醒
7. **联动/级联交互**:资质状态与操作按钮联动(待审核显示审核按钮,黑名单显示移出黑名单按钮)
8. **权限控制交互表现**:无审核权限隐藏"资质审核"按钮;无拉黑权限隐藏"拉黑/移出黑名单"按钮
### 前端硬性约束
- **H1 防重复提交(强制)**: "新增供应商"/行操作(编辑/资质审核/拉黑)按钮请求期间置 loading+disabled 状态;操作期间禁用该行其他操作
- **H2 超时控制(强制)**: 列表查询(GET)超时 15s提交/审核(POST)超时 30s超过阈值提示"请求超时,请稍后重试"
- **H3 操作确认(强制)**: "拉黑"前弹出 confirm(`确定要将供应商"${supplierName}"加入黑名单?加入后该供应商将无法参与任何投标。`, type='error')"移出黑名单"前弹出 confirm("确定要将该供应商移出黑名单?", type='warning')"资质审核-驳回"前弹出 confirm + 驳回原因输入框(必填)
- **H5 权限隔离(建议)**: 返回空列表展示"暂无供应商数据"code=403 时展示"无权限访问"
- **H7 文件上传(建议)**: 资质文件上传限制单个文件≤10MB、总数≤9个超出时提示"单文件不超过10MB附件总数不超过9个"
- **H8 反馈机制(建议)**: 操作成功 successduration=2s+ 静默刷新列表;失败 errorduration=0网络异常显示重试按钮
- **弹窗表单(新增/编辑供应商)额外约束**:
- **H1 防重复提交(强制)**: 弹窗内提交按钮 loading+disabled
- **H2 超时控制(强制)**: 提交(POST)超时 30s
- **H4 脏数据检测(强制)**: 弹窗内表单修改后尝试关闭时拦截确认
- **H8 反馈机制(建议)**: 成功关闭弹窗 + 刷新 + success(2s);失败 error(0)
- **弹窗表单(资质审核)额外约束**:
- **H1 防重复提交(强制)**: 弹窗内确认按钮 loading+disabled
- **H2 超时控制(强制)**: 审核(POST)超时 30s
- **H3 操作确认(强制)**: 已由外层 H3 覆盖(驳回需原因)
- **H4 脏数据检测(强制)**: 审核结果/驳回原因修改后尝试关闭时拦截
- **H8 反馈机制(建议)**: 成功关闭弹窗 + 刷新 + success(2s);失败 error(0)
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 供应商列表 | el-table | stripeborder:row-class-name黑名单行灰色 |
| 资质状态列 | el-tag | :type根据状态配色已审核=success待审核=warning黑名单=danger |
| 新增供应商按钮 | el-button | type="primary"icon="Plus" |
| 编辑按钮 | el-button | type="primary"size="small"link样式 |
| 资质审核按钮 | el-button | type="warning"size="small"link样式 |
| 拉黑按钮 | el-button | type="danger"size="small"link样式 |
| 新增/编辑弹窗 | el-dialog | title="新增供应商/编辑供应商"width="600px" |
| 统一社会信用代码 | el-input | placeholder="请输入统一社会信用代码"maxlength=18 |
| 联系电话 | el-input | placeholder="请输入联系电话" |
| 资质文件上传 | el-upload | action="/api/v1/files/upload":limit=5:file-list.sync |
| 资质审核弹窗 | el-dialog | title="资质审核"width="500px" |
| 审核结果 | el-radio-group | 通过/驳回单选 |
| 审核驳回原因 | el-input | type="textarea":rows=3v-if="审核结果=驳回" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 供应商名称 | requiredmaxlength=100 | 请输入供应商名称 / 供应商名称不能超过100个字符 |
| 统一社会信用代码 | requiredpattern=/^[0-9A-Z]{18}$/ | 请输入统一社会信用代码 / 统一社会信用代码格式不正确18位字母数字 |
| 联系人 | required | 请输入联系人 |
| 联系电话 | requiredpattern=/^1[3-9]\d{9}$/ | 请输入联系电话 / 联系电话格式不正确 |
| 审核结果 | required审核时 | 请选择审核结果 |
| 审核驳回原因 | required审核驳回时 | 请输入驳回原因 |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 列表全字段展示,操作列右对齐 |
| 1024-1279pxPad横屏 | 隐藏"合作次数"列,操作收入"更多"下拉 |
| 768-1023pxPad竖屏 | 仅显示供应商名称/资质状态/操作核心字段,弹窗全屏宽度 |
---
## 页面4招标发布页
**页面编号**HO-BD-04-P01
**端侧归属**Web专属
**页面路径**/bidding/publish
### 操作流程
```
选择招标计划 → 确认标段 → 上传招标文件 → 邀请供应商(邀请招标时) → 发布
```
### 表单字段
| 字段名 | 控件类型 | 必填 | 默认值 | 数据来源 | 校验规则 |
|--------|----------|------|--------|----------|----------|
| 招标计划 | 下拉单选 | 是 | — | 计划中/待发布的计划 | — |
| 招标公告 | 多行文本 | 是 | — | 自填 | — |
| 招标文件 | 文件上传 | 是 | — | 上传 | ≤10个文件 |
| 邀请供应商 | 下拉多选 | 条件 | — | 供应商列表(已审核) | 邀请招标时必填 |
### 交互流程要求
1. **页面加载流程**:进入页面 → 加载可选招标计划(状态=待发布)→ 渲染发布表单
2. **查询/筛选交互流程**:不适用
3. **表单填写与提交流程**:选择招标计划 → 自动加载关联标段信息 → 确认标段 → 上传招标文件 → 填写招标公告 → (邀请招标时)选择邀请供应商 → 点击"发布" → 二次确认后调用发布API → 发布成功跳转招标计划页
4. **弹窗/抽屉交互流程**发布确认弹窗el-message-box提示"确认发布招标?发布后不可撤回"招标文件上传使用el-upload支持预览已上传文件
5. **行内操作流程**:不适用(发布页为表单交互)
6. **异常与错误处理**:招标文件未上传时阻止发布;邀请招标未选择供应商时提示"请选择邀请供应商"发布失败显示el-message错误提示
7. **联动/级联交互**:招标方式为"邀请招标"时显示邀请供应商选择(必填);招标方式为"公开招标"时隐藏;选择招标计划后自动加载标段信息
8. **权限控制交互表现**:无发布权限时隐藏"发布"按钮
### 前端硬性约束
- **H1 防重复提交(强制)**: "发布"按钮请求期间置 loading+disabled 状态;提交后禁用所有表单交互直至请求完成
- **H2 超时控制(强制)**: 表单提交(POST)超时 30s文件上传超时 60s超过阈值提示"请求超时,请稍后重试"
- **H3 操作确认(强制)**: "发布"前弹出 confirm("确定要发布该招标?发布后不可撤回,供应商将可查看并投标。", type='warning')
- **H4 脏数据检测(强制)**: 页面加载时 deep clone 初始表单数据为 _originData监听表单变化维护 isDirty 标志;用户未保存尝试离开时通过 beforeRouteLeave 拦截并弹窗确认
- **H7 文件上传(建议)**: 招标文件上传限制单个文件≤10MB、总数≤9个超出时提示"单文件不超过10MB文件总数不超过9个";支持 .pdf/.doc/.docx
- **H8 反馈机制(建议)**: 发布成功显示 successduration=2s+ 延迟跳转招标计划页;失败显示 errorduration=0网络异常时显示重试按钮
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 招标计划选择 | el-select | placeholder="请选择招标计划"filterable@change加载标段信息 |
| 标段确认区 | el-table | :data=关联标段stripeborderdisabled不可编辑 |
| 招标公告 | el-input | type="textarea":rows=6placeholder="请输入招标公告" |
| 招标文件上传 | el-upload | action="/api/v1/files/upload":limit=10accept=".pdf,.doc,.docx"drag拖拽上传:on-preview预览 |
| 邀请供应商 | el-select | placeholder="请选择供应商"multiplefilterablecollapse-tagsv-if="招标方式=邀请招标" |
| 发布按钮 | el-button | type="primary"icon="Promotion":loading提交中 |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 招标计划 | required | 请选择招标计划 |
| 招标公告 | required | 请输入招标公告 |
| 招标文件 | required≤10个 | 请上传招标文件 / 招标文件不能超过10个 |
| 邀请供应商 | required邀请招标时 | 请选择邀请供应商 |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 表单双列布局,标段确认区全宽展示 |
| 1024-1279pxPad横屏 | 表单单列布局,标段确认区全宽展示 |
| 768-1023pxPad竖屏 | 表单单列布局文件上传区域宽度100%,邀请供应商选择全宽展示 |
---
## 页面5投标管理页
**页面编号**HO-BD-05-P01
**端侧归属**Web专属
**页面路径**/bidding/bids
### 列表字段
| 序号 | 字段名 | 列宽 | 支持排序 | 说明 |
|------|--------|------|----------|------|
| 1 | 标段名称 | 120px | 否 | — |
| 2 | 供应商 | 120px | 否 | — |
| 3 | 投标时间 | 140px | 是 | — |
| 4 | 投标金额 | 100px | 是 | — |
| 5 | 投标文件 | 100px | 否 | 下载查看 |
| 6 | 状态 | 80px | 否 | 已投标/已开标 |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用投标列表API → 渲染列表,默认按投标时间倒序
2. **查询/筛选交互流程**:支持按标段名称、供应商、状态筛选
3. **表单填写与提交流程**:不适用(医院端仅查看投标数据,投标由供应商提交)
4. **弹窗/抽屉交互流程**:点击投标文件"下载查看" → 新窗口打开/下载投标文件
5. **行内操作流程**:点击投标文件列链接下载查看
6. **异常与错误处理**:投标文件下载失败提示"文件下载失败,请重试"列表为空显示el-empty
7. **联动/级联交互**:标段选择后自动过滤该标段下的投标数据
8. **权限控制交互表现**:医院账号仅查看,无操作按钮
### 前端硬性约束
- **H1 防重复提交(强制)**: 投标文件下载按钮点击后置 loading+disabled 状态直至下载完成
- **H2 超时控制(强制)**: 列表查询(GET)超时 15s文件下载超时 60s超过阈值提示"请求超时,请稍后重试"
- **H8 反馈机制(建议)**: 文件下载失败显示 errorduration=0网络异常时显示重试按钮列表加载成功静默刷新
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 投标列表 | el-table | stripeborder:default-sort="{prop: 'bidTime', order: 'descending'}" |
| 状态列 | el-tag | :type根据状态配色已投标=info已开标=success |
| 投标文件 | el-link | type="primary":underline=falseicon="Download"@click下载 |
| 标段筛选 | el-select | placeholder="请选择标段"clearablefilterable |
| 供应商筛选 | el-input | placeholder="请输入供应商名称"clearable |
| 状态筛选 | el-select | placeholder="请选择状态"clearable |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| (无表单校验) | — | — |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 列表全字段展示 |
| 1024-1279pxPad横屏 | 隐藏"投标文件"列(改为行操作下载按钮) |
| 768-1023pxPad竖屏 | 仅显示标段名称/供应商/投标金额/状态核心字段 |
---
## 页面6评标管理页
**页面编号**HO-BD-06-P01
**端侧归属**Web专属
**页面路径**/bidding/evaluations
### 界面布局
```
┌──────────────────────────────────────────────────────────────────┐
│ [面包屑] 分段招标管理 > 评标管理 │
├──────────────────────────────────────────────────────────────────┤
│ [评标委员会] [组建评标委员会] │
│ 评标人1张三 评标人2李四 评标人3王五 │
├──────────────────────────────────────────────────────────────────┤
│ [评分标准] [设置评分标准] │
│ 商务评分权重40% 技术评分权重40% 价格评分权重20% │
├──────────────────────────────────────────────────────────────────┤
│ [评分录入] │
│ 供应商 | 商务分 | 技术分 | 价格分 | 总分 | 排名 │
│ XX公司 | [___] | [___] | [___] | — | — │
│ YY公司 | [___] | [___] | [___] | — | — │
│ [提交评标结果] │
└──────────────────────────────────────────────────────────────────┘
```
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 组建评标委员会 | bidding:award:create | 操作栏 | 始终 | — |
| 设置评分标准 | bidding:award:create | 操作栏 | 始终 | — |
| 提交评标结果 | bidding:award:update | 操作栏 | 始终 | — |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用评标数据API → 渲染评标委员会信息、评分标准、评分录入表格
2. **查询/筛选交互流程**:不适用
3. **表单填写与提交流程**:流程步骤:组建评标委员会 → 设置评分标准 → 录入各供应商评分 → 提交评标结果。组建委员会:点击按钮 → 弹窗选择评标人员 → 保存;设置评分标准:点击按钮 → 弹窗设置各维度权重 → 保存(权重之和必须=100%);录入评分:在评分表格中逐行填写各供应商的商务分/技术分/价格分 → 系统自动计算总分和排名 → 点击"提交评标结果"
4. **弹窗/抽屉交互流程**组建评标委员会弹窗el-dialog含评标人员多选设置评分标准弹窗el-dialog含各维度权重滑块/输入)
5. **行内操作流程**:评分录入表格中行内输入评分数据,总分和排名自动计算
6. **异常与错误处理**评分权重之和不等于100%时阻止保存;单项评分超出范围提示错误;提交评标结果时校验所有供应商评分是否填写完整
7. **联动/级联交互**:评分标准设置后,评分录入表头动态显示对应权重;各维度评分输入后自动计算总分和排名
8. **权限控制交互表现**:无评标权限时仅查看评分结果,不可编辑
### 前端硬性约束
- **H1 防重复提交(强制)**: "组建评标委员会"/"设置评分标准"/"提交评标结果"按钮请求期间置 loading+disabled 状态;评分录入期间锁定已填写行
- **H2 超时控制(强制)**: 数据加载(GET)超时 15s提交(POST)超时 30s超过阈值提示"请求超时,请稍后重试"
- **H3 操作确认(强制)**: "提交评标结果"前弹出 confirm("确定要提交评标结果?提交后将进入定标审批流程,不可修改评分。", type='warning')
- **H4 脏数据检测(强制)**: 页面加载时 deep clone 初始评分数据为 _originData监听评分变化维护 isDirty 标志;用户有未保存评分尝试离开时通过 beforeRouteLeave 拦截确认
- **H8 反馈机制(建议)**: 操作成功显示 successduration=2s+ 静默刷新页面状态;失败显示 errorduration=0网络异常显示重试按钮
- **弹窗表单(组建委员会/设置标准)额外约束**:
- **H1 防重复提交(强制)**: 弹窗内确认按钮 loading+disabled
- **H2 超时控制(强制)**: 提交(POST)超时 30s
- **H4 脏数据检测(强制)**: 弹窗内数据修改后尝试关闭时拦截确认
- **H8 反馈机制(建议)**: 成功关闭弹窗 + 刷新 + success(2s);失败 error(0)
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 评标步骤指示 | el-steps | :active=当前步骤,:space=200finish-status="success" |
| 评标委员会区 | el-card | shadow="hover",含评标人员列表 |
| 组建评标委员会按钮 | el-button | type="primary"icon="User"size="small" |
| 评标人员展示 | el-tag | v-for遍历评标人员closable |
| 评分标准区 | el-card | shadow="hover",含各维度权重展示 |
| 设置评分标准按钮 | el-button | type="primary"icon="Setting"size="small" |
| 评分录入表格 | el-table | :data=供应商评分数据stripebordershow-summary |
| 商务分/技术分/价格分 | el-input-number | :min=0:max=100:precision=1controls-position="right"size="small" |
| 总分列 | 自动计算 | :formatter根据权重加权计算 |
| 排名列 | 自动计算 | 根据总分降序排列 |
| 提交评标结果按钮 | el-button | type="primary"icon="Check":loading提交中 |
| 组建评标委员会弹窗 | el-dialog | title="组建评标委员会"width="600px" |
| 评标人员选择 | el-select | multiplefilterableplaceholder="请选择评标人员" |
| 设置评分标准弹窗 | el-dialog | title="设置评分标准"width="500px" |
| 权重输入 | el-slider | :min=0:max=100show-input:marks="{0:'0%', 50:'50%', 100:'100%'}" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 评标人员 | required≥3人 | 请选择评标人员 / 评标委员会至少3人 |
| 商务评分权重 | required0-100 | 请设置商务评分权重 |
| 技术评分权重 | required0-100 | 请设置技术评分权重 |
| 价格评分权重 | required0-100 | 请设置价格评分权重 |
| 权重总和 | =100% | 评分权重之和必须等于100% |
| 商务分/技术分/价格分 | required0-100 | 请输入评分 / 评分范围为0-100 |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 评标委员会与评分标准左右并排,评分录入表格全宽 |
| 1024-1279pxPad横屏 | 评标委员会与评分标准上下排列,评分录入表格全宽,评分输入列宽缩小 |
| 768-1023pxPad竖屏 | 全部区域纵向堆叠,评分录入表格横向滚动,弹窗全屏宽度 |
---
## 页面7定标审批页
**页面编号**HO-BD-07-P01
**端侧归属**Web专属
**页面路径**/bidding/award
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 定标审批 | bidding:award:approve | 行操作 | 状态=待定标 | 通过/驳回 |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用待定标项目列表API → 渲染列表
2. **查询/筛选交互流程**:支持按标段名称、状态筛选
3. **表单填写与提交流程**:点击"定标审批" → 弹出审批弹窗(查看评标结果摘要,选择通过/驳回)→ 驳回需填写原因 → 确认后调用API → 刷新列表
4. **弹窗/抽屉交互流程**定标审批弹窗el-dialog含评标结果摘要展示、通过/驳回选择、驳回原因输入)
5. **行内操作流程**:仅状态=待定标时显示"定标审批"按钮
6. **异常与错误处理**审批操作失败显示el-message错误提示
7. **联动/级联交互**:审批结果与列表状态联动(通过→公示中,驳回→评标中)
8. **权限控制交互表现**:无审批权限隐藏"定标审批"按钮
### 前端硬性约束
- **H1 防重复提交(强制)**: "定标审批"行操作按钮点击后置 loading+disabled 状态;弹窗内确认按钮同样 loading+disabled
- **H2 超时控制(强制)**: 列表查询(GET)超时 15s定标审批(POST)超时 30s超过阈值提示"请求超时,请稍后重试"
- **H3 操作确认(强制)**: "定标审批-通过"前弹出 confirm("确定要通过该定标审批?通过后将进入公示阶段。", type='warning')"定标审批-驳回"前弹出 confirm + 驳回原因输入框(必填),含影响说明:"驳回后需重新评标"
- **H5 权限隔离(建议)**: 返回空列表展示"暂无待定标项目"code=403 时展示"无权限访问"
- **H8 反馈机制(建议)**: 操作成功 successduration=2s+ 静默刷新列表;失败 errorduration=0网络异常显示重试按钮
- **弹窗表单(定标审批)额外约束**:
- **H1 防重复提交(强制)**: 弹窗内确认按钮 loading+disabled
- **H2 超时控制(强制)**: 提交(POST)超时 30s
- **H3 操作确认(强制)**: 已由外层 H3 覆盖
- **H4 脏数据检测(强制)**: 审批结果/驳回原因修改后尝试关闭弹窗时拦截确认
- **H8 反馈机制(建议)**: 成功关闭弹窗 + 刷新 + success(2s);失败 error(0)
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 定标列表 | el-table | stripeborder |
| 状态列 | el-tag | :type根据状态配色待定标=warning公示中=success评标中=info |
| 定标审批按钮 | el-button | type="primary"size="small"link样式 |
| 定标审批弹窗 | el-dialog | title="定标审批"width="600px" |
| 评标结果摘要 | el-descriptions | :column=1border展示中标候选人、评分等 |
| 审批结果 | el-radio-group | 通过/驳回单选 |
| 驳回原因 | el-input | type="textarea":rows=3v-if="审批结果=驳回" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 审批结果 | required | 请选择审批结果 |
| 驳回原因 | required审批驳回时 | 请输入驳回原因 |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 列表全字段展示审批弹窗600px宽度 |
| 1024-1279pxPad横屏 | 列表隐藏次要字段审批弹窗80%宽度 |
| 768-1023pxPad竖屏 | 列表仅显示核心字段,审批弹窗全屏宽度 |
---
## 页面8中标公示页
**页面编号**HO-BD-08-P01
**端侧归属**Web专属
**页面路径**/bidding/publicity
### 列表字段
| 序号 | 字段名 | 列宽 | 支持排序 | 说明 |
|------|--------|------|----------|------|
| 1 | 标段名称 | 120px | 否 | — |
| 2 | 中标供应商 | 120px | 否 | — |
| 3 | 中标金额 | 100px | 是 | — |
| 4 | 公示开始日 | 100px | 否 | — |
| 5 | 公示结束日 | 100px | 否 | — |
| 6 | 状态 | 80px | 否 | 公示中/已生效 |
| 7 | 操作 | 100px | — | 生成合同 |
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 生成合同 | contract:list:create | 行操作 | 状态=已生效 | 跳转合同管理创建合同 |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用中标公示列表API → 渲染列表
2. **查询/筛选交互流程**:支持按标段名称、状态筛选
3. **表单填写与提交流程**:点击"生成合同"(状态=已生效)→ 二次确认后跳转合同录入页,自动填充标段信息和中标供应商
4. **弹窗/抽屉交互流程**生成合同确认弹窗el-message-box提示"确认生成合同?将跳转合同管理创建合同"
5. **行内操作流程**:仅状态=已生效时显示"生成合同"按钮
6. **异常与错误处理**生成合同跳转失败显示el-message错误提示列表为空显示el-empty
7. **联动/级联交互**:公示状态与操作按钮联动(仅已生效显示生成合同按钮)
8. **权限控制交互表现**:无合同创建权限隐藏"生成合同"按钮
### 前端硬性约束
- **H1 防重复提交(强制)**: "生成合同"行操作按钮点击后置 loading+disabled 状态;操作期间禁用该行其他操作
- **H2 超时控制(强制)**: 列表查询(GET)超时 15s超过阈值提示"请求超时,请稍后重试"
- **H3 操作确认(强制)**: "生成合同"前弹出 confirm("确认生成合同?将跳转至合同管理并自动填充中标信息。", type='info')
- **H5 权限隔离(建议)**: 返回空列表展示"暂无中标公示记录"code=403 时展示"无权限访问"
- **H8 反馈机制(建议)**: 跳转成功无需提示(已跳转);跳转失败显示 errorduration=0网络异常显示重试按钮列表加载静默刷新
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 公示列表 | el-table | stripeborder |
| 状态列 | el-tag | :type根据状态配色公示中=warning已生效=success |
| 生成合同按钮 | el-button | type="primary"size="small"link样式icon="Document" |
| 生成合同确认弹窗 | el-message-box | title="确认生成合同"type="info"confirm-button-text="确认生成" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| (无表单校验) | — | — |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 列表全字段展示,操作列右对齐 |
| 1024-1279pxPad横屏 | 隐藏"公示开始日/公示结束日"列,操作列固定右侧 |
| 768-1023pxPad竖屏 | 仅显示标段名称/中标供应商/状态/操作核心字段 |
---
## 需求追溯
| 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 |
|------------|----------|----------|----------|----------|
| HO-BD-01 | 招标计划 | 02-医院 §2 / 03-医院 §2.2 | 计划→标段拆分 | — |
| HO-BD-02 | 标段管理 | 02-医院 §2 / 03-医院 §2.2 | 标段→招标发布 | — |
| HO-BD-03 | 供应商管理 | 02-医院 §2 | 供应商→投标 | — |
| HO-BD-04 | 招标发布 | 02-医院 §2 / 03-医院 §2.2 | 发布→供应商投标 | — |
| HO-BD-05 | 投标管理 | 02-医院 §2 / 03-医院 §2.2 | 投标截止→评标 | — |
| HO-BD-06 | 评标管理 | 02-医院 §2 / 03-医院 §2.2 | 评标完成→定标 | — |
| HO-BD-07 | 定标审批 | 02-医院 §2 / 03-医院 §2.2 | 定标→公示 | 操作日志 |
| HO-BD-08 | 中标公示 | 02-医院 §2 / 03-医院 §2.2 | 公示期满→生成合同 | 合同管理 |
| HO-BD-09 | 招标导出 | 02-医院 §2 | — | 操作日志 |
## 业务规则
1. **仅医院账号可用**物业公司不可操作此模块来源01 §4.2 / 02-医院 §2
2. **供应商信息自管**供应商信息由医院账号在本系统中录入和管理来源03-医院 §2.2
3. **黑名单供应商**黑名单供应商不可参与投标来源02-医院 HO-BD-03
4. **投标截止**截止时间到达后自动截止不可再提交投标来源03-医院 §2.2
5. **中标→生成合同**公示期满后可一键生成合同跳转合同管理创建来源03-医院 §2.2
6. **所有操作记录日志**招标各环节操作自动记录来源06 §4.5
## 状态流转
```
招标计划 ──▶ 标段拆分 ──▶ 招标发布 ──▶ 投标中 ──▶ 评标中 ──▶ 待定标 ──▶ 公示中 ──▶ 已定标 ──▶ 生成合同
```
| 当前状态 | 操作 | 目标状态 | 执行角色 | 端侧 |
|----------|------|----------|----------|------|
| — | 创建招标计划 | 计划中 | 医院账号 | Web |
| 计划中 | 标段拆分 | 待发布 | 医院账号 | Web |
| 待发布 | 发布招标 | 投标中 | 医院账号 | Web |
| 投标中 | 投标截止 | 评标中 | 系统/医院 | Web |
| 评标中 | 评标完成 | 待定标 | 医院账号 | Web |
| 待定标 | 定标审批 | 公示中 | 医院账号 | Web |
| 公示中 | 公示期满 | 已定标 | 系统自动 | Web |
| 已定标 | 生成合同 | — | 医院账号 | Web |