主题
工程基础管理 · 详细设计文档
文档版本:1.20 | 最近核对日期:2026-11-08
标段保存按标段类型与服务合同规则区分服务类与施工类。服务类不保存施工验收专业,不生成单位工程;若已有单位工程则拒绝保存并提示先核查处理。工程范围仍沿用指定工点或全线管辖及现有授权规则。
企业身份与业务角色分离(2026-10-13):已有业主企业也可承担项目设计、监理或施工角色,直接复用同一
SYS_DEPT.DEPT_ID,禁止为了让选项出现而另建同名参建企业。项目三类参建字段允许deptType=1/2的company/branch/joint_venture企业节点,拒绝group容器和dept部门。候选接口与保存校验使用同一范围,名称兼容解析包含两种体系的企业;同名不能唯一匹配时必须重新按 ID 选择。该范围适用于项目参建主体及全局联合体成员/牵头企业,不扩大其他模块的共享组织校验。
项目参建主体混选现行契约(2026-10-13 修正)
设计、监理、施工字段直接选择已建档企业或全局联合体,允许同一角色同时选择一个联合体及两家独立企业。沿用 ParticipantConsortiumPicker.vue 的企业/联合体选择布局;选择身份为 type + id,企业为 UNIT,联合体为 CONSORTIUM,名称仅作显示。联合体不展开成成员企业,不根据名称逗号推断组成,不以同名企业替代联合体。建设单位仍为业主组织多选,所属公司仍单选。
独立“关联联合体”按钮、弹窗及项目关系 API 下线。全局联合体档案与成员维护继续保留;旧项目联合体表只保留历史记录,不清空、不删除,不再作为项目参建主体现行来源。企业兼任业主及施工等角色时复用同一组织 ID,候选企业允许 deptType=1/2 的 company/branch/joint_venture,排除集团容器、部门及项目部。
三类权威集合为 designParticipants/superviseParticipants/constructParticipants,每项 {type,id,name};空数组明确解除该角色全部引用。后端按类型验证存在性、启用状态及主体类型,从档案生成名称快照,在项目保存事务中整体替换对应角色的有序引用。前端保留 Long ID 原始值,不转 Number;相同数字 ID 的企业和联合体是不同主体。
旧三类 *UnitIds 仅保留独立选择的 UNIT 项,不含联合体成员;旧名称字段是混合主体名称快照;旧单 *UnitId 仅在集合恰有一个 UNIT 且无联合体时保留,其余置空。建设 buildUnitIds 继续使用业主 CSV 集合。被现行参建集合引用的企业/联合体不得删除;联合体被引用后组成变更受保护,名称调整不得更换主体身份。
验收例:选择联合体 C + 企业 A/B 后保存,重开仍回显三项且 C 未变成成员或企业;删除 A 后仅保留 C/B;全部清空后不残留旧单 ID 或名称;企业与联合体同 ID 时能分别回显;非法 type、失效主体或伪造名称不得绕过后端校验;引用中的主体删除和联合体组成变更应被阻止。
联合体成员企业角色复用与本轮迁移边界
全局联合体正常新增、编辑的成员与牵头单位候选,以及后端成员校验,统一允许业主及参建两体系中启用、未删除的企业:deptType=1/2 且 orgType=company/branch/joint_venture;排除集团容器、部门和项目部。不能因企业当前为业主而重复建档为参建单位。联合体仍须至少两个不同成员,牵头单位须属于成员集合;被项目引用后组成冻结及删除引用保护保持有效。
验收例:微电园施工联合体选择“重庆建工第九建设有限公司”与已有业主“重庆对外建设(集团)有限公司”,应复用两企业原 ID,可正常建档和回显;仅一个成员、牵头不在成员中、停用或部门节点仍拒绝保存。
本轮仅重做设计、监理、施工主体分组,保留当前 111 处建设单位信息,不按老源建设字段数量清空。老平台附件为 100 + 26 共 126 条,三类非空角色字段分别为设计 33、监理 39、施工 39,合计 111 个角色字段。迁移按项目身份和修剪首尾空白的 CODE 核对(其中两个源 CODE 带 CRLF),不按项目名称合并,四组同名项目保持各自独立身份。数量与具体落库结果须由本轮数据库回读验证。
设计背景:依据双核四维解耦架构(PBS 空间资产核 / CBS 商务合同核 / WBS 质量工程核 / OBS 组织人员核),本模块全面替换原单棵折叠工程树。系统处于未上线运行阶段,实测下游业务表数据全部为 0 行,无在途单据负担。本版本全面落地标准化两级专业编码、多专业统包复合标段展开机制、参建单位企业主数据强关联(严格校验、禁止自动建档)及极简双轨制数据权限。
文档控制
| 项目 | 内容 |
|---|---|
| 模块名称 | 工程基础管理(PBS/CBS/WBS/OBS) |
| 关联需求分析 | 需求分析 |
| 关联概要设计 | 概要设计 |
| 关联数据库设计 | 数据库设计 |
| 关联代码版本 | 当前主干分支;提交待定 |
| 编写/核对人 | AI Pair Designer |
| 实施前提事实 | 实测下游 7 个业务模块(工程变更、质安、手续、渣土、运营、投资、BIM)数据表全部为 0 行,实施风险收敛在主数据清洗迁移 |
1. 页面、路由与交互设计
1.1 页面路由与菜单规划(统一风格为 /business/engineering/*)
平台规划 5 个核心业务管理页面 + 1 个标准化字典管理页面 + 1 个集成数据权限配置页。数据权限页由工程基础管理菜单进入,实际路由为 /business/data-scope,授权配置使用双 Tab 弹窗:
| 页面/组件 | 路由路径 | 对应菜单名称 | 可见角色 | 主要操作与能力 |
|---|---|---|---|---|
| 线路分期管理 | /business/engineering/line | 线路分期管理 | 建设总部领导、项目总工、超管 | 查询、新增、编辑、删除、启停、排序 |
| 物理工点台账 | /business/engineering/site-master | 物理工点台账 | 规划人员、技术部、总工办 | 查询、新增、编辑、停用、全景查看、GIS坐标 |
| 建设项目管理 | /business/project | 建设项目管理 | 投资部、企划部、合同部 | 24 项全量业务字段维护、投资概算录入、参建单位关联、企业与联合体直接混选 |
| 工程标段管理 | /business/engineering/bid-section | 工程标段管理 | 合同部、工程部、招投标部 | 标段录入、多专业涵盖配置、管辖工点指定、单位工程实时试算预览 |
| 单位工程法定台账 | /business/engineering/unit-project | 单位工程台账 | 质量安全部、监理单位、施工单位 | 单位工程总览、标段×工点×专业综合筛选、法定验收状态跟踪 |
| 专业分类字典 | /business/engineering/major-dict | 专业分类字典 | 系统管理员、标准化专员 | 29 项规范两级专业分类字典查看与扩展维护 |
| 用户数据权限配置 | /business/data-scope | 用户数据权限(双 Tab 弹窗) | 系统管理员、项目分公司管理员 | 按用户配置全线授权或部分工程授权;默认全线授权视图,保留其他线路的已授权范围 |
1.2 关键组件交互契约
1.2.1 标段涵盖专业与管辖工点联动配置(BidSectionFormModal.vue)
- 管辖模式选择:
- 单选框组:
COVERAGE_MODE = 'SPECIFIED'(指定工点/分站型)与'FULL_LINE'(全线统包覆盖)。 - 当选中
'FULL_LINE'时,界面隐藏工点穿梭框,并提示文案:“当前模式将自动管辖所属线路下的全部沿线车站、区间及场段;后续沿线新增工点时将自动级联同步补齐对应单位工程。” - 当选中
'SPECIFIED'时,界面呈现工点穿梭选择器(左侧为该线路下全部工点,右侧为已选管辖工点)。
- 单选框组:
- 涵盖专业多选配置:
- 专业选择器(
el-select multiple):数据源来自BIZ_MAJOR_DICT(29 项规范专业分类,按土建、机电、弱电、供电、联调分组展示); - 支持单选(单专业标段,如仅勾选
SYS-SIG 信号系统)或多选(多专业统包复合标段,如同时勾选MEP-INTE 风水电综合、CIV-DECO 建筑装饰装修、SYS-BAS 环境与设备监控); - 当勾选多个专业时,必须通过单选点选指定其中 1 个专业为“牵头/主专业”(
IS_PRIMARY = '1'),用于标段列表主属性展示与综合报验责任主体确定。
- 专业选择器(
- 单位工程生成动态实时试算:
- 表单底部提供【生成单位工程预览】抽屉/面板;
- 计算公式:
计划生成单位工程数 = 管辖工点数 × 涵盖专业数; - 动态渲染预生成的表格列表:展示【单位工程编码】、【单位工程名称】、【所在工点】、【所属专业】,让工程部与合同部在保存前明确核对实体清单。
1.2.2 全平台通用级联筛选组件(ProjectBidSiteCascader.vue)
为了让工程变更、质量报验、安全巡检、渣土清运、BIM模型鉴权等下游模块无缝使用解耦后的数据体系,封装统一的前端级联选择组件:
- 属性配置(Props):
mode: 选择模式。'bid'(仅选到标段)、'site'(仅选到工点)、'unit'(选到具体单位工程,默认);dataScopeFilter: 布尔值,是否自动受当前登录用户的数据权限约束(默认true);clearable: 支持清空。
- 大整数 ID 契约保证:
- 组件内部与回传的
bidId、siteId、unitProjectId必须保持原始string | number类型,严禁使用 JavaScript 原生Number()转换。
- 组件内部与回传的
- 事件回传(Emits):
@change(val):回传包含{ lineId, bidId, siteId, unitProjectId, majorCode }的完整选型对象;单位工程节点来自GET /business/engineering-tree/tree?maxLevel=unit,同时提供单位工程主键、工点主键和专业编码。
1.2.3 项目单位与联合体选择器(ParticipantConsortiumPicker.vue)
设计/监理/施工沿用既有企业与联合体混选组件布局,以 type + id 标记主体,支持搜索、多选、取消及清空。建设使用 OrgUnitSelect multiple,所属公司单选。详情使用 Element Plus el-descriptions 分组展示基本信息、参建主体、投资与时间;多主体逐项展示类型与名称,长文本跨列,空值统一占位。
2. 服务端接口契约(Controller & Service)
2.1 线路接口(LineController)
| 接口 URL | HTTP 方法 | 调用方 | 权限标识(逐字核对一致) | 请求参数 (Bo) | 响应数据 (Vo) | 事务/特性 |
|---|---|---|---|---|---|---|
/business/line/list | GET | 线路列表页 | business:line:list | LineQueryBo (线路名/状态) | TableDataInfo<LineVo> | 只读;支持分页与名称模糊查询 |
/business/line/{lineId} | GET | 编辑弹窗 | business:line:query | lineId 路径参数 | R<LineVo> | 只读;包含 buildUnitId/Name、operatingCompanyId/Name |
/business/line | POST | 新增线路 | business:line:add | LineBo (含单位ID与名称) | R<Void> | 事务;校验编码唯一;若单位档案缺少则自动创建 SYS_DEPT |
/business/line | PUT | 修改线路 | business:line:edit | LineBo (含单位ID与名称) | R<Void> | 事务;校验编码唯一;若单位档案缺少则自动创建 SYS_DEPT |
/business/line/{lineIds} | DELETE | 线路列表 | business:line:remove | lineIds 逗号拼接 | R<Void> | 事务;前置检查:若线路下仍有关联工点或标段,抛出业务异常阻断 |
2.2 物理工点接口(SiteMasterController)
列表可选 bidId 在分页前限制有效标段的管辖工点:标段必须与工点同线路,FULL_LINE 覆盖整线,SPECIFIED 仅包含有效标段工点关系;无效标段或空范围返回空。继续叠加原工点数据权限,total 为全部查询条件过滤后的总数,未传 bidId 时保持原查询行为。线路穿透弹窗使用常规分页,不再拉取整线后过滤;字典展示及筛选统一使用 biz_site_type,空类型显示占位。
线路、工点、标段、项目、专业字典与单位工程编辑均在详情成功回填后打开弹窗;详情失败不允许保存上次或空白对象。各提交入口在校验开始前防重复触发,校验失败正常结束,保存失败保留表单并恢复按钮;分部工程提交遵循同一行为。
| 接口 URL | HTTP 方法 | 调用方 | 权限标识(逐字核对一致) | 请求参数 (Bo) | 响应数据 (Vo) | 事务/特性 |
|---|---|---|---|---|---|---|
/business/site-master/list | GET | 工点台账/通用弹窗 | business:siteMaster:list 或 business:line:list | SiteMasterBo、PageQuery | PageResult<SiteMasterVo> | 支持按 lineId、工点类型(9类字典编码)及可选 bidId 筛选 |
/business/site-master/{id} | GET | 工点详情/编辑 | business:siteMaster:query | id (siteMasterId) | R<SiteMasterVo> | 包含全部既有工点物理属性(实测 24 列 = 19 个业务/状态列 + 5 个审计列,另加本次新增的 TRANSFER_LINES、STRUCT_TYPE) |
/business/site-master | POST | 新增工点 | business:siteMaster:add | SiteMasterBo | R<Void> | 核心事务;工点入库后,联动沿线所有 FULL_LINE 统包标段自动补齐单位工程 |
/business/site-master | PUT | 编辑工点 | business:siteMaster:edit | SiteMasterBo | R<Void> | 同线路内名称唯一;换线在原、目标线路锁内检查标段管辖及单位工程引用,存在引用则拒绝;无引用时清理旧授权并补齐目标线路全线标段单位工程,整体事务回滚 |
/business/site-master/{ids} | DELETE | 工点删除 | business:siteMaster:remove | ids 逗号拼接 | R<Void> | 事务;若该工点已被生成法定单位工程且发生过业务单据关联,严禁删除 |
2.3 建设项目接口(ProjectController)
| 接口 URL | HTTP 方法 | 调用方 | 权限标识(逐字核对一致) | 请求参数 (Bo) | 响应数据 (Vo) | 事务/特性 |
|---|---|---|---|---|---|---|
/business/project/list | GET | 项目列表页 | business:project:list | ProjectQueryBo | TableDataInfo<ProjectVo> | 只读;支持按名称/状态筛选 |
/business/project/{projectId} | GET | 项目详情/编辑 | business:project:query | projectId 路径参数 | R<ProjectVo> | 包含 24 项全量业务字段 + 建设/设计/监理/施工/分公司单位 ID 与名称 |
/business/project | POST | 新增项目 | business:project:add | ProjectBo(建设 buildUnitIds、三类 *Participants、所属公司单 ID) | R<Long>(新项目 ID) | 事务;项目名称唯一;锁定全部单位并逐项校验集合,生成官方快照;禁止自动建档 |
/business/project | PUT | 修改项目 | business:project:edit | ProjectBo(建设 buildUnitIds、三类 *Participants、所属公司单 ID) | R<Void> | 事务;项目名称唯一;锁定全部单位并逐项校验集合,生成官方快照;禁止自动建档 |
/business/project/{projectIds} | DELETE | 项目删除 | business:project:remove | projectIds 逗号拼接 | R<Void> | 事务;若项目下已有关联标段,阻断删除 |
2.4 标段主数据与专业配置接口(BidSectionController)
| 接口 URL | HTTP 方法 | 调用方 | 权限标识(逐字核对一致) | 请求参数 (Bo) | 响应数据 (Vo) | 事务/特性 |
|---|---|---|---|---|---|---|
/business/bid-section/list | GET | 标段列表页 | business:bidSection:list | BidSectionQueryBo | TableDataInfo<BidSectionVo> | 支持数据权限过滤;按projectId EXISTS筛选任一关系,返回projectIds/projectNames、标段类型、涵盖专业快照 |
/business/bid-section/{bidId} | GET | 标段详情/编辑回显 | business:bidSection:query | bidId 路径参数 | R<BidSectionDetailVo> | 返回标段主体 + 全部projectIds/projectNames + 参建单位ID/名称/负责人 + 涵盖专业列表 + 管辖工点ID列表 |
/business/bid-section | POST | 新增标段 | business:bidSection:add | BidSectionSaveBo (含设计/施工/监理三方单位与负责人 ID、名称、电话) | R<Void> | 核心复合事务:校验参建单位档案(仅复用已建档企业,不自动建档)+ 创建标段 + 绑定专业 + 绑定管辖工点 + 笛卡尔积批量落库单位工程 |
/business/bid-section | PUT | 编辑标段 | business:bidSection:edit | BidSectionSaveBo (含设计/施工/监理三方单位与负责人 ID、名称、电话) | R<Void> | 核心复合事务:校验单位 + 更新标段 + 差量调整专业/工点 + 智能增删单位工程(保护已有验收进度数据) |
/business/bid-section/{bidIds} | DELETE | 标段删除 | business:bidSection:remove | bidIds 逗号拼接 | R<Void> | 事务;若该标段下单位工程已有业务记录,严禁删除 |
/business/bid-section/preview-units | POST | 表单试算抽屉 | business:bidSection:query | BidSectionPreviewBo | R<List<UnitProjectPreviewVo>> | 内存计算试算返回预生成的单位工程清单,不入库 |
/business/bid-section/export | POST | 标段列表页 | business:bidSection:export | BidSectionQueryBo | void (Excel二进制流) | 导出当前筛选范围的工程标段综合台账 |
2.5 单位工程接口(UnitProjectController)
| 接口 URL | HTTP 方法 | 调用方 | 权限标识(逐字核对一致) | 请求参数 (Bo) | 响应数据 (Vo) | 事务/特性 |
|---|---|---|---|---|---|---|
/business/unit-project/list | GET | 单位工程台账 | business:unitProject:list | UnitProjectQueryBo | TableDataInfo<UnitProjectVo> | 支持按标段、工点、专业、验收状态综合筛选 |
/business/unit-project/{unitId} | GET | 单位工程详情 | business:unitProject:query | unitId 路径参数 | R<UnitProjectVo> | 返回所属标段、物理工点、施工/监理单位全量快照 |
/business/unit-project | PUT | 单位工程编辑 | business:unitProject:edit | UnitProjectBo | R<Void> | 更新单位工程名称、国标代码及法定验收状态 |
/business/unit-project/{unitProjectIds} | DELETE | 单位工程删除 | business:unitProject:remove | unitProjectIds 逗号拼接 | R<Void> | 事务;支持单选或批量删除,受分部工程及下游业务单据引用防护拦截 |
/business/unit-project/nav-tree | GET | 工程台账导航树 | business:unitProject:list | UnitProjectNavTreeQueryBo(viewType, bizStatus, lineId) | R<List<UnitProjectNavNodeVo>> | 支持空间视图/合同视图双重视图切换,支持按线路建设状态(在建/规划/运营)筛选,默认过滤在建线路 |
/business/unit-project/cascader-options | GET | 通用级联选择器 | business:unitProject:list | CascaderQueryBo | R<List<CascaderNodeVo>> | 为下游业务模块提供按权限过滤后的树形级联数据源 |
2.6 用户工程数据权限范围接口(UserDataScopeController)
| 接口 URL | HTTP 方法 | 调用方 | 权限标识(逐字核对一致) | 请求参数 (Bo) | 响应数据 (Vo) | 事务/特性 |
|---|---|---|---|---|---|---|
/business/data-scope/users | GET | 人员列表台账 | business:dataScope:list | ScopeUserQueryBo(账号、姓名、手机号、部门 ID、授权状态及分页参数) | R<PageResult<ScopeUserVo>> | 读操作;分页返回用户账号、姓名、手机号、所属单位、授权状态、有效授权线路数及负责工程摘要;台账仅展示线路数,点击详情后按配置和当前候选读取完整名称 |
/business/data-scope/tree/dept-user-counts | GET | 人员台账组织树 | business:dataScope:list | 无 | R<Map<deptId, count>> | 读取部门在职用户计数,前端按组织树递归汇总展示 |
/business/data-scope/{userId} | GET | 弹窗回显 | business:dataScope:list | userId 路径参数 | R<ScopeConfigVo> | 读操作;返回用户当前 revision 及各线路模式与具体组合明细 |
/business/data-scope/candidates/lines | GET | 候选线路 | business:dataScope:list | 无 | R<List<ScopeLineOptionVo>> | 读操作;返回所有未删除的有效线路目录 |
/business/data-scope/candidates | GET | 候选组合树 | business:dataScope:list | lineId | R<ScopeCandidateLineVo> | 读操作;返回指定线路全部合法标段工点组合及防并发 candidateToken |
/business/data-scope/preview | POST | 差异预览 | business:dataScope:list | ScopePreviewBo | R<ScopePreviewVo> | 读操作;不写库,比对拟提交配置与当前配置差异及候选Token有效性 |
/business/data-scope | POST | 弹窗全量保存 | business:dataScope:edit | ScopeReplaceBo | R<ScopeConfigVo> | 事务;严格锁序(升序锁线路→升序锁用户→SELECT FOR UPDATE锁配置根),CAS版本校验,物理替换子项 |
/business/data-scope/batch-assign | POST | 批量添加 | business:dataScope:edit | ScopeBatchAssignBo | R<Void> | 事务;批量追加(APPEND)或覆盖(OVERWRITE)工程范围,任一失败全量回滚 |
/business/data-scope/copy | POST | 复制范围 | business:dataScope:edit | ScopeCopyBo | R<Void> | 事务;校验源用户版本,复制其有效授权到目标人员 |
/business/data-scope/clear | POST | 批量清空 | business:dataScope:edit | ScopeClearBo | R<Void> | 事务;清空指定线路或全配置,保留配置根并递增版本 |
/business/data-scope/reverse-members | GET | 工程成员反查 | business:dataScope:list | kind, lineId, bidId, siteId | R<List<UserDataScopeMemberVo>> | 读操作;严格区分 LINE/PAIR/SITE_SHARED 反查具备可见权限人员及来源依据 |
权限码动词已定:原
business:dataScope:save的save不在公共开发约定 · 权限码动词白名单内,改为business:dataScope:edit(白名单内动作,不扩白名单)。原委与菜单迁移见 §4.1.1。
2.7 分部工程接口(SubProjectController)
分部工程不单列菜单,在“单位工程法定台账”页内维护国标目录与实例,接口如下:
| 接口 URL | HTTP 方法 | 调用方 | 权限标识 | 请求参数 | 响应数据 | 事务/特性 |
|---|---|---|---|---|---|---|
/business/sub-project/list | GET | 单位工程详情/业务表单 | business:subProject:list | SubProjectQueryBo(unitProjectId、majorCode) | TableDataInfo<SubProjectVo> | 按单位工程与专业查询分部清单 |
/business/sub-project/template-options | GET | 单位工程详情 | business:subProject:query | majorCode | R<List<SubProjectVo>> | 按专业返回国标分部目录模板,供批量挂接 |
/business/sub-project | POST | 单位工程详情 | business:subProject:add | SubProjectBo | R<Void> | 事务;同一单位工程下分部编码唯一 |
/business/sub-project | PUT | 单位工程详情 | business:subProject:edit | SubProjectBo | R<Void> | 事务;已被下游单据引用的分部不允许改编码 |
/business/sub-project/{ids} | DELETE | 单位工程详情 | business:subProject:remove | ids 逗号拼接 | R<Void> | 事务;已被引用则阻断删除 |
本方案 §1.1 的页面清单不单列分部工程页面;
requirements.md§2.1 第 3 项“分部工程标准目录库与实例挂接”由本节接口与单位工程台账页承载,不新增菜单。
3. 核心业务动作与事务流转
3.1 标段保存与笛卡尔积单位工程批量生成事务
标段保存是本模块最关键的复合事务入口,其时序流转与业务逻辑由 BidSectionServiceImpl.saveBidWithMajorsAndSites 严格把控:
3.2 沿线新增物理工点时的级联补齐机制
当工程技术人员在 BIZ_SITE_MASTER 中沿线新增一个新车站或新区间时,对于已经建立好的“全线统包标段”(如全线信号系统标、全线供电标、全线综合监控标),系统必须自动级联生成对应的单位工程,防止下游业务在该新工点上线时出现数据断层。
- 实现载体:在
SiteMasterServiceImpl.saveSiteMaster事务内调用unitProjectService.cascadeCreateForFullLineBids(site),保证原子一致; - 幂等防护:依赖 DM8 函数唯一索引
UK_UNIT_PROJECT(CASE WHEN DEL_FLAG='0' THEN BID_ID END, ...)确保并发防重。
3.3 项目参建与业主单位集合绑定事务
项目保存逐项校验混合主体集合,以 type/id 为身份,不调用自动建档入口;建设集合另行校验。旧参建 CSV 仅为独立企业兼容投影;无效引用不降级成自由文本。其他实体按其各自保存契约校验,本节不扩展共享组织规则。
集合容量为 1500 ASCII 字节;四名称快照按 UTF-8 1500 字节上限、所属公司名称按 1020 字节校验。多选及清空时旧单 ID 强制更新为 NULL。候选不存在时先在单位管理维护档案,不能通过项目保存静默新建。企业身份与角色分离:业主企业参与设计、监理、施工时复用原 ID,不能另建同名企业。
4. 权限体系与数据范围控制设计
4.1 统一权限码逐字核对表(前后端与数据库逐字完全一致)
严格遵循平台硬约束,后端 @SaCheckPermission、数据库 SYS_MENU.PERMS 与前端 v-hasPermi 统一采用 business:<资源>:<动作> 体系,逐字一致:
| 功能资源 | 动作说明 | 统一权限标识(后端注解 / 菜单表 PERMS / 前端指令) |
|---|---|---|
| 线路管理 | 列表查询 | business:line:list |
| 线路管理 | 详情查看 | business:line:query |
| 线路管理 | 新增线路 | business:line:add |
| 线路管理 | 修改线路 | business:line:edit |
| 线路管理 | 删除线路 | business:line:remove |
| 物理工点库 | 列表查询 | business:siteMaster:list |
| 物理工点库 | 详情查看 | business:siteMaster:query |
| 物理工点库 | 新增工点 | business:siteMaster:add |
| 物理工点库 | 修改工点 | business:siteMaster:edit |
| 物理工点库 | 删除工点 | business:siteMaster:remove |
| 建设项目信息 | 列表查询 | business:project:list |
| 建设项目信息 | 详情查看 | business:project:query |
| 建设项目信息 | 新增项目 | business:project:add |
| 建设项目信息 | 修改项目 | business:project:edit |
| 建设项目信息 | 删除项目 | business:project:remove |
| 标段与专业配置 | 列表查询 | business:bidSection:list |
| 标段与专业配置 | 详情查看 | business:bidSection:query |
| 标段与专业配置 | 新增标段 | business:bidSection:add |
| 标段与专业配置 | 修改标段 | business:bidSection:edit |
| 标段与专业配置 | 删除标段 | business:bidSection:remove |
| 标段与专业配置 | 导出台账 | business:bidSection:export |
| 单位工程台账 | 列表查询 | business:unitProject:list |
| 单位工程台账 | 详情查看 | business:unitProject:query |
| 单位工程台账 | 编辑修改 | business:unitProject:edit |
| 单位工程台账 | 删除注销 | business:unitProject:remove |
| 分部工程管理 | 列表查询 | business:subProject:list |
| 分部工程管理 | 详情查看 | business:subProject:query |
| 分部工程管理 | 增删修改 | business:subProject:add / :edit / :remove |
| 专业字典管理 | 列表查询 | business:majorDict:list |
| 专业字典管理 | 配置维护 | business:majorDict:edit |
| 数据权限分配 | 权限查询 | business:dataScope:list |
| 数据权限分配 | 权限保存 | business:dataScope:edit(原 :save 的 save 不在动词白名单,改为白名单内动作,见 4.1.1) |
4.1.1 存量权限码退场与菜单迁移
本方案新建 7 个页面、废弃现有 4 个页面,权限码与菜单必须同步迁移,否则旧按钮会因权限码失配全部失效,或形成双套权限码:
| 现有权限码(在用) | 使用位置 | 处置 |
|---|---|---|
business:projectNode:list/query/add/edit/remove | 后端 ProjectNodeController;前端 views/business/engineeringConfig(7 处 v-hasPermi);菜单 4 行 | 随工程信息配置页退场删除;节点维护能力拆分为 business:line:*、business:bidSection:*、business:unitProject:* |
business:projectScope:query/edit | 后端 ProjectScopeController;前端 views/business/projectScope(5 处);菜单 2 行 | 替换为 business:dataScope:list 与保存动作码 |
business:siteMaster:list/query/add/edit/remove | 后端 SiteMasterController;前端 views/business/siteLibrary | 沿用(语义不变,页面迁移至 /business/engineering/site-master) |
business:project:list/query/add/edit/remove | 后端 ProjectController;前端 views/business/projectConfig | 沿用(页面迁移至 /business/project) |
保存动作码的动词(已定):原 business:dataScope:save 的 save 不在公共开发约定 · 权限码的动词白名单(query/list/add/edit/remove/export/import/submit + 已登记特殊动作)内,改为 business:dataScope:edit(白名单内动作,不扩白名单,改动最小)。
菜单迁移动作(开发库按项目 MCP 执行,写入后回读):
- 新增
线路分期管理、物理工点台账、建设项目管理、工程标段管理、单位工程台账、专业分类字典六个菜单行及其PERMS; - 现有
工程信息配置(business:projectNode:*)菜单行删除,其角色关联一并清理; - 现有
工程权限配置(business:projectScope:*)菜单行改为指向/business/engineering/data-scope并更新PERMS; - 现有
工点基本配置、项目信息配置菜单行的路由改为新路径,PERMS不变; - 迁移后按
.agents/tools/check-perms.mjs(verify.ps1 -Check Perms)核对三方一致性,确认business:projectNode:*、business:projectScope:*已无残留。
4.1.2 菜单结构决定的沿革
本方案新建 7 个页面、废弃现有 4 个菜单,与 2026-09-29“本轮不调整菜单结构”的旧决定相反。该旧决定原记录于已废弃的易用性方案稿(2026-10-10 随方案稿删除),本方案按 2026-10-10 的新架构决定执行菜单调整。如业务要求保留现有菜单结构,则 §1.1 的路由规划需重做,属方案级变更,须在实施前确认。
4.2 当前工程数据授权与业务过滤机制
当前授权由 BIZ_USER_ENGINEERING_CONFIG、BIZ_USER_ENGINEERING_LINE、BIZ_USER_ENGINEERING_PAIR 三表承载;业务查询通过 EngineeringDataAccessHelper 与各 Service 显式注入的过滤/详情校验执行,不使用旧 BIZ_USER_DATA_SCOPE 三维并集、AOP 切面或全局 SQL 拦截器。
统一工程选择树 /business/engineering-tree/tree 支持 line、bid、site、unit、site-unit 五种最大层级。line 对受限账号仅返回至少包含一个有效授权组合的线路;bid 对受限账号仅返回有有效授权组合的标段,不加载叶节点;site/unit 先读取当前用户授权集合,再按可见线路、标段和工点 ID 限定主数据查询,并在内存中按完整 (lineId, bidId, siteId) 三元组复核,避免把全库线路、标段、工点和单位工程装入内存后再裁剪。所有层级的整线授权线路 ID 一次批量读取并用集合判断,禁止逐线路调用整线权限单查。整线授权动态覆盖当前及新增工程。所有层级均校验单位工程、工点、标段和父线路的归属一致,防止主数据错线时因全线授权放大可见范围。禁止对每个候选叶节点逐条查询授权,且必须保持同一组合匹配,避免拼接不同授权中的标段和工点。
maxLevel=unit 返回线路→标段→单位工程;UNIT 节点的 id 是 BIZ_UNIT_PROJECT.UNIT_PROJECT_ID,并包含 siteMasterId 与 majorCode。读取权限由调用模块的列表权限或具体质量资源新增/编辑权限满足;候选数据仍统一由工程范围服务过滤。
maxLevel=site-unit 必须同时传 bidId,仅读取该授权标段下的工点与单位工程,返回线路→标段→工点→单位工程结构;SITE 子节点的 UNIT 子项仍按同一线路×标段×工点授权组合过滤。工程变更选择器使用该模式一次请求取得两类二级候选,不能再分别请求两棵全库树。标段所属线路已有整线授权时不再额外读取该用户全部受限组合;仅受限线路才读取组合明细并校验目标标段,减少整线用户首载的授权查询开销。
4.2.1 授权模型与有效组合
CONFIG按用户唯一,保存非负REVISION;LINE为每条授权线路记录FULL_LINE或RESTRICTED;PAIR只保存受限模式的(BID_ID, SITE_ID)组合。FULL_LINE对该线路当前和以后新增的有效工程动态生效;RESTRICTED至少包含一个有效组合。- 有效组合必须同时满足:标段与工点均有效且属于该线路;标段为全线覆盖,或
BIZ_BID_SITE_SCOPE中存在有效的指定覆盖关系。单独匹配标段或工点不能放行专属业务。 - 专属资源按同一个
(LINE_ID, BID_ID, SITE_ID)组合判断;工点共享资源按同线路整线授权或至少一个有效授权组合包含该工点判断。授权查询以当前用户配置为根,不能借用其他用户明细。 - 超级管理员免于用户范围授权判断;查询和详情仍须保持业务记录自身工程关系有效。
4.2.2 授权查询、候选与全量替换
UserDataScopeController 暴露 /business/data-scope/users、/tree/dept-user-counts、/{userId}、/candidates/lines、/candidates?lineId=、/preview 与 POST /business/data-scope。人员台账查询可按账号、姓名、手机号、部门 ID 和授权状态过滤;授权列表响应同时返回手机号、部门及工程范围摘要。全量替换入参包含 userId、expectedRevision、lines 和 candidateTokens;每条 lines 中的线路必须且只能对应一个非空候选 token,缺失或重复均以 400 拒绝。服务端在事务中重新计算候选 token 并校验每个标段×工点组合;候选集合已变化时返回冲突(业务码 409),版本不匹配也拒绝替换,当前配置不被部分覆盖。
并发锁顺序为涉及线路 ID 升序 → 用户行 → 配置根行;成功替换时原子写入三表并递增 REVISION。配置根不存在时仅允许 expectedRevision=0 的首次保存。批量追加/覆盖、复制、清空沿用同一锁序、候选校验及版本更新约束。
单人授权页按线路懒加载候选明细。保存前前端自动并行补载本次提交线路中缺失的候选 token,再一次性提交;候选仍不可读或缺少版本标识时保留草稿并提示重试,不能因用户没有逐条切换到每条已授权线路而误判候选缺失。批量授权采用相同的缺失候选补载规则。
4.2.3 查询与详情授权接入
EngineeringDataAccessHelper.applyPairScope为专属业务列表注入有效组合谓词;applySharedSiteScope为工点共享数据注入共享工点谓词。列表过滤和直接 ID 详情、修改、删除等入口必须使用相同有效性规则;服务异常不得回退到无过滤全量查询。- 工程基础已在标段、单位工程、工点服务接入范围过滤;单位工程台账分页与详情同按当前用户有效组合判定。
- BIM首期新设计(2026-11-08,待实现)通过API契约获取单位工程归属、专属组合范围及双视图导航,不复用旧BIM工点共享SPI放行模型。BIM调用入口使用BIM权限,不能要求额外工程配置管理权限。单位工程直接删除、标段重算移除及删除标段须经BIM引用契约保护;相关联动与回归见BIM详细设计。现有导航台账保持原功能,BIM单独增加单位工程叶节点。
- 下游调用点包括工程变更、工程手续、建渣主台账、质量报验、运营问题闭环和三权移交、BIM 工程/模型访问。各业务按其资源类型选择专属组合或共享工点谓词。运营问题闭环列表、详情和导出仍按跨部门协同基线全量读取;表单线路→工点候选按共享工点授权过滤,新增及修改服务端复核目标工点是否属于同线整线授权或至少一个当前有效标段×工点组合。三权移交的候选、列表、详情及写入均按共享工点范围检查。
招投标数据使用独立项目主数据,不按工程授权裁剪。招标文件登记手工选择线路使用 /business/engineering-tree/all-line-options,仅返回全部有效线路;受工程授权约束的候选仍走 /line-options 或 /tree?maxLevel=line,不得把全量线路端点复用于工程业务。
- 投资计划等仅有线路维度的数据,按线路范围与共享契约独立处理,不得把线路 ID、标段 ID、工点 ID 当作可互换的授权来源。
4.2.4 主数据变化与失效撤权
线路、标段、工点状态/归属或标段工点覆盖关系变化时,UserEngineeringScopeCleanupService 锁定受影响线路、用户及配置根,物理删除不再有效的 pair,并递增受影响用户 REVISION;主数据变更和撤权在同一事务提交,失败整体回滚。删除记录遵守外键依赖顺序,先清理 pair,再处理 line/config;删除用户时同样清理三表,重复清理可幂等。对有效覆盖没有变化的组合予以保留。
5. 异常、事务与并发防护设计
| 风险场景 | 检测位置 | 拦截机制与用户提示 | 事务回滚/补偿 |
|---|---|---|---|
| 标段编码重复 | BidSectionServiceImpl | 校验共同所属项目内 BID_CODE 唯一性(关系集合相交),提示:“当前项目下已存在相同编号的标段,请核对” | 阻止保存,无脏数据 |
| 同工点同专业重复生成 | 数据库底层 UK_UNIT_PROJECT CASE 函数唯一索引 | CASE WHEN DEL_FLAG='0' THEN ... 函数唯一索引兜底,防并发双击重复插入 | 数据库事务自动回滚 |
| 并发创建同名企业档案 | SysDeptServiceImpl.getOrCreateDeptByName | 已取消运行期自动建档:命中同 ID 或同未删除名称即复用既有档案,未命中直接抛出“单位【xxx】尚未建档”,不再插入企业 | 无新建写入,杜绝重复档案 |
| 删除含有在途业务的标段 | BidSectionServiceImpl.removeByIds | 检查是否有在途工程变更、检验批等引用其单位工程,提示:“该标段下单位工程已有业务发生,禁止删除” | 业务阻断并回滚 |
| 删除含有在途业务的工点 | SiteMasterServiceImpl.removeByIds | 检查是否有单位工程或现场单据关联,提示:“该工点已被工程标段纳入管辖,请先解除关联” | 业务阻断并回滚 |
| 多专业标段未指定牵头专业 | 前端弹窗与 Controller 入参校验 | 若涵盖专业数 > 1 且未指定 IS_PRIMARY = '1',提示:“多专业统包标段必须明确指定一个主牵头专业” | 拒绝请求 |
| 全线标段沿线新增车站补齐失败 | SiteMasterServiceImpl 级联方法 | 级联补齐代码捕获异常,死锁重试 3 次;若仍失败整笔工点新增事务回滚 | 强一致性整体回滚,确保数据零孤儿 |
6. 实现映射与技术清单
| 层次 | 类名 / 文件路径 | 职责说明 | 状态 |
|---|---|---|---|
| 实体类 | com.bokun.business.domain.Line | 线路主数据实体类 | 待创建 |
| 实体类 | com.bokun.business.domain.SiteMaster | 物理工点实体类(ALTER扩充,保持22个字段) | 待按新字段更新 |
| 实体类 | com.bokun.business.project.domain.Project | 建设项目实体类(既有表就地 ALTER 扩展四类 *_UNIT_IDS 集合列,字段矩阵见数据库设计 §3.3) | 已实现 |
| 实体类 | com.bokun.business.domain.BidSection | 标段主数据实体类 | 待创建 |
| 实体类 | com.bokun.business.domain.BidMajor | 标段涵盖专业明细实体类 | 待创建 |
| 实体类 | com.bokun.business.domain.BidSiteScope | 标段管辖工点明细实体类 | 待创建 |
| 实体类 | com.bokun.business.domain.UnitProject | 单位工程实体类 | 待创建 |
| 实体类 | com.bokun.business.domain.MajorDict | 29 项标准专业字典实体类 | 待创建 |
| 实体类 | com.bokun.business.domain.UserDataScope | 用户双轨数据权限授权实体类 | 待创建 |
| 服务层 | com.bokun.business.service.impl.BidSectionServiceImpl | 标段维护及笛卡尔积批量生成单位工程实现 | 待创建 |
| 服务层 | com.bokun.business.service.impl.SiteMasterServiceImpl | 工点维护及全线统包标段级联补齐实现 | 待改造 |
| 服务层 | com.bokun.system.service.ISysDeptService | 企业主数据查询、锁定与严格校验(lockDeptsByIds/selectDeptsByList/selectDeptNamesByIds;getOrCreateDeptByName 已退化为“命中复用或抛错”,不自动建档) | 既有服务扩展 |
| 权限过滤 | com.bokun.business.service.helper.EngineeringDataAccessHelper + 各业务 Service 注入 | 整线或同一有效线路×标段×工点组合;共享资源按同线工点投影,Service 层注入(见 §4.2) | 已实现 |
| 前端页面 | src/views/business/engineering/bid-section/index.vue | 标段与多专业涵盖管理页面(含三方单位/负责人选择、KPI 大盘与台账导出) | 已实现 |
| 前端组件 | src/components/Engineering/ProjectBidSiteCascader.vue | 下游模块通用级联选择器组件 | 待创建 |
| 前端组件 | src/components/OrgUnitSelect/index.vue | 项目单位选项组件(四类多选、所属公司单选,禁止新建;内部键统一字符串匹配) | 已复用 |
| 前端组件 | src/components/Engineering/ParticipantConsortiumPicker.vue | 项目参建主体混选组件(企业 UNIT / 联合体 CONSORTIUM 按 type+id 选择与回显) | 已实现 |
| 前端组件 | src/components/Engineering/UnitLeaderPicker.vue | 标段「单位 + 现场负责人」弹窗式选择器(先选单位再联动人员,负责人可留空) | 已实现 |
| 前端组件 | src/views/business/engineering/bid-section/components/BidSectionDetailDrawer.vue | 标段全景综合档案抽屉(合同概况、三方参建主体与负责人、涵盖专业、管辖工点与衍生单位工程) | 已实现 |
| 前端组件 | src/views/business/engineering/site-master/components/SiteMasterDetailDrawer.vue | 工点综合档案抽屉(物理属性、GIS 坐标与挂接单位工程穿透) | 已实现 |
7. 变更记录
| 版本 | 日期 | 变更内容 | 变更原因 | 确认人 |
|---|---|---|---|---|
| v1.0 | 2026-10-10 | 完成全新双核四维架构下的详细设计初稿 | 彻底替代旧折叠工程树设计 | AI Pair Designer |
| v1.1 | 2026-10-10 | 严格统一权限码为 business:<资源>:<动作>;统一前端路由与后端 URL 为 /business/engineering/*;补齐 @DataScope 资源表与注入字段完整映射对照表;明确大整数 ID 契约规范与 DM8 条件唯一索引软删除防重机制 | 解决审阅提出的两套权限码冲突、路由风格混乱及切面规则不明确等缺陷 | AI Pair Designer / 用户审核中 |
| v1.2 | 2026-10-10 | 全面建立参建与业主单位强关联(外键引用 SYS_DEPT.DEPT_ID)与“缺少即建”协同机制;补充 UnitSelect.vue 前端交互契约、Controller/Service 接口参数与事务时序图 | 响应用户需求:彻底解决参建与业主单位仅存文本名称无关联问题,实现零摩擦自动建档 | AI Pair Designer / 用户审核中 |
| v1.3 | 2026-10-10 | 彻底修复迁移 SQL 在 DM8 下的执行问题:① 线路按物理主线归并分期迁移(收敛为23条主线,分期聚合归入 LINE_STAGE),根除 LINE_CODE 重复冲突;② 废除 LATERAL 语法改用标准 CTE 展开;③ 专业明细表主键改用 DM8 序列 SEQ_BIZ_BID_MAJOR.NEXTVAL,杜绝雪花 ID 乘法导致的 BIGINT 溢出;④ 标段 PROJECT_ID 暂置 NULL 避免悬空外键;⑤ 单位工程编码统一为 {线路}-{标段}-{工点}-{专业} 国标格式 | 响应用户实测复核发现的 3 个 P0 与 3 个 P1 缺陷,确保迁移脚本在 DM8 上 100% 具备可执行性 | AI Pair Designer / 用户审核中 |
| v1.4 | 2026-10-10 | 统一运行时与迁移清洗的组织架构挂接规则(业主挂接至集团根节点 100,参建单位挂接至参建单位根节点 2199000000000100013);明确标段多专业在工点下笛卡尔积展开落库单位工程规范,采用独立序列 SEQ_BIZ_UNIT_PROJECT 杜绝 ID 碰撞 | 落实多专业单位工程实体展开规范与组织架构树层级规范 | AI Pair Designer / 用户审核中 |
| v1.5 | 2026-10-10 | 对齐数据库设计 v1.6 执行顺序:明确专业字典数据初始化前置(避免单位工程落空为 0 行);确认物理工点 SITUATION TEXT 等字段严禁反向收窄;将轨道交通/铁路集团 3 家企业统一为业主分类;明确多专业次要专业推导为存量推断并支持前端动态维护 | 响应实施前最后把关审核意见,确保技术方案与实施路径零缺陷 | AI Pair Designer / 用户审核中 |
| v1.6 | 2026-10-10 | 同步核心业主与运营单位改制映射台账(与数据库设计 v1.7 同步):存量文本映射至已建的重庆交通建设管理有限公司(DEPT_ID=101)与重庆轨道交通运营有限公司(DEPT_ID=2083453529837531162),未建档特殊运营公司保留文本 | 响应业务方关于改制更名与已建单位直接复用的指示 | AI Pair Designer / 用户审核中 |
| v1.7 | 2026-10-10 | §4.2 数据权限切面注解由 @DataScope 改为 @EngDataScope,并注明不沿用已移除机制的命名;补充 Scope 一族命名对照与命名规则的引用 | 承接 2026-09-30 权限治理方案稿中仍然有效的命名约定,避免与 2026-09-29 已整体移除的 @DataPermission/DataScopeType 混淆 | 待用户确认 |
| v1.8 | 2026-10-10 | ① §4.2 过滤映射按真实列名重写为“三维取并集”并补 §4.2.0/§4.2.2/§4.2.3(原表引用的 工程变更.LINE_ID、质量.UNIT_PROJECT_ID、建渣.SITE_ID、SQE.BID_ID/SITE_ID 在真实库均不存在;安质环改为不接入过滤);② 新增 §4.1.1 存量权限码退场与菜单迁移、§4.1.2 菜单结构决定沿革;③ 保存动作码由 business:dataScope:save 定为 business:dataScope:edit;④ 新增 §2.7 分部工程接口(原方案声明了范围但无页面与接口);⑤ §1.1 建设项目管理页补联合体关联 | 承接 2026-10-10 开发库回读与代码核对结论,修正方案与真实结构不一致,补齐缺失接口契约 | 待用户确认 |
| v2.0 | 2026-10-11 | 下游模块整体切换新工程模型(按 §4.2.1 与 §7.5 执行完毕):① 工程变更改为「标段必选 + 工点/单位工程可选」(支持标段级全线变更);② 工程手续推进单元改为「工点 + 办理通道(土建 TJ/机电 JD,由责任标段 bidCategory 派生)+ 通道内责任标段必选」,保留 mapEngineeringType 流程路由;③ 质量验收目录改按「单位工程」划分分部(树=线路→标段→单位工程→分部,BIZ_QUALITY_CATALOG 新增 UNIT_PROJECT_ID),报验按单位工程录单;④ 渣土台账改「线路 + 出土工点必选 + 标段可选」;⑤ 运营对接(三权移交/问题闭环)改「线路+工点必填」并升级 SITE/LINE 两维数据权限过滤;⑥ 投资计划条目新增 BID_ID/BID_NAME(产值计划按合同标段分解);⑦ 招投标(招标文件/下属单位招标)切 projectId/bidId/lineId;⑧ BIM SPI 改按工点主键校验并派生项目;⑨ 新增统一工程选择树 /business/engineering-tree/tree(line/bid/site/unit 四模式,三维授权过滤);⑩ 旧工程树 Controller/Service/实体/旧页面(engineeringConfig/projectScope/siteLibrary/projectConfig 旧页)整体退场,15 个旧树列物理删除;⑪ 三处 DDL:BIZ_QUALITY_CATALOG 加 UNIT_PROJECT_ID、BIZ_INVEST_PLAN_ITEM 加 BID_ID/BID_NAME、BIZ_BIDDING_SUBORDINATE_TENDER 加 LINE_ID | 用户确认「从真实工程建设维度复审」后的最终契约:变更挂合同与部位而非强制单位工程、手续按空间工点且土建/机电分流、质量分部按单位工程划分、渣土按出土工地管理、产值按标段分解 | 待用户确认 |
| v1.9 | 2026-10-11 | 重构实现回归修复:① §4.2 数据权限过滤由“切面 + @EngDataScope 注解 + Mapper XML 拼 SQL”修正为 UserDataScopeHelper + Service 层包装器注入(原方案在纯 MyBatis-Plus 查询链路无 XML 可拼、注解无调用点,为死代码;ProjectBidSiteScopeAspect/EngDataScope 已删除),标段/单位工程/级联接口接入过滤,工点查询由旧工程树 UserDataScopeHelper 切换至新 helper 且异常 fail-closed;② resolveLine 由空桩改为经 BIZ_BID_SECTION.LINE_ID 反查线路,下线旧 /{projectId}/engineering-scopes 保存端点(原实现为返回 true 的假成功);③ 标段删除/单位工程重算补分部工程引用保护,指定工点校验线路归属;④ 核心业主映射由关键词模糊命中收窄为完整历史名称精准映射,单位建档加锁防重;⑤ 前端 types.ts 全量按后端 Bo/Vo 重写,修复标段保存/试算 majors 契约、级联组件取值字段、数据权限页用户列表取值层级、单位工程/分部编辑越权字段、标段页字段名与建设状态字典等前端契约错位 | 修复 AI 重构落地后静态走查与回归测试暴露的 P0/P1 缺陷,使实现与真实库结构、跨端契约一致 | 待用户确认 |
| v2.0 | 2026-10-11 | 用户数据权限台账与反查优化:① 台账列表精简为登录账号、用户姓名、手机号码(查询卡支持手机号搜索)、完整部门路径(从根到部门链回溯)、已授权范围摘要回显(支持 Tooltip 查看具体清单);② 弹窗实现工点与标段按线路层级联动,解决 1500 个工点平铺难选问题;③ 新增工程成员反查端点与视图(按标段/工点/全线反查可见人员及其来源依据) | 响应用户对数据权限台账回显、工点层级联动及工程成员反查的业务优化需求 | 待用户确认 |
| v2.1 | 2026-10-11 | 同步 §1.1、§1.2 与 §5 专业字典项数为 29 项,支持土建综合(CIV-INTE)、大机电系统综合(MEP-TOTAL)、弱电系统集成综合(SYS-INTE)、供电系统综合(POW-INTE)4 项大类与跨系统综合专业,收敛工点多专业展开导致的单位工程膨胀 | 响应用户业务指示,支撑土建总包、站后大机电系统总包等统包标段模式 | 已确认 |
| v2.2 | 2026-10-13 | 用户数据权限全景优化:① 核心安全加固:修复 UserDataScopeHelper.applyScopeUnion 跨维度查询空集时条件放行漏洞,实现 100% Fail-Closed 安全闭环;② 高频计算缓存提速:在 CacheNames 引入 BIZ_USER_DATA_SCOPE(10分钟 Redis 缓存),并在权限分配、批量修改、复制、清空及用户删除监听器中实现精准失效(Evict);③ 接口能力扩展:新增批量分配(覆盖/追加)、权限复制、批量清空 3 个新端点;④ 前端体验重构:台账接入组织架构部门树联动、支持授权状态筛选(已配/未配)、表格多选批量操作、工点分类快捷切换(车站/区间/场段/主变)及复制参考人员权限能力 | 响应业务方对用户数据权限性能、安全性与批量管理体验的深度优化需求 | 已确认 |
| v2.3 | 2026-10-13 | 单位工程法定台账全景优化:① 导航树建设状态过滤:UnitProjectNavTreeQueryBo 扩充 bizStatus 过滤参数,左侧导航树支持【在建(默认)】/【规划】/【运营】快速分类切换,且支持全树一键展开/折叠与紧凑折叠模式;② 详情视图补齐:新增单位工程综合档案详情弹窗(business:unitProject:query),一览工程基本属性、空间/合同拓扑、专业/参建主体及下属分部工程清单;③ 编辑体验优化:编辑弹窗新增工程归属只读上下文卡片,杜绝编辑时盲目修改;④ 批量管理强化:表格增加复选框与批量删除功能(受下游业务单据与分部工程引用保护拦截);⑤ 分部管理增强:分部管理抽屉支持关键字快速搜索过滤,国标模板导入前后展示精准明细确认 | 响应用户对工程台账导航按在建/规划/运营切换及单位工程综合台账体验优化需求 | 已确认 |
| v2.4 | 2026-10-13 | 用户数据权限界面视觉与性能专项优化:① 左侧面板文案更名为“业主单位与参建单位”,常驻展示并加宽至 6 栅格(去除非必要面板折叠外壳),树节点默认收起保持视觉整洁;② 树节点增加部门/单位在职人员数量统计展示,支持递归子部门聚合,后端新增 /business/data-scope/tree/dept-user-counts(结合 Spring Cache/Redis 5分钟缓存与客户端内存双重加速);③ 台账头部文案精简为单行水平排布,与批量操作按钮同行展示,高度大幅压减;④ 表头文案更新为“姓名与账户”;⑤ 根治视口下部截断问题:重构主视图为全高弹性伸缩链(flex: 1 + min-height: 0 + overflow-y: auto),表格内部滚动,底部分页栏与边框完整展示 | 响应用户对页面下部截断、树收起美观度、文案精简同行与部门人数高性能展示的优化需求 | 已确认 |
| v2.5 | 2026-10-13 | 建设项目管理台账体验与筛选优化:① 项目编码列宽由 140px 拓展至 240px,增加 show-overflow-tooltip 保护,完美解决发改委 24 位长投资编码(如 2409-500104-04-01-898239)截断问题;② 查询条件中工程状态(projectStatus)默认选中【在建】(字典值 '2'),点进页面即聚焦活跃在建项目,重置时自动恢复默认值 | 响应用户对建设项目编码显示不全及工程状态默认在建的优化需求 | 已确认 |
| v2.6 | 2026-10-15 | 用户数据权限台账“已授权范围”改为紧凑的有效授权线路数摘要;新增只读居中详情弹窗,按线路区分全线授权和部分工程授权,并展示标段与当前有效工点,支持搜索;人员列表响应增加 scopeLineCount | 响应用户对授权范围摘要过长、授权增多后难以阅读的优化需求 | 待验收 |
项目混选 API 补充契约
页面及 API 根路由 /business/project。POST/PUT 接收建设 buildUnitIds 及三类 designParticipants/superviseParticipants/constructParticipants;GET /list 及 /{projectId} 返回相同混合集合。空数组清空角色。权限沿用 business:project:add/edit/list/query,独立项目联合体关系 API 下线。ProjectController → ProjectServiceImpl 在项目事务内校验企业/联合体,整体替换角色引用与兼容快照;查询按角色、ORDER_NUM 组装 type/id/name。客户端 name 不作为权威名称。
项目选择器候选与详情最小投影权限
项目参建主体选择不要求用户拥有单位管理 unit:list 或联合体菜单 consortium:list/query 权限。候选查询使用项目自身权限,business:project:query/add/edit 任一满足即可;保存仍由项目新增/编辑权限校验,候选权限不授予档案维护能力。
| API | 方法 | 返回 | 候选范围 |
|---|---|---|---|
/business/project/participant-unit-options | GET | 分页顶层 rows/total | 业主及参建两体系,启用未删除,company/branch/joint_venture 企业 |
/business/project/participant-consortium-options | GET | 分页顶层 rows/total | 启用未删除且成员、牵头有效的全局联合体 |
两接口由 ParticipantConsortiumPicker.vue 按既有分页搜索方式读取。候选为最小只读查询投影,不提供凭据或档案修改入口。三类 *Participants VO 对联合体追加只读 leadUnitName/memberNames,项目列表/详情随查询一并返回;详情无需再请求要求 consortium:query 的档案接口,也不得因缺少联合体菜单权限而丢失已关联主体回显。客户端追加名称仍不能覆盖后端档案生成的快照。
企业现名、组织层级与项目角色核对(2026-10-14)
原“重庆城市综合交通枢纽(集团)有限公司”复用现“重庆交通资源开发有限公司”既存企业档案及 ID,不另建同一主体。资源公司官网说明其以原枢纽集团为主体改组,于 2025 年 4 月 29 日揭牌;官方公司简介为现名来源。
“重庆通远城市建设发展有限公司”按资源公司体系下级企业维护为
company,不挂集团根作为一级直属公司。资源公司官网 2024 年新闻将其称为原枢纽集团通远公司,支持该组织层级判断;尚未取得足以核实全资/控股比例的资料,不能仅因一级组织图未列而标为合资。此归属依据 2024 年官网历史枢纽/资源体系维护,2026 年当前股权及存续沿革仍待核对;官网所属企业页未列通远,也不能据此推断其更名或注销。官方项目新闻、集团调研新闻。“重庆市渝西快线建设运营有限公司”维护为
joint_venture参股项目企业,组织归属挂交通建设管理公司原铁路体系,不作为集团一级直属公司。2023 年招股说明书披露城建设计 30.60%、铜梁金龙 24.50%、重庆绿发 24.50%、原铁路集团 15.30%、北京城建集团 5.10%;上述比例仅为 2023 年披露时点,不能当作当前股权百分比。铜梁区交通局 2025 年答复明确其是璧铜线 PPP 项目业主。“重庆江跳线轨道交通运营管理有限公司”复用既存企业 ID
2109011604266926081,类型修正为joint_venture合营/参股企业,不新建、不与“重庆轨道江跳线建设运营有限公司”或江跳二期主体合并。原铁路官网披露设立时原铁路集团 50%、中铁建重庆投资 30%、中铁十六局 20%;市国资委 2024 年招聘公告明确其为原铁路集团参股公司,集团 2025 年度财务附注仍按合营企业列示。该性质不表示集团实际控股;2025 年重组后直接归属尚待核对,本轮暂保留集团下参股节点父级100,不将其解释为集团一级直属公司,也不推定挂交通建设或轨道运营公司。历史设立比例不代替最新股权确认。
组织归属表达企业主数据的真实层级,建设单位表达项目参与角色,两者独立;不能因为项目建设字段引用某企业就将它放入集团直属公司,也不能因组织分类调整清空合法建设引用。同一主体更名复用稳定 ID,按真实层级和节点类型维护,不重复建档。
合同标段跨项目关联(2026-10-14 当前业务规则)
一个合同标段可关联多个建设项目,始终保持同一 BID_ID、合同金额、管辖工点及单位工程,不复制标段,不强制指定主项目。标段所属项目选择多项;以任一关联项目筛选均能查到同一标段。关联集合为空表示归属待核对,不能编造所属项目。合同编码在共同所属项目内唯一;同编码且关联集合相交时拒绝保存,无项目关联时,同一线路内未关联项目的标段编码唯一,锁线路行防止并发重号。
项目关联与物理分期是两个维度:工点属于哪条分期线路由空间主数据决定,合同标段覆盖哪些项目由合同项目关系决定,不能为匹配单项目而改写工点分期。合同金额只记一次,跨项目汇总按 BID_ID 去重,不能在各项目重复累计全额;没有分摊基线时不自造项目分摊金额。本次不引入新金额分摊字段。429 项单位工程仍各自引用唯一 BID_ID,原标段/工点/线路授权机制不因多项目关系扩权。
项目删除须检查标段项目关系,仍被标段引用时禁止删除。更新关联在同一事务内校验全部项目并整体替换;重复 ID 拒绝保存;并发编码校验锁定当前及提交项目的并集,按 ID 升序锁定。关联变更不能更换合同身份或重建单位工程。
验收例:同一系统合同关联 15 号线一期与二期,两边筛选均返回同一标段;编辑后重新打开显示两项目;清空后显示待核对且旧单项目不残留;共同项目内相同编码拒绝;合计合同金额按标段计一次;项目删除引用保护有效;429 单位工程的 BID_ID 及原授权不变。
标段 API 集合契约与查询
标段保存 Bo 的 projectIds 为项目 ID 数组,显式 [] 清空,未提供时按旧 projectId 兼容解析(旧单值也为空时清空)。列表/详情返回 projectIds 和 projectNames 数组;旧 projectId 仅恰好一个关联时保留,零或多个时为 NULL,不人为选主项目;旧 projectName 作为导出名称投影连接全部关联名称,空集合时为空。Long ID 保持原值。
列表筛选继续使用单 projectId 参数,后端通过关系表 EXISTS 检查任一关联,避免直接 JOIN 导致行数、分页及统计重复。标段保存事务覆盖项目锁、项目存在性校验、编码冲突校验、主标段保存及关系整体替换。工程树和下游单位工程仍按唯一 BID_ID 引用。项目删除检查关系表的 PROJECT_ID 引用。
15号线公开资料补证与迁移结果(2026-10-14)
两份老平台 JSON 直接给出部分土建合同期别,公开建设和审批资料补齐其余范围。本轮31个现存标段均已建立真实项目关系:一期单项目12个、二期单项目11个、两期共同8个,共39条关系;不再采用前述13+8+10待核对的初步计划。合同明确期别优先于单个工点物理位置,现管辖范围为单一期别的机电子标按所服务范围归集。未给工点主数据另写推断项目ID,也未因车站改名修改历史工点名称。原资料有一期土建11标、现台账无此标,本轮不凭图描述新建合同。具体标段和官方来源见数据库设计本轮迁移章节。
保存标段项目关系时沿用项目只能解析到一条物理线路的既有约束:所选项目已有关联其他线路的有效标段时拒绝保存;项目改选不会自动扩大原BID/SITE/LINE授权。并发锁为标段行(编辑时)、全部当前及提交项目按ID升序;未关联项目的编码按同线路校验并锁线路行。项目选项接口 /business/project/options 真实返回 projectId/projectName,前端显式映射为下拉组件 value/label,不把空白选项当作无项目。
列表/导出使用关联数组回填所有项目名称,旧名称列连接全部项目,仅ID列不虚构主项目。EXISTS筛选不展开成多行,现线路KPI仍按唯一BID返回行聚合合同金额和单位工程总数,不为跨期复制金额;项目金额分摊未纳入本次扩展。
参建单位组织主数据见系统设置详细设计,联合体业务规则见工程基础需求分析,字段结构和历史对象见工程基础数据库设计,迁移与验证结果见工程基础测试与验收。