主题
招投标监管 · 详细设计文档
文档版本:1.00 | 最近核对日期:2026-09-30
进展说明:工程招标挂网→答疑→开标→公示→中标六阶段已按独立项目主数据完成真实闭环;非依法招标扩展、导入和等价角色仍待专项。本轮同步 2026-09-17 取消线路节点运营状态校验和 2026-09-18 线路选择器默认隐藏运营、可切换显示口径。
关联:需求分析、概要设计、数据库设计、测试与验收。接口以
digital-construction-ui/src/api/business/bidding/index.ts和后端实现共同核对。
1. 页面与路由组件
| 能力 | 前端组件 | 当前接口资源 | 关键交互 |
|---|---|---|---|
| 招标文件 | views/business/bidding/tenderDocument/index.vue | /business/bidding/tenderDocument | 独立项目选择、金额/方式、附件、列表筛选 |
| 挂网版本 | views/business/bidding/listingVersion/index.vue | /business/bidding/listingVersion | 主数据/挂网版本同表树形展示、默认全部展开、首挂/重挂、当前/废标轮次 |
| 答疑补遗 | views/business/bidding/clarification/index.vue | /business/bidding/clarification | 选择当前有效轮次、批次和文件 |
| 开标 | views/business/bidding/bidOpening/index.vue | /business/bidding/bidOpening | 三名候选人、报价、得分和结果附件 |
| 公示 | views/business/bidding/publicNotice/index.vue | /business/bidding/publicNotice | 绑定开标、条件异议字段、事实锁定 |
| 中标 | views/business/bidding/award/index.vue | /business/bidding/award | 绑定轮次、前置开标/公示和中标附件 |
| 立项 | views/business/bidding/projectApproval/index.vue | /business/bidding/projectApproval | 独立项目、审批人和立项流程入口 |
| 文件审查 | views/business/bidding/fileReview/index.vue | /business/bidding/fileReview | 三种立项来源、会签部门、审批入口 |
| 评审 | views/business/bidding/evaluation/index.vue | /business/bidding/evaluation | 选择完成文件审查、评审资料 |
| 下属单位招标 | views/business/bidding/subordinateTender/index.vue | /business/bidding/subordinateTender | 导入/模板/导出、进展推导、重复校验 |
实际菜单路由由系统菜单数据注册;若流程跳转路径与组件路径不一致,必须以当前菜单和 Warm-Flow 表单路径核对后再定稿。
当前招投标的 projectApproval、fileReview、evaluation 仍是各自的台账加弹窗办理页面,没有接入安全质量环保模块这套 FlowHeaderCard、双栏流程工作台和 FlowTimeline。审批办理沿平台任务能力执行;后续若统一视觉,应复用前端 UI 规范中的现有流程工作台,不再另起一套布局。本次已通过真实浏览器/API 契约核对工程招标主链路;测试员只需具备相应菜单/按钮/接口权限即可使用全部项目和招投标数据,项目成员关系及工程树节点范围不作为项目或招投标记录的访问过滤。招标登记线路使用 /business/engineering-tree/all-line-options 读取工程信息配置中的全部有效线路,工程业务使用的授权线路候选保持独立。非依法立项/文件审查审批链路保留历史证据,正式扩展仍待专项。
2. 接口契约
所有已实现资源统一提供 /business/bidding/{resource}/list、get/{id}、add、edit、remove/{ids} 等绝对端点(资源包括:tenderDocument、listingVersion、clarification、bidOpening、publicNotice、award、projectApproval、fileReview、evaluation、subordinateTender);列表分页,详情返回可展示字段和附件。下属单位额外提供 POST /import、GET /template、GET /export。招投标项目选择仅读取独立项目主数据,不再请求 GET /business/project/{projectId}/line 解析线路。项目 API 文件当前未暴露专用 /submit,非依法招标流程提交能力是否已由后端补齐需继续核对,不能按旧设计假定已存在。
| 资源 | 页面权限前缀 | 关键服务端校验 |
|---|---|---|
tenderDocument | bidding:tenderDocument:* | 项目有效、同项目唯一、项目快照、金额/附件;不按项目成员或工程树范围过滤;线路独立单选/可留空;归属单位仅业主集团/公司/分公司/合资公司;允许项目无工程范围 |
listingVersion | bidding:listingVersion:*(status 为 2026-09-26 新增的挂标状态变更权限) | 当前版本唯一、版本号、重挂并发、废标保护;状态变更只允许当前有效轮次且未登记中标的轮次,值域 normal/failed |
clarification | bidding:clarification:* | 当前非废标轮次自动绑定、可多批次 |
bidOpening | bidding:bidOpening:* | 三候选人/报价、单位数量、轮次一条 |
publicNotice | bidding:publicNotice:* | 开标存在、一开标一公示、异议条件字段 |
award | bidding:award:* | 开标/公示前置、候选人资格、中标一条 |
projectApproval / fileReview / evaluation | bidding:<resource>:* | 来源冻结、审批状态和流程实例 |
subordinateTender | bidding:subordinateTender:* | PROJECT_ID 必须为有效 BIZ_PROJECT.PROJECT_ID;项目名称快照来自项目主数据,线路独立选择;同一单位+项目唯一;导入整批校验与事务回滚;不按工程授权裁剪 |
招投标各资源的查询和详情均以对应页面/接口权限为边界,不读取 biz_project_user_scope 进行项目裁剪或访问拒绝;项目工程范围可以为空。手工选择的线路节点须通过线路级别与有效主数据校验(只接受 LINE 节点),不校验节点运营状态或工程树可见范围。线路候选由 /business/engineering-tree/all-line-options 提供,按招标文件、立项、文件审查或下属单位招标的列表/查询/新增/编辑权限之一鉴权,不与受工程授权过滤的 /line-options 混用。
下属单位招标的 projectId 始终指向 BIZ_PROJECT.PROJECT_ID,独立项目选择器调用项目选项接口;不得由工程选择树提供标段/工点 ID。服务端重新校验项目存在、生成项目名称/路径快照,线路按独立选择的主数据校验并保存;新记录不写历史兼容列 BID_ID。
前端校验只用于体验;权限、唯一性、关联 ID 不可变、状态、条件必填和导入原子性必须在服务端再次校验。
2.1 招标文件台账展示顺序
查询条件按以下顺序排列:项目名称、时间区间、金额(元)、归属单位、经办部门、当前进展、项目类型、招标方式、线路名称。表格核心列按以下顺序排列:序号、项目名称、项目类型、线路名称、归属单位、经办部门、经办人、招标金额(元)、招标方式,随后为招标过程附件/阶段字段;当前进展固定在右侧,操作列位于最右侧。台账时间列只显示年月日(formatDateOnly,模块内各台账统一口径,见需求分析 8.10),是否类列经 toYesNoFlag 归一为字典值 Y/N 后按 sys_yes_no 显示“是/否”,历史 1/0 数据同样按是/否显示,空值显示占位符(2026-09-24 起,见需求分析 8.6)。
新增/编辑表单中,项目名称右侧为线路名称;线路为独立非必填信息,通过线路选择器选择一条线路级节点或留空。项目变化不触发线路自动回填、锁定或清空。线路候选来自 GET /business/engineering-tree/all-line-options,不继承工程树数据权限;默认隐藏运营线路,可用“显示运营”开关切换显示。
归属单位选择只到单位层级:选项只保留orgType 为集团/公司/分公司/合资公司的节点,部门不下探,最近归属单位解析同样接受合资公司(2026-10-14 起);经办部门、下属单位和归属单位统一请求 GET /system/option/deptTree?deptType=1 取业主单位组织(部门仍可选作经办部门),选人请求 GET /system/option/users?excludeDeptType=2 排除参建单位人员,参建单位(deptType=2)不作为可选项(2026-09-24 起)。招标方案上报稿为必填,招标领导小组会审稿、招标文件上报稿为非必填(2026-09-26 起,见需求分析 8.9)。
2026-10-17 联动修正:招标文件表单中项目名称右侧为线路名称,下一行为所属标段。ProjectNodePicker 标段模式接收 lineId / lineName 限定线路子树,优先按 ID 匹配;选择结果同时携带线路 ID,编辑保留已存线路 ID。人工切换线路清空原标段,切换项目不影响独立线路和标段。五个带单位/部门的台账查询栏和表单均给 OrgDeptSelect 传入当前归属单位 ID;十处经办部门选择器均开启 default-expand-all,默认显示公司与部门层级;查询栏切换单位同步清空部门,表单继续由 useUnitDeptUserCascade 清空部门及经办人。部门候选实际请求 /system/option/deptTree?deptType=1&orgTypes=dept&scopeUnitId=...,服务端保留单位范围内命中部门的完整祖先链并将非部门节点置灰,避免公司层级丢失或部门上浮。
2026-10-18 独立线路契约核对:ProjectMasterSnapshotHelper.snapshot(projectId) 仅校验项目并生成名称/路径,不再调用项目线路解析。招标文件、立项、独立来源文件审查、下属单位招标接收可选 lineId;服务端按线路主数据生成 lineName,禁止仅凭客户端新名称写入。立项/文件审查仍只持久化名称快照,编辑未改线路时可沿用历史名称;招标文件/下属单位招标同时维护既有线路 ID,清空时同步清 ID 与名称。文件审查本平台立项分支在服务端继承来源立项线路,评审和工程招标后续阶段继续继承来源单据。候选接口保留 OR 鉴权,其他工程树权限范围不变。
2.2 招标挂网台账与表单展示
台账主数据行取招标文件台账全量数据(未挂网项目显示挂网次数 0),主数据下挂该项目的全部挂网轮次。挂网时间列只到年月日(formatDateOnly),金额列按填写原样显示(formatAmount,只去掉小数末尾无效零)。操作列在主数据行提供首次挂网/重新挂网与编辑状态;在轮次行提供查看、编辑状态、重新挂网、修改、删除,其中重新挂网只对已废标的当前轮次可用,修改与删除对废标、已中标轮次灰显(2026-09-26 起)。
新增挂网弹窗的项目名称只列出尚未形成挂网记录的招标文件(按台账返回的 listingCount=0 过滤),挂网记录删除后重新回到可选范围(2026-09-26 起)。表单的招标挂网时间为日期控件(type="date"、value-format="YYYY-MM-DD"),编辑回显时截断时分秒;服务端字段仍为 LocalDateTime,按当天 00:00:00 落库。挂网金额不限制小数位,输入控件不再设置 precision。
3. 状态与动作矩阵
| 对象/状态 | 允许动作 | 禁止动作 |
|---|---|---|
当前挂网版本 normal | 登记下游事实、普通字段更正、编辑状态(置废标) | 直接删除、重复当前版本、重新挂网(灰显) |
当前挂网版本 failed(人工置废标) | 查看、编辑状态(改回正常)、重新挂网 | 修改、删除、绑定新下游 |
历史轮次(current_flag=0) | 查看 | 修改、删除、编辑状态、重新挂网 |
| 公示已保存 | 查看 | 修改、删除 |
| 中标记录(保存即锁定) | 查看、导出 | 修改、删除(页面按钮灰显,服务端同样拒绝) |
| 开标已有公示 | 查看 | 修改、删除开标 |
非依法单据 back/cancel | 修改、沿原实例重新提交 | 新建第二实例 |
非依法单据 waiting/finish/invalid/termination | 查看/平台办理 | 业务台账编辑、删除 |
挂标状态由「编辑状态」人工维护,与轮次生命周期分开:轮次的当前标记只由重新挂网切换,状态只由状态变更接口写入;新增轮次一律以正常开始,忽略新增请求里的状态入参。台账的「当前版本」仍按 current_flag=1 且状态为正常判定(既有口径),因此当前轮次被置废标后主数据行的挂网信息与当前进展按无有效轮次展示,重新挂网保存后恢复。状态变更接口 PUT /business/bidding/listingVersion/status 校验取值、必须是当前有效轮次且该轮次未登记中标,写 BIZ_BIDDING_ACTIVITY_LOG 留痕;历史轮次拒绝变更,避免出现两个正常轮次。
重挂必须在事务中锁定招标文件主记录,设置旧版本 failed、插入新版本并唯一切换 current_flag;失败时整体回滚。重新挂网的入口要求当前轮次已废标(前端灰显控制,服务端仍保留「重挂时置旧轮次废标并翻当前标记」的保护分支)。关联 ID 更新时以库内关系覆盖入参。
当前进展字典顺序为:招标文件完成、招标挂网完成、答疑补遗完成、开标完成、公示完成、全部完成。进展由已登记的挂网、答疑、开标、公示和中标事实按业务优先级计算,未达到阶段时不提前显示后续状态。
4. 异常、事务与幂等
- 重复点击或并发重挂:
@RepeatSubmit只能改善体验,最终由事务锁/CAS 和可移植唯一约束兜底;冲突请求返回可定位业务错误。 - 中标前置事实不足:没有非废标轮次、开标或公示时拒绝;中标单位不在合格候选人中时拒绝。
- 条件字段:有异议必须填写异议事项、联系人、处理情况和结果附件;综合评估法按已确认得分规则校验。
- 导入:先解析全批,行号/列名/原因全部返回;任一错误不启动写入或整体回滚,不覆盖既有数据。
- 更正:关联项目、版本和上下游关联不可改;普通字段更正必须记录前后值、原因、操作人和时间。
- 附件:复用平台文件服务,单文件 50MB,上传失败不得以空附件冒充成功。
5. 实现映射与待核对
| 责任 | 已核对位置 | 状态 |
|---|---|---|
| 前端 CRUD、分页、权限按钮 | digital-construction-ui/src/views/business/bidding/**、src/api/business/bidding/** | 已存在,需逐页面回归 |
| DTO/实体/Mapper/Service | digital-construction-modules/digital-construction-business/** | 需与数据库字段逐项核对 |
| 数据库交付基线 | 交付数据库及项目 MCP 变更记录 | 需确认最终数据库版本 |
| 流程提交/表单跳转 | Warm-Flow 表单路径、菜单和后端流程常量 | 当前接口文件未见 /submit,待核对 |
| 审计留痕 | BIZ_BIDDING_ACTIVITY_LOG 或平台统一机制 | 覆盖范围待实测 |
6. 来源与变更
6.1 2026-09-02 实现核对
本次核对涉及 tenderDocument/index.vue、ProjectPicker.vue、ProjectNodePicker.vue、TenderDocumentServiceImpl、ProjectServiceImpl 和项目线路接口:确认项目选择变更后能够触发线路解析;单线路自动回显,多线路拒绝,人工线路仅接受一个线路级节点;业主单位和线路权限在服务端再次校验;招标挂网展示按树形同表、默认展开实现。前端类型检查、代码检查和开发构建通过,后端相关测试通过;真实浏览器角色链路仍按测试文档状态待回归。
详细页面和接口行为综合 feaa1b620、633ccd5c5、8d65027aa、50a7cc445、b5dd1d2 的实现与修复结果;业务约束来自 2183ce382、27749d587、7ce955294。本次真实回归结果和扩展验收边界以测试与验收为准,未核对的实现不写成已完成。
6.2 2026-09-26 挂标状态接口与展示口径
- 新增
PUT /business/bidding/listingVersion/status(权限码bidding:listingVersion:status),入参为id与bidStatus,服务端校验状态取值、当前有效轮次和未登记中标,写业务留痕;ListingVersionBo.bidStatus由「新增/修改时忽略」改为「仅供状态变更接口使用」。 - 删除
TenderDocumentServiceImpl、ListingVersionServiceImpl、AwardServiceImpl、BidOpeningServiceImpl、SubordinateTenderServiceImpl中 5 处「最多保留两位小数」的scale()>2校验,金额精度改由数据库列承载。 - 新增
formatAmount展示转换(金额原样显示),招标文件、挂网、答疑、开标、公示、中标、立项、文件审查、评审、下属单位招标及流程工作台的金额列统一改用它;金额输入控件去掉precision,评审得分保留两位小数。 - 前端接口客户端新增
changeListingVersionStatus;招标文件表单「招标方案上报稿」增加必填校验,服务端同步要求该附件非空。
6.3 2026-09-30 评审管理与文件审查表单联动
- 评审以已完成的文件审查记录作为来源。项目有决策依据时,评审发起和详情只读显示来源决策依据及总经理办公会审议情况;决策依据按字典标签展示。来源没有决策依据时两个字段隐藏。
- 评审开标时间输入和台账展示均按年月日;保存后时间字段落在所选日期的零点。项目与标段归属由服务端从来源文件审查记录恢复(写入
PROJECT_ID与BID_ID三轨列),历史PROJECT_NODE_ID兼容列已在物理结构中淘汰、不再写入。文件审查来源 ID 和项目快照由服务端恢复,不接受客户端改写。 - 评审投标人表格的表头、顺序按 R-BID-032;模板下载和导入按独立权限接口提供,导入明细先回填表格,评审单提交后再持久化。评审记录表必填;资格条件为否时被否决原因必填。
- 评审与文件审查均提供「是否用印」是/否。为否时服务端规范化为
N并清除印章管理员;为是时保留管理员并要求填写。前端隐藏字段时同步清空旧值。 - 评审流程
zhaotoubiao_pingshen使用 V4:经办人后依次经过副部长条件网关、经办部门负责人、分管领导、总经理、董事长条件网关和用印条件网关。skipDeputy=Y跳过副部长,skipChairman=Y跳过董事长,skipSeal=Y跳过印章管理员。副部长和董事长选填;负责人、分管领导和总经理仍必填。流程定义文件为zhaotoubiao_pingshen_v4.json。 - 本轮真实端到端记录经过负责人、分管领导、总经理后结束;副部长、董事长未选且被跳过;用印为否时未进入印章管理员节点。开发环境流程状态、节点历史和评审台账完成状态见测试与验收 §12.5。批量导入的有效数据页面路径仍受浏览器文件选择器限制,验证边界见同节。
导出列(2026-09-15)
- 招投标各台账导出已补齐中文列名:
TenderDocumentVo、ListingVersionVo、ClarificationBatchVo、BidOpeningVo、PublicNoticeVo、AwardVo、SubordinateTenderVo、ProjectApprovalVo、FileReviewVo、EvaluationVo均标注@ExcelIgnoreUnannotated与@ExcelProperty,字典列用ExcelDictConvert+ExcelDictFormat输出中文。 - 导出列与台账页面列一致;附件、流程变量、审计字段等不参与导出,避免导出列出现无意义的文件 ID。
6.4 2026-10-13 流程表单外框统一、文件审查校验修正与下属单位招标台账扩展
- 流程工作台字段外框统一:
BiddingFlowWorkspace.vue中将原先纯文本展示的tenderMethod(招标方式)、projectType(项目类型)、evalMethod(评审方式)、projectEstablishmentStatus(项目立项情况)、decisionBasis(决策依据)统一通过formatDictLabel映射中文后以只读输入框el-input readonly渲染,与上下文字段风格一致。 - 文件审查校验:
FileReviewServiceImpl.java移除contractLegalAttachment非空强校验;前端fileReview/index.vue移除必填规则,将「招标(必选)文件」更名为「招标(比选)文件」。 - 下属单位招标台账原型对齐:
- 前端表格将复合单元格拆分为 10 个独立列,顺序为:参与投标单位数量、第一中标候选人名称、第一中标候选人报价(万元)、第一中标候选人得分(综合评估法填写)、第二候选人三列、第三候选人三列;
- 后端
SubordinateTenderVo相应属性补充@ExcelProperty注解,保持导出与前端页面严格一致。
6.5 2026-10-15 文件审查流程董事长条件网关分支修正
- 缺陷:文件审查流程
zhaotoubiao_wenjian_shenchav4(定义 ID2110000000000009700)的chairman_gateway两条分支连接错误——「选了董事长」(skipChairman=N)直接连到seal_gateway,导致董事长审批节点不可达、审批环节被跳过;「未选董事长」(skipChairman=Y)直接连到end,连带跳过用印环节。同一轮建设中评审流程 v4 的同类网关连接正确(选了董事长先经chairman再到seal_gateway),文件审查版与之一致性缺失。 - 修复:修正开发库
FLOW_SKIP两条记录(ID=2110000000000009812与2110000000000009813),使chairman_gateway的两条分支与评审流程语义对齐:选了董事长 →chairman→seal_gateway;未选董事长 →seal_gateway(不再直接结束)。修正后运行态不经重新发布即生效(Warm-Flow 运行时按FLOW_SKIP表跳转)。2026-10-15 同步修正生产库(68):生产库同版本定义2110000000000009700的两条记录与开发库修复前一致,已按同一修正执行(各 1 行,带前置条件校验),修改前确认该流程在生产库无在途实例;修改后回读验证两条记录的NEXT_NODE_CODE已生效,运行态按表读取无需重启或重新发布。 - 验证:修正后以二级单位真实账户全链复跑文件审查(副部长、分管领导、董事长、用印均选择),链路为
deputy → dept_head → countersign → leader → general_manager → chairman → seal_manager,董事长节点正常出现并审批,流程终态完成;同步复跑 27 号线立项全链(deputy → dept_head → leader → general_manager → chairman)通过。证据见测试与验收。
6.6 2026-10-15 办理弹窗「下一步审批人」按表单审批人默认带出并支持改选
- 需求来源:用户反馈——立项审签等非依法必招标流程办理提交弹窗中,「下一步审批人」原来为空且不选无法提交;要求直接读取页面(业务表单)中的人员信息自动带出,并支持修改。
- 实现(通用组件 + 业务注入):
FlowActionPanel新增可选 propnextAssigneeDefaults(Record<节点编码, { userIds, nickNames }>):在解析下一节点后,对命中的节点预填assigneeMap/nickName(仅在该节点尚未选择时写入,用户仍可点「选择」覆盖);- 节点办理人可能已被服务端按表单审批人解析为具体用户(
permissionFlag为 userId 而非${nextHandlerId}表达式),预填不再限定表达式形态,仍按业务默认值匹配节点编码带出; - 已有业务默认值的节点放开改选候选:
choosePeople中businessDefaultEditable时popUserIds不再按服务端解析出的单人裁剪(未传allowedNextHandlerIds时为全量人员),保证可以换成其他人员; BiddingFlowWorkspace提供默认值映射(NEXT_ASSIGNEE_FIELD_PREFIX):deputy→apprDeputy、dept_head→apprHead、leader→apprLeader、general_manager→apprManager、chairman→apprChairman、seal_manager→sealManager、countersign→countersign(单值apprXxxUserId与多值countersignUserIds均兼容,姓名取apprXxxUserName)。
- 验证(真实页面 UI 链路):新建在途立项(15 号线二期,副部长=任民、负责人=严浩等全填)→ 副部长办理弹窗自动带出「经办部门负责人:严浩」→ 点「选择」候选放开(含杨单丹)→ 改选「杨单丹」并提交 → 数据库回读:
dept_head节点新任务办理人 = 杨单丹(FLOW_TASK/FLOW_USER),改选生效。 - 回归:新增
FlowActionPanel.spec.ts(预填与可改选断言)与BiddingFlowWorkspace.spec.ts(审批人字段映射断言);vue-tsc通过。