# 分段招标管理 > 模块编码: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 反馈机制(建议)**: 操作成功 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 | | 资质要求 | 多行文本 | 否 | — | 自填 | — | | 评标标准 | 多行文本 | 否 | — | 自填 | — | ### 交互流程要求 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 反馈机制(建议)**: 操作成功 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 | — | ### 交互流程要求 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 反馈机制(建议)**: 操作成功 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个文件 | | 邀请供应商 | 下拉多选 | 条件 | — | 供应商列表(已审核) | 邀请招标时必填 | ### 交互流程要求 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 反馈机制(建议)**: 发布成功显示 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 | 否 | 已投标/已开标 | ### 交互流程要求 1. **页面加载流程**:进入页面 → 调用投标列表API → 渲染列表,默认按投标时间倒序 2. **查询/筛选交互流程**:支持按标段名称、供应商、状态筛选 3. **表单填写与提交流程**:不适用(医院端仅查看投标数据,投标由供应商提交) 4. **弹窗/抽屉交互流程**:点击投标文件"下载查看" → 新窗口打开/下载投标文件 5. **行内操作流程**:点击投标文件列链接下载查看 6. **异常与错误处理**:投标文件下载失败提示"文件下载失败,请重试";列表为空显示el-empty 7. **联动/级联交互**:标段选择后自动过滤该标段下的投标数据 8. **权限控制交互表现**:医院账号仅查看,无操作按钮 ### 前端硬性约束 - **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 | 操作栏 | 始终 | — | ### 交互流程要求 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 反馈机制(建议)**: 操作成功显示 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 | 行操作 | 状态=待定标 | 通过/驳回 | ### 交互流程要求 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 反馈机制(建议)**: 操作成功 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 | 行操作 | 状态=已生效 | 跳转合同管理创建合同 | ### 交互流程要求 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 反馈机制(建议)**: 跳转成功无需提示(已跳转);跳转失败显示 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 | — | 操作日志 | ## 业务规则 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 |