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