# 设施总数一致性:实施与验收状态 关联:[后端执行票 —— 设施总数三处口径不一致(5278 / 5276 / 5273)](../../issues/31-5278-5276-5273.md)。 ## 诊断与业务裁定 只读 GET 直接复现 5278 / 5276 / 5273;断言探针见 [三端点设施一致性探针](../../verify/t31-facility-count-readonly.ps1)。根因是设施表集合不同,不是共同管网的求和算法: | 来源 | 纳入设施 | 现场旧总数 | | --- | --- | --- | | 基础档案 | 管网5268、水厂3、供水泵站5、排水工程设施2 | 5278 | | 总体概览 | 管网5268、水厂3、供水泵站5 | 5276 | | 管理信息 | 管网5268、水源地2、窨井3 | 5273 | 用户已裁定统一为上述合法设施并集,由基础档案设施目录作为权威来源。静态数据不变时预计新总数5283:燃气537、供水1006、排水3737、窨井3。该数值尚未由新代码真实运行确认,不作为硬编码或永久断言。 ## 实施契约 - 统一六类设施来源表读取和类型字典:管网、水厂、共用泵站、排水工程设施、水源地、窨井。逻辑删除由现有业务 service 的 ORM 查询规则处理。 - 总体概览和管理信息注入同一设施目录,只投影其记录,不再选自己的设施表集合。 - 无可信类型或无业务编码的来源行不会静默丢失:保留内部未分类哨兵,基础档案/概览计入 `excluded.unknownTypeCount`,管理信息计入 `excluded.unknownIndustryCount`。这些现有字段表示无法进入正式类型/行业的记录,缺编码也属于无法进入正式集合的行;响应不暴露内部哨兵编码。 - 设施没有权威 district,一律未分区;坐标是否可上图不影响计数。监测设备仍独立统计。 - 同码但不同类型/不同来源记录不能被关系去重合并;管理信息内部投影采用目录行身份。 - 未来建设/投运日期在未加年龄过滤时计入设施总数和片区分布,`excluded.futureDateCount` 是年龄异常提示,并不代表从全局总数排除;年龄筛选时仍依现有规则排除未来日期。 - 设施来源 `updatedAt` 取台账真实创建/更新时间最大值,不把请求时间当数据更新时间;工程设施 createTime 不冒充建设日期,未知建设日期为 UNKNOWN。 - 本票统一统计定义和来源,不新增跨 HTTP 请求缓存或数据库快照 token;跨端点实时 GET 比较要求业务数据稳定。回归测试固定同一数据和时钟。 ## 验证事实 - 已运行只读探针,精确断言三个 `totals.facilityCount` 相等,旧服务以 `Facility count mismatch across three endpoints` 失败,输出为5278/5276/5273。 - 新契约回归贯通真实目录、真实适配器和三服务,覆盖全部合法来源、行业合计、片区合计、未来日期、未知类型、缺编码、同码不同设施和空集。 - 既有三适配器单元测试及五端点管网回归已更新到统一来源入口。 - 用户授权后,从 `pipe-network-service` reactor 执行 `mvn test '-Dtest=Cockpit*Test' -DfailIfNoTests=false -q`:**469 tests, 0 failures, 0 errors, 0 skipped**,包括新增跨端点契约 2/2。以 `zksy-admin` 子目录单独执行时命中本地旧依赖 JAR 而失败;从完整 reactor 构建通过,非代码缺陷。 - 后端开始基点为 `7fb7c2c`;并行提交 `60a0e9a`、`33ca0b6` 未触及本票修改文件。 - 当前服务 `http://192.168.110.96:8301` 仍运行旧代码;尚未重载,因此新代码的线上 GET、面板一致性未验收。未运行浏览器测试。 - 已执行双轴静态审查并处理发现:采用来源表+主键稳定身份,保留既有排水工程设施年限与概览长度精度契约,清除未用 Clock 依赖。 ## 下一步 提交本票后,由维护者重载现有8301实例;再运行只读探针核对三端点总数、行业/片区合计并确认基础设施面板,符合后关闭票据并在 map Decisions so far 追加一行。预期5283只作为本轮当前数据的估算,实际以重新加载后的 GET 结果为准。