Initial commit: reorganized source tree

- backend/: 13 Maven modules (cw-elevator-application, cloudwalk-cloud, intelligent-cwoscomponent, ninca-crk, etc.)
- frontend/: 4 Vue projects (elevator-front, cwos-portal, alarm-front, front_acs) + decompiled + scripts
- scripts/: build, test-env, tools (Docker Compose, service templates, API parity)
- docs/: AGENTS.md, superpowers specs, architecture docs
- .gitignore: standard Java/Maven exclusions

Moved from legacy maven-*/ root layout to backend/ organized structure.
This commit is contained in:
hpd840321
2026-05-09 09:00:12 +08:00
commit 7b2bd307f1
7260 changed files with 612980 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
# docs/ — 文档中心
## OVERVIEW
starRiverProperty 全仓文档集中地:架构说明、业务走查、构建环境、代码风格、运维脚本。原 `dev-support/` 内容已迁入此处。
**当前基线版本:v2.0.17**2026-05-05 生产验证通过)
## STRUCTURE
```
docs/
├── README.md # 文档索引与当前排期
├── AGENTS.md # ← 本文件
├── architecture/ # 工程结构
│ ├── Maven聚合工程说明.md # 5 个聚合工程定位
│ ├── 对外接口不变-远程调用与性能优化约定.md # HTTP/Feign 契约约束
│ └── 对外接口不变-走查任务与状态.md # 代码走查清单
├── business/ # 业务说明
│ ├── 访客注册与派梯楼层业务流程走查.md # 访客派梯 Feign 调用链
│ └── 租户访客默认楼层技术产品方案.md # 多租户默认楼层方案
├── build/ # 构建环境
│ └── ORIGINAL_BUILD_JDK.txt # JDK 8 依据
├── style/ # 代码风格
│ └── alibaba-eclipse-codestyle.xml # P3C Eclipse Formatter
├── operations/ # 运维脚本
│ └── deploy_cw_elevator_v1_lib_to_nexus.py # V1 lib → Nexus
├── superpowers/
│ ├── specs/ # 设计规格文档
│ └── data/ # 分析记录与调查报告
└── sql/ # 数据库 DDL 与初始化脚本
```
## WHERE TO LOOK
| Task | Location | Notes |
|------|----------|-------|
| 当前基线版本 | `AGENTS.md` | v2.0.172026-05-05 |
| 聚合工程关系 | `architecture/Maven聚合工程说明.md` | 模块依赖与工程定位 |
| 接口契约约束 | `architecture/对外接口不变-远程调用与性能优化约定.md` | 不可扩展的 HTTP/Feign 边界 |
| 走查任务清单 | `architecture/对外接口不变-走查任务与状态.md` | 可修正与须确认项 |
| 代码风格配置 | `style/alibaba-eclipse-codestyle.xml` | P3C 格式化 XML |
| JDK 版本依据 | `build/ORIGINAL_BUILD_JDK.txt` | JDK 8 强制依据 |
| Nexus 上传 | `operations/deploy_cw_elevator_v1_lib_to_nexus.py` | V1 lib 批量部署 |
| 服务发现架构 | `superpowers/specs/2026-05-01-service-discovery-architecture-design.md` | 设计文档(实施态) |
| ConsulServerList 分析 | `superpowers/data/2026-05-05-consulserverlist-static-ip-discovery-analysis.md` | V1 vs V2 服务发现差异调查 |
## 基线版本信息
| 项目 | 内容 |
|------|------|
| **版本** | **v2.0.17** |
| **状态** | ✅ 生产环境验证通过 |
| **验证日期** | 2026-05-05 |
| **JAR 文件名** | `cw-elevator-application-V1.0.0.20211103.jar`(与 V1 一致) |
| **主类** | `cn.cloudwalk.elevator.AppApplication`(与 V1 一致) |
| **Spring Boot** | 2.1.18.RELEASE |
| **Spring Cloud** | Greenwich.SR6 |
| **JDK** | 1.8(强制) |
| **Git rev** | `1c5e60f6` |
| **配置基线** | `deploy/v2-maven/bootstrap.properties` 与 V1 生产完全一致 |
### 关键决策记录
| 决策 | 选择 | 原因 |
|------|------|------|
| 服务发现 | `discovery.enabled=false` + ConfigurationBasedServerList | 与 V1 生产一致;ZK 发现依赖已移除 |
| Feign 注解 | OpenFeignorg.springframework.cloud.openfeign.FeignClient | V1 使用 Netflix FeignV2 已迁移 |
| 主类名 | AppApplication(与 V1 一致) | 对齐 V1 命名 |
| JAR 文件名 | cw-elevator-application-V1.0.0.20211103.jar(固定) | 生产部署习惯,与 V1 一致 |
| 租户策略 | 新增 tenant_visitor_floor_policy 表 | 新功能,仅在配置策略后生效 |
## CONVENTIONS
- 文档用中文撰写(README.md 及所有架构/业务文档)
- `docs/` 是文档唯一定位点,`dev-support/` 已废弃
- 格式化 XML 路径:所有 `maven-*/pom.xml``alibaba.eclipse.codestyle.path` 均指向 `docs/style/`
- 运行 JAR 还原产物不在 `docs/`,而在 `artifacts/decompiled/`
- **后续所有开发以 v2.0.17 为基线**,在此版本基础上修改和完善
+55
View File
@@ -0,0 +1,55 @@
# 文档索引(starRiverProperty
本目录集中存放说明类文档与配套资源,按类别分子目录。
## 当前排期与范围(2026-04
- 仓库根目录 [`frontend/`](../frontend/) 当前**无可用前端源码与完整静态构建产物**(仅空目录结构;历史快照在 [`artifacts/archive/dated-snapshots/`](../artifacts/archive/dated-snapshots/))。
- **凡依赖物业管理端、登记页、H5/PC 前端改动的迭代任务,在本阶段一律跳过**,不纳入当前迭代排期。优先推进**仅涉及后端、数据库、对外 HTTP/Feign 契约不变前提下的服务与配置**类工作(参见 [对外接口不变-走查任务与状态](architecture/对外接口不变-走查任务与状态.md))。
- **恢复条件**:取得可维护的前端工程或完整 dist,并确认可编译、可联调后,再单独开项将「前端相关」任务接回排期。
## 目录结构
| 目录 | 说明 |
|------|------|
| [business/](business/) | 业务走查、接口流、用例说明 |
| [build/](build/) | 构建环境、JDK 版本依据等 |
| [style/](style/) | 代码风格配置(P3C / Eclipse Formatter XML,供 Maven `formatter-maven-plugin` 引用) |
| [operations/](operations/) | 发布、私服上传等运维脚本 |
| [architecture/](architecture/) | 工程结构、Maven 聚合模块说明与模块间关系 |
源码归档(`*.jar.src` / `*.jar.src.zip`)不在 `docs/` 内,而在仓库根目录 [**`artifacts/decompiled/`**](../artifacts/decompiled/)(目录名 `decompiled` 为历史约定;与本文并列,见该目录 README)。
## 文档列表
### 工程说明(architecture
- [Maven 聚合工程说明](architecture/Maven聚合工程说明.md) — 五个 `maven-*` 聚合工程的定位、子模块、技术栈、工程间依赖与 `artifacts`/运行包分工。
- [对外接口不变-远程调用与性能优化约定](architecture/对外接口不变-远程调用与性能优化约定.md) — HTTP/Feign 不扩展前提下,合并 RPC、有界并行与返回值校验等原则。
- [对外接口不变-走查任务与状态](architecture/对外接口不变-走查任务与状态.md) — 与约定对齐的代码走查:子任务量、可修正项与不可修正/须确认项。
### 业务(business
- [访客注册与派梯楼层业务流程走查](business/访客注册与派梯楼层业务流程走查.md) — 从第三方获取默认楼层到指定楼层、电梯 `add/visitor`、Feign 调用链与用例。
- [租户访客默认楼层技术产品方案](business/租户访客默认楼层技术产品方案.md) — 从第三方登记页初始化(数据项与接口溯源)到派梯开通的**闭环**、多租户默认楼层的实现路径评估与落地建议。
### 构建(build
- [ORIGINAL_BUILD_JDK.txt](build/ORIGINAL_BUILD_JDK.txt) — 原始运行包与构件体现的 **JDK 8** 依据;与各聚合父 POM 中 `maven-enforcer-plugin` 提示一致。
### 风格(style
- [alibaba-eclipse-codestyle.xml](style/alibaba-eclipse-codestyle.xml) — 阿里巴巴 P3C Eclipse 格式化配置;各 `maven-*/pom.xml``alibaba.eclipse.codestyle.path` 指向此处。
- 仓库根目录 `scripts/check_maven_formatter_validate.sh` — 在 **JDK 8** 下对每个 `maven-*``formatter:validate`(插件 **2.16.0**,与父 POM 中 2.24 需更高 JVM 跑插件不同,见 [build/ORIGINAL_BUILD_JDK.txt](build/ORIGINAL_BUILD_JDK.txt) 文末)。`scripts/format_maven_formatter_all.sh` 为同配置批量 `formatter:format`(会改文件,先备份或走评审)。
### 运维(operations
- [deploy_cw_elevator_v1_lib_to_nexus.py](operations/deploy_cw_elevator_v1_lib_to_nexus.py) — 将 V1 运行包 `lib` 下 JAR 批量 `deploy-file` 到 Nexus 的脚本。
## 源码归档与解压树(`artifacts/`
说明类文档在 **`docs/`**;由运行 JAR 还原得到的 **`*.jar.src.zip` / `*.jar.src/`** 已归纳至仓库根目录 **`artifacts/decompiled/`**`archives``trees` 分类),详见 [artifacts/decompiled/README.md](../artifacts/decompiled/README.md)。
## 与 `dev-support` 的关系
`dev-support/` 下文档与配置已迁入 `docs/` 对应子目录。若本地仍有旧路径书签,请改为以 `docs/` 为准。
@@ -0,0 +1,279 @@
# Maven 工作区子工程版本一览
> **范围**`/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译` 下 `maven-*` 目录内全部 `pom.xml`(**主聚合工程 5 个 + 补充反应堆 7 个**,合计 **44** 个 `pom.xml` 文件)。
> **说明**:子模块未单独声明 `<version>` 时,与**反应堆(reactor)父 POM** 的 `<version>` 一致。
> **生成方式**:走查各 `pom.xml` 的 `parent`、`groupId`、`artifactId`、`version`、`properties` 关键项。
> **版本演进(主版本升级)**:相对历史反编译/私服线,本工作区多工程坐标抬升主版本号以便区分。**电梯运行口径**:依赖 **`intelligent-cwoscomponent` 2.9.2-xinghewan**(与 `cw_lib` 一致,**不使用** 3.0.0);**`maven-intelligent-cwoscomponent` 源码反应堆** 仍为 **3.0.0-xinghewan**(与其它工程/历史 3.x 线兼容)。另:cloudwalk-cloud **4.0.0-Brussels-SRX**、ninca-crk **2.0.0**、ninca-qk-alarm **1.0.0-SNAPSHOT**。
---
## 1. 聚合工程总表
### 1.1 主链(业务五工程)
| 工程目录 | 反应堆 `groupId` | 反应堆 `artifactId` | **工程版本** | **Spring Boot parent** | Spring Cloud(属性) |
|----------|------------------|----------------------|--------------|------------------------|----------------------|
| `maven-cw-elevator-application/` | `cn.cloudwalk.elevator` | `cw-elevator-application-reactor` | **`2.0-SNAPSHOT`** | `2.1.18.RELEASE` | 见反应堆 `pom.xml`(与 Boot 2.1 栈配套) |
| `maven-intelligent-cwoscomponent/` | `cn.cloudwalk.intelligent` | `intelligent-cwoscomponent-reactor` | **`3.0.0-xinghewan`** | `2.1.18.RELEASE` | **`Greenwich.SR6`**`${spring-cloud.version}` |
| `maven-cloudwalk-cloud/` | `cn.cloudwalk.cloud` | `cloudwalk-cloud-reactor` | **`4.0.0-Brussels-SRX`** | `2.1.18.RELEASE` | **`Greenwich.SR6`** |
| `maven-ninca-crk/` | `cn.cloudwalk.ninca` | `ninca-crk-reactor` | **`2.0.0`** | **`1.5.22.RELEASE`** | **`Edgware.SR6`** |
| `maven-ninca-qk-alarm/` | `cn.cloudwalk.ninca` | `ninca-qk-alarm-reactor` | **`1.0.0-SNAPSHOT`** | `2.1.18.RELEASE` | (反应堆未统一声明 spring-cloud BOM,以依赖为准) |
### 1.2 补充反应堆(私服缺父 POM 时本地 install
| 工程目录 | 反应堆 / 父 `artifactId` | 版本 | 说明 |
|----------|---------------------------|------|------|
| `maven-cloudwalk-device-sdk/` | `cloudwalk-device-sdk``cn.cloudwalk` | **`2.2.0`** | 子模块 **`cloudwalk-device-sdk-protocol-entity`**;与 intelligent 中 **`cloudwalk.device.sdk.version`** 一致。 |
| `maven-cloudwalk-device-manager/` | `cloudwalk-device-manager``cn.cloudwalk.cloud` | **`2.0.2`** | 子模块 **`cloudwalk-device-manager-common`**、**`cloudwalk-device-manager-interface`**;依赖 **`cloudwalk-common-result:3.7.2-Brussels-SRX`**(须先 **`maven-cloudwalk-legacy-public`**)。 |
| `maven-cloudwalk-legacy-public/` | `cloudwalk-legacy-public-reactor``cn.cloudwalk.cloud` | **`1.0.0-SNAPSHOT`** | 安装 **`cloudwalk-cloud-common:3.7.2-Brussels-SRX`**、**`cloudwalk-common-result`/`web`/`serial`**、**`cwos-sdk-event:1.5.0-SNAPSHOT`**、**`cloudwalk-intelligent-component-lock:1.1.1-SNAPSHOT`**;源码来自 **`反1/*.jar.src.zip`**。 |
| `maven-cwos-resource/` | `cwos-resource-reactor``cn.cloudwalk.cloud` | **`1.0.0-SNAPSHOT`** | 含 **`cwos-component-resource`**、**`cwos-portal`** 父 POM、**`cwos-java-sdk-resource`**、**`cwos-device-pkg-stub`** 等;与电梯 **`cwos.sdk.resource.version`** 对齐。 |
| `maven-cloudwalk-intelligent-davinci-manager/` | `cloudwalk-intelligent-davinci-manager``cn.cloudwalk.intelligent` | **`1.1.7-SNAPSHOT`** | 子模块 **`davinci-manager-common`**、**`davinci-manager-storage`**;与电梯 **`davinci.manager.storage.version`** 一致。 |
| `maven-cwos-common-aks/` | **`cwos-common-aks`**`cn.cloudwalk.cloud` | **`1.0.0-SNAPSHOT`** | 子模块 **`cwos-common-aks-interface`**;与 **`cw_lib`** / **`反1`** 对齐;须先 **`maven-cloudwalk-legacy-public`****`cloudwalk-common-result`**)。 |
| `maven-cwos-device-authentication/` | **`cwos-device-authentication`**`cn.cloudwalk.cloud` | **`1.0.0-SNAPSHOT`** | 子模块 **`cwos-device-authentication-interface`**;依赖 **device-sdk**、**device-manager**、**`maven-cloudwalk-cloud`****`cloudwalk-common-service`**)、**`cwos-common-aks-interface`**;须在 **`maven-cwos-common-aks`** 与 **`maven-cloudwalk-cloud`** 之后 install。 |
---
## 2. 按工程展开:子模块坐标与版本
### 2.1 `maven-cw-elevator-application`(电梯应用)
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `cw-elevator-application-reactor` | **2.0-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cw-elevator-application-common/` | `cw-elevator-application-common` | **2.0-SNAPSHOT**(继承) | `cw-elevator-application-reactor` |
| `cw-elevator-application-data/` | `cw-elevator-application-data` | **2.0-SNAPSHOT**(继承) | 同上 |
| `cw-elevator-application-service/` | `cw-elevator-application-service` | **2.0-SNAPSHOT**(继承) | 同上 |
| `cw-elevator-application-web/` | `cw-elevator-application-web` | **2.0-SNAPSHOT**(继承) | 同上 |
**反应堆内常用属性(节选)**`cloudwalk.internal.version` / `cloudwalk.legacy.public.version` **3.7.2-Brussels-SRX**`intelligent.cwoscomponent.version` **2.9.2-xinghewan**(与 **`cw_lib`** / 上线口径一致);`fastjson.version` **1.2.73**`guava.version` **28.2-jre**`poi.version` **4.1.2**`java.version` **1.8**
---
### 2.2 `maven-intelligent-cwoscomponent`CWOS 智能组件)
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `intelligent-cwoscomponent-reactor` | **3.0.0-xinghewan** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `intelligent-cwoscomponent-parent/` | `intelligent-cwoscomponent` | **3.0.0-xinghewan** | `spring-boot-starter-parent` **2.1.18.RELEASE****stub parent**`packaging`=`pom`,与私服 JAR 声明的 parent 对齐) |
| `intelligent-cwoscomponent-interface/` | `intelligent-cwoscomponent-interface` | **3.0.0-xinghewan**(继承) | `intelligent-cwoscomponent-reactor` |
| `intelligent-cwoscomponent-rest/` | `intelligent-cwoscomponent-rest` | **3.0.0-xinghewan**(继承) | `intelligent-cwoscomponent-reactor` |
**反应堆内常用属性(节选)**`spring-cloud.version` **Greenwich.SR6**`cloudwalk.internal.version` **4.0.0-Brussels-SRX**`cloudwalk.device.sdk.version` **2.2.0**`fastjson.version` **1.2.83**
---
### 2.3 `maven-cloudwalk-cloud`(云从 cloud 公共)
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `cloudwalk-cloud-reactor` | **4.0.0-Brussels-SRX** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cloudwalk-cloud-common/` | `cloudwalk-cloud-common` | **4.0.0-Brussels-SRX** | `spring-boot-starter-parent` **2.1.18.RELEASE****stub parent**`packaging`=`pom` |
| `cloudwalk-common-event/` | `cloudwalk-common-event` | **4.0.0-Brussels-SRX**(继承) | `cloudwalk-cloud-reactor` |
| `cloudwalk-common-service/` | `cloudwalk-common-service` | **4.0.0-Brussels-SRX**(继承) | `cloudwalk-cloud-reactor` |
**反应堆内常用属性(节选)**`spring-cloud.version` **Greenwich.SR6**`cwos.sdk.event.version` **1.5.0-SNAPSHOT**`cloudwalk.internal.version` **4.0.0-Brussels-SRX**
---
### 2.4 `maven-ninca-crk`(轻舟 CRK
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `ninca-crk-reactor` | **2.0.0** | `spring-boot-starter-parent` **1.5.22.RELEASE** |
| `ninca-crk-gpu-std/` | `ninca-crk-gpu-std` | **2.0.0**(继承) | `ninca-crk-reactor` |
**反应堆内常用属性(节选)**`spring-cloud.version` **Edgware.SR6**`cloudwalk.internal.version` **4.0.0-Brussels-SRX**`intelligent.cwoscomponent.rest.version` **3.0.0-xinghewan**`ninca-crk-*` 多模块 **2.9.1_210630-SNAPSHOT**`mybatis-spring-boot.version` **1.3.5**
---
### 2.5 `maven-ninca-qk-alarm`(区域告警应用)
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `ninca-qk-alarm-reactor` | **1.0.0-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `ninca-qk-alarm-app-starter/` | `ninca-qk-alarm-app-starter` | **1.0.0-SNAPSHOT**(继承) | `ninca-qk-alarm-reactor` |
**反应堆内常用属性(节选)**`cloudwalk.internal.version` **4.0.0-Brussels-SRX**`curator.version` **4.2.0**`zookeeper.version` **3.4.14**`mybatis-spring-boot.version` **2.0.1**
---
### 2.6 `maven-cloudwalk-device-sdk`(设备 SDK 父链)
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `cloudwalk-device-sdk` | **2.2.0** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cloudwalk-device-sdk-protocol-entity/` | `cloudwalk-device-sdk-protocol-entity` | **2.2.0**(继承) | `cloudwalk-device-sdk``../pom.xml` |
---
### 2.6b `maven-cloudwalk-device-manager`(设备管理 common / interface
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `cloudwalk-device-manager` | **2.0.2** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cloudwalk-device-manager-common/` | `cloudwalk-device-manager-common` | **2.0.2**(继承) | `cloudwalk-device-manager``../pom.xml` |
| `cloudwalk-device-manager-interface/` | `cloudwalk-device-manager-interface` | **2.0.2**(继承) | `cloudwalk-device-manager``../pom.xml` |
**反应堆内常用属性(节选)**`cloudwalk.common.result.version` **3.7.2-Brussels-SRX**(与 **`maven-cloudwalk-legacy-public`** 中 **`cloudwalk-common-result`** 一致)。
---
### 2.7 `maven-cwos-resource`CWOS 资源 / 门户 / SDK
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `cwos-resource-reactor` | **1.0.0-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cwos-component-resource/` | `cwos-component-resource` | **1.0.0-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cwos-component-resource-data/` | `cwos-component-resource-data` | **1.0.0-SNAPSHOT**(继承) | `cwos-component-resource` |
| `cwos-component-resource-interface/` | `cwos-component-resource-interface` | **1.0.0-SNAPSHOT**(继承) | `cwos-component-resource` |
| `cwos-device-pkg-stub/` | `cwos-device-pkg-stub` | **1.0.0-SNAPSHOT**(继承) | `cwos-resource-reactor` |
| `cwos-portal/` | `cwos-portal` | **1.0.0-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cwos-portal-interface/` | `cwos-portal-interface` | **1.0.0-SNAPSHOT**(继承) | `cwos-portal` |
| `cwos-java-sdk-resource/` | `cwos-java-sdk-resource` | **1.0.0-SNAPSHOT**(继承) | `cwos-resource-reactor` |
**反应堆内常用属性(节选)**`spring-cloud.version` **Greenwich.SR6**`cloudwalk.legacy.public.version` **3.7.2-Brussels-SRX**`mybatis.version` **3.5.6**
---
### 2.8 `maven-cloudwalk-intelligent-davinci-manager`Davinci 存储)
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `cloudwalk-intelligent-davinci-manager` | **1.1.7-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `davinci-manager-common/` | `davinci-manager-common` | **1.1.7-SNAPSHOT**(继承) | `cloudwalk-intelligent-davinci-manager``../pom.xml` |
| `davinci-manager-storage/` | `davinci-manager-storage` | **1.1.7-SNAPSHOT**(继承) | `cloudwalk-intelligent-davinci-manager``../pom.xml` |
**反应堆内常用属性(节选)**`spring-cloud.version` **Greenwich.SR6**`feign-form.version` **3.0.3**`commons-io.version` **2.5**
---
### 2.9 `maven-cloudwalk-legacy-public`(反1 公共线)
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `cloudwalk-legacy-public-reactor` | **1.0.0-SNAPSHOT** | (无 Spring parent,聚合 `pom` |
| `cloudwalk-cloud-common/` | `cloudwalk-cloud-common` | **3.7.2-Brussels-SRX** | `spring-boot-starter-parent` **1.5.22.RELEASE** |
| `cloudwalk-common-result/` | `cloudwalk-common-result` | **3.7.2-Brussels-SRX**(继承) | `cloudwalk-cloud-common` |
| `cloudwalk-common-web/` | `cloudwalk-common-web` | **3.7.2-Brussels-SRX**(继承) | `cloudwalk-cloud-common` |
| `cloudwalk-common-serial/` | `cloudwalk-common-serial` | **3.7.2-Brussels-SRX**(继承) | `cloudwalk-cloud-common` |
| `cwos-sdk-event/` | `cwos-sdk-event` | **1.5.0-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cloudwalk-intelligent-component-lock/` | `cloudwalk-intelligent-component-lock` | **1.1.1-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
---
### 2.10 `maven-cwos-common-aks`AKS 公共接口)
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `cwos-common-aks` | **1.0.0-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cwos-common-aks-interface/` | `cwos-common-aks-interface` | **1.0.0-SNAPSHOT**(继承) | `cwos-common-aks``../pom.xml` |
**反应堆内常用属性(节选)**`cloudwalk.legacy.public.version` **3.7.2-Brussels-SRX**`fastjson.version` **1.2.83**
---
### 2.11 `maven-cwos-device-authentication`(设备认证 interface
| 模块路径 | `artifactId` | 版本 | 父 POM |
|----------|----------------|------|--------|
| 根 | `cwos-device-authentication` | **1.0.0-SNAPSHOT** | `spring-boot-starter-parent` **2.1.18.RELEASE** |
| `cwos-device-authentication-interface/` | `cwos-device-authentication-interface` | **1.0.0-SNAPSHOT**(继承) | `cwos-device-authentication``../pom.xml` |
**反应堆内常用属性(节选)**`cloudwalk-common.version` **3.7.2-Brussels-SRX**`cloudwalk-device.version` **2.0.2**`cloudwalk-aks.version` **1.0.0-SNAPSHOT**`cloudwalk.device.sdk.version` **2.2.0**`fastjson.version` **1.2.83**
---
## 3. 跨工程对齐关系(便于联调)
| 概念 | 常见取值 | 出现在 |
|------|----------|--------|
| 云从内部线版本 | **3.7.2**(电梯常用) / **4.0.0**(部分工程) | 电梯、ninca-qk-alarm 等 `cloudwalk.internal.version` 多为 **3.7.2****cloudwalk-cloud / ninca-crk** 等仍可能 **4.0.0** |
| intelligent 组件线 | **2.9.2-xinghewan**(电梯) / **3.0.0-xinghewan**(反应堆源码、ninca-crk | **电梯** `intelligent.cwoscomponent.version` **必须为 2.9.2**(与 `cw_lib` 一致);**`maven-intelligent-cwoscomponent`** 反应堆仍为 **3.0.0****ninca-crk** `intelligent.cwoscomponent.rest.version` 多为 **3.0.0** |
| 设备 SDK 协议实体 | **2.2.0** | intelligent `cloudwalk.device.sdk.version`**`maven-cloudwalk-device-sdk`** 反应堆版本 |
| 设备管理 common/interface | **2.0.2** | **`maven-cloudwalk-device-manager`**;依赖 **`cloudwalk-common-result` 3.7.2****`maven-cloudwalk-legacy-public`** |
| AKS / 设备认证 interface | **1.0.0-SNAPSHOT** | **`maven-cwos-common-aks`****`cwos-common-aks-interface`**)、**`maven-cwos-device-authentication`****`cwos-device-authentication-interface`**);与 **`cw_lib`** 同名 JAR 对齐;**device-authentication** 另依赖 **`cloudwalk-common-service`****`maven-cloudwalk-cloud`**)、**device-manager-interface**、**protocol-entity** |
| CWOS Java SDK 资源 | **1.0.0-SNAPSHOT** | 电梯 `cwos.sdk.resource.version`**`maven-cwos-resource`** 中 **`cwos-java-sdk-resource`** 等 |
| Davinci 存储 | **1.1.7-SNAPSHOT** | 电梯 `davinci.manager.storage.version`**`maven-cloudwalk-intelligent-davinci-manager`** 中 **`davinci-manager-storage`** |
| 反1 公共线(legacy | **3.7.2 / 1.5.0-SNAPSHOT / 1.1.1-SNAPSHOT** | **`maven-cloudwalk-legacy-public`**`common-result`/`web`/`serial``cwos-sdk-event``component-lock`;与 **`cloudwalk.legacy.public.version`**、**`cwos.sdk.event.version`**、**`intelligent.lock.version`** 对齐 |
| Spring Boot 主线 | **2.1.18.RELEASE** | 电梯、intelligent、cloudwalk-cloud、ninca-qk-alarm |
| Spring Boot 旧线 | **1.5.22.RELEASE** | **仅 ninca-crk** |
---
## 4. `pom.xml` 物理路径清单(44
```
maven-cloudwalk-cloud/pom.xml
maven-cloudwalk-cloud/cloudwalk-cloud-common/pom.xml
maven-cloudwalk-cloud/cloudwalk-common-event/pom.xml
maven-cloudwalk-cloud/cloudwalk-common-service/pom.xml
maven-cloudwalk-device-sdk/pom.xml
maven-cloudwalk-device-sdk/cloudwalk-device-sdk-protocol-entity/pom.xml
maven-cloudwalk-device-manager/pom.xml
maven-cloudwalk-device-manager/cloudwalk-device-manager-common/pom.xml
maven-cloudwalk-device-manager/cloudwalk-device-manager-interface/pom.xml
maven-cloudwalk-legacy-public/pom.xml
maven-cloudwalk-legacy-public/cloudwalk-cloud-common/pom.xml
maven-cloudwalk-legacy-public/cloudwalk-common-result/pom.xml
maven-cloudwalk-legacy-public/cloudwalk-common-web/pom.xml
maven-cloudwalk-legacy-public/cloudwalk-common-serial/pom.xml
maven-cloudwalk-legacy-public/cwos-sdk-event/pom.xml
maven-cloudwalk-legacy-public/cloudwalk-intelligent-component-lock/pom.xml
maven-cloudwalk-intelligent-davinci-manager/pom.xml
maven-cloudwalk-intelligent-davinci-manager/davinci-manager-common/pom.xml
maven-cloudwalk-intelligent-davinci-manager/davinci-manager-storage/pom.xml
maven-cwos-resource/pom.xml
maven-cwos-resource/cwos-component-resource/pom.xml
maven-cwos-resource/cwos-component-resource-data/pom.xml
maven-cwos-resource/cwos-component-resource-interface/pom.xml
maven-cwos-resource/cwos-device-pkg-stub/pom.xml
maven-cwos-resource/cwos-portal/pom.xml
maven-cwos-resource/cwos-portal-interface/pom.xml
maven-cwos-resource/cwos-java-sdk-resource/pom.xml
maven-cwos-common-aks/pom.xml
maven-cwos-common-aks/cwos-common-aks-interface/pom.xml
maven-cwos-device-authentication/pom.xml
maven-cwos-device-authentication/cwos-device-authentication-interface/pom.xml
maven-cw-elevator-application/pom.xml
maven-cw-elevator-application/cw-elevator-application-common/pom.xml
maven-cw-elevator-application/cw-elevator-application-data/pom.xml
maven-cw-elevator-application/cw-elevator-application-service/pom.xml
maven-cw-elevator-application/cw-elevator-application-web/pom.xml
maven-intelligent-cwoscomponent/pom.xml
maven-intelligent-cwoscomponent/intelligent-cwoscomponent-parent/pom.xml
maven-intelligent-cwoscomponent/intelligent-cwoscomponent-interface/pom.xml
maven-intelligent-cwoscomponent/intelligent-cwoscomponent-rest/pom.xml
maven-ninca-crk/pom.xml
maven-ninca-crk/ninca-crk-gpu-std/pom.xml
maven-ninca-qk-alarm/pom.xml
maven-ninca-qk-alarm/ninca-qk-alarm-app-starter/pom.xml
```
---
## 5. 维护说明
- 若某子模块单独写了 `<version>`,以该模块 `pom.xml` 为准(当前走查结果:**子模块均未覆盖反应堆版本**)。
- 私服、Nexus 地址等多写在各反应堆 `pom.xml``properties` 中(如 `nexus.baseUrl`)。
- 本文不替代各工程 `dependencyManagement` 内**第三方库**的逐项版本;需要时可对各根 `pom.xml` 再跑 `mvn help:effective-pom` 导出。
---
## 6. 修订历史
| 日期 | 内容 |
|------|------|
| 2026-04-24 | 初稿:工作区 `pom` 走查 |
| 2026-04-24 | **主版本升级**(与历史反编译/私服坐标区分):电梯 **2.0-SNAPSHOT**、intelligent **3.0.0-xinghewan**、cloudwalk-cloud **4.0.0-Brussels-SRX**、ninca-crk **2.0.0**、ninca-qk-alarm **1.0.0-SNAPSHOT**`cloudwalk.internal.version`、电梯与 ninca-crk 中 intelligent 属性已对齐 |
| 2026-04-24 | **`cloudwalk.legacy.public.version`3.7.2-Brussels-SRX**:私服未发布新主版本的 `cloudwalk-common-result` / `web` / `serial` 时,与反应堆 **4.0.0** 解耦;本地编译说明见 [docs/build/本地编译说明.md](../build/本地编译说明.md) |
| 2026-04-24 | 补充反应堆 **`maven-cloudwalk-device-sdk`**`cloudwalk-device-sdk` **2.2.0**)、**`maven-cwos-resource`**CWOS 资源/门户/SDK);`pom` 总数 **17 → 27**;编译顺序见 [本地编译说明.md](../build/本地编译说明.md) §3 |
| 2026-04-24 | 补充反应堆 **`maven-cloudwalk-intelligent-davinci-manager`****`cloudwalk-intelligent-davinci-manager` 1.1.7-SNAPSHOT**、`davinci-manager-common``davinci-manager-storage`);`pom` 总数 **27 → 30**;编译顺序见 [本地编译说明.md](../build/本地编译说明.md) §3 |
| 2026-04-24 | 补充反应堆 **`maven-cloudwalk-legacy-public`****`反1`**`cloudwalk-cloud-common` **3.7.2**`common-result`/`web`/`serial`、**`cwos-sdk-event`**、**`component-lock`**);`pom` 总数 **30 → 37**;须在 **`maven-cloudwalk-cloud`** 之前 install;见 [本地编译说明.md](../build/本地编译说明.md) §3 |
| 2026-04-24 | 补充反应堆 **`maven-cloudwalk-device-manager`****`cloudwalk-device-manager` 2.0.2**、**common**、**interface****`反1`** zip);`pom` 总数 **37 → 40**;须在 **`maven-cloudwalk-legacy-public`** 之后 install;见 [本地编译说明.md](../build/本地编译说明.md) §3 |
| 2026-04-24 | 补充反应堆 **`maven-cwos-common-aks`**、**`maven-cwos-device-authentication`****`反1`**`cwos-common-aks-interface``cwos-device-authentication-interface`);`pom` 总数 **40 → 44****device-authentication** 须在 **`maven-cloudwalk-cloud`** 与 **`maven-cwos-common-aks`** 之后 install;见 [本地编译说明.md](../build/本地编译说明.md) §3 |
| 2026-04-24 | **`intelligent-cwoscomponent-rest`**`FeignClient`**`org.springframework.cloud.netflix.feign`** 改为 **`org.springframework.cloud.openfeign`**,与 **Greenwich + `spring-cloud-starter-openfeign`** 一致 |
| 2026-04-27 | **电梯** `intelligent.cwoscomponent.version` 定为 **2.9.2-xinghewan**(与 **`cw_lib`**、上线口径一致,**禁止 3.0.0**);`build_nexus_only.sh` 改为从 **`cw_lib` + 父 POM 桩** install-file,不再默认编译 **`maven-intelligent-cwoscomponent` 3.0.0** |
---
*文档为工作区静态走查整理;若你本地有未提交的 `pom` 修改,请以工作区实际文件为准。*
@@ -0,0 +1,297 @@
# Maven 聚合工程说明(starRiverProperty
> **适用范围**:本仓库根目录下以 `maven-` 为前缀的 **Maven Reactor**:其中 **五个** 为主业务聚合工程;另有 **七个** 补充反应堆(`maven-cloudwalk-device-sdk`、`maven-cloudwalk-device-manager`、`maven-cwos-resource`、`maven-cloudwalk-intelligent-davinci-manager`、**`maven-cloudwalk-legacy-public`**、**`maven-cwos-common-aks`**、**`maven-cwos-device-authentication`**)用于在私服缺父 POM 或缺历史公共 JAR 时 **本地 `install` 闭合** `cloudwalk-device-sdk`、`cloudwalk-device-manager`、`cwos-component-resource`、`cwos-portal`、`cwos-java-sdk-resource`、**`cloudwalk-intelligent-davinci-manager` / `davinci-manager-storage`**、**`cloudwalk-common-result` / `web` / `serial`3.7.2**、**`cwos-sdk-event`**、**`cloudwalk-intelligent-component-lock`**、**`cwos-common-aks` / `cwos-device-authentication`** 等坐标(**`反1/`** 下对应 `*.jar.src.zip` 已接入各反应堆)。
> **不适用范围**:各工程依赖的 **NINCA / 云从内部** 等大量 JAR 仍多须 Nexus 解析;本文描述**本仓库内可见的模块边界与协作关系**,补充反应堆仅覆盖文档化缺口中的一段。
---
## 1. 文档目的
- 说明五个聚合工程各自的 **业务定位、子模块划分、技术栈选型原因**
- 说明工程之间的 **Maven 依赖与调用链上的协作**(与 `docs/business/` 中接口走查互补:本文偏「工程与构件」,走查文档偏「接口与数据流」)。
- 说明 **`maven-*`** 目录与 **`artifacts/decompiled/`**(源码归档,目录名 `decompiled` 为历史约定)、**运行包目录** `cw-elevator-application-V1.0.0.20211103/` 的分工,避免混淆「可改源码树」与「仅对照归档」。
---
## 2. 工程一览
### 2.1 主业务五工程
| 仓库目录 | 聚合 artifactId(父 POM | `groupId` | 版本(父 POM | 子模块(`modules` |
|----------|---------------------------|-----------|----------------|----------------------|
| `maven-cloudwalk-cloud/` | `cloudwalk-cloud-reactor` | `cn.cloudwalk.cloud` | `4.0.0-Brussels-SRX` | `cloudwalk-cloud-common``cloudwalk-common-event``cloudwalk-common-service` |
| `maven-cw-elevator-application/` | `cw-elevator-application-reactor` | `cn.cloudwalk.elevator` | `2.0-SNAPSHOT` | `cw-elevator-application-common``data``service``web` |
| `maven-intelligent-cwoscomponent/` | `intelligent-cwoscomponent-reactor` | `cn.cloudwalk.intelligent` | `3.0.0-xinghewan` | `intelligent-cwoscomponent-parent``interface``rest` |
| `maven-ninca-crk/` | `ninca-crk-reactor` | `cn.cloudwalk.ninca` | `2.0.0` | `ninca-crk-gpu-std` |
| `maven-ninca-qk-alarm/` | `ninca-qk-alarm-reactor` | `cn.cloudwalk.ninca` | `1.0.0-SNAPSHOT` | `ninca-qk-alarm-app-starter`(其下再含 web / interface 等子模块) |
### 2.2 补充反应堆(编译链)
| 仓库目录 | 说明 |
|----------|------|
| `maven-cloudwalk-device-sdk/` | 安装 **`cn.cloudwalk:cloudwalk-device-sdk:2.2.0`**`pom`)与 **`cloudwalk-device-sdk-protocol-entity`**,供 **`maven-intelligent-cwoscomponent`** 解析 `protocol-entity` 描述符。 |
| `maven-cloudwalk-device-manager/` | 安装 **`cn.cloudwalk.cloud:cloudwalk-device-manager:2.0.2`**`pom`)及 **`cloudwalk-device-manager-common`**、**`cloudwalk-device-manager-interface`**;依赖 **`cloudwalk-common-result:3.7.2-Brussels-SRX`**(须先 **`maven-cloudwalk-legacy-public`** `install`)。 |
| `maven-cwos-resource/` | 安装 **`cwos-component-resource`**、**`cwos-portal`** 父 POM 及 **`cwos-java-sdk-resource`** 等,供 **`cw-elevator-application-service`** 解析 `cwos-java-sdk-resource` 的传递父链。`cwos-portal-interface`**裁剪 + 占位** 以闭合 SDK,详见 [本地编译说明.md](../build/本地编译说明.md) §3。 |
| `maven-cloudwalk-intelligent-davinci-manager/` | 安装 **`cn.cloudwalk.intelligent:cloudwalk-intelligent-davinci-manager:1.1.7-SNAPSHOT`**(父 `pom`)及 **`davinci-manager-common`**、**`davinci-manager-storage`**,供电梯 **`cw-elevator-application-service`** 解析 **`davinci-manager-storage`**`davinci.manager.storage.version`)。源码基底来自历史 **1.1.5** 反编译 zip,与 V1 运行包 **1.1.7-SNAPSHOT** 坐标一致;**`SpringMvcContract` / `FeignClientsConfiguration`** 与 **Greenwich + OpenFeign** 对齐。 |
| `maven-cloudwalk-legacy-public/` | 安装 **`cn.cloudwalk.cloud:cloudwalk-cloud-common:3.7.2-Brussels-SRX`**(与 **`cloudwalk-common-result` / `web` / `serial`** 反编译 POM 的 parent 一致)、**`cwos-sdk-event:1.5.0-SNAPSHOT`**、**`cloudwalk-intelligent-component-lock:1.1.1-SNAPSHOT`**。源码自 **`反1/*.jar.src.zip`** 解压;**`cwos-sdk-event`** 已替换 **`reflections-maven`** 为 **`org.reflections:reflections`**,并修正 **`KafkaConsumer#setListenerClass`** / **`EventClient`** 的编译问题。 |
| `maven-cwos-common-aks/` | 安装 **`cn.cloudwalk.cloud:cwos-common-aks:1.0.0-SNAPSHOT`** 与 **`cwos-common-aks-interface`**;源码自 **`反1/cwos-common-aks-interface-1.0.0-SNAPSHOT.jar.src.zip`**;须先 **`maven-cloudwalk-legacy-public`****`cloudwalk-common-result`**)。 |
| `maven-cwos-device-authentication/` | 安装 **`cn.cloudwalk.cloud:cwos-device-authentication:1.0.0-SNAPSHOT`** 与 **`cwos-device-authentication-interface`**;源码自 **`反1/cwos-device-authentication-interface-1.0.0-SNAPSHOT.jar.src.zip`**;依赖 **device-sdk**、**device-manager**、**`maven-cloudwalk-cloud`****`cloudwalk-common-service`**)、**`cwos-common-aks-interface`**,须在上述反应堆与 **`maven-cwos-common-aks`** 之后 **`install`**。 |
> **版本说明**:上表为当前源码树反应堆版本(相对历史反编译/私服线已做**主版本号升级**,便于区分)。与 `cw-elevator-application-V1.0.0.20211103` 等**历史运行包内 JAR 文件名**不必一致,详见 `docs/build/ORIGINAL_BUILD_JDK.txt` 文首说明及 [Maven工作区子工程版本一览](Maven工作区子工程版本一览.md)。
---
## 3. 各工程详细说明
### 3.1 `maven-cloudwalk-cloud` — 云从公共云底座(事件与服务)
**定位**
聚合 **CloudWalk 内部通用能力**:消息与事件封装(`cloudwalk-common-event`)、通用服务侧抽象与实现(`cloudwalk-common-service`)。电梯应用、智能组件等上层工程普遍依赖这里的 **`CloudwalkResult`、Feign 封装、事件注解** 等构件。
**为何存在「`cloudwalk-cloud-common`」子模块**
历史子 JAR 的 `parent` 曾指向 **`cloudwalk-cloud-common`**,而原始父 POM 在仓库中缺失。本聚合工程增加 **`cloudwalk-cloud-common`** 模块,使子模块能 **先 `install` 到本地 `~/.m2`**,满足其它构件对「父 POM 坐标」的解析,同时由本 reactor **继承 Spring Boot**,统一 **Spring Cloud Greenwich** 与内部版本属性(如 `cwos-sdk-event` 与 V1 运行包 `lib` 对齐的说明见父 `pom.xml` 注释)。
**技术栈摘要**
- Spring Boot **2.1.x**(与父 POM 声明一致)
- Spring Cloud **Greenwich**`spring-cloud-dependencies` import
- Java **1.8**
**与其它工程关系**
**`maven-cw-elevator-application`**、**`maven-intelligent-cwoscomponent`**、**`maven-ninca-crk`** 等通过 `dependencyManagement` 或直连依赖引用 `cloudwalk-common-event` / `cloudwalk-common-service` 等坐标。
---
### 3.2 `maven-cw-elevator-application` — 电梯 / ACS 通行应用
**定位**
**电梯与门禁派梯相关业务应用**:人员通行规则(含访客 `add/visitor`)、设备、区域/空间 Feign、乘梯记录、MQTT 等。对应运行环境中常部署的 **`elevator-app`** 一类服务;业务走查见 `docs/business/访客注册与派梯楼层业务流程走查.md`
**子模块分层(推荐理解顺序)**
| 子模块 | 典型职责 |
|--------|----------|
| `cw-elevator-application-common` | 公共枚举、常量、工具、跨层 DTO/注解等 |
| `cw-elevator-application-data` | MyBatis 实体、Mapper、DAO 与数据源相关 |
| `cw-elevator-application-service` | 业务实现:`PersonRuleServiceImpl`、设备服务、记录服务等 |
| `cw-elevator-application-web` | Spring MVC 控制器,对外 HTTP API(如 `/elevator/person/add/visitor` |
**技术栈摘要**
- Spring Boot **2.1.x**、Java **1.8**
- MyBatis、分库分表(ShardingSphere 等版本在父 POM 属性中集中管理)
- 依赖 **`cloudwalk-common-*`**、**`intelligent-cwoscomponent-rest`** 等(与智能侧、组织侧集成)
**与运行包、源码归档的关系**
- 父 POM 中属性 **`cw.elevator.v1.lib.dir`**`${project.basedir}/../cw-elevator-application-V1.0.0.20211103/lib`)与 **V1 运行包 `lib` 目录** 对齐,便于 `install-file` 或私服核对。
- **`artifacts/decompiled/trees/cw-elevator-application-*-SNAPSHOT.jar.src`** 为历史解压对照;**日常改代码以 `maven-cw-elevator-application` 下各模块为准**。
---
### 3.3 `maven-intelligent-cwoscomponent` — 智能组件(接口 + REST)
**定位**
**智能操作系统组件(CWOS Component**:对上提供 **REST / Feign Client** 入口,对下通过 **Feign** 调用组织人员、电梯、图库、空间等微服务。在业务文档中常作为「第三方或网关」与 **`cw-elevator-application`** 之间的中转层(例如 `ElevatorPersonService.addVisitor` → Feign → `POST /elevator/person/add/visitor`)。
**子模块说明**
| 子模块 | 职责 |
|--------|------|
| `intelligent-cwoscomponent-parent` | 占位/对齐原多模块父工程坐标(若子模块引用需要) |
| `intelligent-cwoscomponent-interface` | API、参数、结果 DTO、对外 Service 接口定义 |
| `intelligent-cwoscomponent-rest` | 接口实现、Feign 客户端声明、与 Spring Cloud 集成 |
**技术栈摘要**
- Spring Boot **2.1.x**、Spring Cloud **Greenwich**
- 管理 **`cloudwalk-device-sdk-protocol-entity`** 等与设备协议相关的版本(父 POM 注释与 V1 `lib` 对齐)
**与其它工程关系**
- **`maven-cw-elevator-application`** 依赖 **`intelligent-cwoscomponent-rest`**(或同版本构件),形成「智能组件编排 ↔ 电梯落地」的链路。
- **`maven-ninca-crk`** 的 `ninca-crk-gpu-std`**`intelligent-cwoscomponent-rest`** 存在 **exclusion** 等精细依赖控制,说明 CRK 打包场景下需避免重复引入或版本冲突,以实际 **`ninca-crk-gpu-std/pom.xml`** 为准。
---
### 3.4 `maven-ninca-crk` — NINCA CRK 产品线(当前聚合 GPU 标准后端)
**定位**
**NINCA CRK**(门禁、考勤、访客、会议等组合能力)产品族中的 **标准 GPU 出入口后端** 工程 **`ninca-crk-gpu-std`**。子模块描述中体现为轻舟 1.4 体系下的 **标准 GPU 服务器-出入口版**;考勤、访客、门禁等大量 **web 模块以私服版本依赖** 引入,**不在本 reactor 的 `modules` 列表中展开**。
**为何使用 Boot 1.5 + Edgware**
父 POM 说明:为 **贴近原 `spring-boot-maven-plugin` 1.3.x 时代栈**,采用 Spring Boot **1.5.22** 与 Spring Cloud **Edgware**,减少与历史 fat jar 字节码、依赖树差异带来的构建问题。
**技术栈摘要**
- Spring Boot **1.5.x**、Cloud **Edgware**
- Java **1.8**
-**`intelligent-cwoscomponent-rest`**、**`cloudwalk-common-event`** 等版本在父 POM `dependencyManagement` 中锁定
**与其它工程关系**
依赖本仓库整理的 **`intelligent-cwoscomponent-rest`**、**`cloudwalk-common-event`** 等;更多 `ninca-crk-*` 构件从 Nexus 拉取。
---
### 3.5 `maven-ninca-qk-alarm` — 轻舟告警应用(Starter 聚合)
**定位**
**区域告警 / 轻舟告警(qk-alarm)** 可执行应用的 Maven 化聚合:原 **`ninca-qk-alarm-app`** 父 POM 缺失,由本 **`ninca-qk-alarm-reactor`** 补齐 **`dependencyManagement`、插件版本、编码** 等,当前 reactor **直接列出的模块**为 **`ninca-qk-alarm-app-starter`**(可执行 JAR 形态业务的启动与组装入口)。
**子模块 `ninca-qk-alarm-app-starter` 说明**
- 依赖 **`ninca-qk-alarm-app-web`**、**`ninca-qk-alarm-app-interface`** 等同版本子构件,形成完整 Web + 接口层。
- 使用 **Curator + ZooKeeper**(版本在父 POM 统一管理),适用于注册发现或分布式协调类能力(以实际代码为准)。
**技术栈摘要**
- Spring Boot **2.1.x**、Java **1.8**
- MyBatis Spring Boot、Jacoco 等插件在父 POM `pluginManagement` 中声明
**与其它工程关系**
主要依赖 **`cloudwalk-common-web`** 等云从公共 Web 能力;与电梯、智能组件无强绑定,相对 **独立部署单元**
---
### 3.6 `maven-cloudwalk-device-sdk` — 设备 SDK 父 POM(协议实体)
**定位**
私服常缺失 **`cn.cloudwalk:cloudwalk-device-sdk:2.2.0`** 父 `pom`,导致无法解析 **`cloudwalk-device-sdk-protocol-entity`**。本反应堆在本地 **`install`** 后,**`maven-intelligent-cwoscomponent`** 的 **`intelligent-cwoscomponent-interface`** 可正常解析该依赖。
**子模块**
- **`cloudwalk-device-sdk-protocol-entity`**:源码来自 `反1` 反编译 zip,与运行包 **2.2.0** 坐标一致。
---
### 3.7 `maven-cwos-resource` — CWOS 资源 / 门户 / Java SDK
**定位**
补齐 **`cwos-component-resource`**、**`cwos-portal`** 父 POM 及 **`cwos-java-sdk-resource`**,使 **`cw-elevator-application-service`** 不再因私服缺 **`cwos-component-resource:pom`**、**`cwos-portal:pom`** 而失败。
**子模块要点**
- **`cwos-component-resource-data`** / **`cwos-component-resource-interface`**:反编译源码。
- **`cwos-portal-interface`**:为闭合 **`cwos-java-sdk-resource`** 的编译 classpath,已 **裁剪** 非 SDK 所需包,并含 **`cwos-device-pkg-stub`**`DeviceUpgradeResult` 占位)。
- **`cwos-java-sdk-resource`**Feign 注解由 **`org.springframework.cloud.netflix.feign.FeignClient`** 迁移为 **`org.springframework.cloud.openfeign.FeignClient`**,与 **Greenwich + `spring-cloud-starter-openfeign`** 一致;**`ResourceBeanConfig`** 补全缺失的 `import`
---
### 3.8 `maven-cloudwalk-intelligent-davinci-manager` — Davinci 存储父链
**定位**
私服常缺失 **`cn.cloudwalk.intelligent:cloudwalk-intelligent-davinci-manager:1.1.7-SNAPSHOT`** 父 `pom`,导致无法解析 **`davinci-manager-storage`**(电梯 **`cw-elevator-application-service`** 直接依赖)。本反应堆在本地 **`install`** 后,可闭合该父链。
**子模块**
- **`davinci-manager-common`**`DavinciResult``DavinciServiceException` 等。
- **`davinci-manager-storage`**:文件/分片上传 Feign 与 **`FileStorageManager` / `FilePartManager`** 实现;**`io.github.openfeign:feign-okhttp`** 替代原 POM 中的 **`com.netflix.feign:feign-okhttp`**,与 **Spring Cloud Greenwich** 管理的 OpenFeign 一致。
---
### 3.9 `maven-cloudwalk-legacy-public` — 反1 私服公共线(3.7.2 + cwos-sdk-event + lock
**定位**
**`反1/`** 内 **`cloudwalk-common-*-3.7.2-Brussels-SRX.jar.src.zip`**、**`cwos-sdk-event-1.5.0-SNAPSHOT.jar.src.zip`**、**`cloudwalk-intelligent-component-lock-1.1.1-SNAPSHOT.jar.src.zip`** 解压为 Maven 子模块并 **`install`**,闭合 **`cloudwalk.legacy.public.version`**、**`cwos.sdk.event.version`**、**`intelligent.lock.version`** 等横切依赖。
**子模块要点**
- **`cloudwalk-cloud-common`****`3.7.2-Brussels-SRX`** 父 `pom`(继承 **Boot 1.5.22**);与 **`maven-cloudwalk-cloud`** 中 **4.0.0** 的 stub **`cloudwalk-cloud-common`** 为**不同版本**,勿混用。
- **`cloudwalk-common-result`**:在反编译依赖外补 **Spring / Jackson / Joda / SLF4J / validation-api**
- **`cwos-sdk-event`****`reflections-maven`** → **`org.reflections:reflections`****`KafkaConsumer`** 实现 **`Consumer#setListenerClass(Class)`****`EventClient`** 使用 **`commons-lang3.StringUtils`**。
---
### 3.10 `maven-cloudwalk-device-manager` — 设备管理 common / interface2.0.2
**定位**
私服常缺失 **`cn.cloudwalk.cloud:cloudwalk-device-manager:2.0.2`** 父 `pom`,导致无法解析 **`cloudwalk-device-manager-common`**、**`cloudwalk-device-manager-interface`**。本反应堆在本地 **`install`** 后闭合该父链。
**子模块**
- **`cloudwalk-device-manager-common`**、**`cloudwalk-device-manager-interface`**:源码来自 **`反1/`** 下 **`cloudwalk-device-manager-*-2.0.2.jar.src.zip`**。父 POM 将 **`cloudwalk-common-result`** 锁定为 **`3.7.2-Brussels-SRX`**(与 **`maven-cloudwalk-legacy-public`** 一致);**`hibernate-validator`** 与 **Boot 2.1.18** 栈对齐(**6.0.22.Final**)。
**与其它工程关系**
须在 **`maven-cloudwalk-legacy-public`** 成功 **`install`**(提供 **`cloudwalk-common-result:3.7.2`**)之后,再 **`install`** 本反应堆。
---
### 3.11 `maven-cwos-common-aks` / `maven-cwos-device-authentication` — AKS 与设备认证 interface1.0.0-SNAPSHOT
**定位**
**`cw-elevator-application-V1.0.0.20211103/cw_lib`** 中 **`cwos-common-aks-interface`**、**`cwos-device-authentication-interface`** 同名坐标对齐;私服若缺 **`cwos-common-aks`**、**`cwos-device-authentication`** 父 POM,可在本地 **`install`** 闭合。
**子模块**
- **`cwos-common-aks-interface`**、**`cwos-device-authentication-interface`**:源码来自 **`反1/`** 对应 **`*.jar.src.zip`**。
- **device-authentication** 的 **`pom`** 依赖 **`cloudwalk-common-service`**、**`cloudwalk-device-manager-interface`**、**`cwos-common-aks-interface`**、**`cloudwalk-device-sdk-protocol-entity`** 等,编译顺序见 [本地编译说明.md](../build/本地编译说明.md) §3。
---
## 4. 工程间依赖与协作(简图)
下列关系表示 **Maven 依赖 / 常见运行时调用方向**,非严格部署拓扑。
```mermaid
flowchart LR
subgraph devsdk [maven-cloudwalk-device-sdk]
PE[protocol-entity]
end
subgraph cwos [maven-cwos-resource]
SDK[cwos-java-sdk-resource]
end
subgraph davinci [maven-cloudwalk-intelligent-davinci-manager]
DMS[davinci-manager-storage]
end
subgraph cloud [maven-cloudwalk-cloud]
CE[cloudwalk-common-event]
CS[cloudwalk-common-service]
end
subgraph intel [maven-intelligent-cwoscomponent]
II[intelligent-cwoscomponent-interface]
IR[intelligent-cwoscomponent-rest]
end
subgraph elev [maven-cw-elevator-application]
EW[cw-elevator-application-web]
ES[cw-elevator-application-service]
end
subgraph crk [maven-ninca-crk]
GPU[ninca-crk-gpu-std]
end
subgraph alarm [maven-ninca-qk-alarm]
ST[ninca-qk-alarm-app-starter]
end
PE --> II
II --> IR
SDK --> ES
DMS --> ES
CE --> ES
CS --> ES
IR --> ES
ES --> EW
CE --> GPU
IR -.->|可能被 exclusion| GPU
CS --> ST
```
**文字归纳**
- **`maven-cloudwalk-device-sdk`** 为 **`intelligent-cwoscomponent-interface`** 提供 **`cloudwalk-device-sdk-protocol-entity`****`maven-cwos-resource`** 为 **`cw-elevator-application-service`** 提供 **`cwos-java-sdk-resource`**(及 portal/resource 父链);**`maven-cloudwalk-intelligent-davinci-manager`** 为 **`cw-elevator-application-service`** 提供 **`davinci-manager-storage`** 父链;**`maven-cloudwalk-legacy-public`** 为 **`cloudwalk-common-event`**、电梯 **common**、**`cwos-resource`** 等提供 **`cloudwalk-common-result`/`web`/`serial`3.7.2**、**`cwos-sdk-event`**、**`component-lock`****`maven-cloudwalk-device-manager`** 提供 **`cloudwalk-device-manager:2.0.2`** 及 **common/interface**(依赖前述 **`cloudwalk-common-result:3.7.2`**);**`maven-cwos-common-aks`**、**`maven-cwos-device-authentication`** 与 **`cw_lib`** 中 AKS / 设备认证 **interface** 坐标对齐(详见 §3.11)。前序 **`install`** 顺序见 [本地编译说明.md](../build/本地编译说明.md) §3。
- **电梯应用** 依赖 **公共云模块** + **智能组件 REST**,对外暴露电梯 HTTP API;智能组件再通过 Feign 回调电梯、组织等。
- **CRK GPU 标准后端** 依赖公共事件、智能组件等,与考勤/访客等 **NINCA 模块** 打成一个可部署单元(具体以 `ninca-crk-gpu-std/pom.xml` 为准)。
- **告警应用** 相对独立,主要挂 **CloudWalk Web 公共栈**
---
## 5. 源码目录、`artifacts`、运行包三者的分工
| 位置 | 性质 | 建议使用方式 |
|------|------|----------------|
| **`maven-*/*/src/main/java`** | 已整理为 Maven 标准目录的 **主修改区** | 日常开发、编译、`mvn validate/package` |
| **`artifacts/decompiled/trees/*.jar.src`** | 由 JAR 还原的 **解压树归档**(对照用) | 查历史包内资源、与 `META-INF/maven` 对照版本 |
| **`artifacts/decompiled/archives/*.jar.src.zip`** | 未解压的 **zip 备份** | 备份、交付留档 |
| **`cw-elevator-application-V1.0.0.20211103/`** | **V1 运行包展开**(含 `lib/` | 对齐线上依赖列表;`docs/operations/deploy_cw_elevator_v1_lib_to_nexus.py` 默认读取其 `lib` |
详见 [artifacts/decompiled/README.md](../../artifacts/decompiled/README.md)。
---
## 6. 构建与环境(延伸阅读)
- **JDK 版本依据**[ORIGINAL_BUILD_JDK.txt](../build/ORIGINAL_BUILD_JDK.txt)
- **各父 POM** 中 **`maven-enforcer-plugin`** 要求使用 JDK 8 范围,与上述依据一致。
- **代码风格**`docs/style/alibaba-eclipse-codestyle.xml`,各聚合工程通过属性 **`alibaba.eclipse.codestyle.path`** 引用。
- **私服与上传脚本**`docs/operations/deploy_cw_elevator_v1_lib_to_nexus.py`Nexus 地址见各父 POM 中 `nexus.baseUrl` 注释。
---
## 7. 文档维护
- 若新增其它 `maven-*` 反应堆,请在本表与各节补充 **目录、artifactId、modules、与其它工程的依赖边**,并更新 [Maven工作区子工程版本一览](Maven工作区子工程版本一览.md) 与 [本地编译说明.md](../build/本地编译说明.md) §3。
- 若 Spring Boot / Cloud 版本升级,请以各 **`maven-*/pom.xml`** 为准同步更新本文「技术栈摘要」小节。
@@ -0,0 +1,51 @@
# V1 / V2 电梯应用 API 调用链源码比对白名单
本文约定:**每次发布或横向对拍异常排查**时,优先仅对下列文件做 V1 与 V2 的语义级 diff,避免整仓反编译树与 Maven 源码的「格式噪声」干扰判断。
## 用途
- 核对「HTTP 入口 → Service → Feign/DAO」是否与历史 V1 行为一致。
-`maven-cw-elevator-application/tools/elevator_api_parity/` 对拍清单互补:白名单覆盖曾出现 **code_only 不一致** 的典型链路。
## 比对基线(仓库内路径)
| 侧 | 根路径 |
|----|--------|
| **V2Maven 源码)** | `maven-cw-elevator-application/cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/`web<br>`maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/`service |
| **V1(反编译树,与 1.0-SNAPSHOT 模块 JAR 对齐)** | `artifacts/decompiled/trees/cw-elevator-application-web-1.0-SNAPSHOT.jar.src/cn/cloudwalk/elevator/`web<br>`artifacts/decompiled/trees/cw-elevator-application-service-1.0-SNAPSHOT.jar.src/cn/cloudwalk/elevator/`service |
若线网 V1 为 **另一 fat-jar**,应先确认其反编译树或 CFR 输出与上表 V1 根是否同源,再执行比对。
## 白名单(相对上述「根」的类路径)
| 优先级 | 相对路径 | 说明 |
|--------|----------|------|
| P0 | `person/controller/AcsPersonController.java` | `person/add``person/edit``person/pageByApp``timeDetail` 等 |
| P0 | `record/controller/AcsElevatorRecordController.java` | `record/page``analyse/cycle|count``page/request` |
| P0 | `passrule/controller/AcsPassRuleController.java` | `passRule/add` 等规则入口 |
| P0 | `person/impl/PersonRuleServiceImpl.java` | `person/add` 业务链、`76260527` 空设备等 |
| P0 | `person/impl/AcsPersonServiceImpl.java` | `edit``pageByApp``timeDetail`、图库/设备 Feign 组装 |
| P0 | `record/impl/AcsElevatorRecordServiceImpl.java` | `openRecord``analyseCycle``analyseCount``pageInfo` |
| P1 | `passrule/impl/AcsPassRuleServiceImpl.java` | 规则新增/编辑主流程 |
| P1 | `passrule/impl/ImageRuleRefServiceImpl.java` | `addOnlyRule` 等与 `76260527` 相关分支 |
| P1 | `common/AbstractCloudwalkController.java` | `getCloudwalkContext()` 等与请求头/会话相关 |
按需扩展时,应先在 `api_catalog.json` 或走查清单中标注接口 id,再增补对应 Controller/Service**避免无界扫 diff**。
## 建议命令(忽略空白,便于看语义)
在仓库根目录执行,示例(web 单文件):
```bash
diff -uw \
artifacts/decompiled/trees/cw-elevator-application-web-1.0-SNAPSHOT.jar.src/cn/cloudwalk/elevator/person/controller/AcsPersonController.java \
maven-cw-elevator-application/cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/person/controller/AcsPersonController.java
```
`service` 模块将两条根路径中的 `...-web-...` / `cw-elevator-application-web` 换成 `...-service-...` / `cw-elevator-application-service` 即可。
## 相关文档
- V1/V2 依赖比对(`lib`/`cw_lib` 与反应堆坐标):`V1-V2-电梯依赖比对.md`
- 对拍约定与清单说明:`../../maven-cw-elevator-application/tools/elevator_api_parity/API-RECONCILIATION.md`
- 走查任务总览:`对外接口不变-走查任务与状态.md`
@@ -0,0 +1,169 @@
# V1 与 V2 电梯应用依赖:详细比对说明
本文说明 **V1 历史运行包****V2 Maven 反应堆** 在依赖上的对应关系、已核对的一致项、已知差异与后续可执行动作。比对以仓库内 `**cw-elevator-application-V1.0.0.20211103`** 为 V1 基线。
---
## 1. V1 运行包 classpath 结构(与 V2 可执行 JAR 的对应)
| 位置 | 路径 | 数量 | 含义 |
| -------------------- | ------------------------------------------------------ | ------- | --------------------------------------------------------------------------------- |
| **第三方与 Spring 栈** | `cw-elevator-application-V1.0.0.20211103/lib/*.jar` | **245** | 与 Boot 1.5、Spring Cloud、MyBatis、Netty、Feign 等一致;文件名即 **artifactId-version** 形态为主。 |
| **云从 + 电梯模块 + 智能组件** | `cw-elevator-application-V1.0.0.20211103/cw_lib/*.jar` | **24** | 与 V2 `pom.xml`**显式声明版本** 的坐标对齐;电梯四模块以 **1.0-SNAPSHOT** JAR 形式落盘。 |
V2 可执行包由 `spring-boot-maven-plugin` repackage 后,上述两类依赖会进入 `**BOOT-INF/lib/`**;概念上 **V2 ≈ cw_lib lib 的传递闭包**,但 **具体 JAR 列表以 Maven 解析结果为准**
**完整文件名清单(机器可读)**
- `docs/architecture/data/v1-elevator-lib-jars.txt`245 行)
- `docs/architecture/data/v1-elevator-cw-lib-jars.txt`24 行)
---
## 2. `cw_lib`24)与 V2 反应堆版本:逐项一致
下列 JAR 在 V1 `cw_lib` 中的 **文件名** 与 V2 `maven-cw-elevator-application/pom.xml``<properties>` / `dependencyManagement` **一致**(脚本已自动核对):
| # | V1 `cw_lib` 文件名 | V2 约束来源 |
| --- | --------------------------------------------------------- | ----------------------------------------------------------------------------- |
| 1 | `cloudwalk-common-event-3.7.2-Brussels-SRX.jar` | `cloudwalk.internal.version` |
| 2 | `cloudwalk-common-result-3.7.2-Brussels-SRX.jar` | `cloudwalk.legacy.public.version` |
| 3 | `cloudwalk-common-serial-3.7.2-Brussels-SRX.jar` | `cloudwalk.legacy.public.version` |
| 4 | `cloudwalk-common-service-3.7.2-Brussels-SRX.jar` | `cloudwalk.internal.version` |
| 5 | `cloudwalk-common-web-3.7.2-Brussels-SRX.jar` | `cloudwalk.legacy.public.version` |
| 6 | `cloudwalk-device-manager-common-2.0.2.jar` | V1 随包固定;V2 由 `**intelligent-cwoscomponent-rest`** 等传递引入(反应堆未单独 pin 版本,以解析树为准) |
| 7 | `cloudwalk-device-manager-interface-2.0.2.jar` | 同上 |
| 8 | `cloudwalk-device-sdk-protocol-entity-2.2.0.jar` | 同上 |
| 9 | `cloudwalk-intelligent-component-lock-1.1.1-SNAPSHOT.jar` | `intelligent.lock.version` |
| 10 | `cw-elevator-application-common-1.0-SNAPSHOT.jar` | V2`cn.cloudwalk.elevator:cw-elevator-application-common:**2.0-SNAPSHOT`** |
| 11 | `cw-elevator-application-data-1.0-SNAPSHOT.jar` | V2`…-data:**2.0-SNAPSHOT`** |
| 12 | `cw-elevator-application-service-1.0-SNAPSHOT.jar` | V2`…-service:**2.0-SNAPSHOT**` |
| 13 | `cw-elevator-application-web-1.0-SNAPSHOT.jar` | V2`…-web:**2.0-SNAPSHOT**` |
| 14 | `cwos-common-aks-interface-1.0.0-SNAPSHOT.jar` | V1 随包;V2 若未在反应堆显式声明则来自传递依赖 |
| 15 | `cwos-component-resource-data-1.0.0-SNAPSHOT.jar` | 同上 |
| 16 | `cwos-component-resource-interface-1.0.0-SNAPSHOT.jar` | 同上 |
| 17 | `cwos-device-authentication-interface-1.0.0-SNAPSHOT.jar` | 同上 |
| 18 | `cwos-java-sdk-resource-1.0.0-SNAPSHOT.jar` | `cwos.sdk.resource.version` |
| 19 | `cwos-portal-interface-1.0.0-SNAPSHOT.jar` | V1 随包;V2 传递 |
| 20 | `cwos-sdk-event-1.5.0-SNAPSHOT.jar` | `cwos.sdk.event.version` |
| 21 | `davinci-manager-common-1.1.7-SNAPSHOT.jar` | 与 `davinci-manager-storage` 同族 |
| 22 | `davinci-manager-storage-1.1.7-SNAPSHOT.jar` | `davinci.manager.storage.version` |
| 23 | `intelligent-cwoscomponent-interface-2.9.2-xinghewan.jar` | `intelligent.cwoscomponent.version` |
| 24 | `intelligent-cwoscomponent-rest-2.9.2-xinghewan.jar` | `intelligent.cwoscomponent.version` |
**结论(云从/智能主干)**:与对拍、校验切面相关的 `**cloudwalk-common-*` 3.7.2-Brussels-SRX** 与 `**intelligent-cwoscomponent-*` 2.9.2-xinghewan** 等,**V1 cw_lib 与 V2 POM 显式口径一致**;对拍行为差异 **不宜** 首先归因于「cloudwalk 主版本不一致」。
**电梯自研模块**V1 为 **1.0-SNAPSHOT** 四 JARV2 反应堆为 **2.0-SNAPSHOT** —— 属 **预期版本升级**,需用源码白名单比对(见 `V1-V2-电梯API源码比对白名单.md`),而非依赖坐标「偷偷不一致」。
---
## 3. V1 `lib`245)与 V2 `dependencyManagement`:显式对齐项
V2 反应堆在 `<properties>`**主动钉死**、且与 V1 `lib`**常见文件名** 对齐的第三方包括(节选):
| 属性 | 值 | V1 `lib` 中典型 JAR |
| ------------------------------------------------------- | --------------- | --------------------------------------------- |
| `fastjson.version` | 1.2.73 | `fastjson-1.2.73.jar` |
| `guava.version` | 20.0 | `guava-20.0.jar` |
| `poi.version` | 3.15 | `poi-3.15.jar``poi-ooxml-3.15.jar` |
| `ant.version` | 1.9.6 | 见下节「多版本」 |
| `mybatis-spring-boot.version` | 1.3.1 | `mybatis-spring-boot-starter-1.3.1.jar` |
| `pagehelper.version` / `pagehelper-spring-boot.version` | 5.1.2 / 1.2.5 | `pagehelper-5.1.2.jar` 等 |
| `shardingsphere.version` | 4.0.0 | `sharding-jdbc-spring-boot-starter-4.0.0.jar` |
| `spring-cloud.version` | **Edgware.SR6** | 见下节 |
**Spring Boot**V2 父 POM 为 `**spring-boot-starter-parent` 1.5.17.RELEASE**V1 `lib` 中可见 `**spring-boot-*-1.5.17.RELEASE.jar`**,主版本一致。
---
## 4. V1 `lib` 中的「多版本并存」风险(V2 由 BOM 收敛)
`lib` 内文件名做 **artifact 前缀聚合** 后,典型 **多版本** 包括:
| 前缀 | 并存版本(示例) | 说明 |
| ------------ | --------------- | ------------------------------------------------------------------- |
| `feign-core` | 8.18.0 与 9.5.0 | 历史传递与 Netflix/OpenFeign 栈叠加;**实际生效顺序依赖 fat JAR Class-Path / 装载顺序**。 |
| `ant` | 1.6.5 与 1.9.6 等 | V2 反应堆仅钉 `**ant.version` = 1.9.6**V1 物理目录仍含旧 ant。 |
| `rxjava` | 1.x 与 2.x | 常见于 Netflix + 其它客户端并存。 |
V2 由 `**spring-boot-dependencies` + `spring-cloud-dependencies`Edgware.SR6** 统一解析,**理论上** 比「手工铺 245 个 jar」更可重复;若需 **字节级** 证明与 V1 运行时一致,应在 **同一 JDK** 下导出 `**mvn dependency:tree`** 与 V1 进程 `**jcmd <pid> VM.classloader_hierarchy`** / 或解压 fat JAR 的 `BOOT-INF/lib` 做集合 diff。
---
## 5. V2 反应堆「直接依赖」模块一览(非传递闭包)
| 模块 | 直接引入的典型坐标(无版本处由 `dependencyManagement` 解析) |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `cw-elevator-application-starter` | `spring-boot-starter-web`、MyBatis、Actuator、Cache、AOP、OpenFeign、`cw-elevator-application-web` |
| `cw-elevator-application-web` | `cloudwalk-common-web``cw-elevator-application-service` |
| `cw-elevator-application-service` | `cloudwalk-common-service``spring-tx``cloudwalk-common-serial``cwos-java-sdk-resource``jackson-datatype-jsr310``cloudwalk-intelligent-component-lock``cloudwalk-common-event``cwos-sdk-event``cw-elevator-application-data``davinci-manager-storage``intelligent-cwoscomponent-rest``spring-cloud-starter-openfeign``javax.annotation-api``jsr305` |
| `cw-elevator-application-common` | `cloudwalk-common-result`、Guava、POI、Ant、thumbnailator、`commons-io`、fastjson、`tomcat-embed-core``cloudwalk-common-web``spring-boot-autoconfigure``commons-lang3`、ZXing、zip4j、`spring-web``spring-data-redis`、lombok、`jackson-datatype-jsr310` |
| `cw-elevator-application-data` | `cw-elevator-application-common``cloudwalk-common-result``spring-beans`/`context`、MyBatis、mysql、`mybatis-spring-boot-starter`、HikariCP、pagehelper、shardingsphere |
**与 V1 的差异点**V2 `**cw-elevator-application-common`** 显式增加 `**spring-boot-autoconfigure`**(见模块内注释:私服上 `cloudwalk-common-web` 传递不完整时的 **编译 classpath 补齐**)。V1 若完全依赖传递,**编译期/工具链** 与 V2 可能略有不同,但 **运行时** 通常仍由 Boot 引入同一类库。
---
## 5.1 反应堆子模块报「在 nexus-public 找不到 sibling SNAPSHOT」
**现象**`data``cw-elevator-application-common``web``service` 等,日志只出现 `Downloading from nexus-public: .../elevator/...`
**原因**:全局 `~/.m2/settings.xml``**mirrorOf=*`**(或等价过宽)时,Maven 易把 **本反应堆未发布到私服的 SNAPSHOT** 也导向 Nexus,导致失败。**不需要**为此逐个 `deploy` 电梯子模块到私服。
**本仓库已落盘**`maven-cw-elevator-application/.mvn/maven.config` + `.mvn/settings.xml`:用 `-s` **绕过** `~/.m2`profile 激活 `**nexus-public`http**;并含 一条 `id=maven-default-http-blocker``mirrorOf=dummy` 的占位 `<mirror>`,用于覆盖 Maven 3.8.1+ 安装目录里对 `**external:http:*`** 的默认拦截(否则会出现 `Blocked mirror for repositories: [nexus-public (...http...)]`)。**不是** `mirrorOf=*`,不会把反应堆 sibling 整体导向私服。私服若需账号,请在 `.mvn/settings.xml` 内补 `<servers>`(勿提交密钥)。若 Nexus 已支持 **HTTPS**,更推荐改仓库 URL 为 `https://` 并删除该占位 mirror。
**隔离构建**`./scripts/build_nexus_only.sh` 会额外 `purge` `**cn/cloudwalk/elevator`** 下 `*.lastUpdated`,并在使用 `clean install` 时把 sibling 写入隔离库。
---
## 6. 生成「V2 全量传递依赖树」与与 V1 的集合 diff(推荐下一步)
当前环境若 **无法安装反应堆子模块****无法访问 Nexus**,则无法在 CI 外自动生成 **V2 完整 245+ 级传递树**。请在 **可解析依赖** 的环境、于 `**maven-cw-elevator-application` 根**执行(**自动使用 `.mvn/settings.xml`**;与 `build_nexus_only.sh` 对齐隔离库时可加 `-Dmaven.repo.local=$PWD/.m2-elevator-nexus-only`):
```bash
cd maven-cw-elevator-application
mvn -pl cw-elevator-application-starter -am -DskipTests clean install
mvn -pl cw-elevator-application-starter -am -DskipTests dependency:tree \
-DoutputFile=cw-elevator-application-starter/target/v2-starter-dependency-tree.txt
```
然后将 `**target/v2-starter-dependency-tree.txt**` 中的 `groupId:artifactId:jar:version``**docs/architecture/data/v1-elevator-lib-jars.txt**` 做集合差集(仅 artifactId-version 对齐即可),即可得到 **「V2 有而 V1 lib 无」** 与 **「V1 lib 有而 V2 未解析到」** 的完整列表。
---
## 7. 自动化脚本(可重复输出摘要)
仓库根目录执行:
```bash
python3 scripts/compare_v1_v2_elevator_dependencies.py
```
将打印:`cw_lib` 与 V2 属性对齐核对、V1 `lib` 多版本示例、以及生成 `dependency:tree` 的 Maven 命令提示。
---
## 8. 总括结论(供评估「下一步计划」)
1. **云从公共件 + intelligent 2.9.2 + davinci/cwos 等与对拍强相关的坐标**V1 `cw_lib` 与 V2 `pom.xml` **已对齐**
2. **电梯四模块**V1 **1.0-SNAPSHOT** JAR vs V2 **2.0-SNAPSHOT** 源码 —— **预期差异**,行为差应结合 **源码白名单 diff + 运行时** 看。
3. **245 个第三方 JAR**V2 由 **Boot 1.5.17 + Cloud Edgware.SR6 BOM** 收敛;V1 物理目录存在 **Feign/Ant/RxJava 多版本**,**与「仅业务源码不同」假设不完全相容** —— 若要对齐到「与 V1 进程 classpath 完全一致」,需 **依赖树 diff**,不能只盯 `cw_lib`
4. **下一步建议优先级**:① 在 CI 生成并归档 `**dependency:tree`**;② 与 `v1-elevator-lib-jars.txt`**差集报告**;③ 对差集中 **多版本冲突** 项做 **运行时类加载验证**(仅静态比对不足以解释偶发 NPE/空响应)。
---
## 相关文档
- API 调用链源码比对白名单:`V1-V2-电梯API源码比对白名单.md`
- 对拍与根因说明:`../../maven-cw-elevator-application/tools/elevator_api_parity/API-RECONCILIATION.md`
@@ -0,0 +1,24 @@
cloudwalk-common-event-3.7.2-Brussels-SRX.jar
cloudwalk-common-result-3.7.2-Brussels-SRX.jar
cloudwalk-common-serial-3.7.2-Brussels-SRX.jar
cloudwalk-common-service-3.7.2-Brussels-SRX.jar
cloudwalk-common-web-3.7.2-Brussels-SRX.jar
cloudwalk-device-manager-common-2.0.2.jar
cloudwalk-device-manager-interface-2.0.2.jar
cloudwalk-device-sdk-protocol-entity-2.2.0.jar
cloudwalk-intelligent-component-lock-1.1.1-SNAPSHOT.jar
cw-elevator-application-common-1.0-SNAPSHOT.jar
cw-elevator-application-data-1.0-SNAPSHOT.jar
cw-elevator-application-service-1.0-SNAPSHOT.jar
cw-elevator-application-web-1.0-SNAPSHOT.jar
cwos-common-aks-interface-1.0.0-SNAPSHOT.jar
cwos-component-resource-data-1.0.0-SNAPSHOT.jar
cwos-component-resource-interface-1.0.0-SNAPSHOT.jar
cwos-device-authentication-interface-1.0.0-SNAPSHOT.jar
cwos-java-sdk-resource-1.0.0-SNAPSHOT.jar
cwos-portal-interface-1.0.0-SNAPSHOT.jar
cwos-sdk-event-1.5.0-SNAPSHOT.jar
davinci-manager-common-1.1.7-SNAPSHOT.jar
davinci-manager-storage-1.1.7-SNAPSHOT.jar
intelligent-cwoscomponent-interface-2.9.2-xinghewan.jar
intelligent-cwoscomponent-rest-2.9.2-xinghewan.jar
@@ -0,0 +1,245 @@
activation-1.1.jar
aliyun-java-sdk-core-3.2.8.jar
aliyun-java-sdk-dysmsapi-1.1.0.jar
animal-sniffer-annotation-1.0.jar
annotations-2.0.0.jar
ant-1.6.5.jar
ant-1.9.6.jar
ant-apache-bsf-1.9.4.jar
ant-jakarta-oro-1.6.1.jar
ant-launcher-1.9.6.jar
antlr4-runtime-4.7.2.jar
ant-nodeps-1.8.1.jar
archaius-core-0.6.6.jar
asm-5.0.3.jar
asm-analysis-5.0.3.jar
asm-tree-5.0.3.jar
asm-util-5.0.3.jar
aspectjweaver-1.8.13.jar
bcpkix-jdk15on-1.55.jar
bcprov-jdk15on-1.55.jar
bsf-2.4.0.jar
byte-buddy-1.9.6.jar
cache-api-1.0.0.jar
classmate-1.3.4.jar
classworlds-1.1-alpha-2.jar
commons-codec-1.10.jar
commons-collections-3.2.2.jar
commons-collections4-4.1.jar
commons-compress-1.9.jar
commons-configuration-1.8.jar
commons-fileupload-1.3.1.jar
commons-io-2.5.jar
commons-lang-2.6.jar
commons-lang3-3.5.jar
commons-logging-1.2.jar
commons-pool2-2.4.3.jar
consul-api-1.3.0.jar
core-3.3.3.jar
curvesapi-1.04.jar
d3js-3.4.11.jar
dom4j-1.6.1.jar
ehcache-2.10.5.jar
encrypt-core-merge-4.0.0.jar
encrypt-core-rewrite-4.0.0.jar
fastjson-1.2.73.jar
feign-core-8.18.0.jar
feign-core-9.5.0.jar
feign-form-3.0.3.jar
feign-form-spring-3.0.3.jar
feign-hystrix-9.5.0.jar
feign-okhttp-8.18.0.jar
feign-slf4j-9.5.0.jar
freemarker-2.3.28.jar
fst-2.56.jar
groovy-2.4.5-indy.jar
gson-2.8.5.jar
guava-20.0.jar
hamcrest-core-1.3.jar
HdrHistogram-2.1.9.jar
hibernate-validator-5.3.6.Final.jar
HikariCP-2.5.1.jar
httpclient-4.5.6.jar
httpcore-4.4.10.jar
hystrix-core-1.5.12.jar
hystrix-javanica-1.5.12.jar
hystrix-metrics-event-stream-1.5.12.jar
hystrix-serialization-1.5.12.jar
jackson-annotations-2.11.2.jar
jackson-core-2.11.2.jar
jackson-databind-2.11.2.jar
jackson-dataformat-yaml-2.11.2.jar
jackson-datatype-jsr310-2.11.2.jar
jackson-module-afterburner-2.11.2.jar
jade-plugin-common-1.3.8.jar
javassist-3.21.0-GA.jar
javax.inject-1.jar
jboss-logging-3.3.2.Final.jar
jcl-over-slf4j-1.7.25.jar
jdom-1.1.2.jar
jedis-2.9.0.jar
jersey-apache-client4-1.19.1.jar
jersey-client-1.19.1.jar
jersey-core-1.19.1.jar
joda-time-2.9.9.jar
jodd-bean-3.7.1.jar
jodd-core-3.7.1.jar
jquery-2.1.1.jar
jsoup-1.9.2.jar
jsqlparser-1.2.jar
jsr311-api-1.1.1.jar
jul-to-slf4j-1.7.25.jar
junit-4.12.jar
kafka-clients-2.3.0.jar
log4j-over-slf4j-1.7.25.jar
logback-classic-1.1.11.jar
logback-core-1.1.11.jar
lombok-1.16.18.jar
lz4-java-1.6.0.jar
mail-1.4.4.jar
maven-artifact-2.0.5.jar
maven-artifact-manager-2.0.5.jar
maven-model-2.0.5.jar
maven-plugin-anno-1.4.1.jar
maven-plugin-api-2.0.5.jar
maven-profile-2.0.5.jar
maven-project-2.0.5.jar
maven-repository-metadata-2.0.5.jar
maven-settings-2.0.5.jar
mybatis-3.4.6.jar
mybatis-spring-1.3.2.jar
mybatis-spring-boot-autoconfigure-1.3.1.jar
mybatis-spring-boot-starter-1.3.1.jar
mysql-connector-java-5.1.47.jar
netflix-commons-util-0.1.1.jar
netflix-statistics-0.1.1.jar
netty-buffer-4.1.33.Final.jar
netty-codec-4.1.33.Final.jar
netty-codec-dns-4.1.33.Final.jar
netty-common-4.1.33.Final.jar
netty-handler-4.1.33.Final.jar
netty-resolver-4.1.33.Final.jar
netty-resolver-dns-4.1.33.Final.jar
netty-transport-4.1.33.Final.jar
objenesis-2.1.jar
okhttp-3.2.0.jar
okio-1.6.0.jar
opencsv-2.3.jar
pagehelper-5.1.2.jar
pagehelper-spring-boot-autoconfigure-1.2.5.jar
parboiled-core-1.1.7.jar
parboiled-java-1.1.7.jar
pegdown-1.6.0.jar
plexus-container-default-1.0-alpha-9.jar
plexus-utils-1.1.jar
poi-3.15.jar
poi-ooxml-3.15.jar
poi-ooxml-schemas-3.15.jar
reactive-streams-1.0.2.jar
reactor-core-2.0.8.RELEASE.jar
reactor-stream-2.0.8.RELEASE.jar
redisson-2.15.2.jar
redisson-spring-boot-starter-2.15.2.jar
redisson-spring-data-18-2.15.2.jar
reflections-0.9.9-RC2.jar
reflections-maven-0.9.9-RC2.jar
ribbon-2.2.5.jar
ribbon-core-2.2.5.jar
ribbon-httpclient-2.2.5.jar
ribbon-loadbalancer-2.2.5.jar
ribbon-transport-2.2.5.jar
rxjava-1.2.0.jar
rxjava-2.1.13.jar
rxnetty-0.4.9.jar
rxnetty-contexts-0.4.9.jar
rxnetty-servo-0.4.9.jar
servo-core-0.10.1.jar
servo-internal-0.10.1.jar
sharding-core-api-4.0.0.jar
sharding-core-common-4.0.0.jar
sharding-core-entry-4.0.0.jar
sharding-core-execute-4.0.0.jar
sharding-core-merge-4.0.0.jar
sharding-core-rewrite-4.0.0.jar
sharding-core-route-4.0.0.jar
sharding-jdbc-core-4.0.0.jar
sharding-jdbc-spring-boot-starter-4.0.0.jar
shardingsphere-execute-4.0.0.jar
shardingsphere-merge-4.0.0.jar
shardingsphere-rewrite-engine-4.0.0.jar
shardingsphere-spi-4.0.0.jar
shardingsphere-sql-parser-engine-4.0.0.jar
shardingsphere-sql-parser-mysql-4.0.0.jar
shardingsphere-sql-parser-oracle-4.0.0.jar
shardingsphere-sql-parser-postgresql-4.0.0.jar
shardingsphere-sql-parser-relation-4.0.0.jar
shardingsphere-sql-parser-spi-4.0.0.jar
shardingsphere-sql-parser-sql92-4.0.0.jar
shardingsphere-sql-parser-sqlserver-4.0.0.jar
sharding-spring-boot-util-4.0.0.jar
sharding-transaction-core-4.0.0.jar
slf4j-api-1.7.25.jar
snakeyaml-1.17.jar
snappy-java-1.1.7.3.jar
spring-aop-4.3.29.RELEASE.jar
spring-aspects-4.3.29.RELEASE.jar
spring-beans-4.3.29.RELEASE.jar
spring-boot-1.5.17.RELEASE.jar
spring-boot-actuator-1.5.17.RELEASE.jar
spring-boot-autoconfigure-1.5.17.RELEASE.jar
spring-boot-starter-1.5.17.RELEASE.jar
spring-boot-starter-actuator-1.5.17.RELEASE.jar
spring-boot-starter-aop-1.5.17.RELEASE.jar
spring-boot-starter-cache-1.5.17.RELEASE.jar
spring-boot-starter-data-redis-1.5.17.RELEASE.jar
spring-boot-starter-freemarker-1.5.17.RELEASE.jar
spring-boot-starter-jdbc-1.5.17.RELEASE.jar
spring-boot-starter-logging-1.5.17.RELEASE.jar
spring-boot-starter-tomcat-1.5.17.RELEASE.jar
spring-boot-starter-web-1.5.17.RELEASE.jar
spring-cloud-commons-1.3.5.RELEASE.jar
spring-cloud-consul-core-1.3.5.RELEASE.jar
spring-cloud-consul-discovery-1.3.5.RELEASE.jar
spring-cloud-context-1.3.5.RELEASE.jar
spring-cloud-netflix-core-1.4.6.RELEASE.jar
spring-cloud-netflix-hystrix-dashboard-1.4.6.RELEASE.jar
spring-cloud-starter-1.3.5.RELEASE.jar
spring-cloud-starter-consul-1.3.5.RELEASE.jar
spring-cloud-starter-consul-discovery-1.3.5.RELEASE.jar
spring-cloud-starter-netflix-archaius-1.4.6.RELEASE.jar
spring-cloud-starter-netflix-hystrix-1.4.6.RELEASE.jar
spring-cloud-starter-netflix-hystrix-dashboard-1.4.6.RELEASE.jar
spring-cloud-starter-netflix-ribbon-1.4.6.RELEASE.jar
spring-cloud-starter-openfeign-1.4.6.RELEASE.jar
spring-cloud-starter-ribbon-1.4.6.RELEASE.jar
spring-context-4.3.29.RELEASE.jar
spring-context-support-4.3.29.RELEASE.jar
spring-core-4.3.29.RELEASE.jar
spring-data-commons-1.13.16.RELEASE.jar
spring-data-keyvalue-1.2.16.RELEASE.jar
spring-data-redis-1.8.16.RELEASE.jar
spring-expression-4.3.29.RELEASE.jar
spring-jdbc-4.3.29.RELEASE.jar
spring-oxm-4.3.29.RELEASE.jar
spring-security-crypto-4.2.9.RELEASE.jar
spring-security-rsa-1.0.3.RELEASE.jar
springside-core-4.2.3-GA.jar
spring-tx-4.3.29.RELEASE.jar
spring-web-4.3.29.RELEASE.jar
spring-webmvc-4.3.29.RELEASE.jar
stax-api-1.0.1.jar
thumbnailator-0.4.8.jar
tomcat-annotations-api-8.5.34.jar
tomcat-embed-core-8.5.34.jar
tomcat-embed-el-8.5.34.jar
tomcat-embed-websocket-8.5.34.jar
tomcat-jdbc-8.5.34.jar
tomcat-juli-8.5.34.jar
validation-api-1.1.0.Final.jar
wagon-provider-api-1.0-beta-2.jar
xml-apis-1.4.01.jar
xmlbeans-2.6.0.jar
xpp3-1.1.3.4-RC8.jar
xstream-1.1.3.jar
zip4j-2.6.2.jar
zstd-jni-1.4.0-1.jar
@@ -0,0 +1,227 @@
# 对外接口不变:走查任务与状态
> **依据**:[对外接口不变-远程调用与性能优化约定](对外接口不变-远程调用与性能优化约定.md)(§2 总原则、§3 场景、§4 优先级)。
> **走查代码根**`maven-cw-elevator-application/cw-elevator-application-service`2026-04-24 静态走查)。
> **说明**:下表「子任务数」指**与约定相关的 RPC/可优化循环次数上界**(随运行时数据规模变化);**状态**表示在**不扩展 Feign/HTTP 契约**前提下是否建议动代码。
> **排期(2026-04**`frontend/` 暂无可用前端工程;**凡需改前端、登记页、物业管理端 UI 的迭代,暂跳过**(详见 [docs/README 当前排期与范围](../README.md#当前排期与范围2026-04))。本文档仅跟踪**电梯等服务端**在约定下的走查与修正。
---
## 1. 总览表(子任务量 + 可修正 / 不可修正)
| 约定 § | 代码锚点 | 子任务数(上界) | 下一可修正动作(建议顺序) | 不可修正或须前置确认 |
|--------|----------|------------------|----------------------------|------------------------|
| **§3.1** | `ImageRuleRefServiceImpl#delete`(约 575598 行) | **`N = param.getIds().size()`** 次 `updateGroupPersonRef`(每规则删后各 1 次) | **P0**:全部 `deleteById` 完成后,对本轮涉及的 `labelIds``organizationIds` **去重并集**,调用 **1 次** `updateGroupPersonRef`;为每次 RPC 增加 **`isSuccess` 校验**(与 §2.2 一致) | **须图库/通行确认**:合并调用是否为「刷新引用」语义、是否等价于当前 N 次效果;若不能确认则**不得合并**,仅可补返回值校验与日志(**工作区走查与方案审核见 §6**) |
| **§3.2** | `AcsPersonServiceImpl#delete` | **`P = param.getPersonIds().size()`** 次 `imageStorePersonService.delete` | **P1 首轮已实施****§8**):`elevatorRemoteBoundedExecutor` 按批 `invokeAll`(默认并发 **6**),子线程 **`FeignThreadLocalUtil.callWithContext`**;遇失败**整批后**即返回 `CloudwalkResult.fail`(与原先顺序循环遇错即停一致,**非**单条失败即取消同批其它在途 RPC) | **无批量 delete**;同批内并行语义见 **§8.1** |
| **§3.3** | `AcsPassRuleServiceImpl#listFloor` | **`F = passRuleResults.size()`** 次 `acsPersonService.page` | **P1 首轮已实施****§8**):楼层 `page` 有界并行(默认 **6**),`personTotals[]` 按下标写回,**列表顺序不变** | **禁止**本地 count 替代 `totalRows`RPC 上界仍为 **F** |
| **§3.4** | `AcsPassRuleServiceImpl#addImageStore` 内设备绑图库 | **`D = deviceList.size()`** 次 `bindDeviceAndImageStore` | **P1 首轮已实施****§8**):`bind` 有界并行;失败仍 **`rollbackImageStoreAfterBindFailure`** 后抛 `ServiceException`(与同批已绑设备竞态与顺序循环**同类**) | **无批量 bind** |
| **§3.5** | `AcsDeviceTaskServiceImpl#updateFloors` | 增删楼层远程调用**墙钟**上界仍分别为 **A**、**D** 次;**有界并行**可缩短多楼层场景耗时(**迭代 5**,见 **§9** | 内层 `imageRuleRefService.delete` 仍受 **§3.1 冻结** 时的 RPC 上界与语义约束;`@Async("updateFloorsExecutor")` 下背压与 `catch` 细粒度见 **§7.3** / **§9** |
---
## 2. 数量小结(便于排期)
| 类型 | 计数符号 | 含义 |
|------|----------|------|
| **§3.1 可合并 RPC** | 由 N 降为 **1**(在语义确认后) | 规则批量删除场景收益最大 |
| **§3.2 并行度** | P | 人员多 ID 删除 |
| **§3.3 并行度** | F | 楼层列表人数统计 |
| **§3.4 并行度** | D | 设备绑图库 |
| **§3.5** | A + D | 异步任务按层调用 |
---
## 3. 迭代规划与下一迭代范围(不改 HTTP/Feign 签名)
### 冻结范围(2026-04-25
| 项 | 说明 |
|----|------|
| **约定 §3.1 全范围** | 未取得图库/通行对 `updateGroupPersonRef` 语义确认前,**不进行**与该约定相关的**任何**代码修正与优化(含 **合并 N→1** 及 §6.4 所述**仅 `isSuccess` 校验**小步),避免在无确认期分散实现与回滚成本。 |
| **恢复条件** | 图库书面或接口说明确认 + 在 [约定文档 §3.1](对外接口不变-远程调用与性能优化约定.md) 文末回填对接人、日期;再按 §1 表拆分 PR(合并与返回值校验可分步)。 |
| **前端相关** | 仓库**暂无可用前端**;所有需改**前端 / 登记页 / 物业端页面**的迭代**暂不排期、不执行**(与本文服务端走查无冲突;产品方案中 UI 类阶段见 [docs/README](../README.md#当前排期与范围2026-04))。 |
### 迭代 3**§3.5 `updateFloors`**
| 字段 | 内容 |
|------|------|
| **状态** | **走查与首轮修正已完成**(见 **§7**):`getById` 空防护、步骤级 `CloudwalkResult` 校验、`keepAliveSeconds` 绑定线程池。 |
| **约定锚点** | **§3.5** `AcsDeviceTaskServiceImpl#updateFloors` |
| **暂缓项** | 楼层有界并行**已**见 **§9**`AbortPolicy``catch` 语义、其它见 **§7.3**。 |
### 迭代 4**P1:§3.2 / §3.3 / §3.4 + 统一有界池**
| 字段 | 内容 |
|------|------|
| **状态** | **已实施**(实现说明与语义边界见 **§8**)。 |
| **线程池 Bean** | `elevatorRemoteBoundedExecutor``ElevatorRemoteIoExecutorConfig`),配置前缀 **`ninca.elevator.remote-io.pool`**(默认 core=max=**6**queue=512`CallerRunsPolicy`)。**未**与 `updateFloorsExecutor` 合并,避免异步任务与同步 RPC 抢同池。 |
| **公共能力** | `FeignThreadLocalUtil.callWithContext``cw-elevator-application-common`):子线程执行 Feign 前绑定/恢复 ThreadLocal 请求头。 |
### 迭代 5**§3.5 `updateFloors` 楼层有界并行**
| 字段 | 内容 |
|------|------|
| **状态** | **已实施**(见 **§9**):增楼列表、删楼列表在各自阶段内以最多 **6** 路**并发**执行 `add` / `addOnlyRule` / `delete` 等;**`BIND_DEVICES` 仍按原列表顺序**、每层成功**仍 +1** 重读任务行,与纯串行「进度语义」一致;子线程 Feign 经 `FeignThreadLocalUtil``ruleMap``zoneId` 时用 **`getOrDefault(…, "")`** 防 NPE。 |
| **不变更** | **§3.1 全冻结** 期间未改 `ImageRuleRefServiceImpl#delete``updateGroupPersonRef` 次数。 |
### 迭代 6 及以后(可选)
- **调参 / 观测**`ninca.elevator.remote-io.pool` 按环境压测;必要时为 `updateFloors` 批处理增加**指标/耗时日志**(不扩展 HTTP 响应)。
- **§3.1**:图库确认后再评估合并 N→1 与(若允许)`updateGroupPersonRef``isSuccess` 小步。
**已完成回顾**:迭代 1 — **§5**;迭代 2 — **§6**(§3.1 冻结);迭代 3 — **§7**;迭代 4 — **§8**;迭代 5 — **§9**。
---
## 4. 文档维护
| 项目 | 内容 |
|------|------|
| 更新触发 | `ImageRuleRefServiceImpl#delete``AcsPersonServiceImpl#delete``AcsPassRuleServiceImpl#listFloor` / `#addImageStore``AcsDeviceTaskServiceImpl#updateFloors` 任一处重构或签契约变更 |
| 结论回填 | 图库对 §3.1 的确认结论请写回 [约定文档 §3.1](对外接口不变-远程调用与性能优化约定.md) 文末建议行(对接人 + 日期) |
---
## 5. 迭代 1`AcsPassRuleServiceImpl#listFloor` 走查结论(§3.3 / §2.2
**走查日期**2026-04-25
**代码位置**`maven-cw-elevator-application/.../passrule/impl/AcsPassRuleServiceImpl.java` 方法 `listFloor`
| 检查项 | 现状 | 结论 |
|--------|------|------|
| `zoneService.tree` 返回值 | 已校验 `zoneTree.isSuccess()`,失败抛 `ServiceException` | **通过** |
| `acsPersonService.page` 返回值 | 循环内**未**校验 `page.isSuccess()`,直接 `page.getData()``totalRows` | **不通过**:违反约定 **§2.2**Feign 失败时 `getData()` 可能为 null,存在 **NPE** 风险,且可能把失败误当「0 人」 |
| `page.getData()` 空指针 | 未防护 | **不通过**:与上项合并修正 |
| `rowsOfPage` | 当前为 `10`,仅使用 `totalRows` | **建议**:改为 **`1`**(约定 §3.3:仅取总数,略减负载),**不改变** HTTP 响应字段 |
**评估结论(是否允许进入代码修正)****通过进入修正** — 仅补充与 `zoneTree` 分支一致的失败处理及空数据防护,**不**改变对外 JSON 字段语义;`rowsOfPage=1` 与现逻辑(只读 `totalRows`)等价。
**代码修正(已应用,2026-04-25**`AcsPassRuleServiceImpl#listFloor` — 增加 `page.isSuccess()` 失败抛错、`page.getData()` 为空时 `personNumber=0``CloudwalkPageInfo(1,1)` 仅取总数。
**修正实施后**:提交 **`e652eb3`**(分支 `v0.11`)。
---
## 6. 迭代 2`ImageRuleRefServiceImpl#delete` 与 §3.1 方案走查(仅评估,未改代码)
**走查日期**2026-04-25
**目标**:在全工作区定位**图库(intelligent 图库人员服务)**与**通行规则(电梯应用本地)**相关代码,审核「合并 `updateGroupPersonRef`」方案是否需图库侧语义确认后方可实施。
### 6.1 图库 / 通行相关代码位置(工作区)
| 层级 | 路径/符号 | 职责 |
|------|-----------|------|
| **Feign 契约** | `maven-intelligent-cwoscomponent/intelligent-cwoscomponent-rest/.../feign/ImageStorePersonFeignClient.java` | `POST .../updateGroupPersonRef`,请求体 `UpdateGroupPersonRefParam` |
| **DTO** | `maven-intelligent-cwoscomponent/intelligent-cwoscomponent-interface/.../param/UpdateGroupPersonRefParam.java` | `businessId``imageStoreId``personIds``labelIds``organizationIds`(可同时只填部分字段) |
| **客户端封装** | `.../service/RestImageStorePersonServiceImpl.java` | 透传 Feign |
| **电梯侧 §3.1 锚点** | `maven-cw-elevator-application/.../passrule/impl/ImageRuleRefServiceImpl.java` 方法 **`delete`**(约 571605 行) | 按 `param.getIds()` 循环:`listByParentRule` → 收集子规则 `includeLabels` / `includeOrganizations`**`deleteById`** → **`imageStorePersonService.updateGroupPersonRef`**(每删一条父规则 1 次 RPC) |
| **同文件其它 `updateGroupPersonRef`** | `addOnlyRule`(约 434439)、`update` 内分支(约 556~562) | 新增/编辑规则后刷新;**同样未校验** `CloudwalkResult.isSuccess()` |
| **人员通行规则** | `maven-cw-elevator-application/.../person/impl/PersonRuleServiceImpl.java` | `add` / `addVisitor` / `delete` 末尾各 1 次 `updateGroupPersonRef`,入参以 **`personIds`** 为主(与 `delete`**label/org** 为主不同) |
| **HTTP 入口** | `cw-elevator-application-web/.../AcsPassRuleController.java` | `imageRuleRefService.delete` |
| **异步任务调用** | `AcsDeviceTaskServiceImpl#updateFloors` | 删楼层时多构造 `deleteParam.setIds(Collections.singletonList(ruleId))` **逐层**调 `imageRuleRefService.delete`;单次 `delete` 内仍可能 1 次或多次 `updateGroupPersonRef`(视该层 `ids` 数量) |
**说明**:本仓库**无** intelligent 图库服务端的 `updateGroupPersonRef` 业务实现源码,仅能依据 DTO 与调用方推断语义;**与图库/通行团队确认**仍属 §3.1 前置条件。
### 6.2 当前 `delete` 行为摘要(与合并相关)
- `imageStoreId` 来自 **`deviceImageStoreDao.getByBuildingId(param.getParentId())`**,整次批量删除共用同一图库。
- 对每个待删父规则 `id`:先读**该父规则下子规则**的 label/org(子行若带 label 则 `continue`,**同一子行不会同时写入 org**,与数据模型一致),再删父规则,再带着**本轮** `includeLabels` / `includeOrganizations` 调图库刷新。
- **`updateGroupPersonRef` 的返回值未做 `isSuccess` 校验**(违反约定 §2.2;与 `getImageStorePerson` 等分支不一致)。
### 6.3 约定中的「合并」方案审核
| 维度 | 结论 |
|------|------|
| **与现网 N 次调用的等价性** | 若图库侧语义为:在**给定 `imageStoreId`** 下,对传入的 **labelIds / organizationIds 集合**做**增量刷新或按维度重算引用**(各维度独立、与顺序无关),则「删库前汇总所有待删父规则的子维度 → **去重并集** → 删库完成后 **1 次** `updateGroupPersonRef`」与「每删一条父规则刷新其维度子集」在**最终一致**上通常等价。 |
| **必须向图库确认的风险** | 若远端实现为「以本次入参**覆盖/裁剪**图库可见范围」或依赖**调用顺序**产生副作用,则合并后的**单次并集**与 N 次**子集递进**可能不等价。约定文档 §3.1 所述「非破坏性刷新」即针对此。 |
| **`personIds``labelIds`/`organizationIds` 混用** | `PersonRuleServiceImpl``personIds` 路径;`ImageRuleRefServiceImpl#delete` 走 label/org。合并方案**不改变** `delete` 仅设 label/org 的现状;但若图库服务在**未传 `personIds`** 时对空列表有特殊含义,仍须一并确认。 |
| **空列表仍 RPC** | 当前循环在子规则为空时仍调用 `updateGroupPersonRef`(两列表皆空)。合并后是否**跳过空并集**可减少无效 RPC,但属于**行为微调**,若图库依赖「空刷」触发全量重算,须图库确认后再定。 |
| **不合并时的安全增量** | 在未获图库书面确认前,**仅**可为每次 `updateGroupPersonRef` 增加 **`isSuccess` 校验 + 失败抛 `ServiceException`**(及可选日志),**不改变** RPC 次数;与约定「退化为循环调用 + 返回值校验」一致。 |
### 6.4 评估结论(是否允许进入 §3.1「合并」类代码修正)
- **合并 N→1**:**不允许在图库/通行确认前实施** — 与 §1 表及约定 §3.1 前置条件一致。
- **仅返回值校验(及可选空并集跳过,若产品同意)**:**允许作为独立小步** — 不依赖远端语义新假设,符合 §2.2。
**图库确认建议提问(可复制)**:「对同一 `imageStoreId``updateGroupPersonRef` 在仅设置 `labelIds``organizationIds``personIds` 为空)时,是否为**按这些维度刷新人员引用**且**不会**将图库维度裁剪为仅等于本次入参?多次调用子集与单次调用**并集**是否在业务上等价?」
**实施后回填**:确认结论、对接人、日期写入 [约定文档 §3.1 文末](对外接口不变-远程调用与性能优化约定.md)(见约定 §5)。
**排期决策(2026-04-25**:在取得图库确认前,**冻结**约定 **§3.1** 相关全部代码变更;下一迭代转 **§3.5**(见上文 **「迭代 3」**)。
---
## 7. 迭代 3`AcsDeviceTaskServiceImpl#updateFloors` 走查结论(§3.5
**走查日期**2026-04-25
**代码位置**`cw-elevator-application-service/.../device/impl/AcsDeviceTaskServiceImpl.java` 方法 `updateFloors`;线程池 `.../common/UpdateFloorsTaskExecutor.java`;配置 `UpdateFloorsPoolProperties``ninca.update.floor.pool.*`,默认 core=3、max=5、queue=100、`AbortPolicy`)。
### 7.1 调用链与 RPC 上界(与 §1 表对齐)
| 分支 | 行为 | 上界 |
|------|------|------|
| 增楼层 | `personRuleService.add` **或** `imageRuleRefService.addOnlyRule`,成功后 `updateBingDevices` | `addFloors.size()` |
| 删楼层 | `personRuleService.delete` **或** `imageRuleRefService.delete`(单 id**或** 仅 DAO `deleteByOrgAndLabel`,成功后 `updateBingDevices` | `delFloorIds.size()` |
| 内层放大 | `imageRuleRefService.delete` 仍受约定 **§3.1** 冻结影响(`updateGroupPersonRef` 多次);本迭代**未**改该内层。 | 不变 |
**入口**`AcsElevatorDeviceServiceImpl#bindingFloors` / `#bindingPerson` 在插入任务行后**同步**调用 `updateFloors`;方法带 `@Async`,实际在 **`updateFloorsExecutor`** 线程执行;HTTP 已返回 `taskId` 后,**异步内失败不会回写该 HTTP 响应**(现网行为保持;运维依赖任务进度与日志)。
### 7.2 检查项与结论
| 检查项 | 现状(走查时) | 结论 |
|--------|----------------|------|
| `acsDeviceTaskDao.getById` | 未判空即 `task.getIsStop()`,存在 **NPE** 风险(数据异常或竞态) | **不通过** → 已修正:空则记录并 `ServiceException` |
| `personRuleService.add/delete``imageRuleRefService.addOnlyRule/delete` 返回值 | 未校验 `CloudwalkResult.isSuccess()`,失败时仍 **`updateBingDevices`**,进度与真实绑定不一致 | **不通过**(违反 §2.2)→ 已修正:统一 `requireTaskStepSuccess`,失败抛错且**不**递增 |
| `catch``ServiceException(e.getMessage())` | 丢失根因类型与栈信息到调用方;异步场景仅日志含 `{}` 与异常 | **记录**:是否改为 `ServiceException(code, msg)``initCause` 属产品/运维范围,**本轮不改** |
| 线程池 `keepAliveSeconds` | `UpdateFloorsPoolProperties` 有字段,**Bean 未 `setKeepAliveSeconds`**,配置项无效 | **缺陷** → 已在 `UpdateFloorsTaskExecutor` 绑定 |
| `RejectedExecutionHandler` | `AbortPolicy`,队列满时拒绝提交 | **记录**:与背压策略相关,**本轮不改**(须与运维对齐) |
| 删楼 `ruleMap.get(delFloorId)` | 若 `listZoneInfoByIds` 未覆盖某 `delFloorId` 可能 **null** 拼接 `ruleName` | **记录**:数据正常时风险低;**本轮未改**(可后续与 DAO 对齐) |
### 7.3 评估结论(是否允许进入代码修正)
- **允许并已实施(本轮)**`task` 空指针防护;对 **`personRuleService.add` / `delete`**、**`imageRuleRefService.addOnlyRule` / `delete`** 的 **`CloudwalkResult` 成功校验**(约定 §2.2);`updateFloorsExecutor` 绑定 **`keepAliveSeconds`**。
- **暂缓(须单独评审)**:拒绝策略、`catch` 异常语义增强;**楼层有界并行**与 `ruleMap` 缺键防护**已**见 **§9**。
**修正实施后**:提交 **`0ddeedc`**(分支 `v0.11`)。
---
## 8. 迭代 4P1 有界并行(§3.2 / §3.3 / §3.4
**实施日期**2026-04-25
### 8.1 行为与约定对齐说明
| 项 | 说明 |
|----|------|
| **并发度** | 代码常量与默认池 **`corePoolSize=maxPoolSize=6`**(约定 48 区间内),可通过 **`ninca.elevator.remote-io.pool.core-pool-size` / `max-pool-size`** 覆盖。 |
| **§3.2 `delete`** | 多 `personId` 时按批 `ThreadPoolExecutor.invokeAll`;单 ID 仍走主线程(无 Feign 子线程问题)。失败时返回 **`76260407`** 风格 `CloudwalkResult.fail`,与改造前**一致**;**同批内**若某 RPC 失败,`invokeAll` 仍会等本批其它任务结束后再统一 `get()` 抛出/返回,与**严格单线程「第一条失败即不再发起后续」**在「已发起请求数」上略有差异,属典型有界并行取舍。 |
| **§3.3 `listFloor`** | 设备数仍顺序 DAO`acsPersonService.page` 按批并行,结果写入 `personTotals[idx]` 后顺序 `setPersonNumber`**响应楼层顺序不变**。 |
| **§3.4 `addImageStore`** | `bindAppImageStoreDevice` 仍顺序执行;仅 **`bindDeviceAndImageStore`** 按批并行;任一批次中失败则 **`rollbackImageStoreAfterBindFailure`**(抽方法)后抛 `ServiceException`,与原先 try/catch 回滚路径一致。 |
| **Feign ThreadLocal** | 所有子线程 RPC 经 **`FeignThreadLocalUtil.callWithContext`**,避免池化线程串请求头。 |
**实施后提交****`fe571aa`**(分支 `v0.11`)。
---
## 9. 迭代 5`updateFloors` 楼层有界并行(§3.5
**实施日期**2026-04-24(工作区)
### 9.1 设计要点
| 项 | 说明 |
|----|------|
| **并发度** | 与 §8 一致使用 **`elevatorRemoteBoundedExecutor`** 的 **`ThreadPoolExecutor#invokeAll`**,批大小 **`UPDATE_FLOORS_FLOOR_PARALLEL = 6`**(与 `AcsPassRuleServiceImpl` 等处一致)。 |
| **bind 推进** | 同批内各楼层 RPC **可并发**`Future#get()` **按列表下标顺序** 等待;每遇返回值 **1** 则主线程**再** `getById`**`BIND_DEVICES`+1**,与旧实现「每层成功后立即 +1」的**终态**一致。 |
| **停任务** | 每层子步骤开头仍 `getById``isStop != 0` 时该层贡献 **0**、不推进 bind。 |
| **DAO 异常** | 删楼分支中 `getByRuleName` / `deleteByOrgAndLabel`**`DataAccessException`** 在子步内转 **`ServiceException`**,以配合 `Callable``invokeAll` 的异常链。 |
| **§3.1** | 未改 `imageRuleRefService.delete` 实现,内层 `updateGroupPersonRef` 行为与冻结前一致。 |
### 9.2 同批多楼层与「遇错即停」
**§8.1** 类似:同批中若一 Floor 的 RPC 失败,同批**其它在途** Floor 的 RPC 可能已执行完毕;`get()` 按顺序在**首败**时抛出。与严格串行「前一层失败则后层不再发起」在**已发出请求**上可存在差异,属有界并行常见取舍。
### 9.3 代码位置
- `AcsDeviceTaskServiceImpl#updateFloors``#runAddFloorsInBoundedParallel` / `#runDelFloorsInBoundedParallel``#addOneFloorStep` / `#delOneFloorStep``#advanceBindProgressOne`
@@ -0,0 +1,96 @@
# 对外接口不变前提下的远程调用与性能优化约定
**适用范围**:本仓库电梯应用(`maven-cw-elevator-application`)及与之集成的 intelligent / 图库等 Feign 调用路径。
**订立日期**2026-04-24
**状态**:团队约定(实施前对「远端语义」类条目需与图库/通行服务二次确认)。
**走查落地**[对外接口不变-走查任务与状态](对外接口不变-走查任务与状态.md)(子任务计数、可修正 / 不可修正与下一步)。
---
## 1. 「对外接口不变」的可操作定义
| 层级 | 是否允许变更 | 说明 |
|------|----------------|------|
| **对客户端 HTTP** | **否** | URL、Method、请求/响应 JSON 字段与语义、成功/失败码含义与现网一致。 |
| **本模块内部实现** | **是** | `ServiceImpl`、DAO、私有方法、远程调用次数、并行策略等,只要最终 HTTP 行为与业务语义一致。 |
| **intelligent / 图库等 Feign 契约** | **默认否** | 不新增 `batchDelete`、多 zone 一次统计等接口时,仅允许在**现有方法**上组合、批处理逻辑或**有界并行**。若单独立项扩展 Feign,再按新版本评审。 |
下文默认 **HTTP 与 Feign 契约均不扩展**
---
## 2. 总原则
1. **等价优先**:任何减少 RPC 或改并行的地方,须保证与改造前**同一业务语义**(尤其 `totalRows`、删除范围、刷新范围);不得用「近似」本地统计替代远端分页结果,除非完成**对账验收**并文档留痕。
2. **返回值必检**:对 `CloudwalkResult` / Feign 封装结果须校验 `isSuccess`(或项目统一规范);禁止依赖「失败静默」作为常态路径。
3. **合并优于 N 次**:若远端操作对同一维度**幂等重算**(如按 label/org 刷新引用),优先在本地删库结束后**去重并集单次调用**,而非循环内重复调用。
4. **无法合并时的默认手段**:在契约无批量 API 时,采用**有界并行**(固定线程池或 `Semaphore`,建议并发度 4~8,可按环境调参),并明确**失败聚合策略**与现网「遇错即停」等行为一致。
5. **事务边界**:涉及多 RPC + 本地 DB 时,在约定中明确是否 `@Transactional`、失败是否需补偿;禁止在未定义产品语义时擅自「部分成功」。
---
## 3. 按场景的具体约定
### 3.1 `ImageRuleRefServiceImpl.delete`(循环内 `updateGroupPersonRef`
- **目标**:降低重复刷新带来的 RPC 与负载。
- **约定**:在**所有** `deleteById`(或等价删库步骤)完成后,对本轮涉及的 `labelIds``organizationIds` **去重并集**,再调用**一次** `updateGroupPersonRef`
- **前置条件**:与图库/通行侧确认「仅传 label/org 列表」为**刷新引用**语义,而非会把图库裁剪为仅含这些维度的破坏性语义。若不能确认,**退化为**保持循环调用 + **仍须做返回值校验**
- **HTTP**:不变。
### 3.2 `AcsPersonServiceImpl.delete`(循环内 `imageStorePersonService.delete`
- **约束**`ImageStorePersonDelParam` 仅支持单 `personId`,无批量 delete 时不扩展契约。
- **约定**:采用**有界并行** `delete`;失败策略与现实现**一致**(例如任一失败则整体失败);若需与现网「严格顺序失败」完全一致,须在实现中定义完成顺序与异常聚合方式。
- **HTTP**:不变。
### 3.3 `AcsPassRuleServiceImpl.listFloor`(每层 `acsPersonService.page` 仅取 `totalRows`
- **约束**`AcsPersonQueryParam` 单 zone;图库侧无「多楼层一次返回人数」API 时,不能靠单次 RPC 消除 N。
- **禁止**:用本地 `countPersonIdByZoneId` 等 SQL 人数**直接替代** `imageStorePersonService.page``totalRows`(与 `PersonRuleServiceImpl.page` 路径下的 label/org/del 等过滤**不等价**),除非完成**逐层对账**并书面验收。
- **约定**:在契约不扩展时,**最优为按楼层有界并行** `page`(如 `rowsOfPage=1` 仅取总数),按树顺序**合并结果**,保证响应列表顺序与字段不变。
- **HTTP**:不变。
### 3.4 `AcsPassRuleServiceImpl.addImageStore`(循环 `bindDeviceAndImageStore`
- **约定**:无批量 bind 时,**有界并行 bind**;异常时的回滚(如删除已建图库)须与现逻辑一致,并注意并行下与顺序相关的竞态。
- **HTTP**:不变。
### 3.5 `AcsDeviceTaskServiceImpl` 等按楼层调用 `personRuleService.delete` / `imageRuleRefService.delete`
- **约定**:优先受益于 **3.1** 的合并刷新;若仍为每层 `delete`,可叠加**楼层级有界并行**,前提是错误语义与资源侧限流可接受。
---
## 4. 实施优先级(契约不扩展时的 ROI)
| 优先级 | 项 | 说明 |
|--------|-----|------|
| P0 | 3.1 合并 `updateGroupPersonRef` + 返回值校验 | 收益大、变更面相对集中;依赖远端语义确认。 |
| P1 | 3.3 / 3.2 / 3.4 / 3.5 有界并行 | 不改 DTO/URL,主要降低墙钟时间;注意线程池生命周期与超时。 |
| 远期 | Feign 批量/聚合接口 | 契约可扩展时,再评估批量 delete、多 zone 统计等结构性优化。 |
---
## 5. 变更与评审
- 任何偏离本约定(例如采用本地 count 替代 `totalRows`)须在 PR/变更说明中**单列风险**并附对账或测试证据。
- 与 intelligent 团队对齐「`updateGroupPersonRef` 语义」后,建议在本文 **3.1** 节追加**结论日期与对接人**一行,便于审计。
---
## 6. 相关代码锚点(便于检索)
| 场景 | 典型类/方法 |
|------|-------------|
| 人员分页与规则 | `AcsPersonServiceImpl#page``getRuleListByZoneId` |
| 楼层人数 | `AcsPassRuleServiceImpl#listFloor` |
| 规则与图库口径对照 | `PersonRuleServiceImpl#page` |
| 规则引用删除 | `ImageRuleRefServiceImpl#delete` |
| 人员删除与图库 | `AcsPersonServiceImpl#delete` |
---
## 7. 走查任务索引(子任务与状态)
**[对外接口不变-走查任务与状态.md](对外接口不变-走查任务与状态.md)**:按 §3.1~§3.5 与当前代码对齐,列出 **RPC 次数上界**、**下一可实施修正**、**在契约不扩展前提下不可做或须先确认** 的项。
@@ -0,0 +1,221 @@
# 租户 / 组织 / 人员 / 访客 — 数据模型、表关系与用例
**文档性质**:架构梳理(电梯仓 + 组织组件约定)。
**校验状态**:已使用 [`tools/visitor_floor_verification/.env.visitor_verify`](../../maven-cw-elevator-application/tools/visitor_floor_verification/.env.visitor_verify) 所列主机(本地开发库)执行 **`INFORMATION_SCHEMA` + 抽样查询**,纪要见 **§6.1**(日期 **2026-04-30**)。其它环境仍以现场库为准。
**关联精读**[访客注册与派梯楼层 — 业务流程](../testing/visitor-registration-business-flow.md)、[租户访客默认楼层隔离边界](../testing/tenant-visitor-default-floor-isolation.md)。
---
## 1. 术语与请求上下文
| 术语 | 含义 | 典型落点 |
|------|------|----------|
| **租户 / 机构 ID** | 多租户数据隔离边界 | HTTP Header **`businessid`** → `FeignThreadLocalUtil``CloudwalkCallContext.company.companyId` |
| **`business_id`(库列)** | 与上下文 **`businessid`** 相同的字符串 | 组织库 `cw_is_organization.BUSINESS_ID``cw_is_person.BUSINESS_ID`;电梯库 `tenant_visitor_floor_policy.business_id``image_rule_ref.business_id` |
| **组织节点 ID** | 机构树上一节点(公司、部门等) | `cw_is_organization.ID`;父子关系 **`PARENT_ID``ID`** |
| **人员主键 `personId`** | API / 组件语境的人员 ID | 对应组织库 **`cw_is_person.ID`**(导出 CSV 列名为 **`ID`** |
| **被访人** | 接待访客的员工 | `add/visitor` 请求体字段 **`personId`**(勿与访客混淆) |
| **访客** | 访客档案 | 请求体 **`visitorId`**;派梯写库时 **`image_rule_ref.person_id` = 访客 ID** |
**关键辨析**
- **`business_id` 不是 `cw_is_organization` 的主键**。组织节点主键为 **`ID`****`BUSINESS_ID`** 是在**同一租户下多行组织节点上重复出现**的作用域字段。
- 跨库之间**不存在**数据库级外键;一致性依赖 **`business_id`** 与 **`cw_is_person.ID`**API 字段 `personId`)。关联表 **`cw_is_person_organization_ref.PERSON_ID`** 存储的也是该 **`ID`**。
---
## 2. 数据库边界(两库)
```mermaid
flowchart TB
subgraph orgLib [component_organization]
O[cw_is_organization]
P[cw_is_person]
R[cw_is_person_organization_ref]
L[cw_is_person_label_ref]
LB[cw_is_label]
end
subgraph elevLib [cw_elevator_application]
POL[tenant_visitor_floor_policy]
IRR[image_rule_ref]
end
O -->|"树 PARENT_ID"| O
R -->|"ORG_ID"| O
R -->|"PERSON_ID"| P
L -->|"PERSON_ID"| P
L -->|"LABEL_ID"| LB
POL -.->|"business_id 对齐 BUSINESS_ID"| P
IRR -.->|"business_id"| P
IRR -.->|"person_id 常为访客"| P
```
---
## 3. 逻辑 ER(组织库)
组织侧表无权威 DDL 收于本仓库;下列字段来自导出脚本、测试文档与 [`export_catalog.py`](../../maven-cw-elevator-application/tools/visitor_floor_verification/scripts/export_catalog.py) 中的 SQL 用法。
```mermaid
erDiagram
cw_is_organization {
string ID PK "组织节点"
string PARENT_ID FK "父节点 ID 可空"
string BUSINESS_ID "租户范围重复列"
string NAME "节点名称"
}
cw_is_person {
string ID PK "人员主键 API personId"
string BUSINESS_ID "租户"
string NAME "姓名"
int IS_DEL "是否删除"
}
cw_is_person_organization_ref {
string PERSON_ID FK "人员"
string ORG_ID FK "组织节点"
}
cw_is_organization ||--o{ cw_is_organization : "parent_child"
cw_is_person ||--o{ cw_is_person_organization_ref : "membership"
cw_is_organization ||--o{ cw_is_person_organization_ref : "org_node"
```
**`cw_is_person` 列名与访客判定**
- 仓库内导出示例 [docs/testing/_cw_is_person__202604302030.csv](../testing/_cw_is_person__202604302030.csv) 表头为 **`ID`**, **`BUSINESS_ID`**, **`IS_DEL`** 等,与 **2026-04-30 开发库**一致。
- 开发库 **`cw_is_person` 不存在**列:`person_id``deleted``labels``business_name``organization_name`。访客标签通过 **`cw_is_person_label_ref`**`PERSON_ID``LABEL_ID`)关联 **`cw_is_label`**(含 `BUSINESS_ID``NAME`);示例租户下 **`NAME='访客'`** 对应 **`LABEL_ID=ed2dbab6d6234a7287106b80857c819e`**。
---
## 4. 逻辑 ER(电梯库)
依据 [`tenant_visitor_floor_policy.sql`](../../maven-cw-elevator-application/releases/v2.0.0/ddl/tenant_visitor_floor_policy.sql) 与 [`ImageRuleRefMapper.xml`](../../maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/ImageRuleRefMapper.xml)。
```mermaid
erDiagram
tenant_visitor_floor_policy {
string id PK
string business_id "租户 UK 组成部分"
string policy_type "如 INTERSECT_ALLOWLIST"
text allow_zone_ids "JSON zoneId 数组"
string building_id "预留楼栋维度可空"
int enabled
bigint policy_version
}
image_rule_ref {
string id PK
string business_id
string zone_id "楼层区域"
string zone_name
string parent_rule "父规则"
string person_id "访客开通场景为访客"
int person_delete
string include_labels
string include_organizations
int is_default
}
```
**访客默认楼层策略语义(UC-01,未传 `floorIds`**
- **规范**:启用租户访客策略且 **`allow_zone_ids` 非空**时,组织 **`PersonService.detail`** 应将 **`floorList` 替换为 `allow_zone_ids`(替代,非 ∩)**;电梯 **`addVisitor`** 仅使用 `personResult.getFloorList()`,**不再**在电梯侧与 allow 求交。
- 详见 [`PersonRuleServiceImpl#addVisitor`](../../maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/person/impl/PersonRuleServiceImpl.java)、[迁入组织组件规格](../superpowers/specs/2026-05-06-tenant-visitor-policy-organization-implementation.md) 与 [租户访客默认楼层-数据库配置阶段技术设计](../business/租户访客默认楼层-数据库配置阶段技术设计.md)。
---
## 5. 角色与派梯用例(电梯侧)
```mermaid
flowchart LR
actor Caller as Caller_BFF
participant API as AcsPersonController
participant PR as PersonRuleServiceImpl
participant Org as PersonService_detail
participant IRR as ImageRuleRefDao
participant Img as ImageStorePersonService
Caller -->|"POST_add_visitor"| API --> PR
PR --> Org
PR --> IRR
PR --> Img
```
```mermaid
flowchart TD
subgraph UC01 [UC01不传floorIds]
U1[add_visitor]
U2[detail_host_floorList已含策略替代]
U4[write_image_rule_ref_visitor]
U5[batchBind_visitor]
U1 --> U2 --> U4 --> U5
end
subgraph UC02 [UC02显式floorIds]
V1[add_visitor]
V2[detail校验被访人]
V2b[effective=请求floorIds]
V3[write_rules_bind]
V1 --> V2 --> V2b --> V3
end
subgraph UCRead [回读验收]
R1[passRule_image_personId_visitor]
end
```
---
## 6. 附录:现场核对 SQL 与纪要
### 6.1 开发库核对纪要(2026-04-30
以下为使用 **`maven-cw-elevator-application/tools/visitor_floor_verification/.env.visitor_verify`**(主机、端口、账号由本地填写,**勿将密钥写入 Git**)连接所得摘要:
| 项目 | 结果 |
|------|------|
| 根机构 **`BUSINESS_ID=2524639890ba4f2cba9ba1a4eeaa4015`** | 节点 **`NAME=星河湾中心`**`ID=d656e3ab3f61440bb7b9bc23b76834b9`**与 `BUSINESS_ID` 字符串不相等** |
| `cw_is_person` | 主键列 **`ID`**;删除 **`IS_DEL`****无** `person_id``deleted``labels``business_name``organization_name` |
| `cw_is_organization` | 含 **`ID``PARENT_ID``BUSINESS_ID``NAME``IS_DEL`** 等(大量 `EXT*` |
| `cw_is_person_organization_ref` | **`ID``PERSON_ID``ORG_ID`** 及审计列 |
| `cw_is_person_label_ref` / `cw_is_label` | 用于人员标签;访客标签 **`NAME='访客'`** 对应 **`LABEL_ID=ed2dbab6d6234a7287106b80857c819e`**(该租户) |
| `information_schema.TABLE_CONSTRAINTS` | 上述组织表 **仅有 `PRIMARY KEY` / `UNIQUE`****未声明 FOREIGN KEY** |
| `cw-elevator-application.tenant_visitor_floor_policy` | 列与仓库 DDL 一致;示例租户 **`enabled=1`**`allow_zone_ids`**`605560545117995008`** |
### 6.2 INFORMATION_SCHEMA 模板(任意环境)
```sql
-- 组织库:核心表列一览
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'component-organization'
AND TABLE_NAME IN (
'cw_is_organization',
'cw_is_person',
'cw_is_person_organization_ref',
'cw_is_person_label_ref',
'cw_is_label'
)
ORDER BY TABLE_NAME, ORDINAL_POSITION;
-- 根节点与 BUSINESS_ID 是否相等(现场逐项核对)
SELECT ID, PARENT_ID, BUSINESS_ID, NAME
FROM cw_is_organization
WHERE BUSINESS_ID = '2524639890ba4f2cba9ba1a4eeaa4015'
ORDER BY ID
LIMIT 20;
-- 电梯库:策略表列
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'cw-elevator-application'
AND TABLE_NAME IN ('tenant_visitor_floor_policy', 'image_rule_ref')
ORDER BY TABLE_NAME, ORDINAL_POSITION;
```
---
## 7. 文档索引(与本模型一致)
| 文档 | 用途 |
|------|------|
| [visitor-registration-business-flow.md](../testing/visitor-registration-business-flow.md) | 被访人 / 访客 / 楼层源码链路 |
| [visitor-registration-floor-validation.md](../testing/visitor-registration-floor-validation.md) | 测试矩阵与现场组织示例 |
| [tenant-visitor-default-floor-isolation.md](../testing/tenant-visitor-default-floor-isolation.md) | `business_id` 粒度与隔离边界 |
| [租户访客默认楼层-数据库配置阶段技术设计.md](../business/租户访客默认楼层-数据库配置阶段技术设计.md) | **替代**语义与迁移(历史文档含「求交」表述处以 2026-05-06 规格为准) |
@@ -0,0 +1,115 @@
# 租户访客楼层策略 — 代码重构实施指南
> **目标**:在**不破坏对外 HTTP / Feign 契约**的前提下,实现规范中的 **「组织 `detail` 内以 `allow_zone_ids` 替代 `PersonResult.floorList`」**,使**邀约页、UC-01 派梯**与**租户策略**一致。
> **依据**:[访客邀约与派梯楼层一致性梳理](访客邀约与派梯楼层一致性梳理.md)、[迁入组织规格](../superpowers/specs/2026-05-06-tenant-visitor-policy-organization-implementation.md)(以下简称 **《组织规格》**)。
> **当前状态**:电梯 **`PersonRuleServiceImpl#addVisitor`** 已**不**读策略表、**不**做 ∩。组织侧已落地 **`TenantVisitorFloorPolicyService`** + **`ImgPersonServiceImpl#detail` / `page(isVisitor)`** 的 **`allow_zone_ids` 替代**;部署组织库需执行 **`docs/sql/organization_tenant_visitor_floor_policy.sql`**。电梯工程内已无 **`TenantVisitorFloorPolicyDao`**(死代码已删)。
---
## 1. 重构原则(必须遵守)
| 原则 | 说明 |
|------|------|
| **策略语义** | 仅 **「替代」**:命中策略时 **`floorList` = 配置中的 `allow_zone_ids` 解析结果****不要**与 `listByImageId` 结果做 **∩** 作为规范主路径。 |
| **唯一对外楼层权威** | 消费「被访人可派梯/可邀约楼层」**必须**走 **`PersonService.detail``floorList`**(经 Intelligent → 组织)。 |
| **电梯侧** | **不**新增「再算一遍策略」;**不**恢复 `TenantVisitorFloorPolicyDao` 参与 `addVisitor` 有效楼层计算。 |
| **接口兼容** | 《组织规格》约定:`cwos-component-organization-interface` **不**为策略新增公开 DTO/方法时,策略仅作为**服务层内部实现**;对外仍只通过现有 `detail` 返回里的 `floorList` / `floorNames` 体现。 |
| **UC-02** | 显式 `floorIds` 仍由调用方负责与业务单一致;若需 **⊆ 策略** 的硬约束,在 **BFF** 实现,或单独立项改电梯**且**经评审。 |
---
## 2. 分阶段实施任务
### 阶段 A — 数据与组织工程骨架
1. **策略表落库位置**(二选一,推荐 **组织库** 为唯一主库)
- **推荐**:在 **组织服务使用的 MySQL 库** 中创建与《组织规格》一致的表结构(字段含 `business_id``policy_type``allow_zone_ids` JSON、`enabled``building_id` 可空等)。
- **迁移期**:若生产数据仍在**电梯库** `tenant_visitor_floor_policy`,做 **一次性迁移脚本** + 运维切换窗口;迁移完成后电梯侧 Dao **仅删除调用**,不必双写。
2. **组织模块新增(均在 `maven-ninca-common-component-organization`**
- Entity / Mapper / XML`tenant_visitor_floor_policy` CRUD 或至少 **按 `business_id` + enabled** 查询租户默认行(`building_id IS NULL`)。
- **`TenantVisitorFloorPolicyService`**(命名可依项目惯例):
- `boolean isPolicyActive(String businessId)``Optional<PolicyRow> findTenantDefault(String businessId)`
- `List<String> parseAllowZoneIds(String json)`(健壮解析,非法 JSON → 视为未启用或记录告警)。
- **不做**:在 interface 模块暴露新 REST(除非产品明确要求管理 API)。
### 阶段 B — 在 `ImgPersonServiceImpl#detail` 接入替代逻辑(核心)
**文件**`cwos-component-organization-service/.../ImgPersonServiceImpl.java`,方法 **`detail`**。
**插入点**:在 **`elevatorFeignClient.listByImageId` 成功**、已根据 `images` 遍历得到 **`floorList` / `floorNames`(原始)** 之后;在 **`result.setFloorList` / `setFloorNames`** 之前增加分支:
```
伪代码:
原始列表 = 当前遍历 listByImageId 得到的 floorList, floorNames
若 TenantVisitorFloorPolicyService 对 businessId(及必要时 organizationIds)判定「启用且 allow 非空」:
floorList := allow_zone_ids 解析后的 zoneId 列表(顺序:与 JSON 数组顺序一致)
floorNames := 需与 floorList 对齐展示
选项 1:配置侧同时存 id→name 映射(扩展列或独立字典表)
选项 2:对 allow 中每个 zoneId 调现有 Zone Feign 批量查名称(注意批量与超时)
选项 3:若产品允许仅展示 zoneId,则 floorNames 可与 zoneId 同步占位(不推荐体验)
否则:
保持现有原始 listByImageId 语义
result.setFloorList(...)
result.setFloorNames(...)
```
**注意**
- **`defaultFloor` / `floorName`(单人默认层展示)** 与 **`floorList`(通行可达层)** 语义不同,勿混写;参见 [08 文档](../../maven-cw-elevator-application/cw-elevator-application-service/docs/08-visitor-registration-and-elevator-auth.md)。
- **启用判定键**:与《组织规格》一致,以 **`business_id`**Header `businessid` / `companyId`)为主;若后续要 **按机构细分**,再扩展查询条件,不在本阶段默认实现。
### 阶段 C — 访客列表 `page(isVisitor)` 对齐(强烈建议)
**文件**:同一 `ImgPersonServiceImpl`,方法 **`page`**,分支 **`param.getIsVisitor()` 非空**。
- 现状:该分支内有 **星河湾 40F/6F** 等与 **`detail`** 不一致的展示逻辑。
- **建议**:在策略**命中**时 **优先应用与 `detail` 相同的替代结果**(或抽 **私有方法** `applyTenantVisitorFloorPolicy(resultRow, businessId, …)``detail``page` 共用),并 **跳过**与租户策略冲突的硬编码默认层块(参见《组织规格》§4.3)。
- 避免:邀约走 `detail`、列表走 `page` 时出现两套楼层。
### 阶段 D — 电梯侧清理(收尾)
1. **确认** `PersonRuleServiceImpl` **无** `TenantVisitorFloorPolicyDao` 注入与 ∩ 逻辑(当前梳理版本已符合则仅做静态检查)。
2. **删除或标注废弃**`cw-elevator-application-data`**`TenantVisitorFloorPolicyDao` / Mapper / XML** 若已不再被任何 Bean 引用 — **删除**可减少歧义;若迁移脚本仍需参考表结构,可保留 DDL 文档到 `docs/sql`,代码删除前 grep 全仓引用。
3. **电梯库表**:迁移完成后由 DBA **删表或归档**(按运维规范)。
### 阶段 E — UC-02 与集成(可选增强)
- **BFF**:派梯前读取邀约单 `floorIds`,调用 **`detail`** 得到 **`floorList`**(已含替代),校验 **`floorIds ⊆ floorList`**(集合意义),失败则拒绝派梯并返回明确错误码。
- **幂等**:邀约单号 + 派梯状态机由业务系统保证,电梯接口本身不变。
### 阶段 F — 测试与验收
| 场景 | 期望 |
|------|------|
| 未配置策略 | `detail.floorList` 与改造前 **listByImageId** 一致;UC-01 行为不变。 |
| 配置启用且 allow 非空 | `detail.floorList` **等于** allow 列表(替代);UC-01 开通层与邀约页一致。 |
| 关闭策略 / JSON 无效 | 回退原始语义;无启动报错。 |
| `page(isVisitor)` | 与 `detail` 策略表现一致(验收抽样)。 |
---
## 3. 风险与缓解
| 风险 | 缓解 |
|------|------|
| **`floorNames` 与 id 不对齐** | 替代后必须统一用 Zone 服务补全名称或扩展配置。 |
| **性能**detail 每次多一次 DB + 可选批量 Zone | 策略行缓存(短 TTL)或本地缓存按 `business_id`。 |
| **跨楼栋首层**(§4.8 | 产品确认单次 `effective` 是否允许多楼栋;否则约束邀约/UC-02 单层栋或拆分调用。 |
---
## 4. 推荐提交顺序(便于 Code Review
1. 组织库 DDL + Mapper + **PolicyService**(单测解析 JSON)。
2. **`detail` 接入替代** + 单元/集成测试(可 Mock Feign)。
3. **`page` 分支对齐**(若有)。
4. 电梯侧删除死代码 + 文档更新(本文 + 《一致性梳理》§6)。
5. 迁移脚本在生产前演练。
---
**文档版本**:与仓库实施同步更新;重大契约变更需同步修改《组织规格》并评审。
@@ -0,0 +1,293 @@
# 租户访客默认楼层:数据库配置阶段 — 详细技术设计
> **文档性质**:实施级技术设计(历史草案)。**现行规范(2026-05-06**:租户策略 **`allow_zone_ids` 仅在组织 `PersonService.detail` 以「**替代**」写入 `floorList`,电梯 **`addVisitor` 不透传策略表、不做 ∩**。下文若仍出现「求交 / ∩」,视为历史表述;以 [迁入组织组件规格](../superpowers/specs/2026-05-06-tenant-visitor-policy-organization-implementation.md) 为准。
> **产品依据**:[租户访客默认楼层技术产品方案](租户访客默认楼层技术产品方案.md)(策略类型、安全底线、AC 验收)。
> **流程依据**:[访客注册与派梯楼层业务流程走查](访客注册与派梯楼层业务流程走查.md)UC-01 / UC-02、`PersonRuleServiceImpl.addVisitor`)。
| 项目 | 内容 |
|------|------|
| 版本 | v0.1 草案(数据库阶段) |
| 适用工程 | `maven-cw-elevator-application`(电梯应用库;落库表位于**电梯库**或与电梯同数据源的业务库,以现网数据源划分为准) |
| 读者 | 后端开发、DBA、集成测试、运维 |
| **模型索引** | [租户组织人员访客-数据模型与用例](../architecture/租户组织人员访客-数据模型与用例.md)(仓库级 ER、`business_id` 与组织主键辨析) |
---
## 1. 背景与阶段目标
### 1.1 问题复述
多租户场景下,部分机构要求:在调用方**不传** `floorIds`(走 **UC-01**)时,访客派梯生效楼层**不得**简单等同于被访人组织侧 `floorList` 全集,而应**收敛**为机构允许的若干 `zoneId`(如固定接待层)。未做特殊要求的租户须与现网行为**完全一致**。
### 1.2 本阶段目标(范围边界)
| 目标 | 说明 |
|------|------|
| **配置方式** | 通过 **数据库表** 维护「哪些租户启用访客楼层策略及允许列表」;由实施/DBA/SQL 脚本录入,**不提供** 物业/客服可视化管理界面(后续阶段再做)。 |
| **行为(规范)** | 存在有效策略时,组织 **`detail`** 将 **`floorList` 替换为 `allow_zone_ids`(替代)**;电梯侧 **不再**对候选楼层与 allow 做 ∩。 |
| **兼容** | 表中**无**该租户配置、或 `enabled=0`、或 `allow_zone_ids` 为空:与现网 **UC-01** 一致(仍使用组织返回的 `floorList` 全集)。 |
| **显式楼层** | 请求体已带**非空** `floorIds`**UC-02**):电梯 **`addVisitor`** 以请求为准;策略约束应在 BFF/组织侧预先体现,**禁止**在规范文档中将 UC-02 描述为与 allow **求交**。 |
| **访客业务系统 / 登记页** | 本阶段**不要求**改第三方 BFF;但若登记页仍只拉组织 `floorList` 展示,则**展示可能与电梯最终开通楼层不一致** —— 见 **§8 风险与后续工作**。 |
### 1.3 非目标(明确排除)
- 物业管理端 CRUD 页面、审计日志界面、策略版本与登记单快照联动(产品方案 §2.7、§3.4 完整能力)。
- 组织侧收窄 `floorList`、Nacos 配置中心等其它路径(参见产品方案 §4.1 方案族)。
- 按楼栋 `building_id` 的多套策略并行(表结构可预留字段,本阶段查询规则见 **§4.3**)。
---
## 2. 设计原则与安全约束
1. **权限上界(不变量)**
租户策略仅表达**允许集合**;规范路径下 **`PersonService.detail` 输出的 `floorList` 在策略命中时即为 `allow_zone_ids`(替代后的权威列表)**,电梯 **`addVisitor` UC-01** 仅透传该列表。**禁止**再以「与被访人原始 `listByImageId` 结果求交」作为规范语义。
2. **替代后为空 / 配置无效**
若组织侧替代结果无法产生有效 `floorList`(或策略 JSON 无效),应在 **detail****addVisitor** 短路失败(如 **`76260531`**),禁止继续 `zone/page` 首元素等(避免 **UC-04** 类 NPE)。
3. **被访人无楼层**
组织 `detail` 返回的 `floorList`**null 或空列表**:应用层**短路失败**。
4. **数据源**
策略表以 **`businessId`(机构 ID** 与调用上下文 `CloudwalkCallContext.company.companyId` 对齐;所有查询必须带 `business_id` 条件,避免串租户。
---
## 3. 总体架构(本阶段)
```mermaid
flowchart LR
subgraph callers [调用方不变]
T[第三方 / intelligent]
end
subgraph elev [cw-elevator-application]
API["POST /elevator/person/add/visitor"]
SVC["PersonRuleServiceImpl.addVisitor"]
ORG["Feign PersonService.detail"]
DB[("tenant_visitor_floor_policy")]
end
subgraph orgsvc [组织服务]
DETAIL["POST /component/person/detail"]
end
T --> API --> SVC
SVC -->|floorIds 为空| ORG --> DETAIL
SVC -->|读策略| DB
SVC -->|后续现有逻辑| Z["zoneService.page 等"]
```
**职责划分**
- **策略存储与读取**:电梯应用访问本表(与现网 `image_rule_ref` 等表同一数据源即可,减少分布式事务)。
- **「访客系统只获取对应楼层」**:若「访客系统」指**登记页/第三方 BFF**,本阶段**不强制**其改代码;电梯侧已保证**开通结果**收敛。展示一致需后续 **预览接口或 BFF 同源计算**(产品方案 §2.3、§2.5)。
---
## 4. 数据模型设计
### 4.1 逻辑模型
与产品方案 §4.3 对齐,本阶段至少使用下列语义字段:
| 字段 | 类型(建议) | 必填 | 说明 |
|------|----------------|------|------|
| `id` | `VARCHAR(32)` PK | 是 | 主键,UUID |
| `business_id` | `VARCHAR(64)` | 是 | 机构/租户 ID,与 `businessId` 一致 |
| `policy_type` | `VARCHAR(32)` | 是 | 本阶段仅使用 **`INTERSECT_ALLOWLIST`**;预留 `HOST_FLOOR_LIST` 等枚举便于扩展 |
| `allow_zone_ids` | `TEXT` | 条件 | **JSON 数组**,元素为 `zoneId` 字符串;策略生效时须非空(见 §4.4) |
| `building_id` | `VARCHAR(64)` NULL | 否 | **租户级默认**:本阶段固定 **`NULL`** 表示全机构默认一条;非 NULL 预留给「按楼栋」扩展 |
| `enabled` | `TINYINT(1)` | 是 | `1` 启用,`0` 停用(等价于未配置) |
| `policy_version` | `BIGINT` | 是 | 每次配置变更递增;本阶段**可不**接入登记快照,但建议表结构一次到位 |
| `remark` | `VARCHAR(256)` | 否 | 实施备注(如「广发基金接待层」) |
| `created_by` / `updated_by` | `VARCHAR(64)` | 否 | 本阶段手工 SQL 可填运维账号 |
| `created_at` / `updated_at` | `BIGINT` | 否 | Unix 毫秒时间戳,与项目内其它表风格一致 |
**唯一约束建议**`UNIQUE KEY uk_biz_building (business_id, building_id)`
MySQL 中 `building_id` 为 NULL 时多行 `(biz, NULL)` 在部分版本下**可能**被唯一索引允许多条 —— **实施约束**:应用层查询 `WHERE business_id = ? AND building_id IS NULL ... LIMIT 1`,DBA 规范**每个租户仅一行**租户级策略。
### 4.2 DDL 草案(MySQL
```sql
CREATE TABLE tenant_visitor_floor_policy (
id VARCHAR(32) NOT NULL COMMENT '主键',
business_id VARCHAR(64) NOT NULL COMMENT '机构/租户 ID',
policy_type VARCHAR(32) NOT NULL DEFAULT 'INTERSECT_ALLOWLIST' COMMENT '策略类型',
allow_zone_ids TEXT NULL COMMENT 'JSON 数组,zoneId 列表',
building_id VARCHAR(64) NULL COMMENT '预留:楼栋维度;租户默认填 NULL',
enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 启用 0 停用',
policy_version BIGINT NOT NULL DEFAULT 1 COMMENT '配置版本号',
remark VARCHAR(256) NULL,
created_by VARCHAR(64) NULL,
created_at BIGINT NULL,
updated_by VARCHAR(64) NULL,
updated_at BIGINT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_biz_building (business_id, building_id),
KEY idx_business_enabled (business_id, enabled)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户访客默认楼层策略(与组织 floorList 求交)';
```
脚本落地路径:**`docs/sql/tenant_visitor_floor_policy.sql`**(本仓库已提供);亦可复制到各环境 Flyway/Liquibase 目录(以现网规范为准)。
**实现分支**`feature/tenant-visitor-floor-policy-db`(电梯 `PersonRuleServiceImpl.addVisitor` + `TenantVisitorFloorPolicyDao`)。
### 4.3 查询语义(应用层)
单条加载(租户级、启用、默认楼栋):
```text
SELECT ... FROM tenant_visitor_floor_policy
WHERE business_id = ?
AND enabled = 1
AND policy_type = 'INTERSECT_ALLOWLIST'
AND (building_id IS NULL OR building_id = '')
ORDER BY updated_at DESC, policy_version DESC
LIMIT 1;
```
若无行 → 不应用策略。
`allow_zone_ids` 为 NULL、空串、或 JSON 解析为空数组 → **本设计建议**:视为**未配置有效允许列表**,行为与「无策略」一致(避免误配导致全员无法开通);**可选变体**(需产品签字):解析为空则判为配置错误并拒绝 UC-01 —— 实施前二选一写死。
### 4.4 `allow_zone_ids` JSON 约定
- 格式:`["zoneId1","zoneId2"]`UTF-8,无 BOM。
- 元素与组织 `floorList`、空间服务 `zoneId` **同一套 ID**
- 实施前在**空间服务**或台账中核对「28 楼」等业务语言与 `zoneId` 映射(产品方案 §4.6)。
### 4.5 配置示例(实施 SQL
```sql
-- 示例:某租户仅允许访客到达 zone A、B(需替换为真实 business_id / zoneId
INSERT INTO tenant_visitor_floor_policy
(id, business_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, remark, created_at, updated_at)
VALUES
(REPLACE(UUID(),'-',''), 'REPLACE_WITH_BUSINESS_ID', 'INTERSECT_ALLOWLIST',
'["REPLACE_ZONE_A","REPLACE_ZONE_B"]', NULL, 1, 1, '实施录入:接待层', UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000);
```
停用某租户策略:`UPDATE ... SET enabled = 0, policy_version = policy_version + 1, updated_at = ...`
---
## 5. 应用层设计(电梯服务)
### 5.1 改造锚点
| 组件 | 路径 | 说明 |
|------|------|------|
| HTTP | `AcsPersonController#addVisitor` | 入参不变 |
| 服务 | `PersonRuleServiceImpl#addVisitor` | 在 **仅当** `floorIds` 为空分支内,于 `personService.detail` 取回 `floorList` 之后,插入策略加载与求交 |
| 数据访问 | 新建 `TenantVisitorFloorPolicyDao` + MyBatis `Mapper` | 仅 `select`;本阶段无写接口 |
### 5.2 控制流(伪代码)
```text
函数 addVisitor(param, context):
callerProvidedFloors = (param.floorIds 非空)
若 NOT callerProvidedFloors:
调用组织 detail(personId, businessId)
若 detail 失败: 返回 detail 的 code/message
hostFloors = PersonResult.floorList;若 null 则 []
若 hostFloors 为空:
返回业务错误「被访人无派梯楼层」
policy = DAO.selectEnabledTenantDefault(businessId) // building_id IS NULL
若 policy 存在且 allow_zone_ids 解析为非空列表 allow:
effective = [ z for z in hostFloors if z in allowSet ] // 保持 hostFloors 顺序
若 effective 为空:
返回业务错误「租户访客楼层与被访人授权无交集」
param.floorIds = effective
否则:
param.floorIds = hostFloors
// callerProvidedFloors: 不读策略表,param.floorIds 保持调用方原值
若 param.floorIds 为空:
返回业务错误「无可用派梯楼层」
后续沿用现有: zoneService.page、image_rule_ref、batchBind ...
```
### 5.3 与 UC 对照矩阵
| 场景 | `floorIds` 请求 | 表中是否有启用策略 | 期望生效列表 |
|------|-----------------|---------------------|--------------|
| UC-01 现网 | 空 | 否 | `floorList`(与现网一致) |
| UC-01 + 策略 | 空 | 是且 allow 非空 | `allow ∩ floorList` |
| UC-01 + 策略无交集 | 空 | 是且 allow 非空 | **失败**,明确错误码 |
| UC-01 被访人无层 | 空 | 任意 | **失败**(无 floorList |
| UC-02 | 非空 | 任意 | **以请求为准**(本阶段不读表) |
### 5.4 错误码与文案(建议)
| 错误码 | 场景 | 用户/集成方可见文案(中文示例) |
|--------|------|----------------------------------|
| 沿用组织失败码 | `detail` 失败 | 透传组织返回 |
| **新增** `76260531`(示例) | `floorList` 为空或求交后仍无可用楼层(可归并细分) | 无法为访客开通派梯:被访人无授权楼层或无可生效楼层 |
| **新增** `76260532`(示例) | 租户允许列表与被访人 `floorList` 无交集 | 无法为访客开通派梯:租户访客楼层策略与被访人授权楼层不一致,请联系管理员 |
> 注:具体码段需与现网 `762605xx` 资源文件及网关错误码规范对齐;实施时在 `messages` 或统一错误表中登记。
### 5.5 异常与日志
- `addVisitor` 外层 `catch (Exception)` 若吞掉 `ServiceException`,会导致业务错误码丢失;**须**对 `ServiceException` 单独 `rethrow` 或改为**提前返回** `CloudwalkResult.fail`,避免一律映射为 `76260530`
- 日志:在求交前后打 **INFO**`businessId``personId``visitorId`、策略 `id``policy_version`、**脱敏后的** `effective` 楼层数量或 zoneId 列表 —— 按合规要求决定是否打全量 ID)。
### 5.6 事务与性能
- 策略查询为只读,可与现有 `addVisitor` 事务边界一致;**无**跨服务写。
- QPS 不高场景可不加缓存;若加缓存:key=`businessId`+`building_id`,失效条件为策略 `UPDATE`(或 TTL + 版本号)。本阶段可省略。
---
## 6. 测试设计
### 6.1 单元测试
| 用例 ID | 输入 | 期望 |
|---------|------|------|
| T-U01 | 无策略,`floorList`=[a,b],不传 `floorIds` | 生效 [a,b] |
| T-U02 | 策略 allow=[b,c]`floorList`=[a,b] | 生效 [b] |
| T-U03 | 策略 allow=[x]`floorList`=[a,b] | 失败,码 76260532 类 |
| T-U04 | `floorList`=[] | 失败 |
| T-U05 | 调用方传 `floorIds`=[x] | 不读表,生效 [x] |
| T-U06 | `enabled=0` | 等同无策略 |
| T-U07 | `allow_zone_ids` 空或解析为空 | 等同无策略(若采用 §4.3 建议) |
### 6.2 集成 / 回归
- 未插表租户:全量回归 **UC-01 / UC-02**
- 插表租户:组织造数 `floorList` 与策略 allow 多种组合,验证 **AC-1AC-3**(产品方案 §3.5)。
---
## 7. 发布与运维
1. **发布顺序**:先 **DDL 上线**(表空不影响行为)→ 再发 **应用包**(读表逻辑)。
2. **配置变更**:仅 `INSERT/UPDATE`;重大变更递增 `policy_version` 并记录 `remark`
3. **回滚**:应用回滚后行为恢复现网;表数据可保留。
4. **监控**:对新增错误码计数;对「求交为空」单独告警便于实施核对 zoneId。
---
## 8. 风险、依赖与后续阶段
| 项 | 说明 |
|----|------|
| **登记页与开通不一致** | 第三方若仍只展示 `floorList` 全集,而电梯已求交,易产生客诉。缓解:**阶段 2** 提供管理 API + 预览接口,或 BFF 读**同一策略源**(若表在电梯库,可通过只读副本或同步配置解决跨库)。 |
| **直连电梯绕过 BFF** | 本阶段在电梯侧兜底,**直连仍受策略约束**(产品方案 §6.2 中「B+C」思路的部分收益)。 |
| **多楼栋** | 预留 `building_id`;待产品定义「按楼栋策略」后再扩展查询与 UI。 |
| **阶段 2(产品已规划)** | 物业管理端页面:策略维护、空间树多选、`policy_version` 审计、可选 **preview-floors** 与登记快照对齐(产品方案 §2.5、§4.4)。 |
---
## 9. 文档维护
| 项目 | 内容 |
|------|------|
| 路径 | `docs/business/租户访客默认楼层-数据库配置阶段技术设计.md` |
| **变更记录** | [租户访客默认楼层-数据库阶段变更记录](租户访客默认楼层-数据库阶段变更记录.md)(发版/评审用) |
| 修订触发 | `add/visitor` 契约变更;策略表字段变更;决定 UC-02 是否参与求交 |
| 关联 PR | 实现类、`Mapper.xml`、DDL 脚本与错误码资源文件 |
---
*本文档为数据库阶段详细设计;实施以现网分支、代码评审与安全评审结论为准。*
@@ -0,0 +1,133 @@
# 租户访客默认楼层(数据库配置阶段)— 变更记录
> **用途**:记录本仓库内已落地的代码与脚本变更,便于评审、发版说明与运维回溯。
> **设计依据**:[租户访客默认楼层-数据库配置阶段技术设计](租户访客默认楼层-数据库配置阶段技术设计.md)
> **产品依据**:[租户访客默认楼层技术产品方案](租户访客默认楼层技术产品方案.md)
> **流程依据**:[访客注册与派梯楼层业务流程走查](访客注册与派梯楼层业务流程走查.md)
---
## 1. 版本信息
| 项目 | 内容 |
|------|------|
| **Git 分支** | `feature/tenant-visitor-floor-policy-db` |
| **主提交** | `25cff4d``feat(elevator): 租户访客默认楼层策略表与 UC-01 求交` |
| **涉及工程** | `maven-cw-elevator-application``cw-elevator-application-data``cw-elevator-application-service` |
| **对外接口** | 无新增 HTTP;行为变更集中在 **`POST /elevator/person/add/visitor`**`PersonRuleServiceImpl.addVisitor` |
---
## 2. 变更摘要
1. **新增数据库表** `tenant_visitor_floor_policy`:按租户(`business_id`)配置访客允许 `zoneId` 列表(JSON),本阶段仅支持 **`INTERSECT_ALLOWLIST`** 与 **租户级**`building_id` 为空)策略行。
2. **电梯服务 `addVisitor`**:当请求 **未携带非空 `floorIds`**(走查 **UC-01**)时,在取得组织侧被访人 **`floorList`** 后,若存在启用策略且 `allow_zone_ids` 解析为非空数组,则 **`effective = floorList ∩ allow`****保持 `floorList` 原有顺序**);无交集则失败;无表/停用/允许列表为空或 JSON 无效则 **与现网一致** 使用全量 `floorList`
3. **当请求已携带非空 `floorIds`****UC-02**):**不读策略表**、不对入参求交,行为与变更前一致。
4. **健壮性**:组织 `detail` 失败透传错误码;`PersonResult` / `floorList` 为空返回 **`76260531`**;策略求交为空返回 **`76260532`**;最终 `floorIds` 仍为空时返回 **`76260531`**`addVisitor`**`ServiceException` 不再被泛化 `catch` 吞掉**,避免一律映射为 `76260530`
---
## 3. 文件清单
### 3.1 新增
| 路径 | 说明 |
|------|------|
| `docs/sql/tenant_visitor_floor_policy.sql` | 建表 DDL`CREATE TABLE IF NOT EXISTS`)及注释示例 |
| `maven-cw-elevator-application/cw-elevator-application-data/.../person/dto/TenantVisitorFloorPolicyDto.java` | 策略行 DTO |
| `maven-cw-elevator-application/cw-elevator-application-data/.../person/mapper/TenantVisitorFloorPolicyMapper.java` | MyBatis Mapper 接口 |
| `maven-cw-elevator-application/cw-elevator-application-data/.../person/mapper/TenantVisitorFloorPolicyMapper.xml` | `selectEnabledTenantDefault` SQL |
| `maven-cw-elevator-application/cw-elevator-application-data/.../person/dao/TenantVisitorFloorPolicyDao.java` | DAO 接口 |
| `maven-cw-elevator-application/cw-elevator-application-data/.../person/impl/TenantVisitorFloorPolicyDaoImpl.java` | DAO 实现 |
| `docs/business/租户访客默认楼层-数据库配置阶段技术设计.md` | 技术设计(含实现分支与 DDL 路径说明) |
### 3.2 修改
| 路径 | 说明 |
|------|------|
| `maven-cw-elevator-application/cw-elevator-application-service/.../person/impl/PersonRuleServiceImpl.java` | `addVisitor` 主流程;注入 `TenantVisitorFloorPolicyDao`;新增 `parseAllowZoneIds``intersectPreserveHostOrder` |
---
## 4. 行为对照表(验收速查)
| 场景 | `floorIds` 请求体 | 库中策略 | 期望 |
|------|-------------------|----------|------|
| UC-01 基线 | 空 / 未传 | 无行或 `enabled=0``allow_zone_ids` 空/无效 JSON | 与变更前一致:使用组织 **`floorList` 全集** |
| UC-01 + 策略 | 空 / 未传 | 有启用行且 allow 非空 | **`floorList ∩ allow`**(保序) |
| 策略无交集 | 空 / 未传 | allow 与 `floorList` 无共同元素 | **`CloudwalkResult.fail("76260532", ...)`** |
| 被访人无楼层 | 空 / 未传 | 任意 | **`76260531`**`floorList` 空或 null |
| 组织 detail 失败 | 空 / 未传 | 任意 | **透传** `detail` 的 code/message |
| UC-02 | **非空** `floorIds` | 任意 | **不读表**,按请求列表后续处理(与变更前一致) |
---
## 5. 数据库与配置
### 5.1 执行顺序
1. 在电梯应用(或与电梯同数据源)库执行 **`docs/sql/tenant_visitor_floor_policy.sql`**。
2. 对目标租户 **`INSERT`** 策略行(`business_id``allow_zone_ids` JSON、`enabled=1``policy_type='INTERSECT_ALLOWLIST'``building_id`**NULL**)。
3. 发布包含本分支的 **`cw-elevator-application`** 制品。
### 5.2 `allow_zone_ids` 格式
- JSON 数组字符串,例如:`["zoneId1","zoneId2"]`
- 解析失败或解析结果为空:**按无有效策略处理**(不打断 UC-01,避免误配导致全租户不可用);并打 **WARN** 日志。
### 5.3 查询规则(与 Mapper 一致)
- `business_id = ?`
- `enabled = 1`
- `policy_type = 'INTERSECT_ALLOWLIST'`
- `building_id IS NULL OR building_id = ''`
- `ORDER BY updated_at DESC, policy_version DESC LIMIT 1`
**运维约定**:同一租户、租户级策略(`building_id` 为空)**仅维护一行**,避免多行时仅命中最新一条。
---
## 6. 错误码与文案(待资源文件补全)
| 错误码 | 触发条件 | 建议中文文案(需在统一 messages 中配置) |
|--------|----------|------------------------------------------|
| `76260531` | 被访人无 `floorList`;或经处理后仍无可用楼层 | 无法为访客开通派梯:被访人无授权楼层或无可生效楼层 |
| `76260532` | 租户允许列表与被访人 `floorList` 交集为空 | 无法为访客开通派梯:租户访客楼层策略与被访人授权楼层不一致,请联系管理员 |
若未配置文案,`getMessage` 可能回退为码或占位,**发版前请在现网 i18n 资源中登记**。
---
## 7. 日志
- 当发生 **策略求交且结果非空** 时,打 **INFO**`businessId``personId``visitorId``policyId``policyVersion`、**生效楼层数量** `effectiveSize`(不落全量 zoneId,减少日志敏感面;若排障需要可临时调高或改为 DEBUG)。
---
## 8. 集成与运行依赖
| 项 | 说明 |
|----|------|
| **MyBatis** | 启动类需能扫描到 **`cn.cloudwalk.elevator.person.mapper`**(或与现有 `cn.cloudwalk.elevator` 下 Mapper 扫描策略一致);`Mapper.xml` 位于 `cw-elevator-application-data``src/main/java/.../mapper/*.xml`(与现有模块一致)。 |
| **表不存在** | 未执行 DDL 时访问表会抛 SQL 异常,通常落入 `76260530` 包装;**须先 DDL 再发应用**。 |
| **本地编译** | 聚合工程要求 **JDK 8** 跑 Mavenenforcer);若 `cw-elevator-application-common` 等模块因私服依赖未解析失败,与本次新增类无直接关系,需在完整依赖环境编译。 |
---
## 9. 明确未包含(后续迭代)
- 物业管理端页面、策略 CRUD REST、审计与 `policy_version` 写入登记快照。
- 登记页 / BFF **预览接口**与电梯开通结果的 **展示同源**(见技术设计 §8)。
-**`building_id`** 的多套策略(表字段已预留,查询与产品未定前不启用)。
---
## 10. 修订历史
| 日期 | 修订内容 |
|------|----------|
| 2026-04-24 | 初稿:对应分支 `feature/tenant-visitor-floor-policy-db`、提交 `25cff4d` |
---
*本文档随该功能后续提交持续更新;合并主干后建议在提交说明中引用本路径。*
@@ -0,0 +1,427 @@
# 租户访客默认楼层:技术产品方案
> **文档类型**:产品与工程技术方案(含**登记页数据项与接口溯源**、端到端闭环、数据模型与实施路线)。
> **前置阅读**:[访客注册与派梯楼层业务流程走查](访客注册与派梯楼层业务流程走查.md)(UC-01UC-06、对外 HTTP/Feign 与代码位置)。
> **关联工程**[Maven 聚合工程说明](../architecture/Maven聚合工程说明.md)`maven-cw-elevator-application`、`maven-intelligent-cwoscomponent` 等边界)。
> **排期(2026-04)**:凡依赖**物业管理端、登记页、第三方前端**改动的阶段,在取得可维护前端工程前**暂时跳过**;见 [docs/README 当前排期与范围](../README.md#当前排期与范围2026-04)。本文中**纯后端/接口/数据**部分仍可独立推进。
> **术语对齐(2026-05-06,强制)**:租户访客楼层策略的工程语义 **只能是「替代」**——在 **`PersonService.detail`** 将 **`allow_zone_ids` 写入 `PersonResult.floorList`**;电梯 **`addVisitor`** **不透传策略表、不与 allow 求交(∩)**。下文表格中出现的 **INTERSECT / ∩ / 求交** 多为历史方案或 **BFF 侧自选收窄**,**不等价**于现行后端规范;以 [迁入组织组件规格](../superpowers/specs/2026-05-06-tenant-visitor-policy-organization-implementation.md) 为准。
---
## 1. 背景与问题陈述
### 1.1 业务背景
多租户部署下,不同机构对**访客可达楼层**的策略不一致:
- **默认诉求**:访客开通派梯时,若业务侧**不显式传楼层列表**(与 [UC-01](访客注册与派梯楼层业务流程走查.md) 一致),系统仍应开通派梯,但**不应简单等同于被访人组织侧 `floorList` 全集**。
- **典型例子(产品化名)**:**「广发基金」类租户**要求:访客**默认仅可派梯至 28 楼**(或某固定接待层),而被访人本人在组织中可能仍具备多层办公权限。
### 1.2 `floorIds` 是谁的字段、空与非空分别代表什么
#### 1.2.1 字段归属(哪个主体的属性)
`floorIds` **不是**组织人员主数据里「被访人」的持久化字段,也**不是**访客人员档案在组织库里的固定属性;在现有实现中,它是 **电梯应用对外接口** 的一次请求参数。
| 项目 | 说明 |
|------|------|
| **载体** | HTTP **`POST /elevator/person/add/visitor`** 的请求体(`AcsPersonAddVisitorForm` / 服务层 `AcsPersonAddVisitorParam`,见 `maven-cw-elevator-application`)。 |
| **语义** | **本次「给访客开通派梯」操作**中,调用方希望电梯在哪些 **空间分区(`zoneId`)** 上为 `visitorId` 写入默认通行规则并绑图库。 |
| **主体** | 归属主体是 **「派梯开通请求」**(一次 API 调用),由 **调用方**(第三方 BFF、访客业务后台、或 `intelligent-cwoscomponent-rest` 等)填入;电梯服务**读取**后执行落库与远程绑图库。 |
因此:在集成文档中应写清——**`floorIds` 列出的是「本次开通涉及的楼层 zoneId 列表」,由调用方在请求时提供;缺省(空)时电梯才按约定去组织侧拉被访人的 `floorList` 补全。**
#### 1.2.2 `floorIds` 非空时:业务含义与电梯行为
当调用方传入 **非空** `floorIds` 时(走查文档中的 **UC-02:访客派梯-第三方指定楼层**):
| 项目 | 说明 |
|------|------|
| **业务含义** | 调用方已明确「本次访客只(或优先)开通这些楼层」的意图;常见来源包括:登记/审批流程里已算好的**生效楼层**、访客在允许范围内**勾选的多层**、或业务规则直接指定的接待层列表。 |
| **电梯侧行为** | **不再**为补楼层去调 **`POST /component/person/detail`**;直接使用请求中的 `floorIds` 作为待写入规则的楼层列表,后续步骤(`zone/page` 取楼栋、`getDefaultByZoneId`、写 `image_rule_ref``batchBind` 等)与「列表来自组织补全」时相同,**仅楼层列表来源不同**。 |
| **责任边界** | **正确性、合法性、与租户策略及被访人授权的一致性**由调用方负责(或通过 BFF 统一校验);电梯按列表执行;若需「仍不得超过被访人 `floorList`」的硬约束,须在 **BFF、intelligent 或电梯增强**中择一层实现(见 §4、§5)。 |
#### 1.2.3 为什么调用方会选择「非空」(不依赖空列表)
| 动机 | 说明 |
|------|------|
| **与 UI/审批结果一致** | 登记页或审批单已确定可访楼层,开通时**显式写入**同一列表,避免电梯侧再解释「默认」。 |
| **多租户策略在域外已算完** | 推荐做法(§4):在第三方 BFF 做 `tenantAllow ∩ hostFloors`,把结果作为 `floorIds` 传入,电梯无需理解租户表。 |
| **避免 UC-01 与产品语义冲突** | 不传 `floorIds` 时电梯等价于「被访人 `floorList` 全集」;若产品要「小于全集」,**应传非空** `floorIds`,否则现网电梯逻辑无法满足。 |
| **集成契约清晰** | 显式列表便于审计、重放、幂等比对(可与登记快照 `effective_preview_json` 逐字一致)。 |
#### 1.2.4 `floorIds` 为空时:电梯侧补全(与上文对照)
当前电梯侧实现(`PersonRuleServiceImpl.addVisitor`)在 **`floorIds` 为空或缺省** 时:
1. 调用组织 **`/component/person/detail`**`personId` + `businessId`);
2. 将返回的 **`PersonResult.getFloorList()`** 赋给本次执行使用的楼层列表;
3. **不使用** `defaultFloor` 单字段作为补全依据。
因此:**仅在「调用方不传 `floorIds`」这一模式下**,现网电梯无法表达租户级收敛;多租户默认接待层需在 **调用方传非空 `floorIds`****电梯/ BFF 增强兜底** 中实现(见全文 §4、§6)。
### 1.3 文档目标
| 维度 | 目标 |
|------|------|
| **产品** | 定义租户策略、角色权限、配置流程、登记/邀约 **UX 与开通结果一致**、验收标准。 |
| **闭环** | 从**第三方系统在注册/邀约流程中初始化访客登记页**开始,明确**每个数据项从哪个系统、哪类接口获取**;经提交、审批(若有)到 **`add/visitor`** 生效,并给出**一致性校验**与回读建议。 |
| **技术** | 可选架构、推荐组合、数据模型与接口草案、改造边界、安全求交、**多租户默认访客楼层的实现路径综合评估**。 |
---
## 2. 端到端闭环:从第三方登记页初始化到派梯生效
本章回答:**登记页打开时要拉哪些数据、按什么顺序调接口、算出什么给 UI 存什么草稿、审批后如何与电梯开通对齐**,从而形成可审计、可测试的闭环。
### 2.1 闭环目标
| 目标 | 说明 |
|------|------|
| **同源计算** | 「页面上展示的预计可派梯楼层」与「最终调用 `add/visitor``floorIds`(或电梯兜底前的逻辑输入)」由**同一套规则函数**得出,避免两套逻辑漂移。 |
| **接口可追溯** | 每个 UI 字段可映射到**具体外部接口或本地配置**;本仓库已明确的接口见走查文档 §3~§4。 |
| **租户可配置** | `businessId`(机构 ID)贯穿上下文;租户策略变更后,**进行中的登记单**行为需在产品中定义(见 §2.7)。 |
### 2.2 阶段划分(第三方视角)
| 阶段 | 名称 | 参与系统 | 产出 |
|------|------|----------|------|
| **P0** | 登记页/邀约页 **初始化** | 第三方 + 组织 + 空间 +(可选)租户策略服务 | 表单默认值、`effectiveFloorsPreview`、可选楼层展示文案 |
| **P1** | 用户填写与 **校验** | 第三方前端 + 后端 | 通过校验的草稿 DTO |
| **P2** | **提交**登记/发起邀约 | 第三方 DB、工作流引擎 | 业务主键、状态机(待审批/已登记) |
| **P3** | **审批**(若存在) | 第三方审批流 | 通过/驳回;通过则触发 P4 |
| **P4** | **组织侧** 写入访客人员、拿到 `visitorId` | 组织/访客模块(**不在本仓库**,以实际 API 为准) | `visitorId` |
| **P5** | **派梯开通** | 第三方或 intelligent → **电梯** `POST /elevator/person/add/visitor` | 规则写入、图库绑定 |
| **P6** | **回读与告知** | 第三方查询电梯/通行结果或异步任务状态 | 与 P0 展示一致的「已开通楼层」说明 |
### 2.3 访客登记/邀约页:数据项定义与数据来源
下表面向**第三方业务系统**实现同学:列的是**逻辑字段**;物理表名由各自系统定义。接口路径以走查文档为准;**组织人员搜索**(选被访人)在走查中未展开,行内标注为**待对接清单**。
| 逻辑数据项 | 典型 UI 表现 | 数据来源 | 接口或服务(已知/占位) | 关键入参 / 出参 | 与租户楼层关系 |
|-------------|--------------|----------|---------------------------|-----------------|----------------|
| **租户/机构 ID** | 隐藏或顶部切换 | 登录态 / 网关注入 | 上下文 `businessId`,与 `CloudwalkCallContext.company` 一致 | `businessId` | 策略表主键维度 |
| **被访人 `personId`** | 选人组件 | **组织人员检索**(具体路径以 `ninca-common-component-organization` 或网关文档为准) | 占位:`POST .../person/page` 或等价检索 API | 选中行 → `personId` | 后续 `detail` 入参 |
| **被访人姓名/部门等展示** | 选人后回显 | 同上检索结果或二次 `detail` | 检索结果字段 **或** `POST /component/person/detail` | `PersonResult` 展示字段 | 非楼层核心 |
| **被访人授权楼层 ID 列表 `hostFloors`** | 一般不直接展示 ID | **组织**(与电梯 UC-01 同源) | **`POST /component/person/detail`** | 请求:`id`=被访人 `personId``businessId`;响应:`PersonResult.floorList` | 求交上界 |
| **`defaultFloor` / `floorInfoList` 等** | 若产品要展示「默认办公层」文案 | **组织** `detail` 同响应 | 同上 | `PersonResult.defaultFloor``floorInfoList` | **电梯补全不用 `defaultFloor`**;若 UI 用其展示,须与 `floorList` 语义对齐(走查 §8 风险 1) |
| **空间树/楼层名称** | 楼层中文名、楼栋 | **空间服务** `ninca-common` | **`POST /sysetting/zone/tree`**、**`POST /sysetting/zone/page`** | 用 `hostFloors``zoneId` **反查** `zoneName`、楼栋 | 仅展示增强 |
| **租户访客楼层策略** | 管理员配置页;登记页可不直接展示 | **租户策略存储**(自建表或配置中心) | 草案 §4.3 管理 API **或** 第三方本地表 + 管理端 | `policy_type``allow_zone_ids`、版本号 | **与 `hostFloors` 求交**得预览 |
| **`effectiveFloorsPreview`** | 「本次访问预计可开通派梯的楼层」 | **计算字段**(禁止手写死) | `computeEffective(policy, hostFloors, userOverride?)` | 输出 `List<zoneId>`,可附 `displayNames` | **必须与 P5 输入一致** |
| **访客可选楼层(若产品允许访客改)** | 多选框,默认选中 `effectiveFloorsPreview` | `effectiveFloorsPreview` 的子集 | 前端约束:用户勾选 ⊆ 预览集 | 提交 `userSelectedZoneIds` | 高敏租户可关闭多选 |
| **访客姓名、证件、事由、到访时间等** | 表单 | 用户输入 + 机构规则 | 第三方本地 | — | 与楼层正交 |
| **人脸/照片** | 采集/上传 | 用户 + 第三方存储 | 组织图库/人像接口以实际为准 | — | 走查未展开 |
| **策略版本号 `policyVersion`** | 可不展示 | 租户策略表 | 读取策略时返回 | 写入登记草稿 | 审计与回放 |
| **登记单草稿持久化** | — | 第三方 DB | 本地表建议字段:`draft_id, business_id, host_person_id, host_floors_snapshot_json, policy_snapshot_json, effective_preview_json, policy_version, status` | P5 时读出 `effective_preview` 或重算 | 支持审批前后回放 |
**不在本仓库的接口**(须在集成清单中单独列出):访客人员创建、`visitorId` 发放、审批流回调 URL、人像入库等——闭环在 P4 前依赖这些能力,本文仅要求:**P5 的 `floorIds` 与 P0 预览同源**。
### 2.4 接口编排顺序(推荐:登记页初始化一次请求链)
第三方**后端聚合接口**(推荐由自有 **BFF** 实现,避免前端直连多枚令牌)建议内部按序调用:
```
1) 校验 businessId、操作者权限
2) GET 租户访客楼层策略(若无则视为 HOST_FLOOR_LIST
3) POST /component/person/detailid=被访人 personId, businessId
→ 得 hostFloors = floorList(可能 null/空)
4) computeEffective(policy, hostFloors, requestedFromClient=null)
→ 若空:返回明确错误码,登记页展示「无法为该被访人开通访客派梯,请联系管理员」
5) 可选:POST /sysetting/zone/page 或 tree 子集调用,将 zoneId 映射为 zoneName / 楼栋
6) 返回给前端:{ hostPerson, effectiveFloorsPreview, displayNames, policyVersion, warnings }
```
前端**仅展示**第 6 步结果,**不在前端重复实现求交**(防篡改可签短期 token 或仅信服务端字段)。
### 2.5 可选:统一「预览」能力(降低集成方重复劳动)
可在 **第三方 BFF****intelligent** 增加只读接口(路径示例):
| 方法 | 路径(示例) | 入参 | 出参 |
|------|----------------|------|------|
| `POST` | `/api/visitor/register/preview-floors` | `businessId`, `hostPersonId`, 可选 `userSelectedZoneIds` | `hostFloors`, `tenantPolicy`, `effectiveZoneIds`, `displayFloors[]`, `policyVersion`, `canSubmit` |
**契约**`effectiveZoneIds` 的计算规则须与 P5 调用 `add/visitor` 时组装的 `floorIds` **完全一致**(同一服务端模块单元测试)。
### 2.6 P5 派梯开通:与登记页的衔接
| 路径 | 做法 |
|------|------|
| **推荐(方案 B** | 审批通过后,从登记单读出 **快照**或 **用相同函数重算**(若策略允许重算):组装 **`floorIds` = `effectiveZoneIds`**,调用 **`POST /elevator/person/add/visitor`**(或 `ElevatorPersonFeignClient.addVisitor`),走 **UC-02**。 |
| **兜底(方案 C/D** | 若历史集成方坚持不传 `floorIds`,则由电梯或 intelligent 在服务端求交(见 §4);登记页仍应按 §2.3 展示**与兜底后一致**的预览(通过同一预览 API 或文档约定算法)。 |
**时间参数**`begVisitorTime` / `endVisitorTime` 与走查一致,须与登记单有效期对齐。
### 2.7 闭环一致性:策略中途变更、重试与幂等
| 场景 | 产品建议 |
|------|----------|
| 管理员在**登记草稿未提交**时修改策略 | 下次打开登记页重新走 P0,**以新策略为准**。 |
| 草稿已提交、**待审批**期间策略变更 | 二选一并在需求中写死:**(a)** 审批节点展示「策略已变更请重审」并阻塞直到人工确认;**(b)** 以提交时刻 `policyVersion` **冻结**计算结果,审批通过仍按旧结果开通(需评估合规)。 |
| **审批通过瞬间**策略变更 | P5 使用**出队消息中的快照** `effective_preview_json`,避免 TOCTOU。 |
| 重复点击开通 | `visitorId` + 时间窗幂等;与电梯侧是否已存在规则引用需对齐(可查电梯侧人员规则再调,属增强项)。 |
### 2.8 端到端泳道图(闭环)
```mermaid
sequenceDiagram
participant U as 访客用户
participant FE as 第三方前端
participant BFF as 第三方BFF
participant Pol as 租户策略存储
participant Org as 组织 person/detail
participant Zone as 空间 zone/tree|page
participant Reg as 第三方登记库
participant Apv as 审批流
participant OrgW as 组织写访客
participant Elv as 电梯 add/visitor
U->>FE: 打开登记页
FE->>BFF: 初始化(被访人personId)
BFF->>Pol: 读策略(businessId)
BFF->>Org: detail(personId)
Org-->>BFF: floorList
BFF->>BFF: computeEffective
opt 展示楼层名
BFF->>Zone: page/tree(zoneIds)
Zone-->>BFF: names
end
BFF-->>FE: 预览+policyVersion
U->>FE: 填写并提交
FE->>BFF: 提交草稿
BFF->>Reg: 持久化快照
Reg-->>FE: draftId
opt 需审批
BFF->>Apv: 发起
Apv-->>BFF: 通过+token
end
BFF->>OrgW: 创建访客→visitorId
BFF->>Elv: add/visitor(visitorId,personId,floorIds=effective,...)
Elv-->>BFF: 成功/失败
BFF-->>FE: 结果与楼层说明
```
---
## 3. 产品方案
### 3.1 目标用户与角色
| 角色 | 职责 |
|------|------|
| **平台/租户管理员** | 在本机构内配置「访客默认楼层策略」、维护允许的 `zoneId` 列表或与楼栋的映射、查看审计日志。 |
| **被访人员工** | 日常办公权限仍在组织侧维护;不强制要求其理解访客策略。 |
| **访客** | 通过邀约/登记获得限时通行;仅应看到**实际可派梯楼层**(与开通结果一致)。 |
| **运维/实施** | 将「28 楼」等业务语言映射为空间服务中的 **`zoneId`**,并录入策略或导入模板。 |
### 3.2 用户故事(示例)
1. **作为租户管理员**,我希望为本机构配置「访客默认仅开放指定楼层集合」,以便满足物业/合规对访客活动范围的要求。
2. **作为租户管理员**,我希望可选策略为「与员工授权楼层求交」或「固定楼层但必须仍在员工授权内」,以便在**不放大访客权限**的前提下简化配置。
3. **作为访客业务系统**,在调用电梯开通接口时,我可以在不传 `floorIds` 的情况下仍得到符合租户策略的派梯结果(若采用电梯或 BFF 兜底策略)。
4. **作为访客**,我在登记完成前看到的「可访问楼层」说明,应与最终开通的楼层**一致**,避免纠纷。
### 3.3 策略类型(产品枚举建议)
| 策略代码(建议) | 产品名称 | 行为摘要 | 适用场景 |
|------------------|----------|----------|----------|
| `HOST_FLOOR_LIST` | 与现网 UC-01 一致 | 不传 `floorIds` 时,等价于被访人 **`floorList` 全集** | 默认租户、未配置策略时的回退 |
| `INTERSECT_ALLOWLIST` | 租户允许列表 ∩ 被访人楼层 | 最终楼层 = **`allowZoneIds``floorList`**(交集为空则失败并提示) | **广发基金类**:员工多层、访客只允许接待层等 |
| `FIXED_ZONES` | 固定楼层(仍 ∩ 被访人) | 最终楼层 = **`fixedZoneIds``floorList`** | 强固定少量楼层且必须与员工授权一致 |
| `EXPLICIT_ONLY` | 仅显式开通 | 业务侧**必须**传 `floorIds`(等价 UC-02);租户策略关闭「空列表自动补全」 | 金融高敏楼栋 |
**产品原则(建议写进需求)**:凡涉及「租户默认/固定楼层」的,**最终生效楼层必须 ⊆ 被访人 `floorList`**(安全底线,见第 5 章)。
### 3.4 管理端功能清单(MVP → 完整)
**MVP(最小可用)**
- 租户级开关:是否启用「访客楼层策略」。
- 策略类型选择 + **允许楼层多选**(选项数据来自空间树 `/sysetting/zone/tree` 或分页接口,与走查文档一致)。
- 保存后**审计**:操作人、时间、前后 JSON 快照。
**增强**
- 按**楼栋**分别配置(多栋园区)。
- 按**被访部门**或**职级**附加规则(优先级:部门规则 > 租户默认)。
- 导入/导出 CSV`businessId, zoneName, zoneId`)。
- 与「访客类型」联动(VIP 可走多层等,需单独权限模型)。
### 3.5 验收标准(补充闭环相关)
| 编号 | 场景 | 期望 |
|------|------|------|
| AC-1 | 租户配置「允许 {28F}」,被访人 `floorList` 含 28F 与其它层 | 不传 `floorIds` 时(若走兜底),访客**仅**开通 28F |
| AC-2 | 同上,被访人 `floorList` **不含** 28F | **开通失败**,返回明确错误(禁止静默落到其它层) |
| AC-3 | 租户未配置策略 | 行为与现网 **UC-01** 一致 |
| AC-4 | 业务显式传 `floorIds`UC-02 | **以传入为准**(或启用「显式也求交」须在集成合同写明) |
| AC-5 | 注册前 UI 展示楼层 | 与 `add/visitor` **最终生效楼层**一致(含策略与求交) |
| **AC-6** | 登记页初始化与 P5 开通相隔任意时间(策略不变) | **两次 `computeEffective` 结果一致**(或均使用快照) |
| **AC-7** | 仅改展示文案、不改服务端 | **禁止**;展示必须以服务端预览为准 |
---
## 4. 技术方案
### 4.1 方案族对比
| 方案 | 实现位置 | 优点 | 缺点 | 新租户扩展 |
|------|----------|------|------|------------|
| **A. 组织侧收窄 `floorList`** | `ninca-common-component-organization` | 不改电梯;与 UC-01 完全一致 | 员工本人权限与「访客可继承列表」易混 | 每租户数据治理 |
| **B. 业务/访客层显式传 `floorIds`** | 第三方 BFF:登记页与 P5 **同源计算** | 不改电梯;闭环最清晰(UC-02) | 多调用入口需统一 | 租户表在**业务库** |
| **C. 电梯侧策略引擎** | `PersonRuleServiceImpl.addVisitor` | 直连电梯的旧集成也能兜底 | 电梯存策略、发版耦合 | `businessId` 维表 |
| **D. intelligent BFF** | `intelligent-cwoscomponent-rest` | 不直接改电梯包 | 绕过 intelligent 的直连须约束 | 表可在 intelligent 库 |
| **E. 配置中心** | Nacos 等 | 变更快 | 审计弱 | 适合灰度,长期建议落库 |
**推荐组合(工程上较稳)**
1. **首选****方案 B** — 第三方 **BFF****P0 与 P5 共用** `computeEffective``add/visitor` **始终传 `floorIds`**
2. **可选兜底****方案 C 或 D** 仅在 `floorIds` 为空时求交;登记页预览仍应调用**同一预览逻辑**(可部署在 BFF 或 D),避免「兜底路径」与「预览路径」算法分叉。
### 4.2 核心算法(推荐伪代码)
设:
- `hostFloors` = 组织 `detail` 返回的 `floorList`(可能为空)。
- `tenantAllow` = 租户配置的允许访客楼层 `zoneId` 集合。
- `requested` = 调用方传入的 `floorIds`(可能为空)。
```
if requested 非空:
effective = requested // 默认信任;高敏合同可改为 requested ∩ tenantAllow ∩ hostFloors
else:
effective = tenantAllow ∩ hostFloors // 或 policy=HOST 时 tenantAllow 视为全集
if effective 为空:
返回业务错误(勿继续 zone page / insert
```
**电梯 `addVisitor` 当前风险点**:补全后未校验空列表即使用 `floorIds.get(0)`。无论采用何种产品方案,**建议在生效列表计算完成后统一做空集校验**,与 [UC-04](访客注册与派梯楼层业务流程走查.md) 治理合并。
### 4.3 数据模型草案(租户策略落库)
```sql
CREATE TABLE tenant_visitor_floor_policy (
id VARCHAR(32) PRIMARY KEY,
business_id VARCHAR(64) NOT NULL COMMENT '机构/租户 ID',
policy_type VARCHAR(32) NOT NULL,
allow_zone_ids TEXT COMMENT 'JSON 数组 zoneId',
building_id VARCHAR(64) COMMENT '可选',
enabled TINYINT(1) NOT NULL DEFAULT 1,
policy_version BIGINT NOT NULL DEFAULT 1 COMMENT '每次更新+1,供登记快照引用',
remark VARCHAR(256),
created_by VARCHAR(64),
created_at BIGINT,
updated_by VARCHAR(64),
updated_at BIGINT,
UNIQUE KEY uk_biz_building (business_id, building_id)
);
```
**缓存**:按 `businessId` 缓存;更新策略时递增 `policy_version` 并使缓存失效。
### 4.4 管理 API 草案(REST
| 方法 | 路径 | 说明 |
|------|------|------|
| `GET` | `/admin/tenant/{businessId}/visitor-floor-policy` | 查询当前策略 |
| `PUT` | `/admin/tenant/{businessId}/visitor-floor-policy` | 全量更新;**递增** `policy_version` |
| `POST` | `/admin/tenant/{businessId}/visitor-floor-policy/preview` | body`hostPersonId`;返回与登记页同源结构 |
### 4.5 电梯服务改造要点(若采用方案 C)
见前文;补充:**登记页预览若不走电梯**,则电梯内求交逻辑须与 BFF **算法对齐**(共享库或 OpenAPI 生成的客户端 stub 中携带版本号)。
### 4.6 「28 楼」与 zoneId 映射
- 空间:**`/sysetting/zone/tree`**、**`/sysetting/zone/page`**(走查 §3.2)。
- 台账:`businessId``buildingId``display_name``zoneId`、生效日期。
### 4.7 兼容性与集成契约
| 项目 | 建议 |
|------|------|
| **与 UC-02** | 集成合同写明:`floorIds` 非空是否二次求交。 |
| **幂等** | 审批消息带 `draft_id` + `effective_hash`P5 去重。 |
| **版本** | 请求带 `policyVersion`,与快照比对可告警。 |
---
## 5. 安全与合规
1. **权限上界**:访客生效楼层 ⊆ 被访人 **`floorList`**。
2. **禁止静默降级**:交集为空则失败并记录。
3. **审计**:策略变更、预览请求、开通请求(可采样)。
4. **数据隔离**:所有查询带 `businessId`
---
## 6. 多租户「默认访客楼层」实现路径综合评估
在已具备 **§2 闭环**(登记页初始化 → 快照 → 审批 → `add/visitor`)的前提下,对各实现路径按维度打分(**高 / 中 / 低** 为实施与维护成本或风险的主观分级,供选型会使用)。
### 6.1 评估维度说明
| 维度 | 含义 |
|------|------|
| **登记页契合** | 能否自然地在 **P0** 提供准确预览、少调接口。 |
| **闭环一致性** | 单源计算、快照、防 TOCTOU 是否易实现。 |
| **新租户成本** | 新开租户时配置、实施、回归工作量。 |
| **入侵性** | 对电梯/组织/第三方存量改动的范围。 |
| **绕过风险** | 存在不经过 BFF 直连电梯时是否仍安全。 |
### 6.2 综合对比表
| 路径 | 登记页契合 | 闭环一致性 | 新租户成本 | 入侵性 | 绕过风险 | 结论 |
|------|------------|------------|------------|--------|----------|------|
| **B:第三方 BFF + 显式 `floorIds`** | **高**BFF 聚合 detail+策略+zone | **高**(同函数+快照) | **低**(插策略行 + 空间台账) | **低**(电梯可不改) | **中**(依赖网关禁止直连) | **首推** |
| **Dintelligent 预览 + 转发** | **高** | **高**(预览与转发同模块) | **中**(需发布 intelligent | **中** | **中** | 适合已统一走 intelligent 的客户 |
| **C:仅电梯兜底** | **低**(预览仍需别处算,否则与 UI 不一致) | **中**(易双算法) | **低** | **高** | **低** | 作**兜底**,不宜单独承担预览 |
| **A:仅组织改 `floorList`** | **中** | **中**(与员工权限耦合) | **高**(组织数据治理难) | **高** | **低** | 仅当组织域已区分访客继承列时考虑 |
| **B + C** | **高** | **高** | **低** | **中** | **低** | **大型项目推荐**B 主路径 + C 防直连漏传 |
### 6.3 新租户接入检查清单(SOP)
1. 在空间服务确认 **`zoneId`** 与接待层名称。
2. 在租户策略表插入 **`business_id` + `INTERSECT_ALLOWLIST` + allow_zone_ids**(或走管理端保存)。
3. 第三方 BFF 配置 **Nexus/网关** 指向组织与空间。
4. 跑通 **P0 预览****P5 add/visitor** 自动化用例(覆盖 AC-1~AC-7)。
5. 培训租户管理员:**改策略会影响后续新单**;进行中单据策略见 §2.7。
---
## 7. 实施路线(建议阶段)
| 阶段 | 内容 | 产出 |
|------|------|------|
| **0** | 盘点所有 `add/visitor` 入口;登记页是否已有 `detail` 调用 | 调用方与数据项缺口表 |
| **1** | 定稿:§2.3 数据项表 + §2.7 策略变更策略 + AC-6/7 | PRD、接口契约 |
| **2** | 实现 BFF 聚合初始化 + 登记快照 + P5 显式 `floorIds` | 广发基金类租户上线 |
| **3** | 可选:电梯空列表校验 + C/D 兜底 + 监控 | 零 NPE、直连防护 |
---
## 8. 测试用例矩阵(摘录)
| ID | 阶段 | 条件 | 期望 |
|----|------|------|------|
| T0 | P0 | 被访人无 `floorList` | 预览失败,禁止提交 |
| T1 | P0→P5 | INTERSECT,有交集 | 预览与开通均为交集 |
| T6 | P0→P5 | 审批期间策略变更 + 冻结快照 | 开通结果与提交时预览一致 |
| T7 | P0 | 仅前端改楼层展示 | 服务端拒绝或覆盖(AC-7) |
(原 T1~T5 矩阵仍适用于纯开通层逻辑,可与上表合并维护。)
---
## 9. 文档版本与维护
| 项目 | 内容 |
|------|------|
| 输出路径 | `docs/business/租户访客默认楼层技术产品方案.md` |
| 依据代码 | `maven-cw-elevator-application``maven-intelligent-cwoscomponent`;闭环 P4 依赖组织访客 API(仓外) |
| 修订触发 | 登记页字段增减;`person/detail` 字段变更;`add/visitor` 契约变更 |
---
*本文档为方案级输出;组织人员检索、访客建档等接口以实际部署与网关路由为准。表结构与路径在实施前需经安全评审。*
@@ -0,0 +1,323 @@
# 访客注册与派梯楼层:完整业务流程走查
> **范围说明**:本文基于本仓库内 Maven 工程源码(`maven-cw-elevator-application`、`maven-intelligent-cwoscomponent` 等)梳理**接口调用链、业务逻辑与用例**。
> **访客业务后台**(如「轻舟 / intelligent/three」访客注册、审批流)若不在本仓库,文中以「第三方业务系统」统称,并标明本仓库可见的**被调接口**与**出站 Feign/HTTP**。
---
## 1. 术语与角色
| 术语 | 含义 |
|------|------|
| 第三方业务系统 | 访客注册、邀约、审批等上层应用;可经 intelligent 组件或直接调电梯服务 |
| 组织人员服务 | `ninca-common-component-organization`(可配置),提供人员详情、图库人员绑定等 |
| 空间/区域服务 | `ninca-common``/sysetting/zone`,提供楼栋-楼层树、分区 page |
| 电梯应用 | `cw-elevator-application`,维护派梯规则 `image_rule_ref`、设备图库绑定等 |
| 被访人 | `personId`,组织侧人员主键 |
| 访客 | `visitorId`,组织侧访客人员主键 |
| 楼层 | 以 **分区/空间 ID**`zoneId` / `floorId`)表示,与 `PersonResult.floorList` 元素一致 |
---
## 2. 业务总览(从「默认楼层」到「指定楼层」)
```mermaid
flowchart TB
subgraph third [第三方业务系统]
A[访客注册/邀约完成]
B{是否已知具体楼层 zoneId 列表?}
C[调组织服务拉人员详情]
D[组装 floorIds 显式列表]
end
subgraph org [组织人员服务 ninca-common-component-organization]
P["POST /component/person/detail"]
I["POST /component/imagestore/person/batchBind 等"]
end
subgraph intel [intelligent-cwoscomponent-rest 可选]
E["ElevatorPersonService.addVisitor → Feign"]
end
subgraph elev [电梯 cw-elevator-application]
F["POST /elevator/person/add/visitor"]
G["PersonRuleServiceImpl.addVisitor"]
end
A --> B
B -->|否 需默认| C
C --> P
P -->|PersonResult.floorList| third
B -->|是 或 已补全| D
D --> E
C --> E
E --> F
F --> G
G -->|缺 floorIds 时内部再调 P 取 floorList| P
G --> I
```
**要点**
- 「**默认有哪些楼层**」在本仓库电梯侧的实现是:**未传 `floorIds` 时**,调用 **`PersonService.detail`**Feign → **`POST /component/person/detail`**),取 **`PersonResult.getFloorList()`****不是** `PersonResult.defaultFloor` 单字段。
- 「**第三方设定具体楼层**」:**在请求体中携带非空的 `floorIds`** 调用 **`POST /elevator/person/add/visitor`**(或经 `ElevatorPersonService` 转发),电梯侧**不再**调人员详情补楼层。
---
## 3. 流程 A:第三方如何获知「默认」楼层(可走的接口)
第三方若**自行**在注册前展示「被访人默认可达楼层」,应在**组织侧**完成数据拉取;本仓库可见的**权威数据源**为人员详情返回的 **`floorList`**(及可能同时返回的 `defaultFloor``floorInfoList` 等,但电梯访客派梯**仅用** `floorList` 补全逻辑)。
### 3.1 推荐:人员详情(与电梯补全逻辑一致)
| 项目 | 内容 |
|------|------|
| 调用方 | 任意有权限的服务;intelligent 中为 `RestPersonServiceImpl``PersonFeignClient` |
| 服务名配置 | `${feign.component-organization.name:ninca-common-component-organization}` |
| HTTP | **`POST /component/person/detail`** |
| 请求体 | `PersonDetailParam``id` = 被访人 `personId``businessId` = 机构 |
| 响应 | `CloudwalkResult<PersonResult>`,关注 **`floorList`**`List<String>` 楼层/分区 ID |
代码位置(Feign 声明):
```19:32:maven-intelligent-cwoscomponent/intelligent-cwoscomponent-rest/src/main/java/cn/cloudwalk/rest/cwoscomponent/intelligent/person/feign/PersonFeignClient.java
@FeignClient(name = "${feign.component-organization.name:ninca-common-component-organization}",
path = "/component/person", fallback = PersonFeignClientFallback.class)
public interface PersonFeignClient {
...
@RequestMapping(value = {"/detail"}, method = {RequestMethod.POST})
CloudwalkResult<PersonResult> detail(@RequestBody PersonDetailParam paramPersonDetailParam);
```
`PersonResult` 中与楼层相关的字段(电梯 `addVisitor` **补全时只用 `floorList`**):
```27:34:maven-intelligent-cwoscomponent/intelligent-cwoscomponent-interface/src/main/java/cn/cloudwalk/client/cwoscomponent/intelligent/person/result/PersonResult.java
private String defaultFloor;
private String chooseFloor;
private List<String> floorList;
private List<AcsPassRuleImageResultDto> floorInfoList;
...
private String defaultChooseFloor;
```
### 3.2 辅助:空间树 / 楼层分页(电梯网关或管理端常用)
| 项目 | 内容 |
|------|------|
| Feign | `ZoneFeignClient` → `${feign.ninca-common.name:ninca-common}` |
| HTTP | **`POST /sysetting/zone/tree`**、**`POST /sysetting/zone/page`** |
| 用途 | 按楼栋展示树、按条件查分区;**不替代**人员已授权楼层列表 |
```16:23:maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/zone/client/ZoneFeignClient.java
@FeignClient(name = "${feign.ninca-common.name:ninca-common}", path = "/sysetting/zone",
fallback = ZoneFeignClientFallback.class)
public interface ZoneFeignClient {
@RequestMapping(value = {"/tree"}, method = {RequestMethod.POST})
...
@RequestMapping(value = {"/page"}, method = {RequestMethod.POST})
CloudwalkResult<CloudwalkPageAble<ZoneResult>> page(ZoneQueryParam paramZoneQueryParam) throws ServiceException;
}
```
### 3.3 辅助:通行规则-楼层列表(管理派梯规则维度)
| 项目 | 内容 |
|------|------|
| Controller | `AcsPassRuleController` |
| HTTP | **`POST /elevator/passRule/floor`** 等 |
| 用途 | 规则/图库与楼层关系维护与查询;与「人员 floorList」不同维度 |
```45:55:maven-cw-elevator-application/cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java
@RequestMapping({"/floor"})
public CloudwalkResult<CloudwalkPageAble<AcsPassRuleFloorResult>>
listFloor(@RequestBody AcsPassRuleFloorForm form) {
...
return this.imageRuleRefService.listFloor(param, getCloudwalkContext());
```
### 3.4 访客记录查询(识别访客身份,非楼层来源)
电梯乘梯记录中通过 **RestTemplate** 调 **`intelligent/three/visitor/record/query`**,用于判断是否访客及被访人,**不参与** `addVisitor` 楼层列表计算:
```262:274:maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/record/impl/AcsElevatorRecordServiceImpl.java
URI uri =
combineAuthClientURI("intelligent/three/visitor/record/query", (MultiValueMap<String, String>)null);
VisitorRecordQueryParam form = new VisitorRecordQueryParam();
form.setVisitorId(addDTO.getRecognitionFaceId());
...
```
另有 Feign **`VisitorFeignClient`**`ninca-crk-std` 的 **`/intelligent/visitor/record/query`**,与上为不同网关路径,同属访客记录查询能力。
---
## 4. 流程 B:第三方设定「具体楼层」并开通访客派梯
### 4.1 对外 HTTP(电梯应用)
| 项目 | 内容 |
|------|------|
| Method / Path | **`POST /elevator/person/add/visitor`** |
| Controller | `AcsPersonController#addVisitor` |
| Body | `AcsPersonAddVisitorForm` → `AcsPersonAddVisitorParam` |
```53:62:maven-cw-elevator-application/cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/person/controller/AcsPersonController.java
@RequestMapping({"/add/visitor"})
public CloudwalkResult<Boolean> addVisitor(@RequestBody AcsPersonAddVisitorForm form) {
AcsPersonAddVisitorParam param =
(AcsPersonAddVisitorParam)BeanCopyUtils.copyProperties(form, AcsPersonAddVisitorParam.class);
try {
return this.personRuleService.addVisitor(param, getCloudwalkContext());
```
### 4.2 经 intelligent 的 Feign(业务方 SDK 式调用)
| 项目 | 内容 |
|------|------|
| 接口 | `ElevatorPersonService.addVisitor` |
| 实现 | `RestElevatorPersonServiceImpl` |
| Feign | `ElevatorPersonFeignClient` |
| 目标 | `${feign.elevator.name:elevator-app}` **`POST /elevator/person/add/visitor`** |
```11:15:maven-intelligent-cwoscomponent/intelligent-cwoscomponent-rest/src/main/java/cn/cloudwalk/rest/cwoscomponent/intelligent/elevator/feign/ElevatorPersonFeignClient.java
@FeignClient(name = "${feign.elevator.name:elevator-app}", path = "/elevator/person",
fallback = ElevatorPersonFeignClientFallback.class)
public interface ElevatorPersonFeignClient {
@RequestMapping(value = {"/add/visitor"}, method = {RequestMethod.POST})
CloudwalkResult<Boolean> addVisitor(@RequestBody AcsPersonAddVisitorParam paramAcsPersonAddVisitorParam);
```
### 4.3 请求字段语义(用例输入)
| 字段 | 必填性 | 说明 |
|------|--------|------|
| `visitorId` | 是 | 访客在组织侧人员 ID |
| `personId` | 是 | 被访人 ID;**补全楼层时**用于 `detail` |
| `begVisitorTime` / `endVisitorTime` | 视图库接口 | 传入图库绑定有效期 |
| `floorIds` | 否 | **非空**:第三方显式指定可派梯楼层;**空/缺省**:由电梯侧按被访人 **`floorList`** 补全 |
---
## 5. 电梯侧核心业务逻辑:`PersonRuleServiceImpl.addVisitor`
实现类:`PersonRuleServiceImpl``maven-cw-elevator-application/.../PersonRuleServiceImpl.java`)。
### 5.1 步骤分解
| 步骤 | 逻辑 | 外部依赖 |
|------|------|----------|
| 1 | 若 `floorIds` 为空 → `PersonDetailParam(personId, businessId)` → **`personService.detail`** | Feign → **`POST /component/person/detail`**,取 **`getFloorList()`** 赋给 `floorIds` |
| 2 | 用 **`floorIds.get(0)`** 构造 `ZoneQueryParam`**`zoneService.page`** 查分区页,取首条 `ZoneResult` 得 **`parentId`(楼栋)** | Feign → **`POST /sysetting/zone/page`** |
| 3 | **`deviceImageStoreDao.getByBuildingId(parentId)`** 得图库 `imageStoreId` | 本地 DAO |
| 4 | 对 **每个 `floorId`**`imageRuleRefDao.getDefaultByZoneId(floorId)` 取默认通行规则,组装 **`ImageRuleRefAddDto`**(访客 `visitorId` 挂父规则) | 本地 DAO |
| 5 | **`imageRuleRefDao.insertList`** 批量写入派梯规则引用 | 本地 DAO |
| 6 | 组装 **`ImageStorePersonBindParam`**(图库、访客 ID、有效期),**`imageStorePersonService.batchBind`** | Feign → **`POST /component/imagestore/person/batchBind`** |
| 7 | **`imageStorePersonService.updateGroupPersonRef`** 更新组与人员引用 | Feign → **`POST /component/imagestore/person/updateGroupPersonRef`** |
关键代码(补全楼层 + 循环写规则 + 绑图库):
```170:223:maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/person/impl/PersonRuleServiceImpl.java
if (CollectionUtils.isEmpty(param.getFloorIds())) {
PersonDetailParam detailParam = new PersonDetailParam();
detailParam.setId(param.getPersonId());
detailParam.setBusinessId(context.getCompany().getCompanyId());
CloudwalkResult<PersonResult> detail = this.personService.detail(detailParam, context);
param.setFloorIds(((PersonResult)detail.getData()).getFloorList());
}
ZoneQueryParam zoneQueryParam = new ZoneQueryParam();
zoneQueryParam.setId(param.getFloorIds().get(0));
...
for (String floorId : param.getFloorIds()) {
ImageRuleRefResultDto defaultRule = this.imageRuleRefDao.getDefaultByZoneId(floorId);
...
addDto.setPersonId(param.getVisitorId());
...
}
...
CloudwalkResult<ImgStoreBatchBindPersonResult> bindResult =
this.imageStorePersonService.batchBind(imageStorePersonBindParam, context);
...
this.imageStorePersonService.updateGroupPersonRef(refParam, context);
```
图库 Feign(与上表一致):
```19:41:maven-intelligent-cwoscomponent/intelligent-cwoscomponent-rest/src/main/java/cn/cloudwalk/rest/cwoscomponent/intelligent/imagestore/feign/ImageStorePersonFeignClient.java
@FeignClient(name = "${feign.component-organization.name:ninca-common-component-organization}",
path = "/component/imagestore/person", fallback = ImageStorePersonFeignClientFallback.class)
public interface ImageStorePersonFeignClient {
...
@RequestMapping(value = {"/batchBind"}, method = {RequestMethod.POST})
CloudwalkResult<ImgStoreBatchBindPersonResult>
batchBind(@RequestBody ImageStorePersonBindParam paramImageStorePersonBindParam);
@RequestMapping(value = {"/updateGroupPersonRef"}, method = {RequestMethod.POST})
CloudwalkResult<Boolean>
updateGroupPersonRef(@RequestBody UpdateGroupPersonRefParam paramUpdateGroupPersonRefParam);
```
### 5.2 与「内部员工」派梯开通的对比(非访客)
**`POST /elevator/person/add`** → `PersonRuleServiceImpl.add`:按**单个** `zoneId`(楼层)与 `parentId`(楼栋)给多名 **`personIds`** 写规则并绑图库;**不**调人员 `detail` 取 `floorList`。用于从已有人员批量加通行权限的另一条业务线。
```79:136:maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/person/impl/PersonRuleServiceImpl.java
public CloudwalkResult<Boolean> add(AcsPersonAddParam param, CloudwalkCallContext context) throws ServiceException {
...
ImageRuleRefResultDto defaultRule = this.imageRuleRefDao.getDefaultByZoneId(param.getZoneId());
...
for (String personId : param.getPersonIds()) {
...
addDto.setZoneId(param.getZoneId());
```
---
## 6. 接口调用流转汇总表
| 序号 | 调用方向 | 协议与路径 | 典型触发 |
|------|----------|------------|----------|
| 1 | 第三方 / intelligent → 电梯 | `POST /elevator/person/add/visitor` | 访客开通派梯 |
| 2 | 电梯 → 组织 | `POST /component/person/detail` | `floorIds` 为空时补全 |
| 3 | 电梯 → 空间 | `POST /sysetting/zone/page` | 取楼层所属楼栋 |
| 4 | 电梯 → 组织 | `POST /component/imagestore/person/batchBind` | 访客绑图库 |
| 5 | 电梯 → 组织 | `POST /component/imagestore/person/updateGroupPersonRef` | 更新组人关系 |
| 6 | 第三方自行(可选) | `POST /component/person/detail` | 注册前展示默认可达楼层 |
| 7 | 管理端(可选) | `POST /elevator/passRule/floor` 等 | 规则/楼层维护 |
| 8 | 电梯 → 网关 HTTP | `POST intelligent/three/visitor/record/query` | 乘梯记录识别访客 |
---
## 7. 用例(UC)说明
| 用例 ID | 名称 | 前置条件 | 主流程 | 期望结果 |
|---------|------|----------|--------|----------|
| UC-01 | 访客派梯-使用被访人默认楼层列表 | 被访人 `personId` 在组织侧 `detail` 返回**非空** `floorList`;访客已注册 | 调 `add/visitor` 且 **不传 `floorIds`** | 电梯取 `floorList` 为访客写入各层默认规则并绑图库 |
| UC-02 | 访客派梯-第三方指定楼层 | `floorIds` 为合法 zoneId 列表 | 调 `add/visitor` 且 **传入 `floorIds`** | **不再**调 `person/detail` 补楼层;按列表写规则 |
| UC-03 | 注册前展示「可访楼层」 | 需与被访人授权一致 | 第三方先调 **`/component/person/detail`**,展示 `floorList`(或产品定义的 `defaultFloor` 映射) | UI 与电梯补全逻辑对齐(若仅用 `defaultFloor` 需与产品确认是否与 `floorList` 一致) |
| UC-04 | `floorList` 为空 | 被访人无派梯楼层 | `add/visitor` 不传 `floorIds` | `floorIds` 仍为空 → 后续 `get(0)` 等**可能异常**;第三方应校验或传显式楼层 |
| UC-05 | 内部人员加单层派梯 | 已知 `zoneId`、楼栋 `parentId` | `POST /elevator/person/add` | 单层规则 + 图库绑定 |
| UC-06 | 乘梯记录标记访客 | 识别到人脸 | 记录服务调 **`visitor/record/query`** | 回填 `isVisitor`、被访人 |
**扩展(租户访客默认楼层)**:若需「在 UC-01 不传 `floorIds` 的前提下,按租户策略收敛访客楼层(如默认仅开放某接待层)」的产品与技术设计,以及**从第三方登记页初始化数据项、接口编排到 `add/visitor` 的端到端闭环**,见 [租户访客默认楼层技术产品方案](租户访客默认楼层技术产品方案.md)(文中 **§2**)。
---
## 8. 风险与待确认项(走查结论)
1. **`PersonResult.defaultFloor` 与 `floorList`**:电梯 `addVisitor` **仅使用 `floorList`**。若产品「默认访问楼层」对应 `defaultFloor` 标量,需核对组织服务是否在 `detail` 中把二者对齐,否则存在**语义偏差**。
2. **`floorIds.get(0)`**:补全后若列表为空,会在取首元素时失败;第三方或组织数据需保证一致性。
3. **`cwos-sdk-event` 等**与本文无关的依赖问题不影响本业务链结论。
4. **访客注册主流程**(表单、审批、写组织人员表)若在三方工程,需在对应仓库继续搜 **`ElevatorPersonService`**、**`addVisitor`**、**`/elevator/person/add/visitor`** 的引用以闭合「从注册到派梯」的端到端文档。
---
## 9. 文档版本信息
| 项目 | 内容 |
|------|------|
| 输出路径 | `docs/business/访客注册与派梯楼层业务流程走查.md` |
| 依据代码根目录 | `maven-cw-elevator-application`、`maven-intelligent-cwoscomponent` |
| 说明 | 外部服务行为以接口契约为准,组织服务内部如何组装 `floorList` 需在 **ninca-common-component-organization** 源码中二次走查 |
---
*本文档由代码走查自动生成梳理,若接口路径随部署配置变化,请以运行环境 `application*.yml` 中 `feign.*` 为准。*
@@ -0,0 +1,357 @@
# 访客邀约与派梯楼层一致性梳理
> **文档用途**:把「邀约页展示的楼层」与「电梯开通权限实际生效的楼层」如何在现有代码中对齐,用大白话 + 源码位置一并说明,便于产品、集成与排障。
> **关联文档**:[访客与电梯业务完整说明](../../maven-cw-elevator-application/cw-elevator-application-service/docs/08-visitor-registration-and-elevator-auth.md)、[租户访客默认楼层技术产品方案](租户访客默认楼层技术产品方案.md)、[租户访客策略迁入组织规格](../superpowers/specs/2026-05-06-tenant-visitor-policy-organization-implementation.md)、[**租户访客楼层策略 — 代码重构实施指南**](租户访客楼层策略-代码重构实施指南.md)(落地步骤与阶段划分)。
---
## 1. 一句话原则
**所有环节只信同一串楼层 ID**:能去哪几层,应在**拉被访人详情**时由组织侧算清(含租户默认楼层策略时写入 `floorList`);邀约登记把用户选定写进自己的业务单;**派梯时把这份楼层列表放进请求里的 `floorIds`**,电梯就按这一串执行。**不要用「人员列表分页」等接口顶替详情里的楼层主数据。**
---
## 2. 大白话说明
| 诉求 | 做法 |
|------|------|
| 邀约和派梯不要两套楼层 | 选人后楼层候选以 **`PersonService.detail`(组织 `/component/person/detail`)→ `floorList`** 为准;租户「默认只开放某几层」应在组织 **`detail` 链路内完成策略替代后再返回(规范见 §5,落地状态见 §6)。 |
| 邀约单已经定了访问楼层 | 后续 **`POST /elevator/person/add/visitor` 必须把邀约单里保存的那串楼层放进 `floorIds`**;电梯**不会**根据邀约单号去数据库查记录——**只认本次 HTTP 参数**。 |
| 派梯请求不传楼层 | 电梯会用 **被访人详情里的 `floorList`** 作为生效楼层,**不会**自动对齐你们库里存的邀约楼层——若要与邀约一致,**集成侧应始终传 `floorIds`**。 |
---
## 3. 时序图(实现归属:组织侧 / 电梯侧 / 集成侧)
**图例**
| 标注 | 含义 |
|------|------|
| **组织侧** | `maven-ninca-common-component-organization``PersonController``ImgPersonServiceImpl#detail`、组织库、(规范中的)租户访客策略服务 |
| **电梯侧** | `maven-cw-elevator-application``AcsPersonController``PersonRuleServiceImpl#addVisitor`、电梯库 `image_rule_ref` / `zone` / 楼栋图库映射等 |
| **Intelligent** | `maven-intelligent-cwoscomponent``PersonService.detail` → Feign 调组织 `/component/person/detail` |
| **集成侧** | 第三方 / BFF / 访客业务库:邀约单持久化、派梯前组装 `floorIds`(电梯代码中无邀约表) |
### 3.0 端到端:访客建档在前、派梯在后(推荐集成顺序)
典型闭环:**先**完成 **访客人员建档** 并得到 **`visitorId`**(平台人员主键),**再**调用 **`POST /elevator/person/add/visitor`**。邀约页拉 **`detail`**、保存 **`floorIds`** 可与建档分步编排;但 **`addVisitor` 必须在建档成功之后调用**(电梯侧不写访客主数据,见 §4.4)。
```mermaid
sequenceDiagram
autonumber
participant U as 用户 / 前台
participant BFF as BFF / 集成侧
participant PS as Intelligent<br/>PersonService.detail
participant OC as 组织侧<br/>ImgPersonServiceImpl#detail
participant ORG as 组织侧<br/>访客建档(示意接口)
participant AC as 电梯侧<br/>AcsPersonController addVisitor
rect rgb(245,248,250)
Note over U,OC: ① 邀约:选被访人 + 楼层候选(与 §3.1 同源)
U->>BFF: 选被访人 hostPersonId
BFF->>PS: detail(hostPersonId)
PS->>OC: POST /component/person/detail
OC-->>BFF: PersonResult.floorList 等
U->>BFF: 勾选楼层并提交邀约单
BFF->>BFF: 持久化邀约记录(hostPersonId、floorIds、访期等)
end
rect rgb(248,252,255)
Note over BFF,ORG: ② 访客建档(须先于派梯;具体路径以现场组织/访客模块为准)
BFF->>ORG: 创建访客人员 / 人像入库(示意)
Note over ORG: 组织侧或其它访客服务:人员落库,得到 visitorId
ORG-->>BFF: visitorId(平台 personId
end
rect rgb(255,248,245)
Note over BFF,AC: ③ 派梯开通(visitorId 已存在)
BFF->>AC: POST /elevator/person/add/visitor<br/>personId=hostPersonId, visitorId, floorIds=邀约单楼层…
Note over AC: 电梯侧:§3.3 UC-02;不传 floorIds 则 §3.2 UC-01
AC-->>BFF: CloudwalkResult
end
```
| 区块 | 实现归属 | 说明 |
|------|-----------|------|
| ① 邀约与楼层候选 | **集成侧** + **Intelligent → 组织** `detail` | 楼层权威路径与 **§3.1** 一致;邀约单仅存 **集成侧** 业务库 |
| ② 访客建档 | **组织侧为主(示意)** | 本仓库 **`addVisitor`** **不包含**建档;返回的 **visitorId** 即后续规则与图库绑定的主体 |
| ③ 派梯 | **电梯侧** `addVisitor` + 组织 Feign 绑图库 | 详见 **§4.5**;请求体**无邀约单号****floorIds** 须由集成侧按单据填入(对齐 **§3.3** |
---
### 3.1 邀约页初始化 — 拉被访人「可访问楼层」主路径(与 UC-01 同源)
组织侧组装 `floorList`;其中 **`listByImageId`** 通过 Feign **回调电梯 HTTP** 读取通行规则。
```mermaid
sequenceDiagram
autonumber
participant FE as 前端 / BFF<br/>集成侧
participant PS as Intelligent<br/>PersonService.detail
participant OC as 组织侧<br/>PersonController / ImgPersonServiceImpl#detail
participant EF as 电梯 HTTP<br/>passRule/imagelistByImageId
participant TP as 租户策略(规范)<br/>组织侧 DB / Service
FE->>PS: detail(personId, businessId)
Note over PS: Intelligent:路由实现
PS->>OC: POST /component/person/detail
Note over OC: 组织侧:查人员、组装机构标签等
OC->>EF: Feign listByImageId(通行楼层原始列表)
Note over EF: 电梯侧:凭规则返回 zoneId 列表
EF-->>OC: AcsPassRuleImageResultDto 列表
OC->>TP: (可选)命中租户访客策略则替代 floorList
Note over TP: 组织侧:策略语义见 §5<br/>未落地时仍为 listByImageId 结果(§6
TP-->>OC: allow_zone_ids / 未启用
OC-->>PS: PersonResult(含 floorList
PS-->>FE: 展示可选楼层 / 默认勾选依据
```
| 步骤 | 实现位置 |
|------|-----------|
| 对外 detail 聚合入口 | **Intelligent** → 组织 **`PersonController`** |
| `floorList` 原始数据来源(通行规则) | **电梯侧** HTTP,由组织 **`ElevatorFeignClient.listByImageId`** 调用 |
| 租户默认楼层「替代」写入 `floorList` | **组织侧**(规范:`ImgPersonServiceImpl#detail` 内;见 §5~§6 |
| 邀约单保存用户勾选 | **集成侧**业务库,不在本仓库电梯模块 |
---
### 3.2 派梯 UC-01 — 请求 **未带** `floorIds`(电梯用组织 detail 的 `floorList`
电梯侧编排;**被访人详情**仍在 **组织侧** 计算;写规则、绑图库在 **电梯侧 + 组织 Feign**
```mermaid
sequenceDiagram
autonumber
participant BFF as BFF / 调用方<br/>集成侧
participant AC as 电梯侧<br/>AcsPersonController
participant PR as 电梯侧<br/>PersonRuleServiceImpl#addVisitor
participant PS as Intelligent<br/>PersonService.detail
participant OC as 组织侧<br/>ImgPersonServiceImpl#detail
participant DB as 电梯侧 DB<br/>image_rule_ref 等
participant IS as 组织侧<br/>ImageStorePersonService.batchBindFeign
BFF->>AC: POST /elevator/person/add/visitor<br/>floorIds 为空
AC->>PR: addVisitor(param)
PR->>PS: detail(personId)
PS->>OC: /component/person/detail
Note over OC: 组织侧:返回 floorList(§3.1 同源)
OC-->>PS: PersonResult
PS-->>PR: floorList
PR->>PR: effective = personResult.floorListUC-01
PR->>DB: 按楼层写规则、取楼栋 imageStoreId
Note over DB: 电梯侧:PersonRuleServiceImpl 本地 Dao
PR->>IS: batchBind(visitorId, 访期…)
Note over IS: 组织侧:图库绑定
IS-->>PR: 成功 / 失败
PR-->>AC: CloudwalkResult
AC-->>BFF: 结果
```
| 步骤 | 实现位置 |
|------|-----------|
| HTTP 入口 | **电梯侧** `AcsPersonController` |
| UC-01 取楼层 | **电梯侧** `PersonRuleServiceImpl` 使用 **组织 detail** 返回的 `floorList` |
| `PersonService.detail` 实现 | **组织侧** `ImgPersonServiceImpl#detail` |
| 写 `image_rule_ref`、选首层换楼栋 | **电梯侧** `PersonRuleServiceImpl` |
| 访客绑图库 | **组织侧** 服务,电梯 **Feign** 调用 |
---
### 3.3 派梯 UC-02 — 请求 **携带** `floorIds`(与邀约单保存的楼层一致)
与 UC-01 共用同一入口;**生效楼层**取请求体,**不再**用 `detail.floorList` 替换,但仍会调 **detail** 做被访人存在性与前置校验。
```mermaid
sequenceDiagram
autonumber
participant BFF as BFF / 调用方<br/>集成侧
participant AC as 电梯侧<br/>AcsPersonController
participant PR as 电梯侧<br/>PersonRuleServiceImpl#addVisitor
participant PS as Intelligent<br/>PersonService.detail
participant OC as 组织侧<br/>detail(仅校验被访人)
participant DB as 电梯侧 DB
participant IS as 组织侧<br/>batchBindFeign
BFF->>AC: POST /elevator/person/add/visitor<br/>floorIds = 邀约单持久化的列表
Note over BFF: 集成侧:从邀约记录读出楼层写入 body
AC->>PR: addVisitor(param)
PR->>PS: detail(personId)
PS->>OC: /component/person/detail
OC-->>PR: PersonResultfloorList 本轮可不用于生效集)
PR->>PR: effective = param.getFloorIds()UC-02
Note over PR: 电梯侧:不做 floorIds ⊆ detail.floorList 校验(信任调用方)
PR->>DB: 按 effective 写规则…
PR->>IS: batchBind…
IS-->>PR: ok
PR-->>BFF: 结果
```
| 步骤 | 实现位置 |
|------|-----------|
| 从邀约单带出 `floorIds` | **集成侧** |
| UC-02 分支(`effective = param.floorIds` | **电梯侧** `PersonRuleServiceImpl` |
| 子集校验(可选) | **集成侧 BFF** 或后续扩展;**当前电梯侧未实现** |
---
## 4. 派梯接口代码走查(电梯应用)
### 4.1 HTTP 入口
- **路径**`POST /elevator/person/add/visitor`
- **类**`maven-cw-elevator-application/cw-elevator-application-web/.../AcsPersonController.java`
- **请求体**`AcsPersonAddVisitorForm` → 拷贝为 `AcsPersonAddVisitorParam``PersonRuleService.addVisitor`
### 4.2 请求体字段(与邀约记录的关系)
| 字段 | 含义 |
|------|------|
| `personId` | 被访人在组织侧的人员 ID |
| `visitorId` | 访客人员 ID(平台 personId |
| `begVisitorTime` / `endVisitorTime` | 访期(绑图库 et al. |
| `floorIds` | **本次开通涉及的楼层 zoneId 列表**;由调用方填入。**无邀约单号字段**——电梯侧不读访客邀约业务表 |
定义见:`cw-elevator-application-web/.../form/AcsPersonAddVisitorForm.java`
### 4.3 生效楼层如何决定(`PersonRuleServiceImpl#addVisitor`
实现类:`cw-elevator-application-service/.../PersonRuleServiceImpl.java`
1. **始终先调** `personService.detail`(被访人存在性 / 组织侧详情)。失败则直接返回(如 `76260531`)。
2. **决定 `effective`(最终开通的楼层列表)**
- **`floorIds` 非空**(实现里称 **UC-02**):**`effective = 请求里的 `floorIds`**,原样使用。
- **`floorIds` 为空****UC-01**):**`effective = personResult.getFloorList()`**(来自组织 `detail`)。
3. **空列表**:返回失败(`76260531`)。
4. 后续:按 `effective` 每层写 `image_rule_ref`、取楼栋图库 `imageStoreId`、对 **`visitorId`** 调组织侧 `batchBind`、更新组人员引用等。
**重要**:显式传入 `floorIds` 时,当前实现**不会**再与 `personResult.getFloorList()` 做「子集校验」——楼层是否合规依赖**调用方 / BFF**;电梯信任请求体。
### 4.4 业务目标与范围(访客派梯做什么、不做什么)
| 维度 | 说明 |
|------|------|
| **目标** | 在已有 **访客人员 ID**`visitorId`)前提下,为本租户本次访问开通 **电梯通行规则**(电梯库 `image_rule_ref`),并把访客绑定到 **对应楼栋的人脸图库**(组织侧 `batchBind`),使闸机/电梯侧能按楼层放行。 |
| **不做** | **不在此接口创建访客档案**;访客姓名、证件、人像建档应在组织/访客业务前置完成并得到 **`visitorId`**。 |
| **租户上下文** | `businessId` 来自调用上下文(与 `CloudwalkCallContext.company` 一致),与被访人 `personId`、访客 `visitorId` 同属该租户数据范围。 |
---
### 4.5 分阶段业务逻辑(与 `PersonRuleServiceImpl#addVisitor` 对齐)
```mermaid
flowchart LR
S1[1 被访人 detail] --> S2[2 确定 effective]
S2 --> S3[3 首层 zone → 楼栋 → imageStoreId]
S3 --> S4[4 每层写 image_rule_ref<br/>personId=visitorId]
S4 --> S5[5 batchBind 访期 + updateGroupPersonRef]
```
下列阶段均在 **`maven-cw-elevator-application`** · **`PersonRuleServiceImpl.addVisitor`** 中顺序执行。
#### 阶段 1 — 校验被访人可查(组织侧)
- 构造 `PersonDetailParam``id = personId``businessId = context 租户`),调用 **`personService.detail`**(经 Intelligent → 组织 **`ImgPersonServiceImpl#detail`**)。
- **成功**:得到 **`PersonResult`**,后续 UC-01 需要其中的 **`floorList`**。
- **失败**:透传组织返回的 **code / message**;若结果为 null 或不成功且无语义,使用 **`76260531`**(无可用被访人信息或详情不可用)。
- **数据为空**`personResult == null`**`76260531`**。
#### 阶段 2 — 确定本次生效楼层列表 `effective`
- 见 §4.3**UC-02** 用请求 **`floorIds`****UC-01** 用 **`personResult.getFloorList()`**。
- **`effective` 为空**(含 UC-01 时 `floorList` 为空、或 UC-02 传空列表):**`76260531`**。
#### 阶段 3 — 解析「楼栋」并确定组织侧图库 `imageStoreId`(电梯侧 + 空间服务)
-**`effective` 的第一个元素**作为 **`zoneQueryParam.id`**,调用 **`zoneService.page`**(空间服务)解析 **楼层节点**
- 用返回的 **`ZoneResult.get(0).getParentId()`** 作为 **楼栋 ID**,再 **`deviceImageStoreDao.getByBuildingId(parentId)`** 得到 **`imageStoreId`**。
- **业务含义**:多楼层同一次开通时,**以列表首层所在楼栋**作为本次绑定的图库归属;各 **`floorId` 仍分别落在对应分区规则上,但 **人脸图库绑定指向同一 `imageStoreId`**(由首层楼栋决定)。
#### 阶段 4 — 按楼层写入访客通行规则(电梯侧库)
-**`effective` 中每个 `floorId`**
**`imageRuleRefDao.getDefaultByZoneId(floorId)`** 取该分区默认规则模板 → 组装 **`ImageRuleRefAddDto`****`personId` 填的是 `visitorId`(访客)**,写入 **`image_rule_ref`**(批量 **`insertList`**)。
- **语义**:访客在每个选定楼层上各有一条「挂默认父规则」的通行引用,与被访人自有规则分离。
#### 阶段 5 — 访期内人脸图库绑定与组同步(组织侧 Feign)
- **`ImageStorePersonBindParam`**`imageStoreId`(阶段 3)、**`personIds = [visitorId]`**、**`nullDateIsLongTerm = true`**、**`expiryBeginDate` / `expiryEndDate`** 取自请求的 **`begVisitorTime` / `endVisitorTime`**。
- 调用 **`imageStorePersonService.batchBind`**(失败则返回 **组织侧错误码**,电梯透传)。
- 成功后 **`updateGroupPersonRef`**:同一 **`visitorId`** + **`imageStoreId`**,用于组人员引用同步(具体语义见组织组件实现)。
#### 阶段 6 — 异常兜底
- 未捕获的 **`ServiceException`**:向上抛出。
- 其他 **`Exception`**:包装为 **`76260530`**(通用失败)。
---
### 4.6 访期参数(`begVisitorTime` / `endVisitorTime`
| 项 | 说明 |
|------|------|
| **用途** | 传入组织 **`batchBind`**,作为访客在该图库上的 **有效期起止**(与通行规则配合使用,以现场组织/图库策略为准)。 |
| **与楼层关系** | 访期 **不改变** `effective` 楼层集合;仅影响绑定是否在时间上有效。 |
| **`nullDateIsLongTerm=true`** | 代码固定传入;具体与空起止如何组合以组织 **`batchBind`** 实现为准,集成时建议在测试环境验证边界。 |
---
### 4.7 错误码与典型原因(电梯侧可见)
| 错误码 | 典型场景 |
|--------|-----------|
| **`76260531`** | `detail` 失败;被访人 `PersonResult` 为空;UC-01 时 **`floorList` 为空**;或 **`effective` 最终仍为空**。 |
| **`76260530`** | `addVisitor` 内部未预期的 **`Exception`**(如 DB、空指针、空间分页无数据等未单独映射时)。 |
| **组织 / Feign 返回码** | **`batchBind`** 失败时 **透传**对方 **code / message**,成功后再执行 **`updateGroupPersonRef`**;若 bind 失败则 **不会**继续组引用更新。 |
| **`76260521`** | Controller 层捕获 **`ServiceException`** 时映射(多见于其它接口;`addVisitor` 内多为 fail 码直接返回)。 |
排障时建议按日志顺序核对:**detail → effective → zone 首层 → imageStoreId → 每层 getDefaultByZoneId → batchBind**。
---
### 4.8 业务边界与集成注意
1. **首层决定楼栋图库**:若 `effective` 中楼层分属不同楼栋,当前实现**仅以第一项**定 `imageStoreId`;产品若要求「多楼栋多图库」,需拆分多次调用或扩展实现(现状未支持单次多楼栋)。
2. **每层必须有默认规则**:某 **`floorId`** 下 **`getDefaultByZoneId` 若为空**,可能在后续组装/插入时异常并落入 **`76260530`**,需在数据配置层保证各访客可达层已配置默认规则。
3. **幂等与重复开通**:同一访客重复调用可能产生多条规则引用或组织侧重复绑定行为,**以组织与电梯 DAO 约束为准**;重要场景建议业务层幂等(例如按邀约单号去重)。
4. **部分失败**:规则已 **`insertList`** 后若 **`batchBind`** 失败,当前流程 **不会自动回滚**已插入的规则行(需运维或补偿策略关注)。
---
## 5. 与「租户访客默认楼层」策略的关系
- **规范方向**(详见 `docs/superpowers/specs/2026-05-06-tenant-visitor-policy-organization-implementation.md`):租户允许楼层在组织 **`ImgPersonServiceImpl#detail`** 内以 **`allow_zone_ids` 替代**写入返回的 **`floorList`**;电梯 **UC-01** 仅透传该 `floorList`,不在电梯库再与策略表求交。
- **邀约初始化**:应通过 **`detail``floorList`** 展示可选楼层,与 **UC-01** 同源。
- **邀约单已保存楼层后的派梯**:把单据里的楼层写入 **`floorIds`**(UC-02),与单据一致;若需防止超范围,应在 **BFF** 侧校验 `floorIds ⊆ detail.floorList`(策略替代后)。
---
## 6. 实现状态提示(避免误判)
组织侧已实现:**`TenantVisitorFloorPolicyService`** 读取组织库 **`tenant_visitor_floor_policy`**,在 **`ImgPersonServiceImpl#detail`**(及 **`page(isVisitor)`**)对 **`floorList` / 楼层展示** 做 **`allow_zone_ids` 替代**。部署前须在组织库执行 **`docs/sql/organization_tenant_visitor_floor_policy.sql`**;未建表时策略查询失败会自动回退为 **`listByImageId` 原始结果**。详见 [租户访客楼层策略-代码重构实施指南](租户访客楼层策略-代码重构实施指南.md)。
---
## 7. 集成 checklist
- [ ] 邀约页初始化楼层:**走 `PersonService.detail`**,不要用人员分页/导出接口当作 `floorList` 主来源。
- [ ] 邀约保存:持久化用户选定或允许的 **楼层 zoneId 列表**(与展示同源)。
- [ ] 派梯:**从邀约单读出楼层 → 填入 `floorIds`** 调用 `/elevator/person/add/visitor`;若业务允许「不传楼层」,需知悉此时等价 UC-01,**与邀约单无自动对齐**。
- [ ] 安全(可选):BFF 校验 `floorIds``detail.floorList` 的子集(或业务规则允许的超集策略)。
- [ ] 日志:`AcsPersonController` 已打 `requestFloorSize`,便于核对是否传了楼层。
---
## 8. 源码索引(电梯)
| 环节 | 路径 |
|------|------|
| Controller | `maven-cw-elevator-application/cw-elevator-application-web/.../AcsPersonController.java``addVisitor` |
| 表单 | `.../form/AcsPersonAddVisitorForm.java` |
| 参数 | `cw-elevator-application-service/.../param/AcsPersonAddVisitorParam.java` |
| 核心逻辑(§4.4~§4.8) | `cw-elevator-application-service/.../PersonRuleServiceImpl.java``addVisitor` |
| 空间分页(首层 → 楼栋) | 同模块内 **`ZoneService`**`PersonRuleServiceImpl` 注入调用) |
| 图库绑定 / 组引用 | Feign → 组织 **`ImageStorePersonService`**`batchBind``updateGroupPersonRef` |
---
**文档版本**:与仓库梳理同步;若 `addVisitor` 行为变更,请同步更新 **§4**(含 §4.4~§4.8 业务逻辑与错误码)。
+14
View File
@@ -0,0 +1,14 @@
# dev-support 说明
本目录下的文档与工具已**迁移至 `docs/`**,按类别整理:
- 业务走查 → `docs/business/`
- 构建说明(JDK 依据)→ `docs/build/`
- P3C 格式化 XML → `docs/style/`
- Nexus 上传脚本 → `docs/operations/`
Maven 各聚合工程中的 `alibaba.eclipse.codestyle.path` 已改为指向 **`docs/style/alibaba-eclipse-codestyle.xml`**。
请从仓库根目录打开 [docs/README.md](../docs/README.md) 查看完整索引(含 [Maven 聚合工程说明](../docs/architecture/Maven聚合工程说明.md))。
由运行 JAR 还原的 **`*.jar.src` / `*.jar.src.zip`** 已收至仓库根目录 [**`artifacts/decompiled/`**](../artifacts/decompiled/)(目录名 `decompiled` 为历史约定)。
+148
View File
@@ -0,0 +1,148 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
将 cw-elevator-application-V1.0.0.20211103/lib 下全部 JAR 作为初始构件上传到 Nexus。
脚本位置:docs/operations/deploy_cw_elevator_v1_lib_to_nexus.py(与文档同目录,便于运维查找)。
规则:
1. 若 JAR 内含 META-INF/maven/**/pom.properties,则使用其中的 groupId / artifactId / version。
2. 否则使用后备坐标:cn.cloudwalk.elevator.v1.bootlib:<文件名去 .jar>:V1.0.0.20211103
(保证与 Maven Central 坐标不冲突,且一文件一构件。)
version 含 SNAPSHOT 时上传到 maven-snapshots,否则 maven-releases。
需 ~/.m2/settings.xml 中配置 server idnexus-releases、nexus-snapshots(与 URL 对应)。
"""
from __future__ import annotations
import argparse
import os
import subprocess
import sys
import zipfile
from pathlib import Path
# 仓库根目录 = 本文件所在 docs/operations/ 的上两级
DEFAULT_LIB = Path(__file__).resolve().parent.parent.parent / "cw-elevator-application-V1.0.0.20211103" / "lib"
RELEASES_URL = "http://192.168.3.12:8081/repository/maven-releases/"
SNAPSHOTS_URL = "http://192.168.3.12:8081/repository/maven-snapshots/"
RELEASES_ID = "nexus-releases"
SNAPSHOTS_ID = "nexus-snapshots"
FALLBACK_GROUP = "cn.cloudwalk.elevator.v1.bootlib"
FALLBACK_VERSION = "V1.0.0.20211103"
def read_maven_coords(jar: Path) -> tuple[str, str, str] | None:
try:
with zipfile.ZipFile(jar, "r") as zf:
for name in zf.namelist():
if name.endswith("pom.properties") and "META-INF/maven" in name.replace(
"\\", "/"
):
raw = zf.read(name).decode("utf-8", errors="replace")
props: dict[str, str] = {}
for line in raw.splitlines():
line = line.strip()
if not line or line.startswith("#") or "=" not in line:
continue
k, _, v = line.partition("=")
props[k.strip()] = v.strip()
gid = props.get("groupId")
aid = props.get("artifactId")
ver = props.get("version")
if gid and aid and ver:
return gid, aid, ver
except (zipfile.BadZipFile, OSError):
return None
return None
def fallback_coords(jar: Path) -> tuple[str, str, str]:
stem = jar.name[:-4] if jar.name.lower().endswith(".jar") else jar.name
return FALLBACK_GROUP, stem, FALLBACK_VERSION
def is_snapshot_version(version: str) -> bool:
return "SNAPSHOT" in version.upper()
def deploy_one(
jar: Path,
group_id: str,
artifact_id: str,
version: str,
dry_run: bool,
) -> int:
url = SNAPSHOTS_URL if is_snapshot_version(version) else RELEASES_URL
rid = SNAPSHOTS_ID if is_snapshot_version(version) else RELEASES_ID
cmd = [
"mvn",
"-q",
"deploy:deploy-file",
f"-DrepositoryId={rid}",
f"-Durl={url}",
f"-Dfile={jar}",
f"-DgroupId={group_id}",
f"-DartifactId={artifact_id}",
f"-Dversion={version}",
"-Dpackaging=jar",
"-DgeneratePom=true",
]
if dry_run:
print("DRY-RUN:", " ".join(cmd))
return 0
r = subprocess.run(cmd, capture_output=True, text=True)
if r.returncode != 0:
combined = (r.stdout or "") + (r.stderr or "")
# Nexus maven-releases 对已存在 release 坐标禁止覆盖
if "cannot be updated" in combined:
print(f"SKIP (already in repo): {jar.name} -> {group_id}:{artifact_id}:{version}")
return 0
sys.stderr.write(f"FAIL {jar.name} -> {group_id}:{artifact_id}:{version}\n")
if r.stdout:
sys.stderr.write(r.stdout)
if r.stderr:
sys.stderr.write(r.stderr)
return r.returncode
def main() -> int:
p = argparse.ArgumentParser(description="Deploy all JARs from elevator V1 lib to Nexus.")
p.add_argument(
"--lib",
type=Path,
default=DEFAULT_LIB,
help="Directory containing .jar files",
)
p.add_argument("--dry-run", action="store_true", help="Print mvn commands only")
args = p.parse_args()
lib: Path = args.lib
if not lib.is_dir():
print("Not a directory:", lib, file=sys.stderr)
return 2
jars = sorted(lib.glob("*.jar"))
if not jars:
print("No JAR files in", lib, file=sys.stderr)
return 2
ok, fail = 0, 0
for i, jar in enumerate(jars, 1):
coords = read_maven_coords(jar)
if coords:
gid, aid, ver = coords
src = "embedded"
else:
gid, aid, ver = fallback_coords(jar)
src = "fallback"
print(f"[{i}/{len(jars)}] {jar.name} -> {gid}:{aid}:{ver} ({src})")
rc = deploy_one(jar, gid, aid, ver, args.dry_run)
if rc == 0:
ok += 1
else:
fail += 1
print(f"Done. ok={ok} fail={fail}")
return 0 if fail == 0 else 1
if __name__ == "__main__":
sys.exit(main())
@@ -0,0 +1,43 @@
# 生产滚动升级:ninca-common-component-organization(三实例)
**现场根目录(部署包):**
`/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/部署包/ninca_common_component_organization_01-ninca_common_component_organization`
根下含 `bootstrap.properties``application-node.properties` 示例、`sql/`;三台各用子目录(本仓样例为 `…207` / `…208` / `…209`,与 `application-node.properties``component-organization-01``03` 对应)。
---
## 1. 为什么这样升级对终端用户额外风险小
三台是**滚动替换**:任意时刻总有两台在跑,上游 Consul/Ribbon 或负载均衡会把流量导向健康实例,不会像整机停机那样突然断服务。
数据库脚本在 `**component-organization`** 库里**只执行一次**(维护窗口、由 DBA 或授权人在单点执行),避免三台各跑一遍弄乱数据。
若新版本在某台不满意,可**换回停机前备份的旧 JAR**;涉及访客楼层等策略时,也可在库或配置侧**关闭/禁用策略**降低影响(与研发确认具体字段)。运行与构建均为 **JDK 8**
---
## 2. 升级顺序(先库后应用)
1. **数据库(一次)**
`**component-organization`** 上按变更单执行对应 DDL/DML(脚本与部署包 `sql/``docs/sql/` 同源说明一致)。**同一迁移禁止在三台应用机上重复执行。** 慎用含 `DROP TABLE` 的「全量安装」类脚本;生产优先增量脚本。迁移验证落库后再动应用。
2. **应用(逐台)**
建议顺序如 **207 → 208 → 209**(或按现网约定)。**每台流程:** 若现场有 LB/摘流习惯可先摘该实例 → `stop.sh` 停进程 → **备份当前 Fat JAR**(如加 `.bak.日期`)→ 上传新 JAR(与发布说明 **SHA-256** 一致;三台用同一制品)→ **JDK 8**`start.sh` 启动 → 本节第 3 步检查通过后再处理下一台。
保留各节点 `application-node.properties` 中的节点差异(Consul、instance-id、IP 等);合并新版本键值时勿把数据源/Redis/注册中心改成测试环境。
---
## 3. 每台做完看什么(最多三条)
- **健康:** `http://<节点IP>:<management.port>/actuator/health`(路径以现场为准)应为 **UP**
- **日志:** `logs/` 下 info/error,无持续报错、无连库/注册中心失败风暴。
- **冒烟:** 按变更单做只读或低风险接口抽查;若本次含访客楼层策略,用只读方式确认读取符合预期。
---
## 4. 不满意怎么撤回
**应用:** 停进程 → 把备份的 JAR 换回运行文件名 → 再起动并按上节三项看一眼。可只回滚有问题的那台。
**库:** 优先与研发确认是否可通过关策略、改配置规避;若必须还原库,由 DBA 在评估窗口内操作,必要时先停写或停齐三台应用,避免双写分叉。
---
**备忘:** 三台最终应用包 **SHA-256 一致**`sql/README.txt` 中对含 `DROP` 的脚本风险有说明,执行前核对变更单。
@@ -0,0 +1,315 @@
# 组织信息服务(ninca-common-component-organization)产线升级方案
**文档性质:** 正式发布稿(可向甲方及项目组同步)
**适用组件:** `ninca-common-component-organization`(以下简称「组织信息服务」)
**运行基线:** JDK 8;制品需与发布说明中的 **SHA-256** 校验一致
---
## 1 概述与目标
### 1.1 背景
组织信息服务负责人员与组织维度数据,产线通常以 **三实例** 部署,通过服务注册与负载均衡对外统一入口。本次升级在保持业务连续性的前提下,完成数据库与应用制品的协同发布。
### 1.2 目标
| 序号 | 目标 |
| --- | --------------------------------------------------------------------------- |
| G1 | 在约定维护窗口内完成 **数据库迁移(单次执行)****应用滚动升级**,任意时刻保障 **不少于 2/3 实例** 对外可用能力 |
| G2 | 策略类变更(如租户访客可达楼层)以 **组织侧库表与配置** 为权威来源;对外接口契约保持稳定,仍以 **人员详情中的楼层清单** 作为业务侧读取口径 |
| G3 | 升级过程可追溯:制品校验、节点备份、探活与日志核对均有明确检查项 |
| G4 | 预留 **应用级回滚** 路径;库级回滚仅在评估后由 DBA 执行 |
### 1.3 本次变更的业务语义(策略侧)
- **策略存储位置:** 租户访客可达楼层等策略配置落在 **组织信息服务所用数据库(`component-organization`** 中,由组织侧维护与下发相关逻辑。
- **对外呈现:** 业务平台与其它系统仍以 **人员详情接口返回的楼层清单** 为准进行展示与后续编排。
- **合并语义:** 当组织侧配置了访客楼层策略时,其语义为对可达楼层的 **替代(覆盖)**,**不与** 电梯侧或其它环节的计算结果做 **求交**;具体字段与开关以变更单及研发确认为准。
---
## 2 功能实现思路与方案(本次升级对应能力)
本节说明「租户访客可达楼层策略」在组织信息服务内的实现思路,便于甲方技术接口人与乙方研发对齐验收口径;不涉及对外接口路径变更。
### 2.1 设计原则
| 原则 | 说明 |
| ---------- | --------------------------------------------------------------------------------------- |
| **权威在组织库** | 策略数据仅存于 `**component-organization`** 库表;三台应用实例 **无状态、读同一库**,故滚动升级时只要迁移执行正确,各实例行为一致。 |
| **对外契约不变** | 仍通过既有 **人员详情** 等接口返回楼层相关字段;不在本文扩展新 REST 路径。 |
| **替代非求交** | 策略启用且允许列表非空时,对返回给调用方的可达楼层集合采用 **整单替代**;规范语义下 **不做** 与电梯侧原始列表的 **交集过滤**。 |
| **命中与降级** | 按被访人所属 **组织机构 ID 链** 依次尝试命中策略;未命中、策略停用、或查询异常时 **回退** 为既有逻辑(通常仍会与电梯侧权限数据组装原始楼层),避免阻断主流程。 |
### 2.2 数据模型与脚本
| 项 | 说明 |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **表** | `tenant_visitor_floor_policy`(建在 `**component-organization`** 库)。 |
| **关键字段(业务视角)** | **组织节点**:与行政组织树节点 ID 一致;**启用标志**;**允许到访区域列表**(存为 JSON 数组字符串,元素为区域/楼层在通行系统中的标识);默认租户级策略下 **楼栋维度字段为空**(与现网 Mapper 命中规则一致)。 |
| **脚本来源** | 仓库 `docs/sql/` 与部署包 `sql/` 同源;典型建表:`organization_tenant_visitor_floor_policy.sql`;租户初始化按变更单选用 `organization_tenant_visitor_floor_policy_init_*.sql` 等。**生产慎用含 `DROP TABLE` 的全量安装脚本**,优先增量 DDL/DML。 |
### 2.3 服务端逻辑(实现分层)
1. **数据访问层**:按 **组织节点 ID** 查询 **启用** 的策略行;默认策略满足「楼栋字段为空」等现场约定条件(与运行代码一致)。
2. **策略服务**:解析允许列表 JSON;若解析失败或为空,视为 **未生效**,由上层走原逻辑。
3. **人员业务装配**:在 **人员详情** 分支中,先按既有方式获取电梯侧权限相关的楼层数据,再在 **返回前** 若策略命中则用策略列表 **替换** 对外楼层标识集合及展示用名称组装结果;在 **访客分页(访客模式)** 分支中,若策略命中则 **优先** 用策略生成楼层展示,减少对电梯接口的重复依赖(具体以当前发布制品代码为准)。
4. **多组织归属**:被访人若关联多个组织 ID,按约定顺序 **首个命中** 即采用该条策略,避免多处冲突。
### 2.4 验收口径建议(与研发对齐)
| 场景 | 期望行为 |
| ----------- | ------------------------------------- |
| 策略未启用或未配置 | **人员详情** 中楼层相关表现与升级前一致(在其它依赖系统正常前提下)。 |
| 策略启用且允许列表有效 | **人员详情** 返回的楼层清单 **与策略配置一致**(替代语义)。 |
| 关闭策略或清空允许列表 | 恢复为未启用路径下的行为。 |
### 2.5 与其它系统的职责边界
- **组织信息服务**:持久化策略、在人员详情/访客列表等路径写入 **对外一致的楼层清单**
- **电梯 / 区域主数据**:仍为区域标识与电梯权限数据来源之一;组织侧在部分路径会先读取再 **替换** 输出,不改变「业务平台应以人员详情楼层为准」的集成约定。
- **若历史曾在电梯应用侧单独配置同类租户策略**:应按变更单做 **职责收口**,避免同一租户两套规则;电梯侧仅 **透传** 上游给出的楼层清单参与派梯(与研发白皮书一致)。
---
## 3 适用范围与假设
### 3.1 适用范围
- 部署形态:**同一部署包根路径下三台独立进程**(示例子目录 `…207` / `…208` / `…209`),与节点专属配置(如 `application-node.properties` 中的 `component-organization-01``03`)对应。
- 数据库:`**component-organization`** 库;本次迁移脚本 **全环境仅执行一次**
- 不包含:电梯应用、人脸识别 GPU 后端等其它组件的升级步骤(若存在联动,以变更单为准单独约定)。
### 3.2 前提假设
| 假设 | 说明 |
| --- | ----------------------------------------------- |
| H1 | 维护窗口已审批,相关方已知会 |
| H2 | 新制品已从受控仓库获取,**SHA-256** 与发布说明一致 |
| H3 | 三台均可 SSH/运维通道登录,具备 `stop.sh` / `start.sh` 执行权限 |
| H4 | Consul/Ribbon 或前置负载均衡能将流量导向健康实例;摘流操作若存在,按现网规范执行 |
| H5 | JDK 运行环境为 **JDK 8**,与构建一致 |
### 3.3 部署包根路径(事实引用)
**现场根目录(部署包):**
`/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/部署包/ninca_common_component_organization_01-ninca_common_component_organization`
根目录通常包含 `bootstrap.properties``application-node.properties` 示例、`sql/` 等;**三台实例各占用一个子目录**,本仓库样例为 `…207``…208``…209`
---
## 4 变更说明(数据 / 应用)
### 4.1 数据层(`component-organization`
| 类型 | 说明 |
| ---- | ------------------------------------------------- |
| 执行次数 | **仅执行一次**(维护窗口内、单点执行),禁止在三台应用机上重复跑同一套迁移 |
| 脚本来源 | 与部署包 `sql/` 及项目 `docs/sql/` 说明保持一致;执行前对照变更单勾选脚本编号 |
| 风险脚本 | 含 `DROP TABLE` 等「全量安装」类脚本生产慎用;优先 **增量** DDL/DML |
| 验证 | 迁移后做抽样查询或变更单要求的校验 SQL,确认落库正确后再启动首批应用实例 |
### 4.2 应用层(三实例)
| 项 | 要求 |
| ---- | --------------------------------------------------------------------------------------------------------------- |
| 制品 | 三台使用 **同一 Fat JAR**,文件名与 **SHA-256** 与发布说明一致 |
| 运行时 | **JDK 8** 启动 |
| 节点差异 | 保留各节点 `application-node.properties` 中的 Consul、instance-id、监听 IP 等 **现场差异**;合并新版本配置键时 **勿将数据源、Redis、注册中心改为测试环境** |
| 滚动约束 | 逐台替换;任意时刻保证 **至少 2 台健康**,即满足 **≥ 2/3 可用** |
---
## 5 风险评估与控制措施
| 风险 | 影响 | 控制措施 |
| -------- | --------- | -------------------------------------------- |
| 迁移脚本重复执行 | 数据错乱、约束冲突 | **单次执行**;变更单注明执行人与执行时间点 |
| 制品错误或篡改 | 运行异常或安全隐患 | 发布前比对 **SHA-256**;仅从受控渠道获取 |
| 单台升级失败 | 该实例不可用 | 保留旧 JAR 备份;失败实例可先隔离再回滚 |
| 策略语义理解偏差 | 业务展示与预期不符 | 本文第 1.3 节、**第 2 章** 与变更单三重对齐;上线后按验证清单抽查 |
| 库级回滚需求 | 难度大、窗口长 | 优先 **关策略/配置降级**;库回滚由 DBA 评估,必要时暂停写入或协调三台停机窗口 |
---
## 6 升级步骤
### 6.1 总原则
**先库后应用**:数据库迁移验证通过后,再按实例滚动替换应用。**数据库脚本只执行一次**(针对 `component-organization`)。
### 6.2 阶段 A — 数据库(单次)
1. 确认变更单中的脚本列表与顺序;核对 `sql/README.txt` 等对高危脚本(含 `DROP`)的说明。
2. 在授权窗口内,由 **DBA 或授权人****单连接点**`**component-organization`** 执行迁移。
3. 执行记录:时间、执行人、脚本版本号或 Git 标签(若有)、校验 SQL 结果摘要。
4. **禁止** 在三台应用主机上各自再执行一遍同一迁移。
### 6.3 阶段 B — 应用滚动(三台;示例顺序 207 → 208 → 209
**每一台** 重复下列步骤;**上一台** 健康检查通过后再处理 **下一台**,以保证滚动期间 **≥ 2/3** 实例可用。
| 步骤 | 操作要点 |
| --- | -------------------------------------- |
| B1 | (可选)若现场习惯摘流,先摘除当前实例流量 |
| B2 | `stop.sh` 停止进程 |
| B3 | **备份** 当前运行的 Fat JAR(建议命名含 `.bak` 与日期) |
| B4 | 上传新 JAR,校验 **SHA-256** 与发布说明一致 |
| B5 | **JDK 8** 执行 `start.sh` |
| B6 | 按 **第 7 节** 做探活与日志检查;含访客楼层策略时增加只读冒烟 |
| B7 | 通过后处理下一台 |
实例顺序可按现网约定调整;原则不变:**始终保留多数实例对外服务**。
### 6.4 阶段 C — 收口
- 确认三台 **SHA-256** 一致且均为新版本进程。
- 汇总执行记录与验证结果,归档变更单闭环材料。
---
## 7 验证与观察
### 7.1 每台升级后立即检查(建议上限三项,避免清单冗长)
| 检查项 | 方法 | 期望 |
| --- | ---------------------------------------------------------- | --------------------- |
| 健康 | `http://<节点IP>:<management.port>/actuator/health`(路径以现场为准) | 状态为 **UP** |
| 日志 | `logs/` 下 info / error | 无持续异常;无数据库或注册中心连接失败风暴 |
| 冒烟 | 变更单要求的只读或低风险接口;若含访客楼层策略 | 按 **第 2.4 节** 口径抽查 |
### 7.2 观察期建议
上线后 **2472 小时**(可按项目约定)关注错误日志量、接口耗时与业务侧反馈;策略类变更需业务方配合 spot check。
---
## 8 回滚
### 8.1 应用回滚(常用)
1. `stop.sh` 停止该实例。
2. 将备份的 Fat JAR 恢复为运行文件名。
3. **JDK 8** 启动后重复 **第 7.1 节** 检查。
4.**仅回滚异常实例**,无需三台同时回滚(除非变更单要求版本一致)。
### 8.2 数据库 / 策略回滚
- **优先:** 与研发确认是否可通过 **关闭策略、调整配置** 消除影响。
- **库结构或数据回滚:** 由 **DBA** 在评估窗口操作;必要时先 **停写** 或协调 **三台应用暂停**,避免双写分叉。
---
## 9 组织分工
| 角色 | 职责 |
| ------------ | -------------------------------------------- |
| 项目经理 / 甲方接口人 | 维护窗口确认、干系人知会、对外结论同步 |
| 运维 / 现场实施 | 应用启停、JAR 替换与备份、探活与日志初判 |
| DBA | `component-organization` 单次迁移执行或复核、库级回滚评估与执行 |
| 研发 / 架构 | 变更单技术内容、策略语义与配置项确认、疑难日志分析 |
| 测试 / 业务代表 | 冒烟用例与验收点确认、上线后业务侧抽查 |
---
## 附录 A 业务数据流(Mermaid
说明:面向甲方表述,不展开内部类名;强调「策略在组织库、对外仍以人员详情楼层为准、替代语义」。
```mermaid
flowchart LR
subgraph client["用户侧与会端"]
U[住户 / 访客 / 物业终端]
end
subgraph platform["业务平台"]
P[门禁梯控等业务编排]
T2["对外口径:人员详情中的楼层清单"]
end
subgraph org["组织信息服务"]
DB[(组织库)]
S[人员与组织数据]
T1["策略配置落在组织库"]
T3["策略语义:替代覆盖非求交"]
DB --> S
DB --- T1
S --- T3
end
subgraph area["区域与电梯相关能力"]
E[电梯权限与派梯等]
end
U --> P
P --> S
S --> P
P --> E
P --- T2
```
---
## 附录 B 系统交互时序(Mermaid)
```mermaid
sequenceDiagram
participant User as 用户端
participant Biz as 业务平台
participant Org as 组织信息服务
participant Area as 区域与电梯相关系统
User->>Biz: 业务操作(通行 / 访客等)
Biz->>Org: 查询人员与组织信息(含人员详情)
Org->>Biz: 返回人员详情(含楼层清单等)
Note over Org: 访客楼层策略数据持久于组织库<br/>与对外楼层清单展示口径分离管理
Biz->>Area: 下发通行或派梯请求(按业务编排)
Area->>Biz: 执行结果 / 状态
Biz->>User: 界面与设备反馈
```
---
## 附录 C 术语对照(内部研发 → 对外沟通)
| 内部常用表述 | 对外可用表述 |
| ----------------------------------- | ----------------------------- |
| `component-organization` 库 | 组织信息服务业务库 |
| ninca-common-component-organization | 组织信息服务 / 组织组件(按甲方合同用语选用) |
| Feign / Ribbon / Consul | 服务注册与调用(一笔带过或按甲方技术口径) |
| 租户访客楼层策略表 / 配置 | 租户侧访客可达楼层策略(配置在组织侧) |
| 替代(非求交) | 策略生效时以组织侧配置为准覆盖,不与其它环节结果做交集过滤 |
---
**文档版本:** 1.1
**关联参考:**
- `docs/operations/ninca-common-component-organization-prod-rolling-upgrade-3-instances.md`(现场滚动操作备忘)
- `docs/superpowers/specs/2026-05-06-tenant-visitor-policy-organization-implementation.md`(策略契约与 detail / 分页边界详述)
@@ -0,0 +1,141 @@
# 中建系统 — 接口调用链路图
**文档用途:** 从中建系统(业主/集成侧,含经 **Nginx**、**BFF** 或 **intelligent-cwoscomponent** 等)进入云从侧服务时的 **HTTP 调用链** 总览,供联调、验收与领导汇报附图。
**依据:** 本仓库 `docs/business/访客注册与派梯楼层业务流程走查.md`、Feign 声明及 `AcsPersonController` 等;《升级方案》见 `docs/operations/升级方案正式版本.md`(组织侧策略与 `PersonResult.floorList` 关系以该文为准)。
**范围说明:** 「中建系统」在图中抽象为 **调用发起方**;实际部署的 **主机、端口、网关路径前缀、鉴权头** 以现场集成契约为准,本文只锁 **服务名 + 资源路径** 级语义。
---
## 1. 总览:两条主链路
| 链路 | 业务意图 | 起点(中建侧) | 终点侧典型路径 |
| ------------------ | ---------------------------- | ----------------------------------------- | ----------------------------------- |
| **L1 人员详情 / 楼层清单** | 选人、邀约页、展示被访人默认可达楼层等 | 中建 →(网关)→ **组织信息服务** | `POST /component/person/detail` |
| **L2 访客派梯开通** | 已有访客 `visitorId` 后写通行规则、绑图库等 | 中建 →(网关)→ **电梯应用**(可选经 intelligent Feign | `POST /elevator/person/add/visitor` |
电梯应用在 **L2** 内部仍会 **Feign 调用组织**(如 `floorIds` 为空时补全楼层、图库绑定等),详见下文详图。
---
## 2. 链路 L1:人员详情(含楼层清单)
适用于与中建策略升级相关的 **对外楼层口径**:组织侧 `detail` 返回的 `**floorList`**(及策略替代语义)。调用方可为中建前端直连、中建后端经 DMZ 网关、或经统一 API 网关转发。
```mermaid
%%{init: {'theme':'base','themeVariables':{'background':'#ffffff','primaryTextColor':'#111827','lineColor':'#64748b'}}}%%
sequenceDiagram
autonumber
participant ZJ as 中建系统<br/>(调用方)
participant GW as 接入层<br/>Nginx / API 网关(可选)
participant Org as 组织信息服务<br/>ninca-common-component-organization
Note over ZJ,Org: 路径以对外契约为准;以下为典型形态
ZJ->>GW: HTTPS 请求(路由规则依集成)
GW->>Org: 转发 POST /component/person/detail
Org->>Org: 组装 PersonResult(含 floorList;策略启用时覆盖语义见升级方案)
Org-->>GW: CloudwalkResult PersonResult
GW-->>ZJ: 响应
```
**要点:** 与中建是否「直连组织」或「只访问 `/api` 由电梯/网关二次路由」取决于合同;**语义上** 人员详情权威在 **组织服务**`detail`
---
## 3. 链路 L2:访客派梯(经电梯 REST,含组织回调)
典型完整顺序:**中建 → 电梯 `add/visitor` →(电梯内部)组织 `detail`、空间 zone、图库 batchBind 等**。若中建通过 **intelligent** 调用,则多一跳 Feign,对外仍落到同一电梯路径。
```mermaid
%%{init: {'theme':'base','themeVariables':{'background':'#ffffff','primaryTextColor':'#111827','lineColor':'#64748b'}}}%%
sequenceDiagram
autonumber
participant ZJ as 中建系统
participant GW as Nginx / 网关(可选)
participant INTEL as intelligent-cwoscomponent<br/>(可选中转)
participant EL as 电梯应用<br/>cw-elevator-application
participant Org as 组织信息服务
participant COM as ninca-common<br/>空间/区域等
alt 路径 A:中建直连电梯 HTTP
ZJ->>GW: POST …/elevator/person/add/visitor
GW->>EL: 路由至 elevator-app
else 路径 B:经 intelligent Feign
ZJ->>INTEL: 业务 SDK / 内部 REST
INTEL->>EL: Feign POST /elevator/person/add/visitor
end
EL->>Org: Feign POST /component/person/detailfloorIds 为空等场景补全楼层)
Org-->>EL: PersonResult(含 floorList
EL->>COM: 按需 POST /sysetting/zone/page 等(楼栋楼层解析,按实现)
EL->>Org: Feign POST /component/imagestore/person/batchBind 等(绑图库)
EL-->>ZJ: CloudwalkResult Boolean(经 GW 若存在)
Note over EL,Org: 策略命中与 floorList 替代发生在组织 detail;电梯侧透传规则见租户策略专项文档
```
---
## 4. 接口—路径清单(与中建联调对照)
| 方向 | Method / Path(相对服务上下文) | 服务 |
| ----------------------- | ----------------------------------------------- | ----------------------------------- |
| 中建 / 网关 → 组织 | `POST /component/person/detail` | ninca-common-component-organization |
| 中建 / 网关 → 电梯 | `POST /elevator/person/add/visitor` | cw-elevator-application |
| intelligent → 电梯(Feign | `POST /elevator/person/add/visitor` | 同上(`ElevatorPersonFeignClient` |
| 电梯 → 组织 | `POST /component/person/detail` | 组织 |
| 电梯 → 组织 | `POST /component/imagestore/person/batchBind` 等 | 组织 |
| 电梯 → 公共组件 | `POST /sysetting/zone/page` 等 | ninca-common |
完整字段与用例见:`docs/business/访客注册与派梯楼层业务流程走查.md` §3~§5。
---
## 5. 逻辑关系图(与附录 A 对照)
```mermaid
%%{init: {'theme':'base','themeVariables':{'background':'#ffffff','primaryTextColor':'#111827','lineColor':'#64748b'}}}%%
flowchart LR
ZJ[中建系统]
GW[接入层<br/>Nginx 等]
EL[电梯应用]
Org[组织信息服务]
ZJ --> GW
GW --> EL
GW --> Org
EL --> Org
```
**说明:** 中建既可 **只调组织(L1**,也可 **调电梯(L2**;后者必然与组织存在 **出站调用**。平台级分层仍以 `升级方案正式版本.md` **附录 A** 为准。
---
## 6. 修订记录
| 版本 | 日期 | 说明 |
| ---- | ---------- | ---------------------------- |
| V1.0 | 2026-05-06 | 首版:L1/L2 时序、路径表、与升级方案/走查文档对齐 |
---
**关联文档:**
- `docs/operations/升级方案正式版本.md`
- `docs/business/访客注册与派梯楼层业务流程走查.md`
- `docs/operations/ninca-common-component-organization-production-upgrade-plan.md`
+389
View File
@@ -0,0 +1,389 @@
**文档用途:** 面向甲方领导及项目决策层审批用的升级方案正式稿;技术细节与部署路径详见 `docs/operations/ninca-common-component-organization-production-upgrade-plan.md`
---
# 组织信息服务(ninca-common-component-organization)产线升级方案
**正式发布稿 / 甲方审批版**
| 项目 | 内容 |
| ---- | ------------ |
| 文档版本 | **V1.1** |
| 编制单位 | 乙方项目组 |
| 编制日期 | 2026年05月07日 |
| 密级 | 内部公开 / 甲方项目组 |
---
## 文档控制与批准
### 修订记录
| 版本 | 日期 | 作者 | 变更说明 |
| ---- | ---------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| V1.0 | 2026-05-07 | 乙方项目组 | 首次正式提交甲方审批 |
| V1.1 | 2026-05-08 | 乙方项目组 | 更正 DDL 风险表述;完善附录 Mermaid 图(附录 A 增补入口/Nginx、电梯域及 Consul·ZK·关联服务等平台关系;明确「业务平台」拆分与电梯应用双重抽象);新增业务时序图与滚动升级时序图;去除文稿前缀说明;附录 A 终端回流经 Nginx 对称建模并澄清箭头语义,④ 电梯域节点命名与② 区分;附录 B 参与者与附录 A 分层术语对齐;附录 A 场内按接入/应用/组织/电梯域/关联能力分栏;附录 A 将「域内第三方」与「中建相关」等价并与终端用户同列于「①」、取消 EXT;术语路由改用路径 A/B/C 避免与图中①~⑤冲突 |
### 审阅与批准
| 角色 | 姓名 / 部门 | 签字 | 日期 |
| ------- | ----------- | ---------- | -------- |
| 甲方技术负责人 | ___________ | __________ | ________ |
| 甲方业务负责人 | ___________ | __________ | ________ |
| 乙方项目经理 | ___________ | __________ | ________ |
| 现场运维负责人 | ___________ | __________ | ________ |
---
## 执行摘要(领导必读)
| 项目 | 说明 |
| -------- | ----------------------------------------------------------------------------------------------------- |
| **升级原因** | 为满足「租户访客可达楼层策略」统一在组织侧管理,减少多源配置不一致,提升通行业务准确性。 |
| **业务收益** | ① 策略落在组织信息服务所用数据库,配置口径单一;② 对外人员详情等接口路径与契约不变,业务平台默认无改造;③ 策略语义为 **覆盖(替代)**,便于甲乙方对齐验收。 |
| **维护窗口** | 计划 **2026年X月X日 21:00 ~ X月X日 02:00**(共5小时)。 业务影响:滚动升级期间 **始终有≥2台实例对外服务**;单实例切换时可能出现 **秒级延迟**,不设「整机停机」。 |
| **升级内容** | ① 在 `**component-organization`** 库执行迁移(**全环境仅一次**);② 三台应用实例依次滚动替换为同一制品(JDK 8)。 |
| **成功标准** | 三台健康、策略可按租户启用/停用验证、冒烟通过、约定观察期内无关联重大异常。 |
| **回滚承诺** | 应用级回滚可快速恢复旧制品;策略可通过 **停用策略行** 降级,优先避免库结构回滚。 |
---
## 1 背景与业务目标
### 1.1 背景
组织信息服务负责人员与组织数据的维护。租户访客可达楼层等策略若在多系统分散配置,易产生不一致与运维成本。本次升级将 **策略权威收口至组织信息服务所用数据库**,业务平台仍以既有 **人员详情** 等接口获取楼层清单,实现 **策略统一、接口契约稳定**
### 1.2 业务目标
| 序号 | 目标 |
| --- | ----------------------------------- |
| G1 | 维护窗口内完成升级,任意时刻 **≥2/3 实例** 可用,业务连续。 |
| G2 | 策略仅存组织侧库表;对外接口不因本次升级而变更 URL/字段契约。 |
| G3 | 过程可追溯,回滚路径明确。 |
### 1.3 本次变更的业务语义(关键)
> **替代(覆盖),规范语义下非「求交」**
> 租户启用访客楼层策略且允许列表有效时,人员详情等路径返回的楼层清单 **以组织侧配置为准整单呈现**;**不与**电梯侧原始列表做 **交集过滤** 作为规范语义。
> 策略未配置、停用或异常降级时,行为与升级前一致(在依赖系统正常前提下)。
---
## 2 业务影响与变更范围
### 2.1 影响范围
| 影响对象 | 说明 |
| --------------- | -------------------------------------------- |
| 业务平台(门禁、访客、通行等) | **接口契约不变**;租户启用策略后,人员详情中的 **楼层内容** 按组织侧策略呈现。 |
| 电梯 / 区域主数据 | **不要求甲方单独改造**;组织信息服务在未命中策略时仍按既有逻辑与电梯侧数据组装。 |
| 组织信息服务 | 库表迁移(单次)+ 应用制品滚动升级(三台)。 |
### 2.2 不变承诺
- 对外 REST 路径与签名保持兼容(与变更单锁定版本一致)。
- 未启用策略的租户,目标行为与升级前一致。
- 策略查询异常等场景 **降级** 为既有逻辑,避免阻断人员详情主链路(以实际部署制品为准)。
---
## 3 详细升级计划
### 3.1 前置条件检查
| 编号 | 检查项 | 确认方式 |
| ---- | ------------------------------------ | ------- |
| PC-1 | 维护窗口已通过甲方审批,相关方已通知 | 邮件/会议纪要 |
| PC-2 | 新制品已从受控渠道获取,SHA-256 与发布说明一致 | 校验比对 |
| PC-3 | 三台服务器可运维登录,具备启停权限 | 运维验证 |
| PC-4 | 注册中心/负载均衡可将流量导向健康实例 | 控制台查看 |
| PC-5 | 数据库 `component-organization` 已备份且可连接 | DBA 确认 |
### 3.2 升级步骤与时间预估
**总窗口:约 5 小时(实操约 2 小时 + 缓冲)**
#### 阶段 A:数据库迁移(单次,约 10~20 分钟)
- **执行人**:DBA 或授权人
- **执行位置**:仅在 **单管控终端** 连接 `**component-organization`**,**禁止**在三台应用主机各执行一遍同一脚本。
- **内容**:按变更单选用 `**docs/sql/` / 部署包 `sql/`** 中脚本;典型建表见 `organization_tenant_visitor_floor_policy.sql`,租户初始化见变更单指定的 `*_init_*.sql`
- **风险说明(重要)**:含 `**DROP TABLE`** 或重建类的「全量安装」脚本 **不得默认用于生产**;须经评审与备份后再执行。增量 `**CREATE TABLE IF NOT EXISTS`** 类脚本相对安全,但仍 **只执行一次** 并留痕。
- **验证**:抽样校验表对象及约定查询;通过后进入阶段 B。
#### 阶段 B:应用滚动升级(每台约 15~25 分钟,三台合计约 45~75 分钟)
实例顺序示例:**207 → 208 → 209**(与部署包 `ninca_common_component_organization_01-ninca_common_component_organization` 下子目录对应;顺序可按现场安排调整)。
| 步骤 | 操作 | 备注 |
| --- | ------------------------ | ---------- |
| B1 | (可选)摘除当前实例流量 | 依负载均衡与运维规范 |
| B2 | `stop.sh` 停止进程 | |
| B3 | 备份当前 JAR`.bak` + 日期) | |
| B4 | 上传新 JAR,校验 SHA-256 | 三台同一制品 |
| B5 | `start.sh` 启动(**JDK 8** | |
| B6 | 健康检查与冒烟(见第 4 章) | 上一台通过后再下一台 |
| B7 | 恢复流量(若曾摘流) | |
#### 阶段 C:收口与观察(约 30 分钟)
三台均为新版本且健康;按甲方测试租户验证策略启停;进入约定观察期。
---
## 4 验证标准与验收确认
### 4.1 每台升级后即时验证
| 验证项 | 方法 | 期望结果 |
| ---- | ------------------------------------------------------ | ------------------ |
| 健康检查 | `http://<IP>:<management.port>/actuator/health`(以现场为准) | `UP` |
| 日志 | `logs/` | 无持续 ERROR、无注册/连库风暴 |
| 冒烟 | 人员详情等变更单约定接口 | 无 5xx;策略租户符合「替代」口径 |
### 4.2 整体验收清单(甲方签字确认)
| 编号 | 验收项 | 通过标准 | 甲方确认 |
| ---- | -------- | --------------------------------------------- | ---- |
| AC-1 | 三实例健康 | 三台均 UP,观察期内稳定 | □ |
| AC-2 | 数据库变更正确 | `tenant_visitor_floor_policy`(及变更单涉及对象)存在且可读写 | □ |
| AC-3 | 策略语义(替代) | 启用策略后详情楼层与配置一致;停用后恢复升级前行为 | □ |
| AC-4 | 业务冒烟 | 访客/通行典型场景无阻断性故障 | □ |
| AC-5 | 性能 | 人员详情接口耗时相对升级前无明显劣化(阈值由变更单约定) | □ |
---
## 5 风险评估与应对措施
| 风险事件 | 概率 | 业务影响 | 应对措施 |
| --------------- | --- | ---- | ---------------------------- |
| 迁移脚本误执行(重复或错库) | 低 | 高 | 单次、单点、变更单勾脚本;DBA 复核连接串 |
| 误执行含 DROP 的全量脚本 | 低 | 高 | 生产默认只用评审过的增量脚本;全量须书面审批 |
| 单台升级失败 | 中 | 低 | 多数实例仍可用;该台回滚旧 JAR |
| 策略配置与业务预期不符 | 中 | 中 | 上线前测试环境确认;生产可通过停用策略降级 |
| 库级回滚 | 极低 | 高 | **优先停策略**;库回滚须甲方书面批准与 DBA 方案 |
---
## 6 回滚策略
### 6.1 应用回滚(常用)
单台:`stop.sh` → 恢复备份 JAR → `start.sh`(JDK 8)→ 健康检查。可只回滚故障实例。
### 6.2 策略 / 数据降级
- **停用策略**(表中启用标志或等价配置):通常 **无需** 卸版本即可恢复旧展示逻辑(与研发确认字段)。
- **库结构回滚**:高风险,须甲方书面授权与 DBA 执行。
---
## 7 组织分工与紧急联络
| 角色 | 职责 | 姓名 | 联系方式 |
| ------- | ---------- | -------- | -------- |
| 甲方技术负责人 | 窗口审批、协调资源 | ________ | ________ |
| 甲方业务代表 | 验收与业务抽查 | ________ | ________ |
| 乙方项目经理 | 方案与指挥 | ________ | ________ |
| 现场运维 | 启停、制品替换、探活 | ________ | ________ |
| DBA | 单次迁移、库回滚评估 | ________ | ________ |
**升级期间紧急联络(24 小时待命)**
- 乙方技术热线:XXX-XXXX-XXXX
- 甲方 IT 应急:XXX-XXXX-XXXX
---
## 8 升级完成确认与签字
**声明:** 升级过程将严格按审批方案执行;完成后由甲方代表确认验收。
| 角色 | 签字 | 日期 |
| ------- | --- | --- |
| 甲方技术负责人 | | |
| 甲方业务负责人 | | |
| 乙方项目负责人 | | |
---
## 附录 A:业务数据流图(策略在组织侧 · 平台关系概览)
**术语:「业务平台」(本文档用语)**
**场内** 门禁 / 访客 / 通行等场景中,**依赖组织侧既有 HTTP 契约(如人员详情)** 的上层组合,**不是单一进程或单一仓库**。典型路由形态(与下图 **①~⑤ 分区序号不同维度**):**路径 A** Nginx `**/api/*`** → `**cw-elevator-application**`**路径 B** `**/cwos-portal/*`** → `**cwos-portal**` / SPA**路径 C** 可选 `**intelligent-cwoscomponent`** 中转。**「域内第三方」与「中建相关」在本文可等价归类**;附录 A 图中 **①** 将三类接入 **合并为同一分组节点**(框内文字罗列),以减少连线交叉。**不再单独划「域外 EXT」区**。**人员详情权威**在组织侧(如 `**POST /component/person/detail`**)。详见 `docs/architecture/Maven聚合工程说明.md``docs/business/访客注册与派梯楼层业务流程走查.md`
**图中序号:** **①~⑤** = **场内**按角色分层;**版面**为 **第一行左→右:①②③**,**第二行左→右:④⑤**;为减少穿插,**图中仅保留主干与必要的跨层虚线**,响应回流、可选直达 API、镜像详情口径等见下列 **图注**。)
下列图示可在支持 Mermaid 的工具中渲染(如 VS Code、Typora、[mermaid.live](https://mermaid.live))导出 PNG 插入 Word。**插入 Word 时请导出为浅色背景**(勿使用编辑器深色主题截图);下图已内置浅色配色。
```mermaid
%%{init: {'theme':'base','themeVariables':{'background':'#ffffff','primaryColor':'#ffffff','primaryTextColor':'#111827','primaryBorderColor':'#cbd5e1','secondaryColor':'#f8fafc','tertiaryColor':'#f1f5f9','lineColor':'#64748b','clusterBkg':'#fafafa','clusterBorder':'#e2e8f0','edgeLabelBackground':'#ffffff','fontSize':'13px'},'flowchart':{'padding':16,'nodeSpacing':36,'rankSpacing':44,'curve':'basis'}}}%%
flowchart TB
subgraph R1[" "]
direction LR
subgraph IN01["① 接入层"]
SRC[接入来源分组<br/>终端用户 · 中建平台 · 域内第三方]
NGX[Nginx<br/>反向代理 · 静态 · 路由]
SRC --> NGX
end
subgraph IN02["② 应用服务层"]
direction TB
APICH[cw-elevator-application<br/>REST · /api/*]
PTsvc[cwos-portal / SPA<br/>/cwos-portal/*]
INT[intelligent-cwoscomponent<br/>可选编排中转]
LEG[对外口径:人员详情楼层清单]
end
subgraph IN03["③ 组织领域(本次升级)"]
direction TB
ODB[(组织库 component-organization<br/>含租户访客楼层策略)]
POL[策略:启用则允许列表<br/>覆盖对外楼层清单]
OCORE[人员与组织核心逻辑<br/>ninca-common-component-organization]
ODB --> POL --> OCORE
ODB --> OCORE
end
end
subgraph R2[" "]
direction LR
subgraph IN04["④ 电梯主数据域"]
direction LR
ELV[电梯域职责<br/>与②同制品 · 派梯 · 设备 · 区域主数据]
EDB[(电梯业务库)]
ELV --> EDB
end
subgraph IN05["⑤ 关联与基础设施"]
INFRA[Consul / Ribbon · ZooKeeper / Dubbo<br/>Redis / Kafka · CRK · ninca-common 等]
end
end
NGX --> APICH
NGX --> PTsvc
APICH --> OCORE
PTsvc -.-> OCORE
OCORE --> ELV
OCORE -.-> INFRA
ELV -.-> INFRA
style R1 fill:transparent,stroke:none
style R2 fill:transparent,stroke:none
```
> **版式说明:** **①** 使用 **单一「接入来源分组」** 节点汇总三类主体,**一条边** 接入 **Nginx**,避免三源并列的多条平行边。**⑤** 合并为 **一块关联与基础设施**,与 **③④** 各保留 **一条虚线**,其余协作关系见 **图注** 与正文路径 A/B/C,**不在图中重复画回流**(如 HTTP 响应经 Nginx 回到终端、组织与电梯域之间的数据返回等,与附录 B 一致)。**②** 中 **INT / LEG** 仅作层内说明,**不与域外再连线**,以免与主干抢线。
**图注:** **「业务平台」** 指 **②**。**请求主路径**:① → ②(经 Nginx 至 REST/门户等)→ ③(Feign)→ ④;**③↔④** 在组装人员详情时的回调与返回**未单独画箭头**,避免与主干重复。**可选**:中建/域内第三方 **直达** 电梯 REST、**intelligent** 编排等,以实际集成为准。**响应路径**(②→① 等)与 **对外口径(LEG** 图中略。**⑤** 为注册发现、消息及公共能力等,与多组件的细分连接以实际配置为准。
---
## 附录 B:业务交互时序图(人员详情与楼层)
展示「查询被访人详情—楼层如何形成」的抽象过程(不涉及内部类名)。
```mermaid
%%{init: {'theme':'base','themeVariables':{'background':'#ffffff','primaryTextColor':'#111827','lineColor':'#64748b'}}}%%
sequenceDiagram
autonumber
participant User as 终端用户
participant Biz as 业务平台(上层调用方 · 门禁/访客/通行等 )
participant Org as 组织信息服务
participant Elev as 电梯域(区域主数据等)
User->>Biz: 访客邀约 / 查询被访人等业务操作
Biz->>Org: 请求人员详情(需楼层信息)
Org->>Elev: 获取原始可达区域
Elev-->>Org: 返回原始区域列表
Org->>Org: 读取组织库策略;若启用且有效则用策略列表替换对外楼层
Org-->>Biz: 返回人员详情(含楼层清单)
Biz-->>User: 界面展示可选楼层 / 后续通行办理
Note over Org: 策略未命中或异常时降级为既有组装逻辑,避免阻断主流程。
```
(本图 **业务平台****场内** 上层调用侧(同附录 A `**②`**);**终端用户** 与 **中建/域内第三方** 与附录 A `**①`** 同列,本图从进入应用编排之后的链路抽象起笔。)
---
## 附录 C:产线滚动升级时序图(单次库迁移 + 三台滚动)
```mermaid
%%{init: {'theme':'base','themeVariables':{'background':'#ffffff','primaryTextColor':'#111827','lineColor':'#64748b'}}}%%
sequenceDiagram
autonumber
participant DBA as DBA / 授权人
participant DB as 组织库 component-organization
participant Ops as 现场运维
participant N1 as 实例 ①
participant N2 as 实例 ②
participant N3 as 实例 ③
Note over DBA,DB: 阶段 A:仅执行一次
DBA->>DB: DDL/DML(变更单勾选脚本)
DB-->>DBA: 校验落库
Note over Ops,N3: 阶段 B:逐台;全程保持 ≥2 台对外服务能力
Ops->>N1: 停 → 备份 JAR → 换新制品 → 启 → 健康检查
N1-->>Ops: 通过
Ops->>N2: 同上
N2-->>Ops: 通过
Ops->>N3: 同上
N3-->>Ops: 通过
Note over Ops: 阶段 C:三台版本一致,收口与观察期
```
(实例编号 ①②③ 与现场 **207 / 208 / 209** 等目录一一对应,以运维台账为准。)
---
## 附录 D:技术术语对照(供甲乙双方对齐)
| 对外沟通用语 | 内部对应 |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 中建 / 域内第三方 / 用户(入口侧) | 附录 A `**①`** 以 **「接入来源分组」** 单框汇总三类主体,接 **Nginx** 后进入 `**②`****域内第三方** 与 **中建相关** 在语义上可等价归类。非「业务平台」统称(业务平台见下行) |
| 业务平台(本文档 · 场内) | 非单一服务:经 `/api`**cw-elevator-application**、经 `/cwos-portal/*`**cwos-portal**/SPA、可选 **intelligent-cwoscomponent** 等依赖组织契约的上层组合(见附录 A `**②`**、`AGENTS.md` 拓扑) |
| 组织信息服务 | ninca-common-component-organization |
| 组织信息服务业务库 | `component-organization` 数据库 |
| 租户访客楼层策略表 | `tenant_visitor_floor_policy` |
| 覆盖(替代)语义 | 非求交、规范上对楼层清单整单替换 |
| 服务注册与路由 | Consul / Ribbon |
---
**关联技术方案:** `docs/operations/ninca-common-component-organization-production-upgrade-plan.md`(含功能实现思路 §2、附录图与术语全文)
**中建侧接口调用链:** `docs/operations/中建系统-接口调用链路图.md`(从中建系统发起的 L1 人员详情 / L2 访客派梯完整 HTTP·Feign 链路)
**文档结束**
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,40 @@
# 01 `maven-cloudwalk-cloud` — 阿里巴巴规范走查(整理版)
**范围**`maven-cloudwalk-cloud/**/*.java`(排除 `target/`),共约 **22** 个源文件。
**性质**:只读静态走查,对照手册常见项;**非** P3C 全量。
## 抽样说明
- 全量阅读非 `package-info` 源文件;重点 **`CloudwalkEventInitializing`(约 361 行)**、`CloudwalkEventManager``EventHandlerMapping``CloudwalkParamsValidateAspect`
- 本模块几乎无 `*Service*` / `*Impl*` / `*Controller*` 典型三层命名。
## 问题清单(节选)
| 严重度 | 位置 | 行(约) | 类别 | 说明 | 建议 |
|--------|------|----------|------|------|------|
| P0 | `cloudwalk-common-event/.../CloudwalkEventManager.java` | 3140 | 空指针 | `getServiceCodeCustomHandlerListMap` 等可能为 null 后链式 `.get` | 判空或早返回 |
| P0 | `cloudwalk-common-event/.../CloudwalkEventInitializing.java` | 178 | 逻辑 | `eventType.getEventClass().getClass().equals(eventClass)` 易永远不匹配 | 改为 `Objects.equals(eventType.getEventClass(), eventClass)` 等与契约一致 |
| P0 | `cloudwalk-common-event/.../handler/EventHandlerMapping.java` | 2830 | 逻辑 | 同上 `getEventClass().getClass()` | 同上 |
| P1 | `.../autoconfig/EventConfiguration.java` | 1121 | Spring | `@EnableConfigurationProperties` 而无 `@Configuration``@Bean` 可能不生效 | 补 `@Configuration` 或核对导入方式 |
| P1 | `.../autoconfig/EventConfiguration.java` | 19 | 命名 | Bean 方法名 `CloudwalkEventInitializing` 首字母大写 | 改为小驼峰 |
| P1 | `CloudwalkEventInitializing.java` | 多处 | 泛型 | `(Class)``(Map)` 等原始类型强转 | 使用带泛型 API 或安全转换工具 |
| P1 | `.../listener/GroupEventListener.java` | 19 | 异常 | `catch (Exception)` 过宽 | 收窄类型 |
| P1 | `.../listener/GroupEventListener.java` | 12 | 日志 | `LoggerFactory.getLogger(CloudwalkEventListener.class)` 与子类不符 | 使用当前类 |
| P1 | `.../service/aop/CloudwalkParamsValidateAspect.java` | 42 | 命名 | `validatePointcat` 疑似 Pointcut 拼写 | 更正命名 |
| P2 | `CloudwalkEventInitializing.java` | 多处 | 魔法值 / 常量命名 | `pattern` 非全大写、`ThreadPoolExecutor` 字面量等 | 提取命名常量 |
| P2 | `.../listener/GroupListnerClassMapping.java` | 类名 | 命名 | `Listner` 拼写错误 | 长期迁移正确拼写 |
| P2 | `.../handler/EventHandlerMapping.java` | 6368 | 封装 | `getHandlerMap` 返回内部可变 Map 引用 | `unmodifiableMap` 或拷贝 |
## 小结
| 级别 | 数量(约) |
|------|------------|
| P0 | 3 |
| P1 | 12 |
| P2 | 15 |
**正向**:未发现空 `catch``System.out`;日志以 Slf4J 为主。
## 后续建议
优先修复 **P0**(事件路由比较与 NPE),再处理 **Spring 配置类元注解****泛型/raw 类型**
@@ -0,0 +1,26 @@
# 02 `maven-cloudwalk-device-manager` — 阿里巴巴规范走查(整理版)
**范围**`maven-cloudwalk-device-manager/**/*.java`(排除 `target/`),约 **271** 个文件,以 RPC 接口、DTO、枚举、常量为主。
## 问题清单(节选)
| 严重度 | 位置 | 类别 | 说明 | 建议 |
|--------|------|------|------|------|
| P1 | `.../constant/DeviceConstant.java` | 命名 | `OCEAN_DEFALUE_APPLICATIONID` 拼写错误 | 更正为 `DEFAULT` 并全局替换 |
| P1 | 多文件 `*DeltParam` | 命名 | `Delt` 与 Delete 语义不符 | 新代码用 `Delete`,对外 API 需评估兼容 |
| P2 | `DeviceConstant.java` | 规约 | 常量集中在 `interface` 中(常量接口反模式) | 改为 `final` 类 + `private` 构造 |
| P2 | `DeviceConstant.java` | 格式 | 大括号与缩进不符合主流 K&R / 4 空格 | 统一格式化 |
| P2 | `.../DeviceGroupService.java` | 命名 | 方法 `gets` 语义不清 | `listByCondition` 等 |
| P2 | 多文件 | 校验 | `@Size(max=999)` 与数字型 `message` 散落 | 抽 `ValidationConstants` + 码表文档 |
| P2 | 多文件 | 依赖注解 | 广泛使用 `org.hibernate.validator.constraints.NotBlank` | 优先 `javax.validation.constraints.NotBlank` |
| P2 | `.../em/DeviceUpgradeRevertStatusEnum.java` | 卫生 | 若仍含反编译尾部注释需清理 | 已建议用 `strip_jdcore_java_noise.py` 全仓处理 |
## 小结
| 级别 | 数量(约) |
|------|------------|
| P0 | 0 |
| P1 | 2 |
| P2 | 26(含同类合并描述) |
**说明**:模块以**契约层**为主,异常/日志问题多在实现侧;当前以**命名、魔法值、格式**为主。
@@ -0,0 +1,18 @@
# 03 `maven-cloudwalk-device-sdk` — 阿里巴巴规范走查(整理版)
**范围**`maven-cloudwalk-device-sdk/**/*.java`(排除 `target/`),约 **162** 个文件。
## 主要发现
| 类别 | 说明 |
|------|------|
| **序列化** | 大量 `implements Serializable` 的 DTO/Param **未声明 `serialVersionUID`**(约数十个文件);内部静态类序列化缺独立 UID。 |
| **命名** | `NotifyUploadPanoramamResult`Panorama)、`FaceRegistionParam`Registration)等拼写疑点;内部类名 `deviceData``helmetsData` 等小写开头不符合类型 UpperCamelCase。 |
| **格式** | 部分文件 `package` 与类型声明间**大段空行**;若仍残留 `/* N */` 行号注释,应继续跑 `scripts/strip_jdcore_java_noise.py`。 |
| **启发式** | 与 `00-heuristic-scan.md` 一致:`DeviceV2CommonBaseDTO` 等存在**行尾空白**;未见 `System.out`、空 catch。 |
## 建议优先级
1. 为对外 DTO 统一 **`serialVersionUID`** 策略(或评估 Protobuf/JSON 单一序列化路径)。
2. 修正对外可见的**拼写错误**类名时评估协议兼容(`@JSONField` 别名等)。
3. IDE **格式化** + 去除反编译行号噪声。
@@ -0,0 +1,20 @@
# 04 `maven-cloudwalk-intelligent-davinci-manager` — 阿里巴巴规范走查(整理版)
**范围**:共 **13**`*.java``davinci-manager-common` + `davinci-manager-storage`)。
## 问题清单(节选)
| 严重度 | 位置 | 类别 | 说明 | 建议 |
|--------|------|------|------|------|
| P0 | `FileStorageManagerImpl.java` | 安全 | `fileDownLoadWithAbsoluteUrl` 将用户传入 URL 作为 Feign `target`**SSRF** 风险 | URL 白名单、协议限制、禁止内网/metadata |
| P0 | `FileStorageManagerImpl.java` | 资源 | `feign.Response` 未在 `finally`/`try-with-resources`**close**,易连接泄漏 | 确保关闭 Response |
| P1 | `FileStorageManagerImpl.java` | 健壮性 | `DavinciResult` 未系统判空 | 统一空安全/错误模型 |
| P1 | `FileStorageManagerImpl.java` | 异常 | `catch (Exception)` 过宽;错误码空串、未链 cause | 收窄、记录日志、`initCause` |
| P1 | `FileManagerFeignClientFallback.java` | 容错 | Fallback 一律 `RuntimeException`,无结构化降级 | 返回失败 `DavinciResult` 或统一异常类型 + 日志 |
| P1 | `OuterCallFeignClient.java` | Feign | `@RequestLine("GET ")` 路径为空,易误用 | 明确相对路径或文档约束 |
| P2 | `DavinciServiceException.java` | API | 继承受检 `Exception` | 评估改为运行时异常 + 错误码 |
| P2 | 接口参数名 | 命名 | `paramString` 等反编译式命名 | 语义化重命名(与调用方协同) |
## 小结
**P0****SSRF + Feign Response 资源管理** 为首要整改;其次统一 **异常与降级** 语义。
@@ -0,0 +1,21 @@
# 05 `maven-cloudwalk-legacy-public` — 阿里巴巴规范走查(整理版)
**范围**:约 **215**`*.java`;子模块含 `cwos-sdk-event``cloudwalk-common-result``common-web``common-serial``cloudwalk-intelligent-component-lock` 等。
## 问题清单(节选)
| 严重度 | 位置 | 类别 | 说明 | 建议 |
|--------|------|------|------|------|
| P0 | `.../security/AESUtils.java` | 安全 | 使用 **`AES/ECB/PKCS5Padding`** | 改为 GCM 或 CBC+随机 IV 等安全模式并评估兼容 |
| P1 | `cwos-sdk-event/.../KafkaConsumer.java` | 异常/日志 | `catch (Exception)` + `printStackTrace` + 仅 `error(message)` | `logger.error("...", e)`;删 `printStackTrace` |
| P1 | `KafkaConsumer.java` | API | `Class.newInstance()` 已废弃 | `getDeclaredConstructor().newInstance()` |
| P1 | `KafkaProducter.java` | 泛型/命名 | 原始类型 `Producer`;类名 `Producter` 拼写 | 泛型化;重命名类(注意与 Kafka 客户端类名冲突) |
| P1 | `.../CloudwalkContextParameterFilter.java` | 异常 | `catch (Exception)` 吞掉过滤器链异常 | 区分可恢复/不可恢复,避免吞 |
| P1 | `.../BeanCopyUtils.java` 等 | 异常/反射 | 宽 `catch` + `newInstance()` | 收窄异常;换构造器反射 |
| P2 | 多文件 | 日志 | `main``System.out` 演示 | 移至 `src/test` 或删除 |
| P2 | `SnowflakeIdWorker` 等 | 魔法值 | 位移掩码等未命名 | 提取常量并注释 |
## 小结
**安全红线****AES-ECB** 应排期整改。
**工程卫生**:去除 **`printStackTrace` / `System.out`**、替换废弃反射 API、减少 **`catch (Exception)`** 吞栈。
@@ -0,0 +1,22 @@
# 06 `maven-cw-elevator-application` — 阿里巴巴规范走查(整理版)
**范围**`maven-cw-elevator-application/**/*.java`(排除 `target/`);优先 `*Service*``*Impl*``*Controller*`**>150 行** 大文件。
## 问题清单(节选)
| 严重度 | 位置 | 类别 | 说明 | 建议 |
|--------|------|------|------|------|
| 阻断 | `PersonRuleServiceImpl.java` | 契约 | `edit` / `timeDetail` / `pageByApp` 等直接 **`return null`** | 返回明确 `CloudwalkResult` 失败体或 `UnsupportedOperationException` |
| 严重 | `AcsElevatorDeviceGetWayController.java` | 安全 | `getKey` 将配置密钥字段下发 HTTP | 鉴权、短期令牌、禁止明文密钥接口化 |
| 严重 | `AcsElevatorDeviceGetWayController.java` | 性能 | `queryZoneTreeCode` 多层循环内重复远程/DB 调用 | 批量查询或缓存 |
| 主要 | 多处 `*ServiceImpl` / `*Controller` | 异常 | 大量 `catch (Exception)` | 收窄并保留 cause |
| 主要 | `AcsElevatorDeviceServiceImpl.java` | 分层 | `@Repository` 误用于 Service;注入实现类而非接口 | `@Service` + 面向接口 |
| 主要 | 各 Controller | 校验 | `@RequestBody``@Valid` | 补 Bean Validation |
| 主要 | `AbstractCloudwalkController.java` | NPE | `RequestContextHolder.getRequestAttributes()` 可能 null | 判空 |
| 次要 | 多处 | 命名 | `getByDeciveCode`**Device** 拼写错误 | 统一修正(评估 API 兼容) |
| 次要 | `FileController.java` | API | `DatatypeConverter.parseBase64Binary` | `Base64.getDecoder()` |
| 次要 | 全模块 | 依赖 | Fastjson 使用 | 版本治理或迁移 Jackson |
## 小结
优先处理 **对外返回 null**、**密钥类接口** 与 **N+1 调用**;其次统一 **异常与分层注解**
@@ -0,0 +1,20 @@
# 07 `maven-cwos-resource` — 阿里巴巴规范走查(整理版)
**范围**:约 **494**`*.java`;含 `cwos-java-sdk-resource`、portal/resource 接口与桩。
## 主要发现
| 严重度 | 说明 |
|--------|------|
| **高** | `RestPortalUserServiceImpl` 等大量方法 **`return null`** 且部分**未** `@Deprecated`,登录/改密等路径易导致调用方 **NPE 或静默失败**。 |
| **高** | `getDefaultPwd()` 返回 **null** 与「默认密码」语义矛盾。 |
| **中** | `ResourceClient` 在**字段初始化**中 `SpringContext.getBean`,容器时序与单测风险。 |
| **中** | `*Delt*``Resrouce``BacK` 等命名拼写与可读性问题。 |
| **低** | `apidoc` 下大量**空 Controller 壳**;需文档说明为 OpenAPI 占位。 |
| **正向** | 未发现 `System.out` / `printStackTrace`;空 `catch` 启发式未命中。 |
## 建议
1. 对「桩实现」统一 **`@Deprecated` + 明确失败结果`**,禁止静默 `null`。
2. 收敛 **`ResourceClient` 初始化时机**`@PostConstruct` / 懒工厂)。
3. 全模块 **格式化** + 建立 **错误码/校验 message** 常量表。
@@ -0,0 +1,21 @@
# 08 `maven-cwos-common-aks` + `maven-cwos-device-authentication` — 阿里巴巴规范走查(整理版)
**范围**:两工程合计约 **17 + 29**`*.java`;均为 **Feign/接口与 DTO**,无业务实现。
## 主要发现
| 级别 | 说明 |
|------|------|
| **强制** | 鉴权相关接口使用 **`JSONObject` 作入参**`AksAuthService``ApiSecretService` 等),类型约束弱,不符合「优先强类型 DTO」。 |
| **强制** | 包路径 **`.../authetication/...`** 拼写错误(应为 `authentication`),影响检索与协作。 |
| **推荐** | 根 `pom`**Spring Boot 2.1.18**、**Java 8**、**fastjson 1.2.83** — 需持续安全与维护评估。 |
| **推荐** | `CloudwalkDeviceAuthResult` 等同时使用 **`@JsonProperty``@JSONField`**,双 JSON 栈需团队约定。 |
| **推荐** | 大量 **>120 列** 行、**行尾空白**、形参 **`paramXxx`** 反编译痕迹 — 建议 EditorConfig + 一次性格式化。 |
| **推荐** | 常量工具类未 **`private` 构造**防误实例化(`AksConstant` 等)。 |
| **正向** | 未发现 `System.out``printStackTrace`、空 `catch``TODO/FIXME`(启发式)。 |
## 建议优先级
1. 修正 **包名拼写**(或文档声明永久别名与序列化兼容策略)。
2.**`JSONObject` 入参** 渐进替换为 **强类型 DTO**
3. 统一 **JSON 单栈****行宽/空白** 规约。
@@ -0,0 +1,26 @@
# 09 `maven-intelligent-cwoscomponent` — 阿里巴巴规范走查(整理版)
**范围**`intelligent-cwoscomponent-rest`(约 96 个 Java+ `intelligent-cwoscomponent-interface`(约 166 个);**无**本模块内 `@Controller`。优先 **`*Impl*``*Feign*``Fallback`**。
## 问题清单(节选)
| 严重度 | 位置 | 类别 | 说明 | 建议 |
|--------|------|------|------|------|
| P0 | `RestSysettingAreaServiceImpl.java` | 条件装配 | `@ConditionalOnMissingClass` 指向 **resource** 包下 `SysettingAreaServiceImpl`,与 **sysetting** 域不一致 | 核对真实 Local 实现全限定名 |
| P0 | `AcsRecordThreeSendServiceImpl.java` | 条件装配 | 条件类写为 `AcsRecordServiceImpl`,与当前服务语义不符 | 改为正确实现类名 |
| P0 | `RestDeviceServiceImpl.java` | NPE | `deviceType.intValue()` 未防空;`getData()` / `Map` 链式未判空 | 判空与类型安全 |
| P1 | 各 `*FeignClientFallback` | 容错 | 普遍 `throw new RuntimeException(...)` | 返回约定失败 `CloudwalkResult` 或统一异常 + 日志 |
| P1 | `RestDeviceServiceImpl.java` | 泛型 | `(List)` / `(Map)` 原始类型强转 | 使用泛型 API |
| P2 | `PersonFeignClient.java` 等 | 命名 | `batchimport` 应为 `batchImport`(需契约同步) | 重命名 |
| P2 | 多数 `Rest*ServiceImpl` | 注入 | 字段 `@Autowired` | 推荐构造器注入 |
| P2 | `UserAcountDetailResult` 等 | 命名 | `Acount` 拼写 | 评估序列化兼容后修正 |
## 小结
| 级别 | 数量(约) |
|------|------------|
| P0 | 5 |
| P1 | 6 |
| P2 | 21 |
**优先**:修正 **`@ConditionalOnMissingClass`** 指向错误(易导致 Bean 装配与条件语义错误),以及 **`RestDeviceServiceImpl`** 空指针路径。
@@ -0,0 +1,18 @@
# 10 `maven-ninca-crk` — 阿里巴巴规范走查(整理版)
**范围**:仅 **2** 个 Java 文件 — `Application.java``package-info.java`(排除 `target/`)。
## 问题清单
| 级别 | 文件 | 说明 | 建议 |
|------|------|------|------|
| 严重 | `Application.java` | `SpringApplication#run` 阻塞至关闭,其后「启动完成」**语义接近进程退出** | 用 `ApplicationReadyEvent` / `ApplicationRunner` 记录就绪 |
| 警告 | `Application.java` | 使用 **`System.out.println`** | 换 **SLF4J** |
| 建议 | `Application.java` | `new SpringApplication(new Object[]{...})` 冗余 | `SpringApplication.run(Application.class, args)` |
| 建议 | `Application.java` | `@EnableFeignClients` 未收窄包 | 显式 `basePackages` 减少扫描 |
| 建议 | `Application.java` | `netflix.feign.EnableFeignClients` | 随 Spring Cloud 升级迁移 **OpenFeign** 包路径 |
| 通过 | `package-info.java` | 包说明清晰 | — |
## 小结
体量极小,**无**业务逻辑层;重点在 **启动生命周期日志****日志/依赖演进**
@@ -0,0 +1,21 @@
# 11 `maven-ninca-qk-alarm` — 阿里巴巴规范走查(整理版)
**范围**:仅 **2** 个 Java 文件 — `AlarmApplication.java``package-info.java`(排除 `target/`)。
## 问题清单
| 序号 | 文件 | 级别 | 说明 | 建议 |
|------|------|------|------|------|
| 1 | `AlarmApplication.java` | 建议 | `main` 写法非 `SpringApplication.run(Class, args)` 常见形式 | 简化入口 |
| 2 | `AlarmApplication.java` | 建议 | `@EnableFeignClients(basePackages={"cn.cloudwalk"})` **范围过大** | 收窄到实际 Feign 包 |
| 3 | `AlarmApplication.java` | 提示 | `netflix.feign.EnableFeignClients` | 随 BOM 升级迁移 OpenFeign |
| 4 | `package-info.java` | 通过 | 文档说明边界清晰 | — |
| 5 | 模块级 | 信息 | 业务风险多在依赖 **web** 等模块 | 扩展审计范围时纳入 |
## 启发式(与 00 一致)
未发现 TAB、行尾空白、超长行、`System.out`(本模块 `AlarmApplication` 若仍用 `println` 以 00 脚本为准)、空 catch、FIXME。
## 小结
**ninca-crk** 类似,为**薄启动壳**;优先处理 **Feign 扫描范围****main 写法**,并规划 **Spring Cloud** 升级路径。
@@ -0,0 +1,38 @@
# 阿里巴巴 Java 开发手册风格走查 — 索引
**生成日期**2026-04-24
**仓库根**`/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译`
## 说明
- **子任务数量**:与 **`maven-*` 反应堆根目录数量一致(12)**,每个目录由独立子任务只读走查,对照《阿里巴巴 Java 开发手册》常见条目(命名、格式、异常、日志、魔法值、并发与安全等),**非** IDE P3C 插件全量等价结果。
- **机器可读基线**:同目录下 **`00-heuristic-scan.md`** 由 `scripts/alibaba_heuristic_audit.py` 生成(TAB、行尾空白、超长行、`System.out`、空 catch、FIXME 等)。
- **落盘文件**:下表各 `NN-*.md` 为子任务结论的**结构化整理版**(便于检索与 PR 引用);若需更细的原文级表格,可在本地对对应 `maven-*` 树复跑子任务或接入 **P3C / Checkstyle**
## 报告列表
| # | 文件 | 对应工程目录 |
|---|------|----------------|
| 00 | [00-heuristic-scan.md](./00-heuristic-scan.md) | 全部 `maven-*`(启发式脚本) |
| 01 | [01-maven-cloudwalk-cloud.md](./01-maven-cloudwalk-cloud.md) | `maven-cloudwalk-cloud/` |
| 02 | [02-maven-cloudwalk-device-manager.md](./02-maven-cloudwalk-device-manager.md) | `maven-cloudwalk-device-manager/` |
| 03 | [03-maven-cloudwalk-device-sdk.md](./03-maven-cloudwalk-device-sdk.md) | `maven-cloudwalk-device-sdk/` |
| 04 | [04-maven-cloudwalk-intelligent-davinci-manager.md](./04-maven-cloudwalk-intelligent-davinci-manager.md) | `maven-cloudwalk-intelligent-davinci-manager/` |
| 05 | [05-maven-cloudwalk-legacy-public.md](./05-maven-cloudwalk-legacy-public.md) | `maven-cloudwalk-legacy-public/` |
| 06 | [06-maven-cw-elevator-application.md](./06-maven-cw-elevator-application.md) | `maven-cw-elevator-application/` |
| 07 | [07-maven-cwos-resource.md](./07-maven-cwos-resource.md) | `maven-cwos-resource/` |
| 08 | [08-maven-cwos-common-aks-and-device-authentication.md](./08-maven-cwos-common-aks-and-device-authentication.md) | `maven-cwos-common-aks/` + `maven-cwos-device-authentication/`(合并一份,便于对照接口链) |
| 09 | [09-maven-intelligent-cwoscomponent.md](./09-maven-intelligent-cwoscomponent.md) | `maven-intelligent-cwoscomponent/` |
| 10 | [10-maven-ninca-crk.md](./10-maven-ninca-crk.md) | `maven-ninca-crk/` |
| 11 | [11-maven-ninca-qk-alarm.md](./11-maven-ninca-qk-alarm.md) | `maven-ninca-qk-alarm/` |
> **注**`maven-cwos-common-aks` 与 `maven-cwos-device-authentication` 合并在 **08**,避免接口链报告碎片化;若需拆成两文件可自行复制章节。
## 复跑与维护
```bash
cd /path/to/反编译
python3 scripts/alibaba_heuristic_audit.py --out docs/reviews/alibaba-audit-2026-04-24/00-heuristic-scan.md
```
建议在重大反编译合并或格式化后重新生成 **00** 并择机更新 **0111**
@@ -0,0 +1,25 @@
-- 租户访客楼层策略 — 仅用于组织服务库:component-organization
-- 应用只连此库读取策略;与电梯库 cw-elevator-application 中同表结构对齐(org_id 粒度)。
-- 执行:mysql ... component-organization < organization_tenant_visitor_floor_policy.sql
USE `component-organization`;
CREATE TABLE IF NOT EXISTS tenant_visitor_floor_policy (
id VARCHAR(32) NOT NULL COMMENT '主键',
business_id VARCHAR(64) NULL COMMENT 'DEPRECATED: 历史字段;以 org_id 为准',
org_id VARCHAR(32) NULL COMMENT '组织节点ID(cw_is_organization.ID),租户默认策略必填',
policy_type VARCHAR(32) NOT NULL DEFAULT 'INTERSECT_ALLOWLIST' COMMENT '策略类型(历史命名;语义为替代 allow_zone_ids',
allow_zone_ids TEXT NULL COMMENT 'JSON 数组,zoneId 列表',
building_id VARCHAR(64) NULL COMMENT '预留:楼栋维度;租户默认填 NULL',
enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 启用 0 停用',
policy_version BIGINT NOT NULL DEFAULT 1 COMMENT '配置版本号',
remark VARCHAR(256) NULL,
created_by VARCHAR(64) NULL,
created_at BIGINT NULL,
updated_by VARCHAR(64) NULL,
updated_at BIGINT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_org_building (org_id, building_id),
KEY idx_org_enabled (org_id, enabled),
KEY idx_business_enabled (business_id, enabled)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户访客楼层策略(组织库;detail/访客列表替代 floorList';
@@ -0,0 +1,202 @@
-- 组织库 component-organization:广发基金 + 物业管理相关组织 — 访客楼层策略种子数据
-- 表:tenant_visitor_floor_policy(须已执行 organization_tenant_visitor_floor_policy.sql
-- 语义:组织服务按 org_id 命中;allow_zone_ids 为替代用 zoneId 列表(与电梯库种子同源)。
--
-- 执行示例:
-- mysql -h HOST -P PORT -u USER -p < organization_tenant_visitor_floor_policy_init_tenants.sql
USE `component-organization`;
SET NAMES utf8mb4;
-- ---------------------------------------------------------------------------
-- 广发基金:[28-38F]广发基金管理有限公司 → org_id 488b8ad049bb43408a6fbcc50bcb89ac
-- allow28F zone_id = 605560545117995008
-- ---------------------------------------------------------------------------
INSERT INTO tenant_visitor_floor_policy (
id,
org_id,
business_id,
policy_type,
allow_zone_ids,
building_id,
enabled,
policy_version,
remark,
created_at,
updated_at
) VALUES (
'gf_vstr_policy_guangfa_fund_001x',
'488b8ad049bb43408a6fbcc50bcb89ac',
'2524639890ba4f2cba9ba1a4eeaa4015',
'INTERSECT_ALLOWLIST',
'["605560545117995008"]',
NULL,
1,
1,
'广发基金:访客楼层策略(组织库);默认 28F。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
org_id = VALUES(org_id),
business_id = VALUES(business_id),
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
-- ---------------------------------------------------------------------------
-- 物业管理公司(多组织节点):allow = 28F + 6F,便于前端 floorList 展示两档
-- 28F zone_id = 6055605451179950086F zone_id = 605560541473144832
-- JSON 数组顺序:先 28 后 6(与「28+6」表述一致)
-- org_id 来源:component-organization.cw_is_organization(与 docs/sql/tenant_visitor_floor_policy_init_property_mgmt_6f.sql 一致)
-- ---------------------------------------------------------------------------
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_001',
'2524639890ba4f2cba9ba1a4eeaa4015',
'64fdc8eaf5824df5a1329819af29b79f',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星河湾物业管理有限公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_002',
'2524639890ba4f2cba9ba1a4eeaa4015',
'8fc3f910bd834198a539832017fe920e',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星河湾物业管理公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_003',
'2524639890ba4f2cba9ba1a4eeaa4015',
'cc760fdf9c384a0cbf4951ccf2c6452e',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星河湾物管公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_004',
'2524639890ba4f2cba9ba1a4eeaa4015',
'f216235e54ca42bfa0379e69b3754aff',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星中心物业管理公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_005',
'2524639890ba4f2cba9ba1a4eeaa4015',
'95818575a2284db6833289474d33671f',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星中心物业服务中心:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_006',
'2524639890ba4f2cba9ba1a4eeaa4015',
'348328d755624b3491cd307a3109f36a',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星中心物管公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_007',
'2524639890ba4f2cba9ba1a4eeaa4015',
'dde6cc9a4f6b4f5490d03e26fb016200',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'物业管理总部:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
+27
View File
@@ -0,0 +1,27 @@
-- 租户访客默认楼层策略(电梯应用库)
-- 设计说明:docs/business/租户访客默认楼层-数据库配置阶段技术设计.md
CREATE TABLE IF NOT EXISTS tenant_visitor_floor_policy (
id VARCHAR(32) NOT NULL COMMENT '主键',
business_id VARCHAR(64) NOT NULL COMMENT '机构/租户 ID',
policy_type VARCHAR(32) NOT NULL DEFAULT 'INTERSECT_ALLOWLIST' COMMENT '策略类型',
allow_zone_ids TEXT NULL COMMENT 'JSON 数组,zoneId 列表',
building_id VARCHAR(64) NULL COMMENT '预留:楼栋维度;租户默认填 NULL',
enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 启用 0 停用',
policy_version BIGINT NOT NULL DEFAULT 1 COMMENT '配置版本号',
remark VARCHAR(256) NULL,
created_by VARCHAR(64) NULL,
created_at BIGINT NULL,
updated_by VARCHAR(64) NULL,
updated_at BIGINT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_biz_building (business_id, building_id),
KEY idx_business_enabled (business_id, enabled)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户访客默认楼层策略(与组织 floorList 求交)';
-- 示例(实施时替换占位符后执行)
-- INSERT INTO tenant_visitor_floor_policy
-- (id, business_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, remark, created_at, updated_at)
-- VALUES
-- (REPLACE(UUID(),'-',''), 'REPLACE_WITH_BUSINESS_ID', 'INTERSECT_ALLOWLIST',
-- '["REPLACE_ZONE_A","REPLACE_ZONE_B"]', NULL, 1, 1, '实施录入', UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000);
@@ -0,0 +1,48 @@
-- 广发基金租户:访客默认楼层策略初始化(电梯库 cw-elevator-application
-- 组织库 component-organization 同源种子:organization_tenant_visitor_floor_policy_init_tenants.sql
--
-- 字段说明:allow_zone_ids 为 JSON 数组,元素使用 code_elevator_area.zone_idsnowflake 格式),
-- 与 PersonResult.floorList 和 image_rule_ref.zone_id 同一套 ID。
--
-- 数据来源(现场查询 192.168.3.12:3307):
-- org_idcomponent-organization.cw_is_organization
-- NAME='[28-38F]广发基金管理有限公司' -> ID = 488b8ad049bb43408a6fbcc50bcb89ac
-- 28F zone_idcw-elevator-application.code_elevator_area
-- zone_id = 605560545117995008zone_name=28Fcode=0x1C
--
-- 重复执行:使用固定 id + ON DUPLICATE KEY UPDATE,幂等。
SET NAMES utf8mb4;
INSERT INTO tenant_visitor_floor_policy (
id,
org_id,
business_id,
policy_type,
allow_zone_ids,
building_id,
enabled,
policy_version,
remark,
created_at,
updated_at
) VALUES (
'gf_vstr_policy_guangfa_fund_001x',
'488b8ad049bb43408a6fbcc50bcb89ac',
'2524639890ba4f2cba9ba1a4eeaa4015',
'INTERSECT_ALLOWLIST',
'["605560545117995008"]',
NULL,
1,
1,
'广发基金:访客与 floorList 求交后仅保留 allowlist(默认仅 28F zone)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
org_id = VALUES(org_id),
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
@@ -0,0 +1,186 @@
-- 物业公司租户:访客默认楼层策略初始化(电梯库 cw-elevator-application
-- 组织库 component-organization 同源种子:organization_tenant_visitor_floor_policy_init_tenants.sql
-- allow_zone_ids28F + 6FJSON 顺序先 28 后 6),便于前端展示;语义仍以组织侧替代 floorList 为准。
--
-- 数据来源(192.168.3.12:3307):
-- org_idcomponent-organization.cw_is_organization
-- 星河湾物业管理有限公司 → 64fdc8eaf5824df5a1329819af29b79f
-- 星河湾物业管理公司 → 8fc3f910bd834198a539832017fe920e
-- 星河湾物管公司 → cc760fdf9c384a0cbf4951ccf2c6452e
-- 星中心物业管理公司 → f216235e54ca42bfa0379e69b3754aff
-- 星中心物业服务中心 → 95818575a2284db6833289474d33671f
-- 星中心物管公司 → 348328d755624b3491cd307a3109f36a
-- 物业管理总部 → dde6cc9a4f6b4f5490d03e26fb016200
-- 28F zone_id6055605451179950086F zone_id605560541473144832code_elevator_area
--
-- 重复执行:使用固定 id + ON DUPLICATE KEY UPDATE。
SET NAMES utf8mb4;
-- ============================================================
-- 1. 星河湾物业管理有限公司
-- ============================================================
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_001',
'2524639890ba4f2cba9ba1a4eeaa4015',
'64fdc8eaf5824df5a1329819af29b79f',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星河湾物业管理有限公司:访客默认 28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
-- ============================================================
-- 2. 星河湾物业管理公司
-- ============================================================
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_002',
'2524639890ba4f2cba9ba1a4eeaa4015',
'8fc3f910bd834198a539832017fe920e',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星河湾物业管理公司:访客默认 28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
-- ============================================================
-- 3. 星河湾物管公司
-- ============================================================
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_003',
'2524639890ba4f2cba9ba1a4eeaa4015',
'cc760fdf9c384a0cbf4951ccf2c6452e',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星河湾物管公司:访客默认 28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
-- ============================================================
-- 4. 星中心物业管理公司
-- ============================================================
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_004',
'2524639890ba4f2cba9ba1a4eeaa4015',
'f216235e54ca42bfa0379e69b3754aff',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星中心物业管理公司:访客默认 28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
-- ============================================================
-- 5. 星中心物业服务中心
-- ============================================================
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_005',
'2524639890ba4f2cba9ba1a4eeaa4015',
'95818575a2284db6833289474d33671f',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星中心物业服务中心:访客默认 28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
-- ============================================================
-- 6. 星中心物管公司
-- ============================================================
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_006',
'2524639890ba4f2cba9ba1a4eeaa4015',
'348328d755624b3491cd307a3109f36a',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'星中心物管公司:访客默认 28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
-- ============================================================
-- 7. 物业管理总部
-- ============================================================
INSERT INTO tenant_visitor_floor_policy (
id, business_id, org_id, policy_type, allow_zone_ids,
building_id, enabled, policy_version, remark, created_at, updated_at
) VALUES (
'pm_6f_vstr_policy_007',
'2524639890ba4f2cba9ba1a4eeaa4015',
'dde6cc9a4f6b4f5490d03e26fb016200',
'INTERSECT_ALLOWLIST',
'["605560545117995008","605560541473144832"]',
NULL, 1, 1,
'物业管理总部:访客默认 28F+6F(顺序:先 28 后 6,便于前端)。',
UNIX_TIMESTAMP(NOW()) * 1000,
UNIX_TIMESTAMP(NOW()) * 1000
) ON DUPLICATE KEY UPDATE
policy_type = VALUES(policy_type),
allow_zone_ids = VALUES(allow_zone_ids),
enabled = VALUES(enabled),
policy_version = policy_version + 1,
remark = VALUES(remark),
updated_at = VALUES(updated_at);
@@ -0,0 +1,31 @@
-- 租户访客楼层策略:business_id → org_id 数据迁移
-- 前提:DDLtenant_visitor_floor_policy_v2.sql)已执行
-- 执行方式:人工确认 org_id 对应关系后逐行执行
-- 1. 列出所有公司级组织节点(在 component-organization 库执行,供确认)
-- SELECT o.ID, o.NAME, o.PARENT_ID
-- FROM `component-organization`.cw_is_organization o
-- WHERE o.BUSINESS_ID = '2524639890ba4f2cba9ba1a4eeaa4015'
-- AND o.IS_DEL = 0
-- ORDER BY o.NAME;
USE cw-elevator-application;
-- 2. 为现有策略行填入 org_id(示例:广发基金)
-- 请先确认 NAME 匹配正确,再执行
-- UPDATE tenant_visitor_floor_policy
-- SET org_id = '<广发基金的 org_id>',
-- business_id = NULL
-- WHERE id = 'gf_vstr_policy_guangfa_fund_001x';
-- 3. 为其他公司新增策略行(模板)
-- INSERT INTO tenant_visitor_floor_policy
-- (id, org_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, remark, created_at, updated_at)
-- VALUES
-- (REPLACE(UUID(),'-',''), '<公司 org_id>', 'INTERSECT_ALLOWLIST',
-- '["<zone_id>"]', NULL, 1, 1, '', UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000);
-- 4. 验证迁移结果
SELECT id, org_id, business_id, policy_type, allow_zone_ids, enabled
FROM tenant_visitor_floor_policy
ORDER BY org_id;
@@ -0,0 +1,26 @@
-- 租户访客楼层策略:org_id 粒度修复
-- 执行顺序:先 DDL → 数据迁移 → 发应用包
-- 回滚:DROP INDEX uk_org_building, DROP COLUMN org_id, ADD UNIQUE KEY uk_biz_building (business_id, building_id)
USE `cw-elevator-application`;
-- 1. 新增 org_id 列
ALTER TABLE tenant_visitor_floor_policy
ADD COLUMN org_id VARCHAR(32) NULL COMMENT '组织节点ID(cw_is_organization.ID)'
AFTER business_id;
-- 2. 替换唯一约束(business_id → org_id
ALTER TABLE tenant_visitor_floor_policy
DROP INDEX uk_biz_building,
ADD UNIQUE KEY uk_org_building (org_id, building_id);
-- 3. 标记 business_id 为废弃
ALTER TABLE tenant_visitor_floor_policy
MODIFY COLUMN business_id VARCHAR(64) NULL COMMENT 'DEPRECATED: 已废弃,以 org_id 为准';
-- 验证
SELECT COLUMN_NAME, COLUMN_KEY, COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'cw-elevator-application'
AND TABLE_NAME = 'tenant_visitor_floor_policy'
ORDER BY ORDINAL_POSITION;
+603
View File
@@ -0,0 +1,603 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="12">
<profile kind="CodeFormatterProfile" name="P3C-CodeStyle" version="13">
<!--可变参数的... Idea没有对应的配置项,强制insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<!--枚举值之间 Idea没有对应的配置项,强制insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=Java:SPACE_BEFORE_COMMA-->
<!--org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=Java:SPACE_BEFORE_COMMA
由于IDEA只有一个SPACE_BEFORE_COMMA选项,所以统一设置 insert_space_before_comma 为 do not insert
-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations"
value="do not insert"/>
<!--insert_space_before_comma end-->
<!--org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=Java:SPACE_AFTER_COMMA_IN_TYPE_ARGUMENTS-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<!--IDEA只有一个配置项SPACE_AFTER_COMMAinsert_space_after_comma*统一设置成insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<!--insert_space_after_comma end-->
<!--org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=Java:SPACE_BEFORE_COLON-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=Java:SPACE_AFTER_COLON-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<!--IDEA不支持配置,默认do not insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<!--这个在Eclipse也没有找到配置的地方-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_semicolon=Java:SPACE_BEFORE_SEMICOLON
程序导入的时候强制将SPACE_BEFORE_SEMICOLON设置为false
-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<!--SPACE_AFTER_SEMICOLON=true-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<!--IDEA不支持配置,do not insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant"
value="do not insert"/>
<setting
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration"
value="do not insert"/>
<!--IDEA不支持,使用默认-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=Java:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<!--IDEA不支持配置,使用如下值,两者对应-->
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters"
value="insert"/>
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments"
value="do not insert"/>
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters"
value="do not insert"/>
<!--Java:SPACE_BEFORE_OPENING_ANGLE_BRACKET_IN_TYPE_PARAMETER-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters"
value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=Java:SPACE_AFTER_CLOSING_ANGLE_BRACKET_IN_TYPE_ARGUMENT-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments"
value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=Java:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<!--IDEA使用了对应的配置:Java:SPACE_WITHIN_ARRAY_INITIALIZER_BRACES,但感觉不太好,IDEA默认不插入,Eclipse也使用不插入-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer"
value="do not insert"/>
<!--use default insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return"
value="insert"/>
<!--use default do not insert -->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<!--use default insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw"
value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=Java:SPACE_BEFORE_SWITCH_LBRACE-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=Java:SPACE_BEFORE_CLASS_LBRACE-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration"
value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=Java:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=Java:SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer"
value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=Java:SPACE_BEFORE_METHOD_LBRACE-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration"
value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=Java:SPACE_AFTER_QUEST-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=Java:SPACE_BEFORE_QUEST-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=Java:SPACE_BEFORE_ANOTATION_PARAMETER_LIST-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation"
value="do not insert"/>
<!--use default do not insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference"
value="do not insert"/>
<!--下面两个对应IDEA中的一个配置Java:SPACE_AROUND_ASSIGNMENT_OPERATORS,使用insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=Java:SPACE_BEFORE_CATCH_PARENTHESES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=Java:SPACE_BEFORE_METHOD_CALL_PARENTHESES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation"
value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=Java:SPACE_BEFORE_TRY_PARENTHESES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<!--下面两个对应IDEA中的一个配置Java:SPACE_AROUND_UNARY_OPERATOR,使用do not insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=Java:SPACE_BEFORE_IF_PARENTHESES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=Java:SPACE_BEFORE_WHILE_PARENTHESES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=Java:SPACE_AFTER_TYPE_CAST-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=Java:SPACE_BEFORE_METHOD_PARENTHESES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration"
value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=Java:SPACE_BEFORE_FOR_PARENTHESES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=Java:SPACE_BEFORE_SYNCHRONIZED_PARENTHESES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=Java:SPACE_BEFORE_SWITCH_PARENTHESES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
<!--下面两个对应IDEA中的一个配置Java:SPACE_AROUND_LAMBDA_ARROW,使用insert-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
<!--SPACE_WITHIN_EMPTY_ARRAY_INITIALIZER_BRACES-->
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer"
value="do not insert"/>
<!--Idea -> Wrapping And Braces -> Simple classes in one line -->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="do not insert"/>
<!--Idea -> Wrapping And Braces -> Simple method in one line -->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="do not insert"/>
<!--因为Idea不支持配置,所以设置为 Idea默认值-->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="insert"/>
<!--Idea可以通过Wrap Always实现 TODO-->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<!--Idea -> Wrapping And Braces -> Simple block in one line -> do not select -->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<!--Idea -> Wrapping And Braces -> try statement -> catch.... (Java:CATCH_ON_NEW_LINE)-->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement"
value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=Java:ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE-->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer"
value="do not insert"/>
<!--#org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=Java:ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE-->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer"
value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=Java:ELSE_ON_NEW_LINE-->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=Java:WHILE_ON_NEW_LINE-->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement"
value="do not insert"/>
<!--org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=Java:FINALLY_ON_NEW_LINE-->
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement"
value="do not insert"/>
<!--comment start-->
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/>
<!--ENABLE_JAVADOC_FORMATTING-->
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<!--org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<!--IDEA无对应设置,所以关闭对block comment的格式化 -->
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<!--org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=Java:KEEP_FIRST_COLUMN_COMMENT-->
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<!--org.eclipse.jdt.core.formatter.use_on_off_tags=FORMATTER_TAGS_ENABLED-->
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<!--org.eclipse.jdt.core.formatter.disabling_tag=FORMATTER_OFF_TAG-->
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<!--org.eclipse.jdt.core.formatter.enabling_tag=FORMATTER_ON_TAG-->
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<!--下面的没有IDEA对应项,在代码里面对IDEA中使用默认值即可,LINE_COMMENT_AT_FIRST_COLUMN BLOCK_COMMENT_AT_FIRST_COLUMN设置为false-->
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments"
value="false"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<!--和IDEA保持一致,注释换行-->
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<!--comment end-->
<!--org.eclipse.jdt.core.formatter.blank_lines_after_imports=Java:BLANK_LINES_AFTER_IMPORTS-->
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<!--org.eclipse.jdt.core.formatter.blank_lines_before_imports=Java:BLANK_LINES_BEFORE_IMPORTS-->
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<!--org.eclipse.jdt.core.formatter.blank_lines_after_package=Java:BLANK_LINES_AFTER_PACKAGE-->
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<!--org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=Java:BLANK_LINES_AROUND_CLASS-->
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<!--org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=Java:BLANK_LINES_BEFORE_METHOD_BODY-->
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<!--org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=Java:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<!--org.eclipse.jdt.core.formatter.blank_lines_before_field=Java:BLANK_LINES_AROUND_FIELD-->
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<!--org.eclipse.jdt.core.formatter.blank_lines_before_method=Java:BLANK_LINES_AROUND_METHOD-->
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<!--org.eclipse.jdt.core.formatter.blank_lines_before_package=Java:BLANK_LINES_BEFORE_PACKAGE-->
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<!--下面IDEA没有对应设置,使用对应值即可-->
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<!--org.eclipse.jdt.core.formatter.indentation.size=Java:IndentOptions:INDENT_SIZE-->
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<!--org.eclipse.jdt.core.formatter.continuation_indentation=Java:IndentOptions:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1"/>
<!--org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=Java:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<!--org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=Java:IndentOptions:SMART_TABS-->
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<!--org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=Java:INDENT_CASE_FROM_SWITCH-->
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<!--KEEP_INDENTS_ON_EMPTY_LINES-->
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<!--org.eclipse.jdt.core.formatter.tabulation.size=Java:IndentOptions:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<!--Java:IndentOptions:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<!--下面IDEA没有对应设置,使用对应值即可-->
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header"
value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header"
value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header"
value="true"/>
<!--Java:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<!--下面没有对应的IDEA设置,Eclipse先使用对应值-->
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression"
value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="16"/>
<!--IDEA默认配置在同一行,Eclipse使用对应值即可-->
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration"
value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
<!--Java:BINARY_OPERATION_SIGN_ON_NEXT_LINE-->
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
<!--ASSIGNMENT_WRAP 需要设置为 WRAP_AS_NEEDED WRAP_AS_NEEDED . Add in jdt.core-3.12it's not work in previous version -->
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
<!--IDEA无配置项,Eclipse使用对应值即可-->
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<!--org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=Java:KEEP_CONTROL_STATEMENT_IN_ONE_LINE-->
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<!--org.eclipse.jdt.core.formatter.compact_else_if=Java:SPECIAL_ELSE_IF_TREATMENT-->
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<!--Java:ALIGN_GROUP_FIELD_DECLARATIONS-->
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<!--Java:<Programmatic>-->
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<!--统一为end_of_lintIDEA默认一致-->
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration"
value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<!-- <setting id="org.eclipse.jdt.core.compiler.source" value="1.8"/>
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8"/>
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
-->
<!--Java:KEEP_SIMPLE_BLOCKS_IN_ONE_LINE-->
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<!--Java:CLASS_BRACE_STYLE,统一使用end_of_line TODO-->
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<!--org.eclipse.jdt.core.formatter.lineSplit=RIGHT_MARGIN-->
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
</profile>
</profiles>
@@ -0,0 +1,170 @@
# 组织服务组件编译方案评估
**日期**2026-05-05
**来源**ninca-common-component-organization-V2.9.2_20210730.jar
---
## 1. 原始依赖环境
| 项目 | 值 |
|------|-----|
| Spring Boot | 1.5.17.RELEASE |
| Spring Cloud | Edgware.SR3 |
| Spring Framework | 4.3.29.RELEASE |
| JDK | 1.8 |
| Servlet | 3.1.0 (javax) |
---
## 2. 反编译模块结构
```
maven-ninca-common-component-organization/
├── cwos-component-organization-interface-v2.9.2_xinghewan/ # 接口 + DTO (无外部依赖)
├── cwos-component-organization-data-v2.9.2_xinghewan/ # DAO + Entity (依赖 interface)
├── cwos-component-organization-service-v2.9.2_xinghewan/ # 业务逻辑 (依赖 data + interface)
└── cwos-component-organization-web-v2.9.2_xinghewan/ # Controller (依赖 service)
```
**依赖链**web → service → data → interface
---
## 3. 外部依赖分析
### 3.1 可直接复用的 V2 Maven 模块
| 依赖 | 来源模块 | 状态 |
|------|---------|------|
| cloudwalk-common-result | maven-cloudwalk-legacy-public | ✅ 已有 |
| cloudwalk-common-serial | maven-cloudwalk-legacy-public | ✅ 已有 |
| cloudwalk-common-service | maven-cloudwalk-legacy-public | ✅ 已有 |
| cloudwalk-common-data | **无对应模块** | ❌ 需新建 |
| cloudwalk-device-manager-common | maven-cloudwalk-device-manager | ✅ 已有 |
| cloudwalk-device-manager-interface | maven-cloudwalk-device-manager | ✅ 已有 |
| cloudwalk-device-sdk-interface | maven-cloudwalk-device-sdk | ✅ 已有 |
| cloudwalk-device-sdk-protocol-entity | maven-cloudwalk-device-sdk | ✅ 已有 |
| cwos-common-aks-interface | maven-cwos-common-aks | ✅ 已有 |
| cwos-device-authentication-interface | maven-cwos-device-authentication | ✅ 已有 |
| cwos-component-resource-* | maven-cwos-resource | ✅ 已有 |
| davinci-manager-* | maven-cloudwalk-intelligent-davinci-manager | ✅ 已有 |
| cwos-sdk-event | maven-cloudwalk-legacy-public | ✅ 已有 |
| cloudwalk-common-result/web/serial | maven-cloudwalk-legacy-public | ✅ 已有 |
### 3.2 缺失的 CloudWalk 内部依赖
这些 JAR 存在于原始 fat JAR 的 `BOOT-INF/lib/` 中,但本地没有对应的 Maven 模块:
| 依赖 | 说明 | 数量 |
|------|------|------|
| cn.cloudwalk.client.aggregate.* | 聚合服务接口 (cwos-core-aggregate-interface) | ~30 个类 |
| cn.cloudwalk.client.account.* | 账户服务接口 (cwos-component-account-interface) | ~15 个类 |
| cn.cloudwalk.client.resource.* | 资源服务接口 (cwos-component-resource-interface) | ~20 个类 |
| cn.cloudwalk.client.device.mgn.* | 设备管理原子接口 (cwos-core-device-mgn-atomic-interface) | ~10 个类 |
| cn.cloudwalk.client.device.processor.* | 设备处理器接口 (cwos-device-processor-interface) | ~5 个类 |
| cn.cloudwalk.rest.* | REST 客户端 (cwos-component-*-rest) | ~20 个类 |
| cn.cloudwalk.task.* | 任务引擎 (ai-cloud-task-*) | ~10 个类 |
| ninca-common-message-center | 消息中心接口 | ~5 个类 |
| 其他 | pineappine, aliyun, opencv 等 | ~10 个类 |
**合计缺失约 125 个外部类引用。**
### 3.3 移植可行性判断
| 依赖组 | 能否从已有 JAR 提取 | 工作量 |
|--------|-------------------|--------|
| cn.cloudwalk.client.aggregate.* | ✅ JAR 在 lib/ 中,可反编译安装 | 中 |
| cn.cloudwalk.client.account.* | ✅ JAR 在 lib/ 中,可反编译安装 | 中 |
| cn.cloudwalk.client.resource.* | ✅ JAR 在 lib/ 中,可反编译安装 | 中 |
| cn.cloudwalk.rest.* | ✅ JAR 在 lib/ 中,可反编译安装 | 中 |
| ai-cloud-task-* | ✅ JAR 在 lib/ 中 | 低 |
| 第三方 (opencv, aliyun 等) | ✅ 直接从 lib/ 提取 | 低 |
---
## 4. 三种编译方案
### 方案 A:完整 Maven 多模块(推荐)
```
maven-ninca-common-component-organization/
├── pom.xml # reactor POM
├── cwos-component-organization-interface/
│ └── pom.xml # 继承 reactor
├── cwos-component-organization-data/
│ └── pom.xml
├── cwos-component-organization-service/
│ └── pom.xml
└── cwos-component-organization-web/
└── pom.xml
```
**步骤:**
1. 创建 reactor POM,继承 Spring Boot 1.5.17 parent
2. 从原始 JAR 的 `BOOT-INF/lib/` 提取所有缺失的 CloudWalk JAR
3.`mvn install:install-file` 安装到本地 .m2 仓库
4. 各子模块 POM 声明依赖
**优点**:可真正编译、可 IDE 索引、可验证代码正确性
**缺点**:工作量大(~80 个 JAR 需要处理);版本与 V2 主线可能不一致
### 方案 B:混合方案(实用主义)
```
maven-ninca-common-component-organization/
├── pom.xml # 聚合 POM
├── organization-interface/
│ └── pom.xml # 仅 interface 模块可编译
└── organization-libs/ # 存放 lib JAR
└── lib/*.jar # 直接从原始 JAR 提取
```
**步骤:**
1. 仅 interface 模块完全 Maven 化(纯 DTO,无外部依赖)
2. data/service/web 模块标记为 `pom``jar`,依赖通过 `system` scope 引用 lib/ 目录
3. 从原始 JAR 的 `BOOT-INF/lib/` 复制所有 JAR 到 `organization-libs/lib/`
**优点**:interface 可编译;剩余模块至少可 IDE 打开
**缺点**system scope 不可传递;不适合 CI 构建
### 方案 C:纯参考(不编译)
保持当前状态(已清理的反编译源码 + 中文注释),仅用于:
- 代码走查和业务逻辑分析
- Person detail → floorList 调用链追踪
- 策略需求的功能验证
**优点**:零工作量
**缺点**:不能编译验证、IDE 报错
---
## 5. 最终决策:不编译,直接用原始 JAR
### 结论
反编译源码仅作为**走查参考**,不进行 Maven 化编译。任何需要依赖组织服务的项目,直接引用原始 JAR:
```
源码/maven-cw-elevator-application/releases/cw-elevator-application-v2.0.10-.../org-service/.../ninca-common-component-organization-V2.9.2_20210730.jar
```
### 理由
| 考量 | 说明 |
|------|------|
| 复杂度 | 避免引入 80+ 个依赖 JAR 的版本管理问题 |
| 维护成本 | 反编译源码不改动、不编译,永远与原始 JAR 一致 |
| 目标明确 | 仅用于走查 `floorList` 生成逻辑,不需要编译 |
| 引用方式 | 需要时通过 `system` scope 或直接解压查看 |
### 反编译源码的定位
```
maven-ninca-common-component-organization/
→ 走查参考(已清理 CFR 痕迹 + 中文注释 + Unicode 转中文)
→ 不参与构建
→ 不改动
→ 与原始 JAR 字节码保持语义一致(已验证 56/56 方法匹配)
```
@@ -0,0 +1,262 @@
# Component-Org Service 编译错误分类 (200 errors, 8 files)
**日期**: 2026-05-05
**构建**: `mvn compile -DskipTests -s ../maven-cw-elevator-application/.mvn/settings.xml`
**JDK**: 1.8.0_482 | **Spring Boot**: 1.5.22 | **CFR 反编译**: 0.152
---
## 错误总览
| 类别 | 数量 | 根因 | 自动修复难度 |
|------|------|------|-------------|
| No-symbol (找不到符号) | 78 | `$$$` ast-grep 残留 + raw stream 调用 + 方法歧义 | ⭐⭐ 中 |
| Object→cast | 76 | raw List/Map 失去泛型 | ⭐⭐⭐ 高 |
| Type-mismatch | 22 | 类型声明与使用不匹配 | ⭐⭐ 中 |
| Ambiguous (方法歧义) | 16 | redisTemplate.execute() 歧义 | ⭐ 低 |
| Type-inf (类型推断) | 6 | 空集合初始化泛型推断 | ⭐ 低 |
**总计**: 200 errors in 8 files
---
## 1. No-symbol (78 errors)
### 1.1 `$$$` ast-grep 残留 (36 errors)
**涉及文件**: CpOrgDevieKitServiceImpl (32), OrganizationUnitTypeServiceImpl (12), AreaTypeServiceImpl (2)
**根因**: `ast_grep_replace``return CloudwalkResult.success(X)` 改为 `return (CloudwalkResult) CloudwalkResult.success($$$)` 时, `$$$` 捕获参数但 rewrite 时 `$$$``success()` 括号内丢失了 X — X 变量覆盖了 `$$$` 变量名。
**源代码模式**:
```java
// 改写前 (ast-grep)
return CloudwalkResult.success(updateGroupResult);
// 改写后 (异常)
return (CloudwalkResult) CloudwalkResult.success($$$);
```
**修复方案**: 逐行恢复原始表达式。
**影响方法**:
- CpOrgDevieKitServiceImpl: `onUpdateGroupRequest(L117)`, `onUpdateFeatureRequest(L127/L140/L166)`, `onUpdatePictureRequest(L176/L189/L215)`, `onUpdatePersonRequest(L235/L255/L310)`, `handlePersonValidDate(L522/L530)`
- OrganizationUnitTypeServiceImpl: `page(L76)`, `getList(L110)`, `defaultInitOrgType(L121/L145)`, `initParkOrg(L188/L227)`
- AreaTypeServiceImpl: `add(L104)`
### 1.2 raw stream `.map()` 调用 Object 方法 (12 errors)
**涉及文件**: OrganizationServiceImpl.detail(L814,L815,L824,L843), CpImageStorePersonManager(L110,L357,L365,L386)
**根因**: raw List 的 `.stream()` 返回 `Stream<Object>`, 对 Object 调用 `.getAreaId()` / `.getImageStoreId()` 找不到方法。
**源代码模式**:
```java
// refDTOS 是 raw List, stream() 是 Stream<Object>
List officeArea = refDTOS.stream()
.filter(it -> it.getRefType() == 0) // Object 没有 getRefType()
.map(o -> o.getAreaId()) // Object 没有 getAreaId()
.collect(Collectors.toList());
```
**修复方案**: 在 stream 前添加 `(List<OrganizationAreaRefDTO>)` 转换,或定义变量时指定泛型。
### 1.3 redisTemplate.delete(Object) (2 errors)
**涉及文件**: CpOrgDevieKitServiceImpl.unlockSyncLog(L593)
**根因**: `redisTemplate.delete(Object)` — RedisTemplate 的 `delete()` 签名是 `delete(K key)` 泛型, 传入 Object 无法匹配。
**修复方案**: 删除 `(Object)` 转型, 直接传 key: `this.redisTemplate.delete(key);`
---
## 2. Object→cast (76 errors)
### 2.1 for-each over raw Collection (30+ errors)
**涉及文件**: CpImageStorePersonSynManager, CpImageStorePersonValidateManager, CpOrgDevieKitServiceImpl
**根因**: raw List/Map 遍历时 Iterator 返回 Object, 无法赋值给具体类型。
**源代码模式**:
```java
// removeMap 是 raw Map
for (Map.Entry entry : removeMap.entrySet()) { ... }
// 修复:
for (Map.Entry<Long, Set<SyncPersonLocal>> entry : removeMap.entrySet()) { ... }
// personInfoDataDatas 是 raw Collection
for (DeviceImageUpdateFeautreResult deviceUpdatePersonResult : personInfoDataDatas) { ... }
// 修复: 声明 personInfoDataDatas 为 Collection<DeviceImageUpdateFeautreResult>
```
**修复方案**: 找到 raw Collection 的声明位置, 添加泛型类型参数。如果变量有多态使用, 则添加 `(Collection<Type>)` 转换。
### 2.2 redisTemplate.keys() 返回 raw Set (8 errors)
**涉及文件**: CpImageStorePersonSynManager.checkHandleSynTaskException(L489,L492,L499,L502)
**根因**: `redisTemplate.keys(pattern)` 返回 `Set<K>`, 但声明为 raw `Set`, 后续 `.replaceFirst()` 等方法在 Object 上找不到。
**源代码模式**:
```java
Set synQueueHeadDataKeys = this.redisTemplate.keys(...);
String imageStoreId = synQueueHeadDataKey.replaceFirst(SYN_QUEUE_HEAD_DATA, "");
```
**修复方案**: 声明为 `Set<String>`:
```java
Set<String> synQueueHeadDataKeys = this.redisTemplate.keys(...);
```
### 2.3 Map.get() 返回 Object (8 errors)
**涉及文件**: CpImageStorePersonManager(L316,L336), OrganizationUnitTypeServiceImpl(L59)
**根因**: raw Map 的 `get()` 返回 Object, 无法调用 `.setPersonId()` 或赋值给 Integer。
**修复方案**: 声明 Map 为 `Map<K, V>` 泛型, 或在 get() 结果上添加强制转型。
### 2.4 stream().collect() 返回 Object (10 errors)
**涉及文件**: OrganizationServiceImpl.saveAreaDetails(L963,L970,L974,L981)
**根因**: raw List 的 stream 操作, collect 返回 Object 无法赋值给具体类型。
**修复方案**: 在 stream 前添加 `(List<String>)` 转换:
```java
List passableList = ((List<String>)passableArea).stream().map(...).collect(Collectors.toList());
```
---
## 3. Type-mismatch (22 errors)
### 3.1 `String` → `Set<String>` 转型 (8 errors)
**涉及文件**: CpImageStorePersonSynManager(L489,L492,L499,L502)
**根因**: 代码写了 `(java.lang.String)` 转型但实际类型是 `Set`:
```java
Set synQueueHeadDataKeys = (java.lang.String) this.redisTemplate.keys(...);
```
**修复方案**: 修改转型为目标类型:
```java
Set<String> synQueueHeadDataKeys = this.redisTemplate.keys(...);
```
### 3.2 三元表达式类型不一致 (4 errors)
**涉及文件**: CpImageStorePersonValidateManager(L150, L453)
**根因**:
```java
List<Object> syncPersonDtoList = StringUtils.isNotBlank(dataSet)
? JsonUtils.toObjList(dataSet, SyncPersonLocal.class)
: new ArrayList<>(); // inferred as ArrayList<Object>
```
`JsonUtils.toObjList()` 返回 `List<SyncPersonLocal>`, `new ArrayList<>()` 推断为 `ArrayList<Object>`, 三元运算符的两个分支类型不一致。
**修复方案**: 指定 ArrayList 的泛型:
```java
: new ArrayList<SyncPersonLocal>()
```
### 3.3 `ArrayList<String>` vs `List<String>` (2 errors)
**涉及文件**: OrganizationServiceImpl.getList(L552)
**根因**: `ids` 声明为 `ArrayList<String>``param.getIds()` 返回 `List<String>`, 不能直接赋值。
**修复方案**:
```java
ids = new ArrayList<>(param.getIds()); // 或
ids.clear(); ids.addAll(param.getIds());
```
### 3.4 `List<Object>` vs `List<String>` (2 errors)
**涉及文件**: OrganizationServiceImpl.detail(L826)
**根因**: zoneIds 声明为 `List<Object>``result.setZoneIds()` 接受 `List<String>`
**修复方案**:
```java
result.setZoneIds((List<String>)(List<?>) zoneIds); // 双重转型绕过泛型检查
```
### 3.5 `List<List<T>>` vs `List<List>` (2 errors)
**涉及文件**: CpImageStorePersonTxHandler.handleImageStorePersonDelete(L201)
**根因**: `Lists.partition()` 返回 `List<List<T>>` 但赋值给 `List<List>`
**修复方案**:
```java
List<List<String>> partition = Lists.partition(changePersonIds, delBatchSize);
```
---
## 4. Ambiguous (16 errors) - redisTemplate.execute() 歧义
**涉及文件**: CpImageStorePersonSynManager (12), CpImageStorePersonValidateManager (4)
**根因**: `RedisTemplate<K,V>.execute()` 有两个重载:
- `execute(RedisCallback<T> callback)`
- `execute(SessionCallback<T> callback)`
lambda `connection -> connection.eval(...)` 同时匹配 RedisCallback 和 SessionCallback。
**源代码**:
```java
this.redisTemplate.execute(connection -> (Long)connection.eval(lua, keys, args))
```
**修复方案**: 添加 lambda 参数类型或转型:
```java
this.redisTemplate.execute((RedisCallback<Long>) connection -> connection.eval(lua, keys, args))
```
---
## 5. Type-inf (6 errors) - 类型推断失败
### 5.1 Sets.newHashSet() 泛型推断 (2 errors)
**涉及文件**: CpImageStorePersonTxHandler.deletePersonFromImageStores(L221)
**根因**: `Sets.newHashSet((Object[])new String[]{imageId})` — 重建数组丢失类型。
**修复方案**:
```java
Sets.newHashSet(imageId) // 或
Sets.<String>newHashSet(new String[]{imageId})
```
### 5.2 Map infer from stream (4 errors)
**涉及文件**: CpImageStorePersonSynManager.handleImageStoreIncrementSyn(L417,L418)
**根因**: `.collect(Collectors.groupingBy(...))` 的结果赋值给 `Map<String, List<GroupPersonRef>>` 但 stream 是 raw。
**修复方案**: 先转型 source 再 stream。
---
## 每文件修复优先级
| 文件 | 错误数 | 主要类别 | 修复复杂度 | 预估时间 |
|------|-------|---------|-----------|---------|
| CpOrgDevieKitServiceImpl | 54 | $$ (32), Obj→cast (20) | ⭐⭐ | 30 min |
| CpImageStorePersonSynManager | 38 | Obj→cast (10), Ambiguous (12) | ⭐⭐ | 25 min |
| OrganizationServiceImpl | 32 | No-sym (14), Obj→cast (14) | ⭐⭐ | 20 min |
| CpImageStorePersonValidateManager | 28 | Obj→cast (12), Type-mis (8) | ⭐⭐ | 20 min |
| CpImageStorePersonManager | 16 | No-sym (8), Obj→cast (8) | ⭐⭐ | 15 min |
| OrganizationUnitTypeServiceImpl | 14 | $$ (12), Obj→cast (2) | ⭐ | 10 min |
| AreaTypeServiceImpl | 10 | $$ (2), Obj→cast (8) | ⭐ | 10 min |
| CpImageStorePersonTxHandler | 8 | Type-mis (2), No-sym (2) | ⭐ | 5 min |
**总预估**: 约 2 小时逐行修复。
@@ -0,0 +1,256 @@
# ConsulServerList 静态固定后:IP 直连服务发现分析
> **日期**2026-05-05
> **分析范围**`maven-cw-elevator-application`、`maven-intelligent-cwoscomponent`
> **状态**:待后续排查
---
## 1. 问题背景
电梯应用(cw-elevator-application)的三个上游 Feign 客户端在 `spring.cloud.consul.discovery.enabled=false` 的情况下,无法通过 Consul 动态发现服务实例。当前解决方式是将 Ribbon 的 `ServerList` 固定为 `ConfigurationBasedServerList`,直接配置静态 IP 列表绕过 Consul。
但 V1 生产(星中心)中**并没有**这些静态 IP 配置,却仍在正常运行——这个差异需要深入排查。
---
## 2. 服务发现链路现状
### 2.1 V2 当前架构
```
业务代码 → @FeignClient(name = "ninca-crk-std")
Ribbon LoadBalancer
ConfigurationBasedServerList ← 由 application.properties 强制指定
ninca-crk-std.ribbon.listOfServers ← 直接返回硬编码 IP:Port
目标 HTTP 服务
```
### 2.2 V1 生产(星中心)架构——未文档化的差异
```
业务代码 → @FeignClient(name = "ninca-crk-std")
Ribbon LoadBalancer
??? (无 ConfigurationBasedServerList 配置)
??? (无 listOfServers 配置)
```
**V1 生产没有 `ribbon.listOfServers`,但 Feign 调用工作正常——原因未知。**
---
## 3. 涉及的上游服务与 Feign 客户端
### 3.1 `ninca-crk-std`CRK 人脸识别 GPU
| Feign 客户端 | 模块 | @FeignClient name | 当前解析方式 |
|-------------|------|-------------------|-------------|
| `VisitorFeignClient.java` | elevator-service | `${feign.ninca-crk-std.name:ninca-crk-std}` | Ribbon → `listOfServers=10.128.161.95:16106` |
| `AcsRecordThreeSendFeignClient.java` | intelligent-cwoscomponent-rest | `${feign.ninca-crk-std.name:ninca-crk-std}` | Ribbon → 同上 |
另有非 Feign 路径:`AcsElevatorRecordServiceImpl` 通过 `@Value("${ninca-crk-std.ip}")` + `RestTemplate` 直连 CRK,与 Feign 无关。
### 3.2 `ninca-common-component-organization`(组织组件)
| Feign 客户端 | @FeignClient name | @FeignClient url | 当前解析方式 |
|-------------|-------------------|-----------------|-------------|
| `PersonFeignClient.java` | `ninca-common-component-organization` | **`http://127.0.0.1:33011`**(硬编码) | **绕过 Ribbon,直接 URL** |
| `OrganizationFeignClient.java` | `${feign.component-organization.name}` | 无 | Ribbon → `listOfServers=127.0.0.1:33011` |
| `LabelFeignClient.java` | `${feign.component-organization.name}` | 无 | Ribbon → 同上 |
| `ImageStorePersonFeignClient.java` | `${feign.component-organization.name}` | 无 | Ribbon → 同上 |
| `ImageStoreFeignClient.java` | `${feign.component-organization.name}` | 无 | Ribbon → 同上 |
| `ApplicationImageStoreFeignClient.java` | `${feign.component-organization.name}` | 无 | Ribbon → 同上 |
### 3.3 `ninca-common`(公共组件)
| Feign 客户端 | @FeignClient name | 当前解析方式 |
|-------------|-------------------|-------------|
| `ZoneFeignClient.java` | `${feign.ninca-common.name:ninca-common}` | Ribbon → **无 `listOfServers` 配置** |
| `FileFeign.java` | `${feign.ninca-common.name:ninca-common}` | Ribbon → 同上 |
| `SysettingAreaFeignClient.java` | `${feign.ninca-common.name:ninca-common}` | Ribbon → 同上 |
> **⚠️ `ninca-common` 没有任何 `ribbon.listOfServers` 配置。如果 Feign 调用到达此服务,会因空列表失败。**
---
## 4. 配置差异矩阵
### 4.1 V2 deploy/v2-maven/application.properties(当前验证环境)
```properties
# Feign 服务名映射
feign.ninca-crk-std.name=ninca-crk-std
feign.component-organization.name=ninca-common-component-organization
feign.ninca-common.name=ninca-common
# ninca-crk-std: 强制 ConfigurationBasedServerList + 静态 IP
ninca-crk-std.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList
ninca-crk-std.ribbon.listOfServers=10.128.161.95:16106
# ninca-common-component-organization: 同上
ninca-common-component-organization.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList
ninca-common-component-organization.ribbon.listOfServers=127.0.0.1:33011
# ninca-common: ❌ 无任何 Ribbon 配置
```
### 4.2 V2 deploy/v1-legacy/application.properties
```properties
ninca-crk-std.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList
ninca-crk-std.ribbon.listOfServers=10.128.161.95:16106
# ❌ component-organization 和 ninca-common 无 Ribbon 配置
```
### 4.3 V1 生产(星中心/cw-elevator-application-V1.0.0.20211103/application.properties
```properties
feign.ninca-crk-std.name=ninca-crk-std
feign.component-organization.name=ninca-common-component-organization
feign.ninca-common.name=ninca-common
ninca-crk-std.ip=10.0.22.102:16106
# ❌ 无任何 ribbon.listOfServers 配置
# ❌ 无任何 NIWSServerListClassName 配置
# ✅ discovery.enabled=falsebootstrap.properties
```
---
## 5. NincaCrkStdRibbonConfiguration 源码删除问题
| 文件 | 状态 | 位置 |
|------|------|------|
| `NincaCrkStdRibbonConfiguration.java` | ❌ **源码已删除** | `cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/` 目录存在但为空 |
| `NincaCrkStdRibbonConfiguration.class` | ✅ 旧 fat JAR 中残留 | `deploy/v2-maven/cw-elevator-application-2.0.0/BOOT-INF/classes/cn/cloudwalk/ribbon/` |
| `ElevatorApplication.java` | ❌ 当前无 `@RibbonClient`/`@RibbonClients` | 启动类已清理 |
**影响**:新的 V2 构建不再包含 `NincaCrkStdRibbonConfiguration.class`。但由于 `application.properties` 中已有 `NIWSServerListClassName`,功能不受影响——属性配置和 Java 配置实现相同目的。
**残留风险**:旧 JAR 的 `NincaCrkStdRibbonConfiguration``@RibbonClients` 引用。如果旧 JAR 中的 `ElevatorApplication.class``@RibbonClients({@RibbonClient(configuration=NincaCrkStdRibbonConfiguration.class)})`,而新的构建没有这个类,会导致 `ClassNotFoundException`。需要确认 `ElevatorApplication.java` 是在哪个提交中完全移除了 `@RibbonClients`
---
## 6. PersonFeignClient URL 硬编码问题
Commit: `ff9a9ed6``fix(test): hardcode PersonFeignClient url to local stub for test env`
```java
// 改前:
@FeignClient(name = "${feign.component-organization.name:ninca-common-component-organization}",
path = "/component/person", fallback = PersonFeignClientFallback.class)
// 改后:
@FeignClient(name = "ninca-common-component-organization",
url = "http://127.0.0.1:33011",
path = "/component/person", fallback = PersonFeignClientFallback.class)
```
**改动影响**
- `name` 从可配置占位符改为硬编码
- 新增 `url` 强制指向 `127.0.0.1:33011`(本地 stub
- `name` 硬编码后,即使去掉 `url`Ribbon 客户端名也不再跟随 `feign.component-organization.name` 配置
**提交说明**`NOTE: PersonFeignClient url change is test-only, revert before production`
---
## 7. 待排查项
### P0 — V1 生产服务发现机制
V1 生产(星中心 `bootstrap.properties`)中 `spring.cloud.consul.discovery.enabled=false`,且没有任何 `ribbon.listOfServers` 配置。需要确认:
- V1 生产的 Feign 客户端到 CRK/组织组件的调用路径是否实际被执行?
- 如果执行,ConsulServerList 在 `discovery.enabled=false` 下是否仍能从 Consul HTTP API 获取实例?
- Spring Cloud Edgware.SR3 的 `ConsulServerList``discovery.enabled=false` 时到底如何行为?
**验证方法**
```bash
# 在 V1 生产进程上查 Ribbon 实际使用的 ServerList 实现类
# 通过 RibbonLoadBalancerProbeRunner 日志(如果有)
# 或通过 jstack 分析 Feign 调用链
# 查看 Spring Cloud Consul 版本(决定 ConsulServerList 行为)
unzip -p V1.jar lib/spring-cloud-consul-discovery-*.jar META-INF/MANIFEST.MF
```
### P1 — ninca-common 缺少静态 IP 配置
`ZoneFeignClient`(空间服务)和 `FileFeign`(文件服务)调用 `ninca-common`,但没有任何 `listOfServers` 配置。需要:
- 确认这些 Feign 客户端在 V1/V2 中是否实际被调用
- 如果被调用,补充 `ninca-common.ribbon.listOfServers` 配置
### P1 — PersonFeignClient 生产就绪检查
- 确认 `url = "http://127.0.0.1:33011"` 在构建生产 JAR 前被 revert
- 恢复 `name = "${feign.component-organization.name:ninca-common-component-organization}"` 的占位符形式
### P2 — NincaCrkStdRibbonConfiguration 清理残留
- 决定是否恢复源码(保留 Java config 方式)或完全依赖 properties
- 如果依赖 properties,删除 `cn/cloudwalk/ribbon/` 空目录清除残留
### P2 — V1 vs V2 Ribbon 配置对齐文档
-`docs/architecture/` 中记录 V1 生产的真实服务发现机制
- 明确 V2 增加 `ribbon.listOfServers` 的理由和适用范围
---
## 8. 关键文件定位
| 文件 | 路径 |
|------|------|
| ElevatorApplication.java | `maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/ElevatorApplication.java` |
| NincaCrkStdRibbonConfiguration.java | **已删除**(旧路径:`.../ribbon/NincaCrkStdRibbonConfiguration.java` |
| RibbonLoadBalancerProbeRunner.java | `.../debug/RibbonLoadBalancerProbeRunner.java` |
| ElevatorUpstreamServiceNames.java | `.../debug/ElevatorUpstreamServiceNames.java` |
| PersonFeignClient.java | `maven-intelligent-cwoscomponent/intelligent-cwoscomponent-rest/.../person/feign/PersonFeignClient.java` |
| V2 deploy application.properties | `maven-cw-elevator-application/deploy/v2-maven/application.properties` |
| V2 deploy test properties | `maven-cw-elevator-application/deploy/v2-maven/application-test.properties` |
| V1 生产 config | `星中心/cw-elevator-application-V1.0.0.20211103/application.properties` |
| V1 生产 bootstrap | `星中心/cw-elevator-application-V1.0.0.20211103/bootstrap.properties` |
| V1 fat JAR internal props | `星中心/.../cw-elevator-application-V1.0.0.20211103.jar!/application.properties` |
| 提交:清理 @RibbonClients | `373b5501` |
| 提交:PersonFeignClient url 硬编码 | `ff9a9ed6` |
| 提交:添加 ZK discovery 依赖 | `6b5898d0` |
| 提交:添加 NincaCrkStdRibbonConfiguration | `0a6ac955` |
| 架构设计文档 | `docs/superpowers/specs/2026-05-01-service-discovery-architecture-design.md` |
---
## 9. 附录:Ribbon ServerList 在 Spring Cloud Edgware 中的默认行为
Spring Cloud Edgware.SR3V1 使用的版本)中,当 `spring.cloud.consul.discovery.enabled=false`
```
ConsulDiscoveryClient → @ConditionalOnProperty(enabled=true) → bean NOT created
ConsulServerList → depends on DiscoveryClient → can't be created
Fallback → ConfigurationBasedServerList (Ribbon 默认)
ConfigurationBasedServerList → reads "{name}.ribbon.listOfServers" from Environment
if absent → returns empty list
```
V2Spring Cloud Greenwich + Boot 2.1.x)表现相同。
如果 V1 生产确实没有 `listOfServers` 但 Feign 调用正常,则说明:
1. Feign 客户端的调用链路本身不在 CRK/组织组件上执行,或者
2. Spring Cloud Edgware 的 ConsulServerList 在 `discovery.enabled=false` 时有特殊处理(需要反编译 `ConsulServerList.class` 确认),或者
3. V1 生产运行时通过其他方式注入了 `listOfServers`(如 Consul KV、`SPRING_APPLICATION_JSON`、JVM 参数)
---
*本文档为代码走查与配置分析生成,需结合生产环境运行时证据进一步排查。*
@@ -0,0 +1,137 @@
# 组织组件:部署包 vs 源码批量对比与 javap 单类语义对照
> **已 supersede** 全量 `**src/main/java`582 文件)** 逐类 `javap` 核对、清单与解决方案见
> `[2026-05-06-component-org-full-java-audit-and-remediation.md](./2026-05-06-component-org-full-java-audit-and-remediation.md)`
> 及 `maven-ninca-common-component-organization/tools/out/deploy_javap_audit_main.json`。
**日期:** 2026-05-06
**部署包根路径:** `星河湾星中星/部署包/ninca_common_component_organization_01-ninca_common_component_organization`
**源码反应堆:** `源码/maven-ninca-common-component-organization`
**本地构建:** `mvn -DskipTests package`(对比时使用各模块 `target/*.jar` 与 Starter Fat JAR
---
## 1. 批量对比摘要(Lua / 配置 / JAR)
| 类别 | 结论 |
| ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Lua**`service/.../lua` ↔ 部署 `BOOT-INF/classes/lua` | `diff -rq` 无差异,9 个脚本一致。 |
| **配置** | 根目录 `application.properties``BOOT-INF/classes` 仍有多层覆盖差异;根目录存在无效行 `新增配置`(应改为 `#` 注释)。`generator*.xml` 仅在现场包内,仓库无同名 `src/main/resources`。 |
| **四模块 JAR** | 与部署 `BOOT-INF/lib``*-v2.9.2_xinghewan.jar` 逐 entry SHA-256 比对:**绝大多数 `.class` 哈希不同**;另见接口 JAR 多 `component-org/messages*.properties`Data JAR 多 `mapper/mysql/*.xml` 而仓库 data 模块未提交对应 XML。 |
| **Starter** | 现场 `BOOT-INF/classes` 含大量 config/kafka 等 `**.class`**;仓库 `starter``**OrganizationServer.java**`,编译产物几乎只有 `**OrganizationServer.class**`。 |
| **Fat JAR** | 现场 `...20210730.jar`(约 116MB)与本地 `ninca-common-component-organization-2.9.2-xinghewan.jar`(约 96MB**SHA-256 不同**,依赖与打包体积不一致。 |
---
## 2. javap 对照方法
- **命令:** `javap -p -classpath <jar 或 classes 目录> <全限定类名>`
- **含义:** 打印编译期可见的类签名、字段、方法(含 private),用于 **API 形状** 对照;**不**等价于字节码逐条指令一致(需 `javap -c``javap -v`)。
- **部署侧类路径:** 优先从解压目录 `.../BOOT-INF/classes` 加载(如 `OrganizationServer`);其余类从现场四模块 JAR 组成的 classpath 加载。
- **本地侧:** Starter 类从 `cwos-component-organization-starter/target/classes`;其余从本地四模块 `target/*.jar`
---
## 3. 抽样类:javap 是否一致
| 类 | javap`-p`)结果 |
| ----------------------------------------------------------------------- | ------------------------------- |
| `cn.cloudwalk.starter.organization.OrganizationServer` | **不一致**(见下节) |
| `cn.cloudwalk.web.organization.controller.PersonController` | **完全一致** |
| `cn.cloudwalk.web.organization.controller.CpOrgDeviceKitController` | **完全一致** |
| `cn.cloudwalk.service.organization.service.ImgPersonServiceImpl` | **不一致**(见下节) |
| `cn.cloudwalk.service.organization.service.CpImageStoreToolServiceImpl` | **不一致**(见下节;差异仅在合成 lambda 方法签名) |
---
## 4. 差异详情:`diff -u`javap 输出)
### 4.1 `OrganizationServer`
现场类继承 `SpringBootServletInitializer` 并实现 `WebApplicationInitializer`,且含 `RestTemplate``MeterRegistryCustomizer``configure(SpringApplicationBuilder)` 等;本地类为 **普通类**,仅 `main``**cloudwalkSessionContextHolder()`** Bean 方法,**无 WAR 引导与 Micrometer 相关成员**。
```diff
--- deploy javap
+++ local javap
@@ -1,12 +1,6 @@
Compiled from "OrganizationServer.java"
-public class cn.cloudwalk.starter.organization.OrganizationServer extends org.springframework.boot.web.support.SpringBootServletInitializer implements org.springframework.web.WebApplicationInitializer {
- private static org.slf4j.Logger log;
- org.springframework.data.redis.core.StringRedisTemplate stringRedisTemplate;
+public class cn.cloudwalk.starter.organization.OrganizationServer {
public cn.cloudwalk.starter.organization.OrganizationServer();
+ public cn.cloudwalk.cloud.context.CloudwalkSessionContextHolder cloudwalkSessionContextHolder();
public static void main(java.lang.String[]);
- org.springframework.web.client.RestTemplate restTemplate();
- public org.springframework.web.client.RestTemplate getWebClient();
- io.micrometer.spring.autoconfigure.MeterRegistryCustomizer<io.micrometer.core.instrument.MeterRegistry> configurer(java.lang.String);
- protected org.springframework.boot.builder.SpringApplicationBuilder configure(org.springframework.boot.builder.SpringApplicationBuilder);
- static {};
}
```
**解读:** 本地 Starter 与现场 **入口形态不一致**;若要以现场为准,需将完整 Starter 源码迁回仓库后再比对。
---
### 4.2 `ImgPersonServiceImpl`
本地相对现场 **多出** 租户访客楼层策略依赖与两个私有辅助方法(与仓库内访客楼层策略改造一致)。
```diff
--- deploy javap
+++ local javap
@@ -23,6 +23,7 @@
private org.springframework.context.MessageSource messageSource;
private cn.cloudwalk.service.organization.service.feign.ZoneFeignClient zoneFeignClient;
+ private cn.cloudwalk.service.organization.policy.TenantVisitorFloorPolicyService tenantVisitorFloorPolicyService;
@@ -56,6 +57,8 @@
public cn.cloudwalk.cloud.result.CloudwalkResult<java.lang.Boolean> syncAccountUnbind(...);
+ private java.lang.String buildCommaSeparatedFloorNames(java.lang.String, java.util.List<java.lang.String>);
+ private java.util.List<cn.cloudwalk.client.organization.result.AcsPassRuleImageResultDto> buildFloorInfoListFromOrderedZoneIds(java.lang.String, java.util.List<java.lang.String>);
private void saveSysLog(...);
```
**解读:** **源码侧领先于现场 JAR**(功能扩展);非「仅编译器噪声」。
---
### 4.3 `CpImageStoreToolServiceImpl`
差异仅体现在 **lambda 合成方法** `lambda$batchRemoveFace$5` 的参数列表(少一个 `BatchRemoveFaceParam`)。公开 API 未在上面的片段中变化,通常与 **同一源码重新编译后 lambda 编号/捕获变量** 有关,需结合 `-c` 或业务测试确认行为是否等价。
```diff
--- deploy javap
+++ local javap
@@ -36,7 +36,7 @@
- private static void lambda$batchRemoveFace$5(cn.cloudwalk.client.organization.param.BatchRemoveFaceParam, cn.cloudwalk.client.organization.service.store.param.CpBatchHandleFaceParam, java.util.List, java.lang.String);
+ private static void lambda$batchRemoveFace$5(cn.cloudwalk.client.organization.service.store.param.CpBatchHandleFaceParam, java.util.List, java.lang.String);
```
---
## 5. 结论与建议
1. **PersonController / CpOrgDeviceKitController****方法签名层面** 与现场一致,与「几乎全部 class 文件哈希不同」并存时,说明 **大量差异来自编译环境或调试信息**,而非必然的业务接口变更。
2. **OrganizationServer** 与现场 **语义层面不一致**,与仓库 Starter 仅保留最小入口一致,属 **结构性缺口**
3. **ImgPersonServiceImpl** 差异反映 **源码已增加租户访客楼层策略**,现场包未包含时需 **升级发布** 才能对齐。
4. 后续若要扩大 javap 覆盖面:可对 **变更集中的 Service** 再跑同一脚本;若需 **指令级** 一致,对关键方法追加 `javap -c` 对比。
---
## 6. 复现命令(节选)
```bash
DEPLOY_LIB=".../ninca-common-component-organization-V2.9.2_20210730/BOOT-INF/lib"
D_CP="$DEPLOY_LIB/cwos-component-organization-web-v2.9.2_xinghewan.jar:..."
DEPLOY_CLS=".../BOOT-INF/classes"
L_CP=".../cwos-component-organization-web/target/...jar:..."
javap -p -classpath "$DEPLOY_CLS" cn.cloudwalk.starter.organization.OrganizationServer
javap -p -classpath ".../cwos-component-organization-starter/target/classes" cn.cloudwalk.starter.organization.OrganizationServer
```
(将 `...` 替换为本机完整路径。)
@@ -0,0 +1,85 @@
# DIFFERENT(剩余):逐类 `javap -p` 核对(现场 JAR vs 本仓库 `target/classes`
**日期:** 2026-05-06**2026-05-06 更新**OpenCvUtils + 三工具类已与现场 **IDENTICAL**DIFFERENT **18**
**依据:** `maven-ninca-common-component-organization/tools/out/deploy_javap_audit_main.json``status == "DIFFERENT"`
**证据文件:** `tools/out/different-22-javap/`(历史批量 diff);复跑审计后以 **`deploy_javap_audit_main.json`** 为准
**现场 classpath** `ninca-common-component-organization-V2.9.2_20210730/BOOT-INF/classes` + 四模块 `*-v2.9.2_xinghewan.jar`
**本地 classpath** `interface` / `data` / `service` / `web` / `starter``target/classes`(与 `deploy_javap_audit.py` 一致)
---
## 1. 总览:差异类型与处置
| 类型 | 含义 | 本批数量(约) |
| ------------------------------ | ---------------------------------------------------------------------------------- | ------------------ |
| **A. 仅 synthetic / lambda 形变** | 无 `public`/`protected` 方法签名的变化,差异集中在 `lambda$…``null$` 或具体化类型(`List``ArrayList`) | 多数 |
| **B. 小范围 API 面变化** | 主要为 **`ChannelFileReader` 声明 `AutoCloseable`**(工具类构造已与现场对齐) | **1** |
| **C. 明确业务增强** | 新增**字段/私有方法**或组织 `detail` 等实现路径增加分支 | 2+ |
| **D. 与现场能力严重偏离** | 公开方法集合与现场**不等价** | **已处理(OpenCvUtils 已与现场 IDENTICAL** |
**说明:** 已与现场 **IDENTICAL** 的曾有 DIFFERENT 项:**`OpenCvUtils`**(与 `jar.src`/`javap` 对齐)、**`ImageUtil`/`ToolUtil`/`ImageEditUtils`**(补 **private** 无参构造,与部署 service JAR 一致)。**仍 DIFFERENT** 共 **18** 类(多为 synthetic/lambda 或业务超前)。
---
## 2. 逐类表(剩余 DIFFERENT**18**;已收敛项见 §2.1
### 2.1 已从 DIFFERENT 收敛(供追溯)
| FQN | 处置 |
| --- | --- |
| `OpenCvUtils` | 与现场 **service JAR + `jar.src`** 对齐,`javap -p` **IDENTICAL** |
| `ImageUtil``ToolUtil``ImageEditUtils` | 增加 **`private Xxx() {}`**,与部署 **private 无参构造**一致,`javap` **IDENTICAL** |
### 2.2 仍为 DIFFERENT(简表)
| # | FQN | 差异要点(见对应 `diff-*.patch`) | 分类 | 建议 |
| --- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ----- | ----------------------------------------------------------------------- |
| 1 | `…common.AbstractImagStoreService` | `lambda$distinctByKey$0` 首参 `Set``ConcurrentHashMap$KeySetView` | A | 视为编译器/具体化差异;**行为以方法体为准**(可抽查 `javap -c`) |
| 2 | `…common.JsonUtils` | `lambda$toStrList$1``List``ArrayList` | A | 无 public 变化 |
| 3 | `…common.OkhttpUtil` | 新增 `lambda$postJson$1(…)` | A | `postJson` 重载实现略调;**确认与 HTTP 头/体一致**后接受 |
| 4 | `…config.ChannelFileReader` | 本地 **`implements AutoCloseable`**`javap` 首行与现场不同);现场仍有 `close()` | B | **`CommonAppExportExecuteTask` 使用 try-with-resources**,保留 AutoCloseable;接受与现场 **javap 字符串**不一致或与现场合并策略 |
| 5 | `…service.CertRegistryHandler` | `lambda$null$4/5` 形参列表简化(Optional/交叉类型 → 单类型) | A | 典型 Stream/Optional 链改写;**公开方法未变** |
| 6 | `…CpDeviceImagePersonServiceImpl` | `personPassRule` 相关 lambda 合并/删减 | A | public 段一致;属实现整理 |
| 7 | `…CpImageStorePersonManager` | 多组 `lambda$null$`* 删除,编号下移 | A | 同上 |
| 8 | `…CpImageStorePersonSynManager` | Redis 回调 lambda 返回类型 `Long``Object` | A | JDK8 `RedisConnection` 泛型与 lambda **桥接**常见现象 |
| 9 | `…CpImageStorePersonValidateManager` | 大量 `lambda$`* 重排、嵌套 lambda 命名变化 | A | **patch 行数最大**,仍以 synthetic 为主;**建议用业务用例回归**(校验任务、延期校验) |
| 10 | `…CpImageStoreServiceImpl` | `packageCpResult`/`packageImageStoreResult`/`getAssociated` 等 lambda 编号与具体类型 | A | public 未变 |
| 11 | `…CpImageStoreToolServiceImpl` | `lambda$batchRemoveFace$5` 少一参(去掉 `BatchRemoveFaceParam`) | A | **对外接口未变**;实现层闭包捕获范围变化 |
| 12 | `…DeviceGroupRefChangeEventHandler` | `HashSet` vs `Set` 于一处 lambda | A | 无 public 变化 |
| 13 | `…DevicePersonSyncManager` | `lambda$null$2` 形参类型变化 | A | 无 public 变化 |
| 14 | `…DevicePersonSyncServiceImpl` | 删除两行 `deviceImageStoreMap` 相关 lambda | A | public 未变 |
| 15 | `…ImgPersonServiceImpl` | **新增字段** `tenantVisitorFloorPolicyService`**新增私有方法** `buildCommaSeparatedFloorNames``buildFloorInfoListFromOrderedZoneIds` | **C** | **星河湾租户访客楼层增强**;发版说明与联调必测 |
| 16 | `…OrganizationServiceImpl` | `detail`/`listNames`/`saveAreaDetails` 路径下 **lambda 数量与编号**变化(增加 `ZoneUnitResultDTO` 等参与) | A/C | **`javap` 前半段 public 方法与现场一致**;若产品关心 **detail 返回中区域/楼层展示**,做专项对比测试 |
| 17 | `…starter.task.ComponentTaskInitialize` | 现场多 `lambda$run$0(String)`,本地无 | A | 与 **定时/初始化路径**实现差异一致(如去掉一处 stream);启动后看日志与任务是否注册 |
| 18 | `…controller.DevicePersonSyncController` | `devicePersonResync`/`detail` 的 lambda 个数与参数类型 | A | **三个 public API 未变**;可做 elevator API 对拍 |
---
## 3. 与《全量审计》§4 的关系
- **OpenCvUtils** 已与现场 **`javap` IDENTICAL**(见 §2.1)。
- **ImgPersonServiceImpl(表 2.2 #15)** 为**已知的仓库超前能力**,与 **MISSING_DEPLOY(租户策略等)** 配套部署后才能在现场 classpath 出现对应依赖类。
- 其余类以 **A 类**为主:**契约测试**(接口级)可通过;**集成回归**仍建议覆盖图库同步、设备同步、组织详情。
---
## 4. 复现核对命令(可选)
```bash
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH="$JAVA_HOME/bin:$PATH"
# 设置 D_CP / L_CP 同本文档前言,然后:
javap -p -classpath "$D_CP" cn.cloudwalk.service.organization.common.OpenCvUtils > /tmp/deploy.txt
javap -p -classpath "$L_CP" cn.cloudwalk.service.organization.common.OpenCvUtils > /tmp/local.txt
diff -u /tmp/deploy.txt /tmp/local.txt
```
批量产物已由流水线写入:`tools/out/different-22-javap/diff-<ShortName>.patch`
---
**关联:** `[2026-05-06-component-org-full-java-audit-and-remediation.md](./2026-05-06-component-org-full-java-audit-and-remediation.md)` §4DIFFERENT 分类说明)
@@ -0,0 +1,163 @@
# 组织组件:全量 Javasrc/main/java)与部署包逐类核对及解决方案
**日期:** 2026-05-06**2026-05-06 已执行 P0~P2 落地**,见下节)
**范围:** `maven-ninca-common-component-organization` 下全部 `**src/main/java`** 源文件,与部署目录
`部署包/ninca_common_component_organization_01-ninca_common_component_organization/ninca-common-component-organization-V2.9.2_20210730`
`**BOOT-INF/classes` + 四模块 `*-v2.9.2_xinghewan.jar**` 中的字节码 **逐类 `javap -p` 比对**
---
## 0. 执行记录(P0 → P1 → P2
| 阶段 | 内容 | 结果 |
| ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **P0** | 使用 **JDK 8**`JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64`)执行 `mvn clean package -DskipTests`;抽查 Fat JAR 内嵌 `cwos-component-organization-service-*.jar` 中含 `TenantVisitorFloorPolicyService``OrganizationRedisLuaConfiguration``ElevatorFeignClientFallback` 等新增类。 | **通过**:产物 `cwos-component-organization-starter/target/ninca-common-component-organization-2.9.2-xinghewan.jar`(约 96MB)。**说明:** 必须用 JDK 8 编译,JDK 11+ 会因注解处理器模块封装报错。 |
| **P1** | 用 **CFR 0.152**`tools/cfr-0.152.jar`Maven Central 自动下载)反编译现场 `**BOOT-INF/classes/cn/cloudwalk/starter`** 打成的 mini-jar,源码迁入 `**starter/src/main/java**``**SelfRegistryHandler**` 从现场 **service** JAR 反编译迁入 `**service/.../SelfRegistryHandler.java`**,并手工修正泛型与 `**CloudwalkResult`/`AtomicDeviceGetResult**` 等与 `**CertRegistryHandler**` 对齐;修正 `**MbGenerator`/`ComponentTaskInitialize**` 反编译瑕疵。 | **通过**`deploy_only_outer_types` **由 23 降为 0**(源码侧已覆盖原「仅部署」顶层类型);全仓 `**src/main/java` 现为 605**+23)。 |
| **P2** | 重新运行 `**deploy_javap_audit.py`**(对齐后的契约快照)。 | **MISSING_DEPLOY 仍为 18****DIFFERENT 已降至 18**`OpenCvUtils`、三工具类构造等已与现场 **IDENTICAL**);**IDENTICAL 569**(以最新 `tools/out/deploy_javap_audit_main.json` 为准)。 |
**复跑命令(JDK 8):**
```bash
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH="$JAVA_HOME/bin:$PATH"
cd maven-ninca-common-component-organization
mvn -q clean package -DskipTests
python3 tools/deploy_javap_audit.py --workers 16 \
--write-json tools/out/deploy_javap_audit_main.json \
--write-markdown tools/out/deploy_javap_audit_main.md
```
**自动化脚本路径:** `maven-ninca-common-component-organization/tools/deploy_javap_audit.py`
**产物:** `tools/out/deploy_javap_audit_main.json`(全量每文件状态)、`tools/out/deploy_javap_audit_main.md`(节选表)。
**延续审核(Lua / lib / Data JAR XML / 配置):** [`2026-05-06-component-org-source-vs-deploy-continued-audit.md`](./2026-05-06-component-org-source-vs-deploy-continued-audit.md)
**现场替换清单:** [`2026-05-06-component-org-release-checklist.md`](./2026-05-06-component-org-release-checklist.md)
---
## 1. 汇总统计(P2 复跑后)
| 状态 | 数量 | 含义 |
| ------------------------ | ------- | ----------------------------------------------------------------------- |
| **IDENTICAL** | **569** | 部署包与当前 `mvn compile` 产物 `**javap -p` 完全一致**(顶层类型签名一致)。 |
| **DIFFERENT** | **18** | 同 FQN 下字段/方法列表等与现场 **不一致**(含业务变更或编译器 synthetic/lambda 差异)。 |
| **MISSING_DEPLOY_JAVAP** | **18** | 本地可解析,部署 classpath **无该类****仓库新增、现场 JAR 未包含**(需 **发布 P0 制品** 后线上才有)。 |
另:**「仅部署侧顶层类型」** 经 **P1 补源码** 后,脚本统计 `**deploy_only_outer_types = 0`**(见 `deploy_javap_audit_main.json`)。
---
## 2. 总体解决方案(决策树)
1. **以现场为权威(线上稳定优先)**
-**现场 Fat JAR** 或其中 **四模块 JAR** 纳入制品库;CI 对发布分支构建产物做 `**javap` 契约校验**(或与现场 JAR 二进制对齐)。
- 对下面 §4 **DIFFERENT** 类:若需与线上一致,应从 **与现场同源的标签/分支** 迁出代码,或 **接受当前仓库为超前版本** 仅做回归后再发版。
2. **以仓库为权威(迭代与星河湾定制优先)**
- **发布新版 Fat JAR**,替换现场 `ninca-common-component-organization-V2.9.2_20210730.jar`
- **MISSING_DEPLOY18** 全部为仓库侧新增能力(租户访客策略、Redis Lua 装配、大量 Feign Fallback)→ **必须随新版本部署**,否则线上不存在这些类。
- **补齐 Starter 源码与资源**(§5),使 **本仓库可完整复现** 现场同等启动行为。
3. **非 Java 资产(与本次 javap 并行结论)**
- **Lua**:源码 `service/.../lua` 与部署 `BOOT-INF/classes/lua` **已批量 diff 一致**
- **MyBatis XML**:现场 Data JAR 内含 `**mapper/mysql/*.xml`**,仓库 data 模块 **未见同名 XML 提交** → 发布前需 **补齐 XML 与仓库一致****确认由依赖 JAR 提供**
- **配置**:根目录 `application.properties` 覆盖 BOOT-INF;修正无效行 `**新增配置`**,核对 cron 与 **xhw*** 等业务常量。
---
## 3. MISSING_DEPLOY_JAVAP18):仓库有、现场包无 —— 处置
**结论:** 现场运行的是 **旧世代制品**;下列类型已在仓库 **新增或拆分**,需 **升版部署** 后才能与线上一致(或在线上删除引用——不推荐)。
| # | FQN | 源文件 |
| ---- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
| 1 | `cn.cloudwalk.data.organization.entity.TenantVisitorFloorPolicy` | `data/.../TenantVisitorFloorPolicy.java` |
| 2 | `cn.cloudwalk.data.organization.mapper.TenantVisitorFloorPolicyMapper` | `data/.../TenantVisitorFloorPolicyMapper.java` |
| 3 | `cn.cloudwalk.service.organization.config.GroupPersonSynExecutorConfiguration` | `service/.../GroupPersonSynExecutorConfiguration.java` |
| 4 | `cn.cloudwalk.service.organization.config.GroupPersonSynPoolProperties` | `service/.../GroupPersonSynPoolProperties.java` |
| 5 | `cn.cloudwalk.service.organization.config.OrganizationRedisLuaConfiguration` | `service/.../OrganizationRedisLuaConfiguration.java` |
| 6 | `cn.cloudwalk.service.organization.policy.TenantVisitorFloorPolicyService` | `service/.../TenantVisitorFloorPolicyService.java` |
| 718 | 各类 `*FeignClientFallback` / `EnterpriseFeignClientFallback` / `PineappleEngineClientFallBack` 等 | `service/.../feign/*.java``corp/feign/*.java` |
**解决方案:**
1. **数据库:** 已若有租户访客策略表结构,保证 **现场 MySQL 与迁移脚本** 与文档一致。
2. **发布:** 使用本仓库 `**mvn package` 产出的 Fat JAR** 替换现场;配置中打开/对齐 **Redis Lua、线程池、Feign** 相关项。
3. **验证:** 租户访客相关 API + 图库同步 + Feign 降级路径 **集成测试**
---
## 4. DIFFERENT18):签名不一致 —— 分类与处置
### 4.1 Starter 入口(结构性)
| FQN | 说明 | 建议 |
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `cn.cloudwalk.starter.organization.OrganizationServer` | 现场:**继承 `SpringBootServletInitializer`**,含 **Micrometer、RestTemplate、WAR `configure`** 等;仓库:**极简 `main` + `CloudwalkSessionContextHolder` Bean**。 | **二选一:** (A) 从历史制品/分支 **回收完整 `OrganizationServer` 与 Starter 配置类源码** 入仓库;(B) 明确 **仅支持可执行 Jar 模式**,现场改造启动脚本与监控接入以匹配仓库。 |
### 4.2 Service 公共工具与抽象类(多为编译/细节差异风险)
含:`AbstractImagStoreService``ImageEditUtils``ImageUtil``JsonUtils``OkhttpUtil``OpenCvUtils``ToolUtil``ChannelFileReader`
**逐类核对(DIFFERENT 剩余清单):** [`2026-05-06-component-org-different-22-per-class-review.md`](./2026-05-06-component-org-different-22-per-class-review.md)`OpenCvUtils` 已与现场对齐;其余多为 synthetic/**`ImgPersonServiceImpl`** 业务超前等)。
**建议:**
1. 对每一类执行 `**javap -p` diff 存档**(已由脚本隐含);若仅 **lambda/synthetic 行** 变化 → **加强集成测试**;若 **公开方法增减** → 走 **代码评审与回归**
2. 锁定 **JDK 8****Maven 编译器插件** 版本,减少无谓字节码漂移。
### 4.3 图库 / 设备同步核心业务类
含:`CertRegistryHandler``CpDeviceImagePersonServiceImpl``CpImageStorePersonManager``CpImageStorePersonSynManager``CpImageStorePersonValidateManager``CpImageStoreServiceImpl``CpImageStoreToolServiceImpl``DeviceGroupRefChangeEventHandler``DevicePersonSyncManager``DevicePersonSyncServiceImpl``ImgPersonServiceImpl``OrganizationServiceImpl`
**建议:**
1. `**ImgPersonServiceImpl`**:仓库已含 **租户访客楼层策略** 相关成员与方法 → **领先现场**;发版或回退策略见 §2。
2. `**CpImageStoreToolServiceImpl`** 等:重点复核 **批量删脸、同步日志** 等与现场故障(如 **COUNT 溢出、图片为空**)相关路径。
3.**电梯 / Portal Feign** 联调验证。
### 4.4 Web
| FQN | 建议 |
| --------------------------------------------------------------------- | ---------------------------------------------------------------- |
| `cn.cloudwalk.web.organization.controller.DevicePersonSyncController` | `**javap` 与现场不一致**:核对接口路径、参数 DTO、是否新增接口;做 **API 对拍**(现场 vs 新版本)。 |
---
## 5. 部署包多出、源码未收录问题(P1 已处理)
`**deploy_only_outer_fqns` 约 23 项**(含 `**SelfRegistryHandler`**、Starter 下 config/kafka/multipart/task/mybatis 等)已通过 **§0 P1**(CFR 反编译 + 手工修正)迁入仓库;**当前审计脚本 `deploy_only_outer_types = 0`**。
后续维护应以 **本仓库源码** 为准,避免再次只剩 `.class`;生成器 `**MbGenerator`** 内含示例 JDBC 连接串,仅本地生成代码时使用,**勿将密码提交到共享分支外的场景滥用**。
---
## 6. IDENTICAL569
约占 `**src/main/java`605)的 **94.0%**,明细见 `**deploy_javap_audit_main.json`** 中 `status == "IDENTICAL"` 条目。
---
## 7. 与先前抽样文档的关系
早期抽样结论仍有效:`**PersonController``CpOrgDeviceKitController**` 在本次 **全量核对中均为 IDENTICAL****全量结果** 显示 `**DevicePersonSyncController` 为 DIFFERENT**,需在发版前单独核对。
更早期的简报:`[2026-05-06-component-org-deploy-vs-source-batch-diff-and-javap.md](./2026-05-06-component-org-deploy-vs-source-batch-diff-and-javap.md)` —— 已由 **本文件 + JSON** 取代为 **权威全量清单**
---
## 8. 附录:测试源码(可选)
若需包含 `**src/test/java`**,运行:
`python3 tools/deploy_javap_audit.py --all-sources ...`
预期大量 `**MISSING_DEPLOY_JAVAP**`(测试类不会打进现场 Fat JAR),**一般仅用于开发自检**,不作为与现场等价对照。
@@ -0,0 +1,212 @@
# Component-Org 生产环境错误审查报告
**日期**: 2026-05-06
**数据源**: `部署包/ninca_common_component_organization_01-ninca_common_component_organization/...209/logs/`
**范围**: error.log (21个滚动文件, ~600MB), 覆盖 2026-02-19 ~ 2026-05-06 (2.5个月)
**编译状态**: 本次代码变更后 BUILD SUCCESS (0 errors)
---
## 1. 错误总览
| # | 错误类型 | 次数 | 严重度 | 已定位源码 | 本次变更相关 |
|---|---------|------|--------|----------|------------|
| 1 | AggDeviceImageStoreFeignClient sync failed | 36,557 | 🟡 | Fallback.java:125 | ❌ 否 |
| 2 | addFace 图片为空 (5人×7图库) | 36,560 | 🟡 | CpImageStoreToolServiceImpl.java:395 | ❌ 否 |
| 3 | device updatePerson error | 4,749 | 🟡 | CpOrgDeviceKitController.java:160 | ❌ 否 |
| 4 | 下载图片异常 LoadBalancer | 1,000 | 🟡 | CpImageStoreToolServiceImpl.java:210 | ❌ 否 |
| 5 | addValidateData removeJob timeout | 688 | 🟠 | CpImageStorePersonValidateManager.java:141 | ❌ 否 |
| 6 | AtomicDeviceFeignClient list failed | 368 | 🟡 | Fallback.java:85 | ❌ 否 |
| 7 | addValidateData addOrModJob timeout | 322 | 🟠 | CpImageStorePersonValidateManager.java:185 | ❌ 否 |
| 8 | VehicleFeignClient failed | 68 | 🟢 | Fallback.java:47 | ❌ 否 |
| 9 | 图片角度识别失败 | 35 | 🟢 | ImageEditUtils.java:145 | ❌ 否 |
| 10 | ElevatorFeignClient listByImageId failed | 15 | 🟢 | Fallback.java:31 | ❌ 否 |
| 11 | 设备不存在 | 71 | 🟢 | AtomicDeviceFallback | ❌ 否 |
| 12 | MySQL Communications link failure | 13 | 🟠 | JDBC驱动层 | ❌ 否 |
**总计**: ~80,446 个 ERROR 日志条目, **全部与本次代码变更无关**
---
## 2. 逐错误分析
### 2.1 AggDeviceImageStoreFeignClient sync failed (36,557次)
**日志示例**:
```
[2026-02-19 08:43:17] [hystrix-cwos-portal-55] [ERROR]
[c.c.r.a.d.f.AggDeviceImageStoreFeignClient$Fallback] [125]
call AggDeviceImageStoreFeignClient sync device imageStore failed
```
**源码位置**: `maven-intelligent-cwoscomponent` (非本次变更范围)
**根因分析**:
- 下游服务 `cwos-portal` (设备图库聚合服务) 不可达
- Hystrix 熔断触发 fallback
- 线程名 `hystrix-cwos-portal-*` 表明所有调用均失败
**影响**: 设备图库同步中断,人员变更不推送到终端设备
**建议**: 检查 cwos-portal 服务健康状态与网络连通性
---
### 2.2 addFace 图片为空 (36,560次)
**日志示例**:
```
[2026-02-19 08:41:25] [SimpleAsyncTaskExecutor-67386] [ERROR]
[c.c.s.o.s.CpImageStoreToolServiceImpl] [457]
图库[c8c6722505a0481a8f9fc24df122d8d3]添加人脸[1690239736450007040]异常:图片为空
```
**源码位置**: `CpImageStoreToolServiceImpl.java` L365-401 (生产 JAR: L457)
**根因分析**:
- 5个人员 (personId 1611164xxx + 1690239xxx) 在 7 个图库 (如 c8c67225, d2e18254, 7a83a5d2) 中反复失败
- `getComparePicture()` 返回空/null → feature提取失败 → 异常
- **重试无限循环**: 每次 sync 任务触发都重试,无退避/告警抑制
**影响**:
- 日志噪音 (占全部错误 45%)
- 线程池浪费 (SimpleAsyncTaskExecutor 创建大量线程)
- 图库同步卡在这些人身上,后续人员无法同步
**建议**:
- 对持续失败的人员添加 skip 列表或退避策略
- 对空图片场景添加前置校验 (L374 之前检查 getComparePicture())
---
### 2.3 device updatePerson error (4,749次)
**日志示例**:
```
[2026-02-19 08:37:04] [http-nio-17016-exec-14597] [ERROR]
[c.c.w.o.c.CpOrgDeviceKitController] [160]
device updatePerson errorcause
```
**源码位置**: `CpOrgDeviceKitController.java` L160 — controller 层捕获异常
**根因分析**:
- `cause` 后为空 — 空指针异常
- HTTP 请求线程 (http-nio-17016-exec) 处理设备更新回调
- 下游设备管理服务返回 null 或超时
**影响**: 设备端人员信息更新失败,但不影响组织侧数据
**建议**: 添加 null-safety 检查,打印完整 stack trace
---
### 2.4 下载图片异常 LoadBalancer (1,000次)
**日志示例**:
```
Caused by: com.netflix.client.ClientException:
Load balancer does not have available server for client: cwos-p
```
**源码位置**: `CpImageStoreToolServiceImpl.java` L210: `fileStorageManager.fileDownload()`
**根因分析**:
- Ribbon 负载均衡器找不到可用实例
- 客户名 `cwos-p` (cwos-portal) — 文件存储服务不可达
- 与错误 #1 (AggDeviceImageStoreFallback) 同源 — cwos-portal 整体不可用
**影响**: 无法下载远程图片进行人脸特征提取
**建议**: 与 #1 同 — 检查 cwos-portal 服务
---
### 2.5 addValidateData removeJob timeout (688次)
**日志示例**:
```
[2026-02-27 15:14:26] [group-person-syn-pool-110525] [ERROR]
[c.c.s.o.s.CpImageStorePersonValidateManager] [141]
CpImageStorePersonValidateManager addValidateData removeJob time out
```
**源码位置**: `CpImageStorePersonValidateManager.java` L136-141
**根因分析**:
```java
// L140: validateJobGroupLock 获取锁成功,但后续操作超时
log.error("CpImageStorePersonValidateManager addValidateData removeJob time out");
```
- `validateJobGroupLock` 获取 Redis 锁后,scheduler 操作超时
- 线程池 `group-person-syn-pool` 并发竞争 Redis 锁
- 688次集中在 `2026-02-27 15:14:26` — 同一秒内 688 个线程同时尝试
**影响**: 人员校验任务的 Quartz trigger 移除失败,可能导致过期任务堆积
**建议**:
- 增加 Redis 锁超时时间
- 限流 removeJob 操作 (避免 688 并发)
---
### 2.6 AtomicDeviceFeignClient list failed (368次)
**日志示例**:
```
[ERROR] call AtomicDeviceFeignClient list device failed
```
**源码位置**: `AtomicDeviceFeignClient$Fallback.java` L85
**根因分析**: 原子设备管理服务不可达 (Hystrix fallback)
**建议**: 检查设备服务健康状态
---
### 2.7 addValidateData addOrModJob timeout (322次)
**相同根因**#5 — Redis 锁竞争导致 Quartz scheduler 操作超时。
---
### 2.8-2.12 低频率错误
| 错误 | 根因 |
|------|------|
| VehicleFeignClient failed (68次) | 车牌服务不可达 |
| 图片角度识别失败 (35次) | 图片格式不兼容 Commons Imaging |
| ElevatorFeignClient failed (15次) | 电梯服务不可达 |
| 设备不存在 (71次) | 设备已删除但同步任务未清理 |
| MySQL 连接丢失 (13次) | 数据库连接池耗尽/超时 |
---
## 3. 与本次代码变更的关系
**本次变更范围**:
1. `TenantVisitorFloorPolicy` (Entity + Mapper)
2. `TenantVisitorFloorPolicyService` (新增)
3. `ImgPersonServiceImpl` (detail + listByPage 策略插入)
4. Elevator `PersonRuleServiceImpl` (已预先清理)
5. Elevator `DavinciStorageBeansConfiguration` (bigFileDownload 补齐)
**错误对应关系**:
- 全部 12 类错误均发生在 **本次变更之前** (最早 2026-02-19)
- 无任何错误与 `TenantVisitorFloorPolicy*``ImgPersonServiceImpl` 策略插入相关
- 电梯 `addVisitor` 阶段 3 删除后,`PersonRuleServiceImpl` 不再访问策略表,消除了一类潜在错误
**结论**: 本次变更 **未引入任何新错误**
---
## 4. 改进建议
| 优先级 | 建议 | 影响范围 |
|--------|------|---------|
| 🔴 P0 | 修复 addFace 无限重试 (36,560次) — 添加 skip list | CpImageStoreToolServiceImpl |
| 🔴 P0 | 排查 cwos-portal 服务不可达 (36,557次) | 运维/基础设施 |
| 🟠 P1 | Redis 锁竞争优化 (688+322次) — 限流 removeJob/addOrModJob | CpImageStorePersonValidateManager |
| 🟠 P1 | device updatePerson 空指针 — 添加 null-safety + stack trace | CpOrgDeviceKitController |
| 🟡 P2 | 添加 Feign 健康检查告警 | 运维监控 |
@@ -0,0 +1,73 @@
# 组织组件:发布替换现场旧包 — 操作清单
**适用:** 用本仓库 `**mvn clean package -DskipTests`****JDK 8**)产出的 Fat JAR,替换
`部署包/.../ninca-common-component-organization-V2.9.2_20210730/` 目录下的旧 `**…20210730.jar`**。
**构建产物(每次发布后更新哈希):**
| 项 | 值 |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **文件** | `maven-ninca-common-component-organization/cwos-component-organization-starter/target/ninca-common-component-organization-2.9.2-xinghewan.jar` |
| **约大小** | ~96 MB |
| **SHA-256(示例,2026-05-06 构建)** | `406409e377b0c5b57e2f9baeb3692c9e7b7cf739731fb389433566056bdaafce` |
构建命令:
```bash
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH="$JAVA_HOME/bin:$PATH"
cd maven-ninca-common-component-organization
mvn clean package -DskipTests
sha256sum cwos-component-organization-starter/target/ninca-common-component-organization-2.9.2-xinghewan.jar
```
---
## 1. 发布前核对(源码侧已就绪项)
| 项 | 状态 |
| ----------------------------------------------------------------- | --- |
| Data 模块 `**mapper/mysql/*.xml`33** 已进 `**src/main/resources`** | ✅ |
| Interface 模块 `**component-org/messages*.properties**` 已从现场 JAR 回填 | ✅ |
| Starter / `**SelfRegistryHandler**` 等已与现场对齐(见主Remediation文档) | ✅ |
替换现场 JAR 后,审计脚本中的 **MISSING_DEPLOY_JAVAP18** 应在 **现场进程 classpath** 中消失(需 **重新跑一次 `deploy_javap_audit.py`****新** 部署目录验证)。
---
## 2. 现场替换步骤(运维)
1. **备份**:复制当前 `ninca-common-component-organization-V2.9.2_20210730.jar` 为带日期后缀的 `.bak`
2. **停机**:按现有 `**stop.sh`** / systemd 停止进程。
3. **覆盖**:将构建 Fat JAR 复制到部署目录,**文件名可与现场脚本一致**(若脚本写死 `…20210730.jar`,可改名或改脚本指向新名)。
4. **配置**:保留 `**application.properties`(根目录)** 与环境占位符;合并仓库 `**run-verify`** 中与现场一致的键若需要。**勿**把本地测试库地址直接拷到生产。
5. **启动****JDK 8** 执行 `**java -jar`**(参数与现网一致,`spring.config.location` 等)。
6. **探活**`/actuator/health`(或约定端口 **management.port**)、错误日志无连续异常。
---
## 3. 发布后代码审计(可选)
在新的现场解压目录或新 Fat JAR 上:
```bash
python3 tools/deploy_javap_audit.py --workers 16 \
--write-json tools/out/deploy_javap_audit_after_upgrade.json
```
预期:**MISSING_DEPLOY** 显著下降或为 **0**(取决于是否仍用旧解压目录对比)。
---
## 4. 仍存在的差异(预期)
- `**javap` DIFFERENT22**:多为仓库 **超前演进**;若发布新版本即以仓库为准,需在 **预发做接口对拍**
- `**BOOT-INF/lib` 文件名**:与 Spring Boot repackage 插件版本有关;以 **运行冒烟** 为准。
---
**关联:** `[2026-05-06-component-org-source-vs-deploy-continued-audit.md](./2026-05-06-component-org-source-vs-deploy-continued-audit.md)` · `[2026-05-06-component-org-full-java-audit-and-remediation.md](./2026-05-06-component-org-full-java-audit-and-remediation.md)`
@@ -0,0 +1,101 @@
# 组织组件:源码与现场旧部署包 — 延续审核摘要
**日期:** 2026-05-06
**对照对象:**
- **源码构建:** `maven-ninca-common-component-organization`JDK 8`mvn compile` / Fat JAR
- **现场:** `部署包/ninca_common_component_organization_01-ninca_common_component_organization/ninca-common-component-organization-V2.9.2_20210730`
---
## 1. Java 字节码(`javap` 全量脚本)
已复跑 `tools/deploy_javap_audit.py``src/main/java` **605** 文件):
| 状态 | 数量 |
| ----------------------- | --- |
| IDENTICAL | 565 |
| DIFFERENT | 22 |
| MISSING_DEPLOY_JAVAP | 18 |
| deploy_only_outer_types | 0 |
明细见:`maven-ninca-common-component-organization/tools/out/deploy_javap_audit_main.json`
---
## 2. Lua
`cwos-component-organization-service/src/main/resources/lua` 与现场 `**BOOT-INF/classes/lua`**`diff -rq` **无差异**
---
## 3. Fat JAR — `BOOT-INF/lib` 文件名级对比
- **现场:** 255 个嵌套 JAR**本地 Fat JAR** 260 个。
- Spring Boot **2.7.x repackage** 常把嵌套 JAR 命名为 `***-1.0.jar`**;现场解压目录为原始 `*** .jar`**。对文件名做 `**-1.0.jar``.jar` 规范化** 后再 `comm`
**仍不对称的典型原因(非缺依赖):**
| 类型 | 说明 |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **四模块命名** | 现场:`cwos-component-organization-*-v2.9.2_xinghewan.jar`;本地:`cwos-component-organization-*-2.9.2-xinghewan.jar`(坐标/版本串写法不同)。 |
| **opencv / javacpp** | 现场 lib 内单独 `**opencv-*.jar` / `javacpp*.jar`**;本地 Fat 中可能以 不同条目名或合并策略 出现,需以 `**jar tf` + 类路径加载** 校验运行时是否等价。 |
| **spring-boot-jarmode-layertools** | 本地 Fat 含 `**spring-boot-jarmode-layertools-2.7.18.jar`**(来自 `**spring-boot-maven-plugin` 2.7.18**),现场旧包 **无**:属于 **打包插件版本差异**,一般 **不影响** 默认 `java -jar` 启动。 |
| *cloudwalk-common- 重复** | 规范化集合里本地可能同时出现 `**cloudwalk-common-data-3.5.2-Brussels-SRX.jar``cloudwalk-common-data-3.5.2.jar`**(依赖收敛边界不同),需警惕 **类加载优先级**,建议在发布说明中 **固定一条依赖链**。 |
**结论:** lib **清单不宜仅用文件名逐字相等**;发布前应在 **预发**`**java -jar` + 冒烟** 验证;若需严格二进制一致性,应对齐 `**spring-boot-maven-plugin` / BOM** 与 CloudWalk **systemPath** 依赖集合。
---
## 4. Data 模块 JAR — MyBatis XML
| 制品 | `mapper/mysql/*.xml` |
| --------------------------------------------------------------------------------- | -------------------- |
| 现场 `**cwos-component-organization-data-v2.9.2_xinghewan.jar`** | **33** |
| 本地(**2026-05-06 已回填后**`**cwos-component-organization-data-2.9.2-xinghewan.jar`** | **33** |
**已执行:** 从现场 JAR 解压 `**cn/cloudwalk/data/organization/mapper/mysql/*.xml`** 至
`cwos-component-organization-data/src/main/resources/cn/cloudwalk/data/organization/mapper/mysql/`**33** 个文件),`**mvn -pl ... -am package` 与全反应堆 `mvn clean package` 均通过**`jar tf` 可见全部 XML。
**说明:** `**TenantVisitorFloorPolicyMapper`** 仅使用 **注解 SQL**`@Select`),不依赖新增 XML 文件。
---
## 5. Service 模块 JAR — 哈希
| 文件 | SHA-256(前缀) |
| ------------------------------------------------------------- | --------------- |
| 现场 `cwos-component-organization-service-v2.9.2_xinghewan.jar` | `738aacf7f562…` |
| 本地 `cwos-component-organization-service-2.9.2-xinghewan.jar` | `c007f4ece70a…` |
`**javap` DIFFERENT/MISSING** 结论一致:**字节码整体不一致**,其中 **18 类仅本地有**、**22 类签名差异**(含业务演进)。
---
## 6. 配置文件 — `application.properties`
现场 `**BOOT-INF/classes/application.properties`**216 行)与 **进程根目录 `application.properties`**(222 行)存在大量差异(diff 体量 **约 441 行** unified 上下文);此前已记录:线程池、**xhw***、Kafka、实例 ID、占位符主机名等。
**建议:****根目录覆盖文件** 为运行真相;修正无效行 `**新增配置`**;发布新版本时附带 **配置迁移清单**Consul/Redis/MySQL/Kafka 占位符)。
---
## 7. 下一步(按风险)
1. ~~**Data JAR 补齐 Mapper XML**~~(§4 已完成)。
2. ~~*Interface `component-org/messages.properties**`~~(已从现场 interface JAR 回填至` cwos-component-organization-interface/src/main/resources/component-org/`)。
3. **发布本地 Fat JAR** 替换现场旧包 —— 收敛 **MISSING_DEPLOY 18**;操作清单见 `**[2026-05-06-component-org-release-checklist.md](./2026-05-06-component-org-release-checklist.md)`**。
4. **DIFFERENT 22** —— 按业务验收决定是否接受(仓库超前)或回源。
5. **lib 清单** —— 仅作辅助;以 **运行时验证** 为准。
---
**关联文档:** `[2026-05-06-component-org-full-java-audit-and-remediation.md](./2026-05-06-component-org-full-java-audit-and-remediation.md)`P0~P2 执行记录与 Starter 补源码)。
@@ -0,0 +1,428 @@
mysql: [Warning] Using a password on the command line interface can be insecure.
cw_is_device_image_store ID varchar NO PRI 主键
cw_is_device_image_store DEVICE_ID varchar NO NULL MUL 设备Id
cw_is_device_image_store IMAGE_STORE_ID varchar NO NULL 图库Id
cw_is_device_image_store TYPE smallint NO NULL 设备图库变更类型(1:新增,2:删除)
cw_is_device_image_store CREATE_TIME bigint YES NULL 创建时间 时间戳
cw_is_device_image_store LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳
cw_is_device_image_store FINISH_PULL_TIME bigint YES NULL 结束拉取时间 时间戳
cw_is_device_image_store STATUS smallint NO 0 状态(0:未通知,1:已通知)
cw_is_device_person ID varchar NO NULL PRI 主键
cw_is_device_person DEVICE_ID varchar NO NULL MUL 设备ID
cw_is_device_person PERSON_ID varchar NO NULL 人员ID
cw_is_device_person TYPE smallint YES NULL 类型(0:正常,1:删除)
cw_is_device_person CREATE_TIME bigint YES NULL 创建时间 时间戳
cw_is_device_person LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳
cw_is_device_person_sync_log ID varchar NO PRI
cw_is_device_person_sync_log DEVICE_ID varchar NO NULL MUL 设备ID
cw_is_device_person_sync_log IMAGE_STORE_ID varchar NO NULL MUL 图库ID
cw_is_device_person_sync_log PERSON_ID varchar NO NULL 人员ID
cw_is_device_person_sync_log GROUP_PERSON_REF_ID varchar NO NULL MUL 图库人员关联ID
cw_is_device_person_sync_log IMAGE_ID varchar YES NULL 人脸ID
cw_is_device_person_sync_log STATUS smallint YES 0 同步状态(0:设备未拉取,1:设备已拉取,2:设备上报成功,3:设备上报失败)
cw_is_device_person_sync_log CODE varchar YES NULL 错误编码
cw_is_device_person_sync_log ERROR_MESSAGE varchar YES NULL 失败原因
cw_is_device_person_sync_log CREATE_TIME bigint YES NULL 创建时间 时间戳
cw_is_device_person_sync_log LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳(新增/修改人员信息时更新)
cw_is_device_person_sync_log COUNT smallint YES 0 计数器
cw_is_device_person_sync_log LAST_PULL_TIME bigint YES NULL 最近拉取时间 时间戳
cw_is_device_person_sync_log LAST_REPORT_TIME bigint YES NULL 最近上报时间 时间戳
cw_is_device_person_sync_log UPDATE_INFO varchar YES NULL 处理信息
cw_is_device_person_sync_log EXPIRY_BEGIN_DATE bigint YES NULL 人员有效期开始时间 时间戳
cw_is_device_person_sync_log EXPIRY_END_DATE bigint YES NULL 人员有效期结束时间 时间戳
cw_is_device_person_sync_log DEVICE_PERSON_REF_ID varchar NO NULL 设备-人员表主键
cw_is_device_person_sync_log IS_DEL smallint YES 0 逻辑删除字段 0未删除 1删除
cw_is_group_person_ref ID varchar NO NULL PRI
cw_is_group_person_ref IMAGE_STORE_ID varchar YES NULL MUL 图库id
cw_is_group_person_ref PERSON_ID varchar YES NULL MUL 人员id
cw_is_group_person_ref EXPIRY_BEGIN_DATE decimal YES NULL 人员有效期开始时间 时间戳
cw_is_group_person_ref EXPIRY_END_DATE decimal YES NULL 人员有效期结束时间 时间戳
cw_is_group_person_ref STATUS smallint YES 0 MUL 人员有效状态 -1删除、0正常、1失效
cw_is_group_person_ref CREATE_USER_ID varchar YES NULL
cw_is_group_person_ref CREATE_TIME decimal YES NULL
cw_is_group_person_ref LAST_UPDATE_USER_ID varchar YES NULL
cw_is_group_person_ref LAST_UPDATE_TIME decimal YES NULL
cw_is_group_person_ref IS_DEL smallint NO 0 MUL 逻辑删除字段 0未删除 1删除
cw_is_group_person_ref GENDER smallint YES NULL 性别
cw_is_group_person_ref AGE int YES NULL 年龄
cw_is_group_person_ref GROUP_TIME bigint YES NULL 入库时间
cw_is_group_person_ref GROUP_STATUS smallint YES NULL 0:未建模 1:建模中 2:建模完成 3:建模失败
cw_is_group_person_ref ERROR_MESSAGE varchar YES NULL 建模失败时的失败原因
cw_is_group_person_ref EXPIRY_BEGIN_DATE_STATUS smallint YES 0 人员有效开始时间状态(0:未处理 1:已处理)
cw_is_group_person_ref EXPIRY_END_DATE_STATUS smallint YES 0 人员有效期结束时间状态(0:未处理 1:已处理)
cw_is_group_person_ref VALID_DATE_CRON varchar YES NULL 多时间段cron表达式
cw_is_image_store_associated_ref ID varchar NO NULL PRI 唯一标识
cw_is_image_store_associated_ref IMAGE_STORE_ID varchar NO NULL MUL 图库id
cw_is_image_store_associated_ref ASSOCIATED_OBJECT_ID varchar NO NULL 关联对象id
cw_is_image_store_associated_ref ASSOCIATED_OBJECT_ID_TYPE int NO NULL 关联对象的类型,1:机构,2:标签,3:个人
cw_is_image_store_associated_ref ASSOCIATED_ACTION int YES NULL 0:包含,1:排除
cw_is_image_store_associated_ref EXPIRY_BEGIN_DATE decimal YES NULL 人员有效期开始时间 时间戳
cw_is_image_store_associated_ref EXPIRY_END_DATE decimal YES NULL 人员有效期结束时间 时间戳
cw_is_image_store_associated_ref CREATE_TIME decimal YES NULL
cw_is_image_store_associated_ref CREATE_USER_ID varchar YES NULL
cw_is_image_store_associated_ref LAST_UPDATE_TIME decimal YES NULL
cw_is_image_store_associated_ref LAST_UPDATE_USER_ID varchar YES NULL
cw_is_image_store_associated_ref VALID_DATE_CRON varchar YES NULL 多时间段cron表达式
cw_is_label ID varchar NO NULL PRI 唯一标识
cw_is_label NAME varchar YES NULL
cw_is_label CODE varchar NO NULL 编码
cw_is_label BUSINESS_ID varchar YES NULL business id
cw_is_label IS_DEL smallint YES NULL 0未删,1已删
cw_is_label ADD_TYPE smallint YES NULL 添加类型,0手动创建,1应用初始,2应用创建
cw_is_label CREATE_USER_ID varchar YES NULL 创建者
cw_is_label CREATE_TIME decimal YES NULL 创建时间
cw_is_label LAST_UPDATE_USER_ID varchar YES NULL 最后更新者
cw_is_label LAST_UPDATE_TIME decimal YES NULL 最后更新时间
cw_is_organization ID varchar NO NULL PRI 唯一标识
cw_is_organization NAME varchar YES NULL 机构名称
cw_is_organization ORDER_BY int YES NULL 同级排序字段
cw_is_organization PARENT_ID varchar YES NULL 上级机构id
cw_is_organization BUSINESS_ID varchar YES NULL
cw_is_organization TYPE_ID varchar YES NULL 机构类型ID
cw_is_organization IS_DEL smallint YES NULL 是否删除,0没有删除,1被删除
cw_is_organization CREATE_USER_ID varchar YES NULL 创建者
cw_is_organization CREATE_TIME decimal YES NULL 创建时间
cw_is_organization LAST_UPDATE_USER_ID varchar YES NULL 最后更新者
cw_is_organization LAST_UPDATE_TIME decimal YES NULL 最后更新时间
cw_is_organization EXT1 varchar YES NULL 扩展字段1
cw_is_organization EXT2 varchar YES NULL 扩展字段2
cw_is_organization EXT3 varchar YES NULL 扩展字段3
cw_is_organization EXT4 varchar YES NULL 扩展字段4
cw_is_organization EXT5 varchar YES NULL 扩展字段5
cw_is_organization EXT6 varchar YES NULL 扩展字段6
cw_is_organization EXT7 varchar YES NULL 扩展字段7
cw_is_organization EXT8 varchar YES NULL 扩展字段8
cw_is_organization EXT9 varchar YES NULL 扩展字段9
cw_is_organization EXT10 varchar YES NULL 扩展字段10
cw_is_organization EXT11 varchar YES NULL 扩展字段11
cw_is_organization EXT12 varchar YES NULL 扩展字段12
cw_is_organization EXT13 varchar YES NULL 扩展字段13
cw_is_organization EXT14 varchar YES NULL 扩展字段14
cw_is_organization EXT15 varchar YES NULL 扩展字段15
cw_is_organization EXT16 varchar YES NULL 扩展字段16
cw_is_organization EXT17 varchar YES NULL 扩展字段17
cw_is_organization EXT18 varchar YES NULL 扩展字段18
cw_is_organization EXT19 varchar YES NULL 扩展字段19
cw_is_organization EXT20 varchar YES NULL 扩展字段20
cw_is_organization EXT21 varchar YES NULL 扩展字段21
cw_is_organization EXT22 varchar YES NULL 扩展字段22
cw_is_organization EXT23 varchar YES NULL 扩展字段23
cw_is_organization EXT24 varchar YES NULL 扩展字段24
cw_is_organization EXT25 varchar YES NULL 扩展字段25
cw_is_organization EXT26 varchar YES NULL 扩展字段26
cw_is_organization EXT27 varchar YES NULL 扩展字段27
cw_is_organization EXT28 varchar YES NULL 扩展字段28
cw_is_organization EXT29 varchar YES NULL 扩展字段29
cw_is_organization EXT30 varchar YES NULL 扩展字段30
cw_is_organization IS_VALID int YES NULL 禁用启用,0=禁用,1=启用
cw_is_organization_area_ref ID varchar NO NULL 主键ID
cw_is_organization_area_ref ORG_ID varchar NO 机构ID
cw_is_organization_area_ref AREA_ID varchar NO 区域ID
cw_is_organization_area_ref REF_TYPE tinyint NO NULL 0所在区域 1派梯区域
cw_is_organization_area_ref BUSINESS_ID varchar NO 企业ID
cw_is_organization_area_ref CREATE_TIME bigint YES NULL 创建日期 时间戳
cw_is_organization_area_ref CREATE_USER_ID varchar YES NULL 创建人ID
cw_is_organization_area_ref LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳
cw_is_organization_area_ref LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
cw_is_organization_extend ID varchar NO
cw_is_organization_extend ORGANIZATION_ID varchar NO
cw_is_organization_extend BUSINESS_ID varchar NO NULL
cw_is_organization_extend EMPLOYEE_NUMBER smallint NO 0
cw_is_organization_extend ORG_CAR_NUMBER smallint NO 0
cw_is_organization_extend EMPLOYEE_CAR_NUMBER smallint NO 0
cw_is_organization_extend LEASEHOLD_BEGIN bigint YES NULL 起租日期
cw_is_organization_extend LEASEHOLD_END bigint YES NULL 到租日期
cw_is_organization_extend PAYMENT_STATE tinyint YES NULL
cw_is_organization_extend CARPORT_NUM smallint NO 0 车位数量
cw_is_organization_extend CREATE_USER_ID varchar YES
cw_is_organization_extend CREATE_TIME bigint YES NULL
cw_is_organization_extend LAST_UPDATE_USER_ID varchar YES
cw_is_organization_extend LAST_UPDATE_TIME bigint YES NULL
cw_is_organization_extend REMARK varchar YES
cw_is_organization_extend_detail ID varchar NO
cw_is_organization_extend_detail ORGANIZATION_ID varchar NO
cw_is_organization_extend_detail BUSINESS_ID varchar NO NULL
cw_is_organization_extend_detail UNIT_RENT decimal NO NULL
cw_is_organization_extend_detail WATER_AMOUNT decimal NO NULL
cw_is_organization_extend_detail ELECTRICITY_AMOUNT decimal NO NULL
cw_is_organization_extend_detail PROPERTY_AMOUNT decimal NO NULL
cw_is_organization_extend_detail BELONG_DATE bigint NO NULL
cw_is_organization_extend_detail PAY_TIME bigint NO NULL
cw_is_organization_extend_detail CREATE_USER_ID varchar NO
cw_is_organization_extend_detail CREATE_TIME bigint NO NULL
cw_is_organization_extend_detail LAST_UPDATE_USER_ID varchar NO
cw_is_organization_extend_detail LAST_UPDATE_TIME bigint NO NULL
cw_is_organization_extend_detail REMARK varchar NO
cw_is_organization_image_store APPLICATION_ID varchar NO NULL PRI 设备主键
cw_is_organization_image_store ORG_ID varchar NO NULL PRI 设备主键
cw_is_organization_image_store IMAGE_STORE_ID varchar NO NULL PRI 图库主键
cw_is_organization_type ID varchar NO NULL PRI 主键
cw_is_organization_type BUSINESS_ID varchar YES NULL 企业ID
cw_is_organization_type CODE varchar YES NULL 编号
cw_is_organization_type NAME varchar YES NULL 名称
cw_is_organization_type HAS_LOWER_LEVEL tinyint YES 0 是否可以有下级机构 0 不可以 1 可以
cw_is_organization_type HAS_DEFAULT tinyint YES 0 是否是默认的 0 不是 1 是
cw_is_organization_type STATUS tinyint YES 0 状态(0 有效 1 无效)默认为0
cw_is_organization_type CREATE_USER_ID varchar YES NULL 创建人
cw_is_organization_type CREATE_TIME decimal YES NULL 创建时间
cw_is_organization_type LAST_UPDATE_USER_ID varchar YES NULL 更新人
cw_is_organization_type LAST_UPDATE_TIME decimal YES NULL 更新时间
cw_is_organization_type_properties ID varchar NO NULL PRI 主键
cw_is_organization_type_properties BUSINESS_ID varchar YES NULL 企业ID
cw_is_organization_type_properties ORGANIZATION_TYPE_ID varchar YES NULL 机构ID
cw_is_organization_type_properties CODE varchar YES NULL 编号
cw_is_organization_type_properties NAME varchar YES NULL 名称
cw_is_organization_type_properties STATUS tinyint YES 0 (0 有效 1 无效)默认为0
cw_is_organization_type_properties HAS_REQUIRED tinyint YES 0 是否必填 0 非必填 1 必填
cw_is_organization_type_properties ORDER_NUM int YES NULL 序号
cw_is_organization_type_properties CREATE_USER_ID varchar YES NULL 创建人
cw_is_organization_type_properties CREATE_TIME decimal YES NULL 创建时间
cw_is_organization_type_properties LAST_UPDATE_USER_ID varchar YES NULL 更新人
cw_is_organization_type_properties LAST_UPDATE_TIME decimal YES NULL 更新时间
cw_is_person ID varchar NO NULL PRI 主键ID
cw_is_person BUSINESS_ID varchar NO NULL MUL 企业ID
cw_is_person PERSON_CODE varchar YES NULL 人员CODE
cw_is_person NAME varchar YES NULL MUL 姓名
cw_is_person USER_NAME varchar YES NULL 用户名
cw_is_person PHONE varchar YES NULL 联系电话
cw_is_person STATUS smallint YES NULL 人员状态(0 有效 1 无效)默认为0
cw_is_person EXPIRY_BEGIN_DATE decimal YES NULL 人员有效期开始时间 时间戳
cw_is_person EXPIRY_END_DATE decimal YES NULL 人员有效期结束时间 时间戳
cw_is_person SHOW_PICTURE varchar YES NULL 人员展示照
cw_is_person COMPARE_PICTURE text YES NULL 人员比对照
cw_is_person IS_DEL smallint YES NULL MUL 逻辑删除字段 0:未删除 1:已删除
cw_is_person CREATE_TIME decimal YES NULL 创建日期 时间戳
cw_is_person CREATE_USER_ID varchar YES NULL 创建人ID
cw_is_person LAST_UPDATE_TIME decimal YES NULL 修改日期 时间戳
cw_is_person LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
cw_is_person EMAIL varchar YES NULL 邮箱
cw_is_person IMAGE_ID varchar YES NULL MUL 识别照
cw_is_person EXT1 varchar YES NULL 扩展字段1
cw_is_person EXT2 varchar YES NULL 扩展字段2
cw_is_person EXT3 varchar YES NULL 扩展字段3
cw_is_person EXT4 varchar YES NULL 扩展字段4
cw_is_person EXT5 varchar YES NULL 扩展字段5
cw_is_person EXT6 varchar YES NULL 扩展字段6
cw_is_person EXT7 varchar YES NULL 扩展字段7
cw_is_person EXT8 varchar YES NULL 扩展字段8
cw_is_person EXT9 varchar YES NULL 扩展字段9
cw_is_person EXT10 varchar YES NULL 扩展字段10
cw_is_person EXT11 varchar YES NULL 扩展字段11
cw_is_person EXT12 varchar YES NULL 扩展字段12
cw_is_person EXT13 varchar YES NULL 扩展字段13
cw_is_person EXT14 varchar YES NULL 扩展字段14
cw_is_person EXT15 varchar YES NULL 扩展字段15
cw_is_person EXT16 varchar YES NULL 扩展字段16
cw_is_person EXT17 varchar YES NULL 扩展字段17
cw_is_person EXT18 varchar YES NULL 扩展字段18
cw_is_person EXT19 varchar YES NULL 扩展字段19
cw_is_person EXT20 varchar YES NULL 扩展字段20
cw_is_person EXT21 varchar YES NULL 扩展字段21
cw_is_person EXT22 varchar YES NULL 扩展字段22
cw_is_person EXT23 varchar YES NULL 扩展字段23
cw_is_person EXT24 varchar YES NULL 扩展字段24
cw_is_person EXT25 varchar YES NULL 扩展字段25
cw_is_person EXT26 varchar YES NULL 扩展字段26
cw_is_person EXT27 varchar YES NULL 扩展字段27
cw_is_person EXT28 varchar YES NULL 扩展字段28
cw_is_person EXT29 varchar YES NULL 扩展字段29
cw_is_person EXT30 varchar YES NULL 扩展字段30
cw_is_person EXT31 varchar YES NULL 扩展字段31
cw_is_person EXT32 varchar YES NULL 扩展字段32
cw_is_person EXT33 varchar YES NULL 扩展字段33
cw_is_person EXT34 varchar YES NULL 扩展字段34
cw_is_person EXT35 varchar YES NULL 扩展字段35
cw_is_person EXT36 varchar YES NULL 扩展字段36
cw_is_person EXT37 varchar YES NULL 扩展字段37
cw_is_person EXT38 varchar YES NULL 扩展字段38
cw_is_person EXT39 varchar YES NULL 扩展字段39
cw_is_person EXT40 varchar YES NULL 扩展字段40
cw_is_person CREATE_SYS_ACCOUNT smallint NO 0 是否同步账号,1同步,0不同步
cw_is_person SYS_ACCOUNT_ID varchar YES NULL 系统账号ID
cw_is_person SOURCE smallint NO 1 人员来源 1页面管理 2抓拍
cw_is_person RESERVE_INFO varchar YES NULL 保留信息
cw_is_person WELCOME varchar YES NULL 欢迎语
cw_is_person IC_CARD_NO varchar YES NULL IC卡号
cw_is_person IC_CARD_TYPE varchar YES NULL IC卡类型
cw_is_person DEFAULT_FLOOR varchar YES NULL 默认楼层id
cw_is_person CHOOSE_FLOOR text YES NULL 选中的楼层
cw_is_person_audit ID varchar NO NULL PRI 主键ID
cw_is_person_audit BUSINESS_ID varchar NO NULL 企业ID
cw_is_person_audit NAME varchar NO NULL 姓名
cw_is_person_audit USER_NAME varchar YES NULL 用户名
cw_is_person_audit PERSON_CODE varchar YES NULL 人员CODE
cw_is_person_audit PHONE varchar YES NULL 联系电话
cw_is_person_audit EMAIL varchar YES NULL 邮箱
cw_is_person_audit IMAGE_ID varchar YES NULL 识别照
cw_is_person_audit COMPARE_PICTURE varchar YES NULL 人员比对照
cw_is_person_audit SHOW_PICTURE varchar YES NULL 人员展示照
cw_is_person_audit ORGANIZATIONIDS text YES NULL 所属机构
cw_is_person_audit ORGANIZATIONNAMES text YES NULL 所属机构名称
cw_is_person_audit LABELIDS text YES NULL 所属标签
cw_is_person_audit LABELNAMES text YES NULL 所属标签名称
cw_is_person_audit CREATE_SYS_ACCOUNT tinyint YES 0 是否同步创建账号,0 不创建 1 创建
cw_is_person_audit SYS_ACCOUNT_ID varchar YES NULL 系统账号ID
cw_is_person_audit IC_CARD_NO varchar YES NULL IC卡号
cw_is_person_audit IC_CARD_TYPE varchar YES NULL IC卡类型
cw_is_person_audit SOURCE tinyint NO NULL 来源(1:页面;2:抓拍;3:设备;4:扫码)
cw_is_person_audit DEVICE_CODE varchar YES NULL 注册设备编号
cw_is_person_audit DEVICE_NAME varchar YES NULL 注册设备名称
cw_is_person_audit WELCOME varchar YES NULL 欢迎语
cw_is_person_audit RESERVE_INFO varchar YES NULL 备用字段
cw_is_person_audit USER_PROPERTIES text YES NULL 用户填写字段
cw_is_person_audit USER_PROPERTIES_NAME text YES NULL 用户填写字段名称
cw_is_person_audit STATUS tinyint YES NULL 人员状态(0 有效 1 无效)默认为0
cw_is_person_audit AUDIT_STATUS tinyint YES NULL 审核状态:0审核中,1审核通过,2审核失败
cw_is_person_audit IS_DEL tinyint YES NULL 逻辑删除字段 0:未删除 1:已删除
cw_is_person_audit CREATE_USER_ID varchar YES NULL 创建人ID
cw_is_person_audit CREATE_TIME bigint YES NULL 创建日期 时间戳
cw_is_person_audit LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
cw_is_person_audit LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳
cw_is_person_audit EXT1 varchar YES NULL 扩展字段1
cw_is_person_audit EXT2 varchar YES NULL 扩展字段2
cw_is_person_audit EXT3 varchar YES NULL 扩展字段3
cw_is_person_audit EXT4 varchar YES NULL 扩展字段4
cw_is_person_audit EXT5 varchar YES NULL 扩展字段5
cw_is_person_audit EXT6 varchar YES NULL 扩展字段6
cw_is_person_audit EXT7 varchar YES NULL 扩展字段7
cw_is_person_audit EXT8 varchar YES NULL 扩展字段8
cw_is_person_audit EXT9 varchar YES NULL 扩展字段9
cw_is_person_audit EXT10 varchar YES NULL 扩展字段10
cw_is_person_audit EXT11 varchar YES NULL 扩展字段11
cw_is_person_audit EXT12 varchar YES NULL 扩展字段12
cw_is_person_audit EXT13 varchar YES NULL 扩展字段13
cw_is_person_audit EXT14 varchar YES NULL 扩展字段14
cw_is_person_audit EXT15 varchar YES NULL 扩展字段15
cw_is_person_audit EXT16 varchar YES NULL 扩展字段16
cw_is_person_audit EXT17 varchar YES NULL 扩展字段17
cw_is_person_audit EXT18 varchar YES NULL 扩展字段18
cw_is_person_audit EXT19 varchar YES NULL 扩展字段19
cw_is_person_audit EXT20 varchar YES NULL 扩展字段20
cw_is_person_audit EXT21 varchar YES NULL 扩展字段21
cw_is_person_audit EXT22 varchar YES NULL 扩展字段22
cw_is_person_audit EXT23 varchar YES NULL 扩展字段23
cw_is_person_audit EXT24 varchar YES NULL 扩展字段24
cw_is_person_audit EXT25 varchar YES NULL 扩展字段25
cw_is_person_audit EXT26 varchar YES NULL 扩展字段26
cw_is_person_audit EXT27 varchar YES NULL 扩展字段27
cw_is_person_audit EXT28 varchar YES NULL 扩展字段28
cw_is_person_audit EXT29 varchar YES NULL 扩展字段29
cw_is_person_audit EXT30 varchar YES NULL 扩展字段30
cw_is_person_audit EXT31 varchar YES NULL 扩展字段31
cw_is_person_audit EXT32 varchar YES NULL 扩展字段32
cw_is_person_audit EXT33 varchar YES NULL 扩展字段33
cw_is_person_audit EXT34 varchar YES NULL 扩展字段34
cw_is_person_audit EXT35 varchar YES NULL 扩展字段35
cw_is_person_audit EXT36 varchar YES NULL 扩展字段36
cw_is_person_audit EXT37 varchar YES NULL 扩展字段37
cw_is_person_audit EXT38 varchar YES NULL 扩展字段38
cw_is_person_audit EXT39 varchar YES NULL 扩展字段39
cw_is_person_audit EXT40 varchar YES NULL 扩展字段40
cw_is_person_batch_detail ID varchar NO NULL PRI 主键ID
cw_is_person_batch_detail BATCH_ID varchar NO NULL MUL 所属批次ID
cw_is_person_batch_detail FILE_NAME varchar NO NULL 文件名称
cw_is_person_batch_detail PERSON_NAME varchar YES NULL 人员姓名
cw_is_person_batch_detail STATUS decimal NO NULL 状态(1 成功 2 失败)
cw_is_person_batch_detail REMARK varchar YES NULL 描述信息
cw_is_person_batch_detail CREATE_TIME decimal YES NULL 创建时间,时间戳
cw_is_person_batch_detail CREATE_USER_ID varchar YES NULL 创建用户ID
cw_is_person_batch_import ID varchar NO NULL 主键ID
cw_is_person_batch_import BUSINESS_ID varchar YES NULL 企业ID
cw_is_person_batch_import BATCH_NO varchar NO NULL 批次号
cw_is_person_batch_import TYPE decimal NO NULL 导入类型(1.文件前端上传,2.服务器文件路径,3.服务器图片生成 )
cw_is_person_batch_import FILE_NAME varchar NO NULL 文件名称
cw_is_person_batch_import FILE_PATH varchar YES NULL 文件路径
cw_is_person_batch_import FINISH_TIME decimal YES NULL 结束时间,时间戳
cw_is_person_batch_import TOTAL_COUNT decimal YES NULL 总数
cw_is_person_batch_import CURRENT_COUNT decimal YES NULL 当前已完成数
cw_is_person_batch_import REMARK varchar YES NULL 描述信息
cw_is_person_batch_import STATUS decimal NO NULL 状态(1.未开始,2.进行中,3.已完成,4.异常)
cw_is_person_batch_import CREATE_TIME decimal YES NULL 创建时间,时间戳
cw_is_person_batch_import CREATE_USER_ID varchar YES NULL 创建用户ID
cw_is_person_batch_import OPERATION varchar YES NULL 操作类型(new 新增,update 更新)
cw_is_person_batch_import LOGIN_NAME varchar YES NULL 登录名称
cw_is_person_label_ref ID varchar NO NULL PRI 主键ID
cw_is_person_label_ref PERSON_ID varchar NO NULL MUL 人员ID
cw_is_person_label_ref LABEL_ID varchar NO NULL MUL 标签主键ID
cw_is_person_label_ref CREATE_TIME decimal YES NULL 创建日期 时间戳
cw_is_person_label_ref CREATE_USER_ID varchar YES NULL 创建人ID
cw_is_person_label_ref LAST_UPDATE_TIME decimal YES NULL 修改日期 时间戳
cw_is_person_label_ref LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
cw_is_person_organization_ref ID varchar NO NULL PRI 主键ID
cw_is_person_organization_ref PERSON_ID varchar NO NULL MUL 人员ID
cw_is_person_organization_ref ORG_ID varchar NO NULL MUL 组织ID
cw_is_person_organization_ref CREATE_TIME decimal YES NULL 创建日期 时间戳
cw_is_person_organization_ref CREATE_USER_ID varchar YES NULL 创建人ID
cw_is_person_organization_ref LAST_UPDATE_TIME decimal YES NULL 修改日期 时间戳
cw_is_person_organization_ref LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
cw_is_person_properties ID varchar NO NULL PRI 主键
cw_is_person_properties BUSINESS_ID varchar YES NULL 企业ID
cw_is_person_properties CODE varchar YES NULL 编号
cw_is_person_properties NAME varchar YES NULL 名称
cw_is_person_properties TYPE smallint YES NULL 输入类型 1 字符串 2 选择 3 时间 4 文件上传
cw_is_person_properties STATUS tinyint YES 0 (0 有效 1 无效)默认为0
cw_is_person_properties HAS_SYS_ACCOUNT tinyint YES 0 是否作为系统账号 0 不可以 1 可以
cw_is_person_properties HAS_SYS_ACCOUNT_AVAILABLE tinyint YES 0 是否可以作为系统账号字段 0 不可以 1 可以
cw_is_person_properties HAS_REQUIRED tinyint YES 0 是否必填 0 不要必填 1 必填
cw_is_person_properties HAS_DEFAULT tinyint YES 0 是否默认 0 不默认 1 默认
cw_is_person_properties ORDER_NUM int YES NULL 序号
cw_is_person_properties REMINDER varchar YES NULL 提示语
cw_is_person_properties CREATE_USER_ID varchar YES NULL 创建人
cw_is_person_properties CREATE_TIME bigint YES NULL 创建时间
cw_is_person_properties LAST_UPDATE_USER_ID varchar YES NULL 更新人
cw_is_person_properties LAST_UPDATE_TIME bigint YES NULL 更新时间
cw_is_person_properties ARRAY_DATA varchar YES NULL 如果类型是2,补充填写下拉列表,用逗号分隔
cw_is_person_properties HAS_MULTIPLE tinyint YES NULL 如果类型是2,补充填写是否多选 0 单选 1 复选
cw_is_person_properties_switch ID varchar NO NULL PRI 主键
cw_is_person_properties_switch BUSINESS_ID varchar YES NULL 企业ID
cw_is_person_properties_switch SWITCH_PARAM tinyint YES NULL 开启注册照优化
cw_is_person_properties_switch SIZE_PARAM int YES NULL 尺寸:1-1存,2-2存
cw_is_person_properties_switch SHAPE_PARAM tinyint YES NULL 形态变化
cw_is_person_properties_switch STATUS tinyint YES 0 (0 有效 1 无效)默认为0
cw_is_person_properties_switch SKIN_COLOR_PARAM tinyint YES NULL 肤色整体优化
cw_is_person_properties_switch CREATE_USER_ID varchar YES NULL 创建人
cw_is_person_properties_switch CREATE_TIME bigint YES NULL 创建时间
cw_is_person_properties_switch LAST_UPDATE_USER_ID varchar YES NULL 更新人
cw_is_person_properties_switch LAST_UPDATE_TIME bigint YES NULL 更新时间
cw_is_person_properties_switch DEFECTS_PARAM tinyint YES NULL 瑕疵优化
cw_is_person_properties_switch BACKGROUND_PARAM tinyint YES NULL 换背景
cw_is_person_properties_switch BACKGROUND_OBJECT int YES NULL 换背景底色:3-白色,4-蓝色,2-红色
cw_is_person_registry ID varchar NO PRI 主键ID
cw_is_person_registry BUSINESS_ID varchar NO 租户ID
cw_is_person_registry STATUS tinyint NO 1 开启设备注册(0 关闭 1 开启) 默认为1
cw_is_person_registry DEVICE_STATUS tinyint NO 0 设备注册审核(0 关闭 1 开启) 默认为0
cw_is_person_registry CODE_STATUS tinyint NO 1 扫码注册审核(0 关闭 1 开启) 默认为1
cw_is_person_registry ORGANIZATION_IDS varchar YES 注册默认组织ID列表(用英文逗号分隔)
cw_is_person_registry LABEL_IDS varchar YES 注册默认标签ID列表(用英文逗号分隔)
cw_is_person_registry CREATE_TIME decimal YES NULL 创建日期 时间戳
cw_is_person_registry CREATE_USER_ID varchar YES 创建人ID
cw_is_person_registry LAST_UPDATE_TIME decimal YES NULL 修改日期 时间戳
cw_is_person_registry LAST_UPDATE_USER_ID varchar YES 修改人员ID
cw_is_person_registry TYPE tinyint NO 0 注册类型(0:自助注册 1:人证注册) 默认为0
cw_is_person_registry_device ID varchar NO PRI 主键ID
cw_is_person_registry_device REGISTRY_ID varchar NO MUL 注册配置主键
cw_is_person_registry_device DEVICE_CODE varchar NO 设备编码
cw_is_person_registry_properties ID varchar NO PRI 主键ID
cw_is_person_registry_properties REGISTRY_ID varchar NO MUL 注册配置主键
cw_is_person_registry_properties PERSON_PROPERTY_ID varchar NO 人员属性表主键
cw_is_person_registry_properties BIND_PROPERTY_CODE varchar YES NULL 与人员属性关联的属性
cw_operation_log ID varchar NO NULL PRI 唯一标识
cw_operation_log BUSINESS_ID varchar YES NULL business id
cw_operation_log CREATE_USER_ID varchar YES NULL 创建者
cw_operation_log CREATE_USER_NAME varchar YES NULL 创建者名称
cw_operation_log CREATE_TIME decimal YES NULL 创建时间
cw_operation_log INTERFACE_NAME varchar YES NULL 接口名称
cw_operation_log CONTENT text YES NULL 请求报文
cw_operation_log MODULE varchar YES NULL 模块
cw_operation_log CALL_IP varchar YES NULL 来源ip
cw_task_job_everytime_details ID varchar YES NULL
cw_task_job_everytime_details JOB_NAME varchar YES NULL
cw_task_job_everytime_details JOB_STATUS decimal YES NULL
cw_task_job_everytime_details START_TIME decimal YES NULL
cw_task_job_everytime_details END_TIME decimal YES NULL
cw_task_job_everytime_details IP_ADDRESS varchar YES NULL
cw_task_job_everytime_details MAC_ADDRESS varchar YES NULL
org_floor org_id varchar NO NULL 机构id
org_floor zone_id varchar YES NULL 楼层id
org_floor is_all smallint NO NULL 是否全部查询:0-是,1-不是
org_floor zone_name varchar YES NULL 楼层名
1 mysql: [Warning] Using a password on the command line interface can be insecure.
2 cw_is_device_image_store ID varchar NO PRI 主键
3 cw_is_device_image_store DEVICE_ID varchar NO NULL MUL 设备Id
4 cw_is_device_image_store IMAGE_STORE_ID varchar NO NULL 图库Id
5 cw_is_device_image_store TYPE smallint NO NULL 设备图库变更类型(1:新增,2:删除)
6 cw_is_device_image_store CREATE_TIME bigint YES NULL 创建时间 时间戳
7 cw_is_device_image_store LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳
8 cw_is_device_image_store FINISH_PULL_TIME bigint YES NULL 结束拉取时间 时间戳
9 cw_is_device_image_store STATUS smallint NO 0 状态(0:未通知,1:已通知)
10 cw_is_device_person ID varchar NO NULL PRI 主键
11 cw_is_device_person DEVICE_ID varchar NO NULL MUL 设备ID
12 cw_is_device_person PERSON_ID varchar NO NULL 人员ID
13 cw_is_device_person TYPE smallint YES NULL 类型(0:正常,1:删除)
14 cw_is_device_person CREATE_TIME bigint YES NULL 创建时间 时间戳
15 cw_is_device_person LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳
16 cw_is_device_person_sync_log ID varchar NO PRI
17 cw_is_device_person_sync_log DEVICE_ID varchar NO NULL MUL 设备ID
18 cw_is_device_person_sync_log IMAGE_STORE_ID varchar NO NULL MUL 图库ID
19 cw_is_device_person_sync_log PERSON_ID varchar NO NULL 人员ID
20 cw_is_device_person_sync_log GROUP_PERSON_REF_ID varchar NO NULL MUL 图库人员关联ID
21 cw_is_device_person_sync_log IMAGE_ID varchar YES NULL 人脸ID
22 cw_is_device_person_sync_log STATUS smallint YES 0 同步状态(0:设备未拉取,1:设备已拉取,2:设备上报成功,3:设备上报失败)
23 cw_is_device_person_sync_log CODE varchar YES NULL 错误编码
24 cw_is_device_person_sync_log ERROR_MESSAGE varchar YES NULL 失败原因
25 cw_is_device_person_sync_log CREATE_TIME bigint YES NULL 创建时间 时间戳
26 cw_is_device_person_sync_log LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳(新增/修改人员信息时更新)
27 cw_is_device_person_sync_log COUNT smallint YES 0 计数器
28 cw_is_device_person_sync_log LAST_PULL_TIME bigint YES NULL 最近拉取时间 时间戳
29 cw_is_device_person_sync_log LAST_REPORT_TIME bigint YES NULL 最近上报时间 时间戳
30 cw_is_device_person_sync_log UPDATE_INFO varchar YES NULL 处理信息
31 cw_is_device_person_sync_log EXPIRY_BEGIN_DATE bigint YES NULL 人员有效期开始时间 时间戳
32 cw_is_device_person_sync_log EXPIRY_END_DATE bigint YES NULL 人员有效期结束时间 时间戳
33 cw_is_device_person_sync_log DEVICE_PERSON_REF_ID varchar NO NULL 设备-人员表主键
34 cw_is_device_person_sync_log IS_DEL smallint YES 0 逻辑删除字段 0未删除 1删除
35 cw_is_group_person_ref ID varchar NO NULL PRI
36 cw_is_group_person_ref IMAGE_STORE_ID varchar YES NULL MUL 图库id
37 cw_is_group_person_ref PERSON_ID varchar YES NULL MUL 人员id
38 cw_is_group_person_ref EXPIRY_BEGIN_DATE decimal YES NULL 人员有效期开始时间 时间戳
39 cw_is_group_person_ref EXPIRY_END_DATE decimal YES NULL 人员有效期结束时间 时间戳
40 cw_is_group_person_ref STATUS smallint YES 0 MUL 人员有效状态 -1删除、0正常、1失效
41 cw_is_group_person_ref CREATE_USER_ID varchar YES NULL
42 cw_is_group_person_ref CREATE_TIME decimal YES NULL
43 cw_is_group_person_ref LAST_UPDATE_USER_ID varchar YES NULL
44 cw_is_group_person_ref LAST_UPDATE_TIME decimal YES NULL
45 cw_is_group_person_ref IS_DEL smallint NO 0 MUL 逻辑删除字段 0未删除 1删除
46 cw_is_group_person_ref GENDER smallint YES NULL 性别
47 cw_is_group_person_ref AGE int YES NULL 年龄
48 cw_is_group_person_ref GROUP_TIME bigint YES NULL 入库时间
49 cw_is_group_person_ref GROUP_STATUS smallint YES NULL 0:未建模 1:建模中 2:建模完成 3:建模失败
50 cw_is_group_person_ref ERROR_MESSAGE varchar YES NULL 建模失败时的失败原因
51 cw_is_group_person_ref EXPIRY_BEGIN_DATE_STATUS smallint YES 0 人员有效开始时间状态(0:未处理 1:已处理)
52 cw_is_group_person_ref EXPIRY_END_DATE_STATUS smallint YES 0 人员有效期结束时间状态(0:未处理 1:已处理)
53 cw_is_group_person_ref VALID_DATE_CRON varchar YES NULL 多时间段cron表达式
54 cw_is_image_store_associated_ref ID varchar NO NULL PRI 唯一标识
55 cw_is_image_store_associated_ref IMAGE_STORE_ID varchar NO NULL MUL 图库id
56 cw_is_image_store_associated_ref ASSOCIATED_OBJECT_ID varchar NO NULL 关联对象id
57 cw_is_image_store_associated_ref ASSOCIATED_OBJECT_ID_TYPE int NO NULL 关联对象的类型,1:机构,2:标签,3:个人
58 cw_is_image_store_associated_ref ASSOCIATED_ACTION int YES NULL 0:包含,1:排除
59 cw_is_image_store_associated_ref EXPIRY_BEGIN_DATE decimal YES NULL 人员有效期开始时间 时间戳
60 cw_is_image_store_associated_ref EXPIRY_END_DATE decimal YES NULL 人员有效期结束时间 时间戳
61 cw_is_image_store_associated_ref CREATE_TIME decimal YES NULL
62 cw_is_image_store_associated_ref CREATE_USER_ID varchar YES NULL
63 cw_is_image_store_associated_ref LAST_UPDATE_TIME decimal YES NULL
64 cw_is_image_store_associated_ref LAST_UPDATE_USER_ID varchar YES NULL
65 cw_is_image_store_associated_ref VALID_DATE_CRON varchar YES NULL 多时间段cron表达式
66 cw_is_label ID varchar NO NULL PRI 唯一标识
67 cw_is_label NAME varchar YES NULL
68 cw_is_label CODE varchar NO NULL 编码
69 cw_is_label BUSINESS_ID varchar YES NULL business id
70 cw_is_label IS_DEL smallint YES NULL 0未删,1已删
71 cw_is_label ADD_TYPE smallint YES NULL 添加类型,0手动创建,1应用初始,2应用创建
72 cw_is_label CREATE_USER_ID varchar YES NULL 创建者
73 cw_is_label CREATE_TIME decimal YES NULL 创建时间
74 cw_is_label LAST_UPDATE_USER_ID varchar YES NULL 最后更新者
75 cw_is_label LAST_UPDATE_TIME decimal YES NULL 最后更新时间
76 cw_is_organization ID varchar NO NULL PRI 唯一标识
77 cw_is_organization NAME varchar YES NULL 机构名称
78 cw_is_organization ORDER_BY int YES NULL 同级排序字段
79 cw_is_organization PARENT_ID varchar YES NULL 上级机构id
80 cw_is_organization BUSINESS_ID varchar YES NULL
81 cw_is_organization TYPE_ID varchar YES NULL 机构类型ID
82 cw_is_organization IS_DEL smallint YES NULL 是否删除,0没有删除,1被删除
83 cw_is_organization CREATE_USER_ID varchar YES NULL 创建者
84 cw_is_organization CREATE_TIME decimal YES NULL 创建时间
85 cw_is_organization LAST_UPDATE_USER_ID varchar YES NULL 最后更新者
86 cw_is_organization LAST_UPDATE_TIME decimal YES NULL 最后更新时间
87 cw_is_organization EXT1 varchar YES NULL 扩展字段1
88 cw_is_organization EXT2 varchar YES NULL 扩展字段2
89 cw_is_organization EXT3 varchar YES NULL 扩展字段3
90 cw_is_organization EXT4 varchar YES NULL 扩展字段4
91 cw_is_organization EXT5 varchar YES NULL 扩展字段5
92 cw_is_organization EXT6 varchar YES NULL 扩展字段6
93 cw_is_organization EXT7 varchar YES NULL 扩展字段7
94 cw_is_organization EXT8 varchar YES NULL 扩展字段8
95 cw_is_organization EXT9 varchar YES NULL 扩展字段9
96 cw_is_organization EXT10 varchar YES NULL 扩展字段10
97 cw_is_organization EXT11 varchar YES NULL 扩展字段11
98 cw_is_organization EXT12 varchar YES NULL 扩展字段12
99 cw_is_organization EXT13 varchar YES NULL 扩展字段13
100 cw_is_organization EXT14 varchar YES NULL 扩展字段14
101 cw_is_organization EXT15 varchar YES NULL 扩展字段15
102 cw_is_organization EXT16 varchar YES NULL 扩展字段16
103 cw_is_organization EXT17 varchar YES NULL 扩展字段17
104 cw_is_organization EXT18 varchar YES NULL 扩展字段18
105 cw_is_organization EXT19 varchar YES NULL 扩展字段19
106 cw_is_organization EXT20 varchar YES NULL 扩展字段20
107 cw_is_organization EXT21 varchar YES NULL 扩展字段21
108 cw_is_organization EXT22 varchar YES NULL 扩展字段22
109 cw_is_organization EXT23 varchar YES NULL 扩展字段23
110 cw_is_organization EXT24 varchar YES NULL 扩展字段24
111 cw_is_organization EXT25 varchar YES NULL 扩展字段25
112 cw_is_organization EXT26 varchar YES NULL 扩展字段26
113 cw_is_organization EXT27 varchar YES NULL 扩展字段27
114 cw_is_organization EXT28 varchar YES NULL 扩展字段28
115 cw_is_organization EXT29 varchar YES NULL 扩展字段29
116 cw_is_organization EXT30 varchar YES NULL 扩展字段30
117 cw_is_organization IS_VALID int YES NULL 禁用启用,0=禁用,1=启用
118 cw_is_organization_area_ref ID varchar NO NULL 主键ID
119 cw_is_organization_area_ref ORG_ID varchar NO 机构ID
120 cw_is_organization_area_ref AREA_ID varchar NO 区域ID
121 cw_is_organization_area_ref REF_TYPE tinyint NO NULL 0所在区域 1派梯区域
122 cw_is_organization_area_ref BUSINESS_ID varchar NO 企业ID
123 cw_is_organization_area_ref CREATE_TIME bigint YES NULL 创建日期 时间戳
124 cw_is_organization_area_ref CREATE_USER_ID varchar YES NULL 创建人ID
125 cw_is_organization_area_ref LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳
126 cw_is_organization_area_ref LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
127 cw_is_organization_extend ID varchar NO
128 cw_is_organization_extend ORGANIZATION_ID varchar NO
129 cw_is_organization_extend BUSINESS_ID varchar NO NULL
130 cw_is_organization_extend EMPLOYEE_NUMBER smallint NO 0
131 cw_is_organization_extend ORG_CAR_NUMBER smallint NO 0
132 cw_is_organization_extend EMPLOYEE_CAR_NUMBER smallint NO 0
133 cw_is_organization_extend LEASEHOLD_BEGIN bigint YES NULL 起租日期
134 cw_is_organization_extend LEASEHOLD_END bigint YES NULL 到租日期
135 cw_is_organization_extend PAYMENT_STATE tinyint YES NULL
136 cw_is_organization_extend CARPORT_NUM smallint NO 0 车位数量
137 cw_is_organization_extend CREATE_USER_ID varchar YES
138 cw_is_organization_extend CREATE_TIME bigint YES NULL
139 cw_is_organization_extend LAST_UPDATE_USER_ID varchar YES
140 cw_is_organization_extend LAST_UPDATE_TIME bigint YES NULL
141 cw_is_organization_extend REMARK varchar YES
142 cw_is_organization_extend_detail ID varchar NO
143 cw_is_organization_extend_detail ORGANIZATION_ID varchar NO
144 cw_is_organization_extend_detail BUSINESS_ID varchar NO NULL
145 cw_is_organization_extend_detail UNIT_RENT decimal NO NULL
146 cw_is_organization_extend_detail WATER_AMOUNT decimal NO NULL
147 cw_is_organization_extend_detail ELECTRICITY_AMOUNT decimal NO NULL
148 cw_is_organization_extend_detail PROPERTY_AMOUNT decimal NO NULL
149 cw_is_organization_extend_detail BELONG_DATE bigint NO NULL
150 cw_is_organization_extend_detail PAY_TIME bigint NO NULL
151 cw_is_organization_extend_detail CREATE_USER_ID varchar NO
152 cw_is_organization_extend_detail CREATE_TIME bigint NO NULL
153 cw_is_organization_extend_detail LAST_UPDATE_USER_ID varchar NO
154 cw_is_organization_extend_detail LAST_UPDATE_TIME bigint NO NULL
155 cw_is_organization_extend_detail REMARK varchar NO
156 cw_is_organization_image_store APPLICATION_ID varchar NO NULL PRI 设备主键
157 cw_is_organization_image_store ORG_ID varchar NO NULL PRI 设备主键
158 cw_is_organization_image_store IMAGE_STORE_ID varchar NO NULL PRI 图库主键
159 cw_is_organization_type ID varchar NO NULL PRI 主键
160 cw_is_organization_type BUSINESS_ID varchar YES NULL 企业ID
161 cw_is_organization_type CODE varchar YES NULL 编号
162 cw_is_organization_type NAME varchar YES NULL 名称
163 cw_is_organization_type HAS_LOWER_LEVEL tinyint YES 0 是否可以有下级机构 0 不可以 1 可以
164 cw_is_organization_type HAS_DEFAULT tinyint YES 0 是否是默认的 0 不是 1 是
165 cw_is_organization_type STATUS tinyint YES 0 状态(0 有效 1 无效)默认为0
166 cw_is_organization_type CREATE_USER_ID varchar YES NULL 创建人
167 cw_is_organization_type CREATE_TIME decimal YES NULL 创建时间
168 cw_is_organization_type LAST_UPDATE_USER_ID varchar YES NULL 更新人
169 cw_is_organization_type LAST_UPDATE_TIME decimal YES NULL 更新时间
170 cw_is_organization_type_properties ID varchar NO NULL PRI 主键
171 cw_is_organization_type_properties BUSINESS_ID varchar YES NULL 企业ID
172 cw_is_organization_type_properties ORGANIZATION_TYPE_ID varchar YES NULL 机构ID
173 cw_is_organization_type_properties CODE varchar YES NULL 编号
174 cw_is_organization_type_properties NAME varchar YES NULL 名称
175 cw_is_organization_type_properties STATUS tinyint YES 0 (0 有效 1 无效)默认为0
176 cw_is_organization_type_properties HAS_REQUIRED tinyint YES 0 是否必填 0 非必填 1 必填
177 cw_is_organization_type_properties ORDER_NUM int YES NULL 序号
178 cw_is_organization_type_properties CREATE_USER_ID varchar YES NULL 创建人
179 cw_is_organization_type_properties CREATE_TIME decimal YES NULL 创建时间
180 cw_is_organization_type_properties LAST_UPDATE_USER_ID varchar YES NULL 更新人
181 cw_is_organization_type_properties LAST_UPDATE_TIME decimal YES NULL 更新时间
182 cw_is_person ID varchar NO NULL PRI 主键ID
183 cw_is_person BUSINESS_ID varchar NO NULL MUL 企业ID
184 cw_is_person PERSON_CODE varchar YES NULL 人员CODE
185 cw_is_person NAME varchar YES NULL MUL 姓名
186 cw_is_person USER_NAME varchar YES NULL 用户名
187 cw_is_person PHONE varchar YES NULL 联系电话
188 cw_is_person STATUS smallint YES NULL 人员状态(0 有效 1 无效)默认为0
189 cw_is_person EXPIRY_BEGIN_DATE decimal YES NULL 人员有效期开始时间 时间戳
190 cw_is_person EXPIRY_END_DATE decimal YES NULL 人员有效期结束时间 时间戳
191 cw_is_person SHOW_PICTURE varchar YES NULL 人员展示照
192 cw_is_person COMPARE_PICTURE text YES NULL 人员比对照
193 cw_is_person IS_DEL smallint YES NULL MUL 逻辑删除字段 0:未删除 1:已删除
194 cw_is_person CREATE_TIME decimal YES NULL 创建日期 时间戳
195 cw_is_person CREATE_USER_ID varchar YES NULL 创建人ID
196 cw_is_person LAST_UPDATE_TIME decimal YES NULL 修改日期 时间戳
197 cw_is_person LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
198 cw_is_person EMAIL varchar YES NULL 邮箱
199 cw_is_person IMAGE_ID varchar YES NULL MUL 识别照
200 cw_is_person EXT1 varchar YES NULL 扩展字段1
201 cw_is_person EXT2 varchar YES NULL 扩展字段2
202 cw_is_person EXT3 varchar YES NULL 扩展字段3
203 cw_is_person EXT4 varchar YES NULL 扩展字段4
204 cw_is_person EXT5 varchar YES NULL 扩展字段5
205 cw_is_person EXT6 varchar YES NULL 扩展字段6
206 cw_is_person EXT7 varchar YES NULL 扩展字段7
207 cw_is_person EXT8 varchar YES NULL 扩展字段8
208 cw_is_person EXT9 varchar YES NULL 扩展字段9
209 cw_is_person EXT10 varchar YES NULL 扩展字段10
210 cw_is_person EXT11 varchar YES NULL 扩展字段11
211 cw_is_person EXT12 varchar YES NULL 扩展字段12
212 cw_is_person EXT13 varchar YES NULL 扩展字段13
213 cw_is_person EXT14 varchar YES NULL 扩展字段14
214 cw_is_person EXT15 varchar YES NULL 扩展字段15
215 cw_is_person EXT16 varchar YES NULL 扩展字段16
216 cw_is_person EXT17 varchar YES NULL 扩展字段17
217 cw_is_person EXT18 varchar YES NULL 扩展字段18
218 cw_is_person EXT19 varchar YES NULL 扩展字段19
219 cw_is_person EXT20 varchar YES NULL 扩展字段20
220 cw_is_person EXT21 varchar YES NULL 扩展字段21
221 cw_is_person EXT22 varchar YES NULL 扩展字段22
222 cw_is_person EXT23 varchar YES NULL 扩展字段23
223 cw_is_person EXT24 varchar YES NULL 扩展字段24
224 cw_is_person EXT25 varchar YES NULL 扩展字段25
225 cw_is_person EXT26 varchar YES NULL 扩展字段26
226 cw_is_person EXT27 varchar YES NULL 扩展字段27
227 cw_is_person EXT28 varchar YES NULL 扩展字段28
228 cw_is_person EXT29 varchar YES NULL 扩展字段29
229 cw_is_person EXT30 varchar YES NULL 扩展字段30
230 cw_is_person EXT31 varchar YES NULL 扩展字段31
231 cw_is_person EXT32 varchar YES NULL 扩展字段32
232 cw_is_person EXT33 varchar YES NULL 扩展字段33
233 cw_is_person EXT34 varchar YES NULL 扩展字段34
234 cw_is_person EXT35 varchar YES NULL 扩展字段35
235 cw_is_person EXT36 varchar YES NULL 扩展字段36
236 cw_is_person EXT37 varchar YES NULL 扩展字段37
237 cw_is_person EXT38 varchar YES NULL 扩展字段38
238 cw_is_person EXT39 varchar YES NULL 扩展字段39
239 cw_is_person EXT40 varchar YES NULL 扩展字段40
240 cw_is_person CREATE_SYS_ACCOUNT smallint NO 0 是否同步账号,1同步,0不同步
241 cw_is_person SYS_ACCOUNT_ID varchar YES NULL 系统账号ID
242 cw_is_person SOURCE smallint NO 1 人员来源 1页面管理 2抓拍
243 cw_is_person RESERVE_INFO varchar YES NULL 保留信息
244 cw_is_person WELCOME varchar YES NULL 欢迎语
245 cw_is_person IC_CARD_NO varchar YES NULL IC卡号
246 cw_is_person IC_CARD_TYPE varchar YES NULL IC卡类型
247 cw_is_person DEFAULT_FLOOR varchar YES NULL 默认楼层id
248 cw_is_person CHOOSE_FLOOR text YES NULL 选中的楼层
249 cw_is_person_audit ID varchar NO NULL PRI 主键ID
250 cw_is_person_audit BUSINESS_ID varchar NO NULL 企业ID
251 cw_is_person_audit NAME varchar NO NULL 姓名
252 cw_is_person_audit USER_NAME varchar YES NULL 用户名
253 cw_is_person_audit PERSON_CODE varchar YES NULL 人员CODE
254 cw_is_person_audit PHONE varchar YES NULL 联系电话
255 cw_is_person_audit EMAIL varchar YES NULL 邮箱
256 cw_is_person_audit IMAGE_ID varchar YES NULL 识别照
257 cw_is_person_audit COMPARE_PICTURE varchar YES NULL 人员比对照
258 cw_is_person_audit SHOW_PICTURE varchar YES NULL 人员展示照
259 cw_is_person_audit ORGANIZATIONIDS text YES NULL 所属机构
260 cw_is_person_audit ORGANIZATIONNAMES text YES NULL 所属机构名称
261 cw_is_person_audit LABELIDS text YES NULL 所属标签
262 cw_is_person_audit LABELNAMES text YES NULL 所属标签名称
263 cw_is_person_audit CREATE_SYS_ACCOUNT tinyint YES 0 是否同步创建账号,0 不创建 1 创建
264 cw_is_person_audit SYS_ACCOUNT_ID varchar YES NULL 系统账号ID
265 cw_is_person_audit IC_CARD_NO varchar YES NULL IC卡号
266 cw_is_person_audit IC_CARD_TYPE varchar YES NULL IC卡类型
267 cw_is_person_audit SOURCE tinyint NO NULL 来源(1:页面;2:抓拍;3:设备;4:扫码)
268 cw_is_person_audit DEVICE_CODE varchar YES NULL 注册设备编号
269 cw_is_person_audit DEVICE_NAME varchar YES NULL 注册设备名称
270 cw_is_person_audit WELCOME varchar YES NULL 欢迎语
271 cw_is_person_audit RESERVE_INFO varchar YES NULL 备用字段
272 cw_is_person_audit USER_PROPERTIES text YES NULL 用户填写字段
273 cw_is_person_audit USER_PROPERTIES_NAME text YES NULL 用户填写字段名称
274 cw_is_person_audit STATUS tinyint YES NULL 人员状态(0 有效 1 无效)默认为0
275 cw_is_person_audit AUDIT_STATUS tinyint YES NULL 审核状态:0审核中,1审核通过,2审核失败
276 cw_is_person_audit IS_DEL tinyint YES NULL 逻辑删除字段 0:未删除 1:已删除
277 cw_is_person_audit CREATE_USER_ID varchar YES NULL 创建人ID
278 cw_is_person_audit CREATE_TIME bigint YES NULL 创建日期 时间戳
279 cw_is_person_audit LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
280 cw_is_person_audit LAST_UPDATE_TIME bigint YES NULL 修改日期 时间戳
281 cw_is_person_audit EXT1 varchar YES NULL 扩展字段1
282 cw_is_person_audit EXT2 varchar YES NULL 扩展字段2
283 cw_is_person_audit EXT3 varchar YES NULL 扩展字段3
284 cw_is_person_audit EXT4 varchar YES NULL 扩展字段4
285 cw_is_person_audit EXT5 varchar YES NULL 扩展字段5
286 cw_is_person_audit EXT6 varchar YES NULL 扩展字段6
287 cw_is_person_audit EXT7 varchar YES NULL 扩展字段7
288 cw_is_person_audit EXT8 varchar YES NULL 扩展字段8
289 cw_is_person_audit EXT9 varchar YES NULL 扩展字段9
290 cw_is_person_audit EXT10 varchar YES NULL 扩展字段10
291 cw_is_person_audit EXT11 varchar YES NULL 扩展字段11
292 cw_is_person_audit EXT12 varchar YES NULL 扩展字段12
293 cw_is_person_audit EXT13 varchar YES NULL 扩展字段13
294 cw_is_person_audit EXT14 varchar YES NULL 扩展字段14
295 cw_is_person_audit EXT15 varchar YES NULL 扩展字段15
296 cw_is_person_audit EXT16 varchar YES NULL 扩展字段16
297 cw_is_person_audit EXT17 varchar YES NULL 扩展字段17
298 cw_is_person_audit EXT18 varchar YES NULL 扩展字段18
299 cw_is_person_audit EXT19 varchar YES NULL 扩展字段19
300 cw_is_person_audit EXT20 varchar YES NULL 扩展字段20
301 cw_is_person_audit EXT21 varchar YES NULL 扩展字段21
302 cw_is_person_audit EXT22 varchar YES NULL 扩展字段22
303 cw_is_person_audit EXT23 varchar YES NULL 扩展字段23
304 cw_is_person_audit EXT24 varchar YES NULL 扩展字段24
305 cw_is_person_audit EXT25 varchar YES NULL 扩展字段25
306 cw_is_person_audit EXT26 varchar YES NULL 扩展字段26
307 cw_is_person_audit EXT27 varchar YES NULL 扩展字段27
308 cw_is_person_audit EXT28 varchar YES NULL 扩展字段28
309 cw_is_person_audit EXT29 varchar YES NULL 扩展字段29
310 cw_is_person_audit EXT30 varchar YES NULL 扩展字段30
311 cw_is_person_audit EXT31 varchar YES NULL 扩展字段31
312 cw_is_person_audit EXT32 varchar YES NULL 扩展字段32
313 cw_is_person_audit EXT33 varchar YES NULL 扩展字段33
314 cw_is_person_audit EXT34 varchar YES NULL 扩展字段34
315 cw_is_person_audit EXT35 varchar YES NULL 扩展字段35
316 cw_is_person_audit EXT36 varchar YES NULL 扩展字段36
317 cw_is_person_audit EXT37 varchar YES NULL 扩展字段37
318 cw_is_person_audit EXT38 varchar YES NULL 扩展字段38
319 cw_is_person_audit EXT39 varchar YES NULL 扩展字段39
320 cw_is_person_audit EXT40 varchar YES NULL 扩展字段40
321 cw_is_person_batch_detail ID varchar NO NULL PRI 主键ID
322 cw_is_person_batch_detail BATCH_ID varchar NO NULL MUL 所属批次ID
323 cw_is_person_batch_detail FILE_NAME varchar NO NULL 文件名称
324 cw_is_person_batch_detail PERSON_NAME varchar YES NULL 人员姓名
325 cw_is_person_batch_detail STATUS decimal NO NULL 状态(1 成功 2 失败)
326 cw_is_person_batch_detail REMARK varchar YES NULL 描述信息
327 cw_is_person_batch_detail CREATE_TIME decimal YES NULL 创建时间,时间戳
328 cw_is_person_batch_detail CREATE_USER_ID varchar YES NULL 创建用户ID
329 cw_is_person_batch_import ID varchar NO NULL 主键ID
330 cw_is_person_batch_import BUSINESS_ID varchar YES NULL 企业ID
331 cw_is_person_batch_import BATCH_NO varchar NO NULL 批次号
332 cw_is_person_batch_import TYPE decimal NO NULL 导入类型(1.文件前端上传,2.服务器文件路径,3.服务器图片生成 )
333 cw_is_person_batch_import FILE_NAME varchar NO NULL 文件名称
334 cw_is_person_batch_import FILE_PATH varchar YES NULL 文件路径
335 cw_is_person_batch_import FINISH_TIME decimal YES NULL 结束时间,时间戳
336 cw_is_person_batch_import TOTAL_COUNT decimal YES NULL 总数
337 cw_is_person_batch_import CURRENT_COUNT decimal YES NULL 当前已完成数
338 cw_is_person_batch_import REMARK varchar YES NULL 描述信息
339 cw_is_person_batch_import STATUS decimal NO NULL 状态(1.未开始,2.进行中,3.已完成,4.异常)
340 cw_is_person_batch_import CREATE_TIME decimal YES NULL 创建时间,时间戳
341 cw_is_person_batch_import CREATE_USER_ID varchar YES NULL 创建用户ID
342 cw_is_person_batch_import OPERATION varchar YES NULL 操作类型(new 新增,update 更新)
343 cw_is_person_batch_import LOGIN_NAME varchar YES NULL 登录名称
344 cw_is_person_label_ref ID varchar NO NULL PRI 主键ID
345 cw_is_person_label_ref PERSON_ID varchar NO NULL MUL 人员ID
346 cw_is_person_label_ref LABEL_ID varchar NO NULL MUL 标签主键ID
347 cw_is_person_label_ref CREATE_TIME decimal YES NULL 创建日期 时间戳
348 cw_is_person_label_ref CREATE_USER_ID varchar YES NULL 创建人ID
349 cw_is_person_label_ref LAST_UPDATE_TIME decimal YES NULL 修改日期 时间戳
350 cw_is_person_label_ref LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
351 cw_is_person_organization_ref ID varchar NO NULL PRI 主键ID
352 cw_is_person_organization_ref PERSON_ID varchar NO NULL MUL 人员ID
353 cw_is_person_organization_ref ORG_ID varchar NO NULL MUL 组织ID
354 cw_is_person_organization_ref CREATE_TIME decimal YES NULL 创建日期 时间戳
355 cw_is_person_organization_ref CREATE_USER_ID varchar YES NULL 创建人ID
356 cw_is_person_organization_ref LAST_UPDATE_TIME decimal YES NULL 修改日期 时间戳
357 cw_is_person_organization_ref LAST_UPDATE_USER_ID varchar YES NULL 修改人员ID
358 cw_is_person_properties ID varchar NO NULL PRI 主键
359 cw_is_person_properties BUSINESS_ID varchar YES NULL 企业ID
360 cw_is_person_properties CODE varchar YES NULL 编号
361 cw_is_person_properties NAME varchar YES NULL 名称
362 cw_is_person_properties TYPE smallint YES NULL 输入类型 1 字符串 2 选择 3 时间 4 文件上传
363 cw_is_person_properties STATUS tinyint YES 0 (0 有效 1 无效)默认为0
364 cw_is_person_properties HAS_SYS_ACCOUNT tinyint YES 0 是否作为系统账号 0 不可以 1 可以
365 cw_is_person_properties HAS_SYS_ACCOUNT_AVAILABLE tinyint YES 0 是否可以作为系统账号字段 0 不可以 1 可以
366 cw_is_person_properties HAS_REQUIRED tinyint YES 0 是否必填 0 不要必填 1 必填
367 cw_is_person_properties HAS_DEFAULT tinyint YES 0 是否默认 0 不默认 1 默认
368 cw_is_person_properties ORDER_NUM int YES NULL 序号
369 cw_is_person_properties REMINDER varchar YES NULL 提示语
370 cw_is_person_properties CREATE_USER_ID varchar YES NULL 创建人
371 cw_is_person_properties CREATE_TIME bigint YES NULL 创建时间
372 cw_is_person_properties LAST_UPDATE_USER_ID varchar YES NULL 更新人
373 cw_is_person_properties LAST_UPDATE_TIME bigint YES NULL 更新时间
374 cw_is_person_properties ARRAY_DATA varchar YES NULL 如果类型是2,补充填写下拉列表,用逗号分隔
375 cw_is_person_properties HAS_MULTIPLE tinyint YES NULL 如果类型是2,补充填写是否多选 0 单选 1 复选
376 cw_is_person_properties_switch ID varchar NO NULL PRI 主键
377 cw_is_person_properties_switch BUSINESS_ID varchar YES NULL 企业ID
378 cw_is_person_properties_switch SWITCH_PARAM tinyint YES NULL 开启注册照优化
379 cw_is_person_properties_switch SIZE_PARAM int YES NULL 尺寸:1-1存,2-2存
380 cw_is_person_properties_switch SHAPE_PARAM tinyint YES NULL 形态变化
381 cw_is_person_properties_switch STATUS tinyint YES 0 (0 有效 1 无效)默认为0
382 cw_is_person_properties_switch SKIN_COLOR_PARAM tinyint YES NULL 肤色整体优化
383 cw_is_person_properties_switch CREATE_USER_ID varchar YES NULL 创建人
384 cw_is_person_properties_switch CREATE_TIME bigint YES NULL 创建时间
385 cw_is_person_properties_switch LAST_UPDATE_USER_ID varchar YES NULL 更新人
386 cw_is_person_properties_switch LAST_UPDATE_TIME bigint YES NULL 更新时间
387 cw_is_person_properties_switch DEFECTS_PARAM tinyint YES NULL 瑕疵优化
388 cw_is_person_properties_switch BACKGROUND_PARAM tinyint YES NULL 换背景
389 cw_is_person_properties_switch BACKGROUND_OBJECT int YES NULL 换背景底色:3-白色,4-蓝色,2-红色
390 cw_is_person_registry ID varchar NO PRI 主键ID
391 cw_is_person_registry BUSINESS_ID varchar NO 租户ID
392 cw_is_person_registry STATUS tinyint NO 1 开启设备注册(0 关闭 1 开启) 默认为1
393 cw_is_person_registry DEVICE_STATUS tinyint NO 0 设备注册审核(0 关闭 1 开启) 默认为0
394 cw_is_person_registry CODE_STATUS tinyint NO 1 扫码注册审核(0 关闭 1 开启) 默认为1
395 cw_is_person_registry ORGANIZATION_IDS varchar YES 注册默认组织ID列表(用英文逗号分隔)
396 cw_is_person_registry LABEL_IDS varchar YES 注册默认标签ID列表(用英文逗号分隔)
397 cw_is_person_registry CREATE_TIME decimal YES NULL 创建日期 时间戳
398 cw_is_person_registry CREATE_USER_ID varchar YES 创建人ID
399 cw_is_person_registry LAST_UPDATE_TIME decimal YES NULL 修改日期 时间戳
400 cw_is_person_registry LAST_UPDATE_USER_ID varchar YES 修改人员ID
401 cw_is_person_registry TYPE tinyint NO 0 注册类型(0:自助注册 1:人证注册) 默认为0
402 cw_is_person_registry_device ID varchar NO PRI 主键ID
403 cw_is_person_registry_device REGISTRY_ID varchar NO MUL 注册配置主键
404 cw_is_person_registry_device DEVICE_CODE varchar NO 设备编码
405 cw_is_person_registry_properties ID varchar NO PRI 主键ID
406 cw_is_person_registry_properties REGISTRY_ID varchar NO MUL 注册配置主键
407 cw_is_person_registry_properties PERSON_PROPERTY_ID varchar NO 人员属性表主键
408 cw_is_person_registry_properties BIND_PROPERTY_CODE varchar YES NULL 与人员属性关联的属性
409 cw_operation_log ID varchar NO NULL PRI 唯一标识
410 cw_operation_log BUSINESS_ID varchar YES NULL business id
411 cw_operation_log CREATE_USER_ID varchar YES NULL 创建者
412 cw_operation_log CREATE_USER_NAME varchar YES NULL 创建者名称
413 cw_operation_log CREATE_TIME decimal YES NULL 创建时间
414 cw_operation_log INTERFACE_NAME varchar YES NULL 接口名称
415 cw_operation_log CONTENT text YES NULL 请求报文
416 cw_operation_log MODULE varchar YES NULL 模块
417 cw_operation_log CALL_IP varchar YES NULL 来源ip
418 cw_task_job_everytime_details ID varchar YES NULL
419 cw_task_job_everytime_details JOB_NAME varchar YES NULL
420 cw_task_job_everytime_details JOB_STATUS decimal YES NULL
421 cw_task_job_everytime_details START_TIME decimal YES NULL
422 cw_task_job_everytime_details END_TIME decimal YES NULL
423 cw_task_job_everytime_details IP_ADDRESS varchar YES NULL
424 cw_task_job_everytime_details MAC_ADDRESS varchar YES NULL
425 org_floor org_id varchar NO NULL 机构id
426 org_floor zone_id varchar YES NULL 楼层id
427 org_floor is_all smallint NO NULL 是否全部查询:0-是,1-不是
428 org_floor zone_name varchar YES NULL 楼层名
@@ -0,0 +1,171 @@
mysql: [Warning] Using a password on the command line interface can be insecure.
cw_is_device_image_store PRIMARY ID 0 1
cw_is_device_image_store UNIQUE_KEY DEVICE_ID 0 1
cw_is_device_image_store UNIQUE_KEY IMAGE_STORE_ID 0 2
cw_is_device_person PRIMARY ID 0 1
cw_is_device_person UNIQUE_KEY DEVICE_ID 0 1
cw_is_device_person UNIQUE_KEY PERSON_ID 0 2
cw_is_device_person_sync_log IDX_DEVICE_STATUS DEVICE_ID 1 1
cw_is_device_person_sync_log IDX_DEVICE_STATUS GROUP_PERSON_REF_ID 1 2
cw_is_device_person_sync_log IDX_DEVICE_STATUS STATUS 1 3
cw_is_device_person_sync_log IDX_DEVICE_STATUS LAST_REPORT_TIME 1 4
cw_is_device_person_sync_log IDX_DEVICE_STATUS LAST_PULL_TIME 1 5
cw_is_device_person_sync_log IDX_DEVICE_STATUS LAST_UPDATE_TIME 1 6
cw_is_device_person_sync_log idx_dev_ps_syn_log_imgstroe_id_person_id IMAGE_STORE_ID 1 1
cw_is_device_person_sync_log idx_dev_ps_syn_log_imgstroe_id_person_id PERSON_ID 1 2
cw_is_device_person_sync_log IDX_GROUP_PERSON_REF GROUP_PERSON_REF_ID 1 1
cw_is_device_person_sync_log IDX_IMAGESTORE_STATUS IMAGE_STORE_ID 1 1
cw_is_device_person_sync_log IDX_IMAGESTORE_STATUS STATUS 1 2
cw_is_device_person_sync_log IDX_PERSON_UPDATE DEVICE_ID 1 1
cw_is_device_person_sync_log IDX_PERSON_UPDATE IMAGE_STORE_ID 1 2
cw_is_device_person_sync_log IDX_PERSON_UPDATE LAST_UPDATE_TIME 1 3
cw_is_device_person_sync_log IDX_PERSON_UPDATE PERSON_ID 1 4
cw_is_device_person_sync_log PRIMARY ID 0 1
cw_is_device_person_sync_log UNIQUE_KEY DEVICE_ID 0 1
cw_is_device_person_sync_log UNIQUE_KEY IMAGE_STORE_ID 0 2
cw_is_device_person_sync_log UNIQUE_KEY PERSON_ID 0 3
cw_is_group_person_ref IDX_IGPR_PEROSN_COUNT2 IMAGE_STORE_ID 1 1
cw_is_group_person_ref IDX_IGPR_PEROSN_COUNT2 STATUS 1 2
cw_is_group_person_ref IDX_IGPR_PERSON IMAGE_STORE_ID 1 1
cw_is_group_person_ref IDX_IGPR_PERSON PERSON_ID 1 2
cw_is_group_person_ref IDX_IGPR_PERSON_1 PERSON_ID 1 1
cw_is_group_person_ref IDX_IGPR_PERSON_COUNT IS_DEL 1 1
cw_is_group_person_ref IDX_IGPR_PERSON_COUNT IMAGE_STORE_ID 1 2
cw_is_group_person_ref IDX_IGPR_PERSON_UPDATE IMAGE_STORE_ID 1 1
cw_is_group_person_ref IDX_IGPR_PERSON_UPDATE LAST_UPDATE_TIME 1 2
cw_is_group_person_ref IDX_IGPR_PERSON_UPDATE PERSON_ID 1 3
cw_is_group_person_ref IDX_IGPR_STATUS_TIME STATUS 1 1
cw_is_group_person_ref IDX_IGPR_STATUS_TIME LAST_UPDATE_TIME 1 2
cw_is_group_person_ref PRIMARY ID 0 1
cw_is_image_store_associated_ref IDX_IMAGE_STORE_ASSOCIATED IMAGE_STORE_ID 1 1
cw_is_image_store_associated_ref IDX_IMAGE_STORE_ASSOCIATED ASSOCIATED_OBJECT_ID 1 2
cw_is_image_store_associated_ref IDX_IMAGE_STORE_ASSOCIATED ASSOCIATED_ACTION 1 3
cw_is_image_store_associated_ref PRIMARY ID 0 1
cw_is_label PRIMARY ID 0 1
cw_is_organization PRIMARY ID 0 1
cw_is_organization_image_store PRIMARY APPLICATION_ID 0 1
cw_is_organization_image_store PRIMARY ORG_ID 0 2
cw_is_organization_image_store PRIMARY IMAGE_STORE_ID 0 3
cw_is_organization_type PRIMARY ID 0 1
cw_is_organization_type_properties PRIMARY ID 0 1
cw_is_person IDX_CW_IS_PERSON_EMAIL BUSINESS_ID 1 1
cw_is_person IDX_CW_IS_PERSON_EMAIL EMAIL 1 2
cw_is_person IDX_CW_IS_PERSON_PERSON_CODE BUSINESS_ID 1 1
cw_is_person IDX_CW_IS_PERSON_PERSON_CODE PERSON_CODE 1 2
cw_is_person IDX_CW_IS_PERSON_PHONE BUSINESS_ID 1 1
cw_is_person IDX_CW_IS_PERSON_PHONE PHONE 1 2
cw_is_person IDX_CW_IS_PERSON_USER_NAME BUSINESS_ID 1 1
cw_is_person IDX_CW_IS_PERSON_USER_NAME USER_NAME 1 2
cw_is_person idx_imageId IMAGE_ID 1 1
cw_is_person IDX_IP_PAGE IS_DEL 1 1
cw_is_person IDX_IP_PAGE BUSINESS_ID 1 2
cw_is_person IDX_IP_PAGE LAST_UPDATE_TIME 1 3
cw_is_person IDX_IP_PAGE ID 1 4
cw_is_person IDX_IP_PAGE SOURCE 1 5
cw_is_person idx_is_person ID 0 1
cw_is_person IDX_IS_PERSON_NAME NAME 1 1
cw_is_person PRIMARY ID 0 1
cw_is_person_audit PRIMARY ID 0 1
cw_is_person_batch_detail IDX_CEBD_PAGE BATCH_ID 1 1
cw_is_person_batch_detail IDX_CEBD_PAGE CREATE_TIME 1 2
cw_is_person_batch_detail PRIMARY ID 0 1
cw_is_person_label_ref IDX_LABEL LABEL_ID 1 1
cw_is_person_label_ref IDX_PERSON PERSON_ID 1 1
cw_is_person_label_ref idx_pl_personid PERSON_ID 1 1
cw_is_person_label_ref PRIMARY ID 0 1
cw_is_person_organization_ref IDX_ORG ORG_ID 1 1
cw_is_person_organization_ref IDX_PERSON PERSON_ID 1 1
cw_is_person_organization_ref idx_po_person_id PERSON_ID 1 1
cw_is_person_organization_ref PRIMARY ID 0 1
cw_is_person_properties PRIMARY ID 0 1
cw_is_person_properties_switch PRIMARY ID 0 1
cw_is_person_registry PRIMARY ID 0 1
cw_is_person_registry_device PRIMARY ID 0 1
cw_is_person_registry_device UNIQUE_KEY REGISTRY_ID 0 1
cw_is_person_registry_device UNIQUE_KEY DEVICE_CODE 0 2
cw_is_person_registry_properties PRIMARY ID 0 1
cw_is_person_registry_properties UNIQUE_KEY REGISTRY_ID 0 1
cw_is_person_registry_properties UNIQUE_KEY PERSON_PROPERTY_ID 0 2
cw_operation_log PRIMARY ID 0 1
qrtz_blob_triggers PRIMARY SCHED_NAME 0 1
qrtz_blob_triggers PRIMARY TRIGGER_NAME 0 2
qrtz_blob_triggers PRIMARY TRIGGER_GROUP 0 3
qrtz_calendars PRIMARY SCHED_NAME 0 1
qrtz_calendars PRIMARY CALENDAR_NAME 0 2
qrtz_cron_triggers PRIMARY SCHED_NAME 0 1
qrtz_cron_triggers PRIMARY TRIGGER_NAME 0 2
qrtz_cron_triggers PRIMARY TRIGGER_GROUP 0 3
qrtz_fired_triggers IDX_QRTZ_FT_INST_JOB_REQ_RCVRY INSTANCE_NAME 1 1
qrtz_fired_triggers IDX_QRTZ_FT_INST_JOB_REQ_RCVRY SCHED_NAME 1 2
qrtz_fired_triggers IDX_QRTZ_FT_INST_JOB_REQ_RCVRY REQUESTS_RECOVERY 1 3
qrtz_fired_triggers IDX_QRTZ_FT_JG SCHED_NAME 1 1
qrtz_fired_triggers IDX_QRTZ_FT_JG JOB_GROUP 1 2
qrtz_fired_triggers IDX_QRTZ_FT_J_G JOB_NAME 1 1
qrtz_fired_triggers IDX_QRTZ_FT_J_G SCHED_NAME 1 2
qrtz_fired_triggers IDX_QRTZ_FT_J_G JOB_GROUP 1 3
qrtz_fired_triggers IDX_QRTZ_FT_TG SCHED_NAME 1 1
qrtz_fired_triggers IDX_QRTZ_FT_TG TRIGGER_GROUP 1 2
qrtz_fired_triggers IDX_QRTZ_FT_TRIG_INST_NAME SCHED_NAME 1 1
qrtz_fired_triggers IDX_QRTZ_FT_TRIG_INST_NAME INSTANCE_NAME 1 2
qrtz_fired_triggers IDX_QRTZ_FT_T_G SCHED_NAME 1 1
qrtz_fired_triggers IDX_QRTZ_FT_T_G TRIGGER_NAME 1 2
qrtz_fired_triggers IDX_QRTZ_FT_T_G TRIGGER_GROUP 1 3
qrtz_fired_triggers PRIMARY SCHED_NAME 0 1
qrtz_fired_triggers PRIMARY ENTRY_ID 0 2
qrtz_job_details IDX_QRTZ_J_GRP SCHED_NAME 1 1
qrtz_job_details IDX_QRTZ_J_GRP JOB_GROUP 1 2
qrtz_job_details IDX_QRTZ_J_REQ_RECOVERY SCHED_NAME 1 1
qrtz_job_details IDX_QRTZ_J_REQ_RECOVERY REQUESTS_RECOVERY 1 2
qrtz_job_details PRIMARY SCHED_NAME 0 1
qrtz_job_details PRIMARY JOB_NAME 0 2
qrtz_job_details PRIMARY JOB_GROUP 0 3
qrtz_locks PRIMARY SCHED_NAME 0 1
qrtz_locks PRIMARY LOCK_NAME 0 2
qrtz_paused_trigger_grps PRIMARY SCHED_NAME 0 1
qrtz_paused_trigger_grps PRIMARY TRIGGER_GROUP 0 2
qrtz_scheduler_state PRIMARY SCHED_NAME 0 1
qrtz_scheduler_state PRIMARY INSTANCE_NAME 0 2
qrtz_simple_triggers PRIMARY SCHED_NAME 0 1
qrtz_simple_triggers PRIMARY TRIGGER_NAME 0 2
qrtz_simple_triggers PRIMARY TRIGGER_GROUP 0 3
qrtz_simprop_triggers PRIMARY SCHED_NAME 0 1
qrtz_simprop_triggers PRIMARY TRIGGER_NAME 0 2
qrtz_simprop_triggers PRIMARY TRIGGER_GROUP 0 3
qrtz_triggers IDX_QRTZ_T_C CALENDAR_NAME 1 1
qrtz_triggers IDX_QRTZ_T_C SCHED_NAME 1 2
qrtz_triggers IDX_QRTZ_T_G TRIGGER_GROUP 1 1
qrtz_triggers IDX_QRTZ_T_G SCHED_NAME 1 2
qrtz_triggers IDX_QRTZ_T_JG JOB_GROUP 1 1
qrtz_triggers IDX_QRTZ_T_JG SCHED_NAME 1 2
qrtz_triggers IDX_QRTZ_T_NEXT_FIRE_TIME NEXT_FIRE_TIME 1 1
qrtz_triggers IDX_QRTZ_T_NEXT_FIRE_TIME SCHED_NAME 1 2
qrtz_triggers IDX_QRTZ_T_NFT_MISFIRE SCHED_NAME 1 1
qrtz_triggers IDX_QRTZ_T_NFT_MISFIRE MISFIRE_INSTR 1 2
qrtz_triggers IDX_QRTZ_T_NFT_MISFIRE NEXT_FIRE_TIME 1 3
qrtz_triggers IDX_QRTZ_T_NFT_ST NEXT_FIRE_TIME 1 1
qrtz_triggers IDX_QRTZ_T_NFT_ST SCHED_NAME 1 2
qrtz_triggers IDX_QRTZ_T_NFT_ST TRIGGER_STATE 1 3
qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE NEXT_FIRE_TIME 1 1
qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE TRIGGER_STATE 1 2
qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE MISFIRE_INSTR 1 3
qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE SCHED_NAME 1 4
qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP TRIGGER_GROUP 1 1
qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP SCHED_NAME 1 2
qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP MISFIRE_INSTR 1 3
qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP NEXT_FIRE_TIME 1 4
qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP TRIGGER_STATE 1 5
qrtz_triggers IDX_QRTZ_T_N_G_STATE SCHED_NAME 1 1
qrtz_triggers IDX_QRTZ_T_N_G_STATE TRIGGER_STATE 1 2
qrtz_triggers IDX_QRTZ_T_N_G_STATE TRIGGER_GROUP 1 3
qrtz_triggers IDX_QRTZ_T_N_STATE TRIGGER_STATE 1 1
qrtz_triggers IDX_QRTZ_T_N_STATE TRIGGER_NAME 1 2
qrtz_triggers IDX_QRTZ_T_N_STATE SCHED_NAME 1 3
qrtz_triggers IDX_QRTZ_T_N_STATE TRIGGER_GROUP 1 4
qrtz_triggers IDX_QRTZ_T_STATE TRIGGER_STATE 1 1
qrtz_triggers IDX_QRTZ_T_STATE SCHED_NAME 1 2
qrtz_triggers PRIMARY SCHED_NAME 0 1
qrtz_triggers PRIMARY TRIGGER_NAME 0 2
qrtz_triggers PRIMARY TRIGGER_GROUP 0 3
qrtz_triggers SYS_C0012788 SCHED_NAME 1 1
qrtz_triggers SYS_C0012788 JOB_NAME 1 2
qrtz_triggers SYS_C0012788 JOB_GROUP 1 3
1 mysql: [Warning] Using a password on the command line interface can be insecure.
2 cw_is_device_image_store PRIMARY ID 0 1
3 cw_is_device_image_store UNIQUE_KEY DEVICE_ID 0 1
4 cw_is_device_image_store UNIQUE_KEY IMAGE_STORE_ID 0 2
5 cw_is_device_person PRIMARY ID 0 1
6 cw_is_device_person UNIQUE_KEY DEVICE_ID 0 1
7 cw_is_device_person UNIQUE_KEY PERSON_ID 0 2
8 cw_is_device_person_sync_log IDX_DEVICE_STATUS DEVICE_ID 1 1
9 cw_is_device_person_sync_log IDX_DEVICE_STATUS GROUP_PERSON_REF_ID 1 2
10 cw_is_device_person_sync_log IDX_DEVICE_STATUS STATUS 1 3
11 cw_is_device_person_sync_log IDX_DEVICE_STATUS LAST_REPORT_TIME 1 4
12 cw_is_device_person_sync_log IDX_DEVICE_STATUS LAST_PULL_TIME 1 5
13 cw_is_device_person_sync_log IDX_DEVICE_STATUS LAST_UPDATE_TIME 1 6
14 cw_is_device_person_sync_log idx_dev_ps_syn_log_imgstroe_id_person_id IMAGE_STORE_ID 1 1
15 cw_is_device_person_sync_log idx_dev_ps_syn_log_imgstroe_id_person_id PERSON_ID 1 2
16 cw_is_device_person_sync_log IDX_GROUP_PERSON_REF GROUP_PERSON_REF_ID 1 1
17 cw_is_device_person_sync_log IDX_IMAGESTORE_STATUS IMAGE_STORE_ID 1 1
18 cw_is_device_person_sync_log IDX_IMAGESTORE_STATUS STATUS 1 2
19 cw_is_device_person_sync_log IDX_PERSON_UPDATE DEVICE_ID 1 1
20 cw_is_device_person_sync_log IDX_PERSON_UPDATE IMAGE_STORE_ID 1 2
21 cw_is_device_person_sync_log IDX_PERSON_UPDATE LAST_UPDATE_TIME 1 3
22 cw_is_device_person_sync_log IDX_PERSON_UPDATE PERSON_ID 1 4
23 cw_is_device_person_sync_log PRIMARY ID 0 1
24 cw_is_device_person_sync_log UNIQUE_KEY DEVICE_ID 0 1
25 cw_is_device_person_sync_log UNIQUE_KEY IMAGE_STORE_ID 0 2
26 cw_is_device_person_sync_log UNIQUE_KEY PERSON_ID 0 3
27 cw_is_group_person_ref IDX_IGPR_PEROSN_COUNT2 IMAGE_STORE_ID 1 1
28 cw_is_group_person_ref IDX_IGPR_PEROSN_COUNT2 STATUS 1 2
29 cw_is_group_person_ref IDX_IGPR_PERSON IMAGE_STORE_ID 1 1
30 cw_is_group_person_ref IDX_IGPR_PERSON PERSON_ID 1 2
31 cw_is_group_person_ref IDX_IGPR_PERSON_1 PERSON_ID 1 1
32 cw_is_group_person_ref IDX_IGPR_PERSON_COUNT IS_DEL 1 1
33 cw_is_group_person_ref IDX_IGPR_PERSON_COUNT IMAGE_STORE_ID 1 2
34 cw_is_group_person_ref IDX_IGPR_PERSON_UPDATE IMAGE_STORE_ID 1 1
35 cw_is_group_person_ref IDX_IGPR_PERSON_UPDATE LAST_UPDATE_TIME 1 2
36 cw_is_group_person_ref IDX_IGPR_PERSON_UPDATE PERSON_ID 1 3
37 cw_is_group_person_ref IDX_IGPR_STATUS_TIME STATUS 1 1
38 cw_is_group_person_ref IDX_IGPR_STATUS_TIME LAST_UPDATE_TIME 1 2
39 cw_is_group_person_ref PRIMARY ID 0 1
40 cw_is_image_store_associated_ref IDX_IMAGE_STORE_ASSOCIATED IMAGE_STORE_ID 1 1
41 cw_is_image_store_associated_ref IDX_IMAGE_STORE_ASSOCIATED ASSOCIATED_OBJECT_ID 1 2
42 cw_is_image_store_associated_ref IDX_IMAGE_STORE_ASSOCIATED ASSOCIATED_ACTION 1 3
43 cw_is_image_store_associated_ref PRIMARY ID 0 1
44 cw_is_label PRIMARY ID 0 1
45 cw_is_organization PRIMARY ID 0 1
46 cw_is_organization_image_store PRIMARY APPLICATION_ID 0 1
47 cw_is_organization_image_store PRIMARY ORG_ID 0 2
48 cw_is_organization_image_store PRIMARY IMAGE_STORE_ID 0 3
49 cw_is_organization_type PRIMARY ID 0 1
50 cw_is_organization_type_properties PRIMARY ID 0 1
51 cw_is_person IDX_CW_IS_PERSON_EMAIL BUSINESS_ID 1 1
52 cw_is_person IDX_CW_IS_PERSON_EMAIL EMAIL 1 2
53 cw_is_person IDX_CW_IS_PERSON_PERSON_CODE BUSINESS_ID 1 1
54 cw_is_person IDX_CW_IS_PERSON_PERSON_CODE PERSON_CODE 1 2
55 cw_is_person IDX_CW_IS_PERSON_PHONE BUSINESS_ID 1 1
56 cw_is_person IDX_CW_IS_PERSON_PHONE PHONE 1 2
57 cw_is_person IDX_CW_IS_PERSON_USER_NAME BUSINESS_ID 1 1
58 cw_is_person IDX_CW_IS_PERSON_USER_NAME USER_NAME 1 2
59 cw_is_person idx_imageId IMAGE_ID 1 1
60 cw_is_person IDX_IP_PAGE IS_DEL 1 1
61 cw_is_person IDX_IP_PAGE BUSINESS_ID 1 2
62 cw_is_person IDX_IP_PAGE LAST_UPDATE_TIME 1 3
63 cw_is_person IDX_IP_PAGE ID 1 4
64 cw_is_person IDX_IP_PAGE SOURCE 1 5
65 cw_is_person idx_is_person ID 0 1
66 cw_is_person IDX_IS_PERSON_NAME NAME 1 1
67 cw_is_person PRIMARY ID 0 1
68 cw_is_person_audit PRIMARY ID 0 1
69 cw_is_person_batch_detail IDX_CEBD_PAGE BATCH_ID 1 1
70 cw_is_person_batch_detail IDX_CEBD_PAGE CREATE_TIME 1 2
71 cw_is_person_batch_detail PRIMARY ID 0 1
72 cw_is_person_label_ref IDX_LABEL LABEL_ID 1 1
73 cw_is_person_label_ref IDX_PERSON PERSON_ID 1 1
74 cw_is_person_label_ref idx_pl_personid PERSON_ID 1 1
75 cw_is_person_label_ref PRIMARY ID 0 1
76 cw_is_person_organization_ref IDX_ORG ORG_ID 1 1
77 cw_is_person_organization_ref IDX_PERSON PERSON_ID 1 1
78 cw_is_person_organization_ref idx_po_person_id PERSON_ID 1 1
79 cw_is_person_organization_ref PRIMARY ID 0 1
80 cw_is_person_properties PRIMARY ID 0 1
81 cw_is_person_properties_switch PRIMARY ID 0 1
82 cw_is_person_registry PRIMARY ID 0 1
83 cw_is_person_registry_device PRIMARY ID 0 1
84 cw_is_person_registry_device UNIQUE_KEY REGISTRY_ID 0 1
85 cw_is_person_registry_device UNIQUE_KEY DEVICE_CODE 0 2
86 cw_is_person_registry_properties PRIMARY ID 0 1
87 cw_is_person_registry_properties UNIQUE_KEY REGISTRY_ID 0 1
88 cw_is_person_registry_properties UNIQUE_KEY PERSON_PROPERTY_ID 0 2
89 cw_operation_log PRIMARY ID 0 1
90 qrtz_blob_triggers PRIMARY SCHED_NAME 0 1
91 qrtz_blob_triggers PRIMARY TRIGGER_NAME 0 2
92 qrtz_blob_triggers PRIMARY TRIGGER_GROUP 0 3
93 qrtz_calendars PRIMARY SCHED_NAME 0 1
94 qrtz_calendars PRIMARY CALENDAR_NAME 0 2
95 qrtz_cron_triggers PRIMARY SCHED_NAME 0 1
96 qrtz_cron_triggers PRIMARY TRIGGER_NAME 0 2
97 qrtz_cron_triggers PRIMARY TRIGGER_GROUP 0 3
98 qrtz_fired_triggers IDX_QRTZ_FT_INST_JOB_REQ_RCVRY INSTANCE_NAME 1 1
99 qrtz_fired_triggers IDX_QRTZ_FT_INST_JOB_REQ_RCVRY SCHED_NAME 1 2
100 qrtz_fired_triggers IDX_QRTZ_FT_INST_JOB_REQ_RCVRY REQUESTS_RECOVERY 1 3
101 qrtz_fired_triggers IDX_QRTZ_FT_JG SCHED_NAME 1 1
102 qrtz_fired_triggers IDX_QRTZ_FT_JG JOB_GROUP 1 2
103 qrtz_fired_triggers IDX_QRTZ_FT_J_G JOB_NAME 1 1
104 qrtz_fired_triggers IDX_QRTZ_FT_J_G SCHED_NAME 1 2
105 qrtz_fired_triggers IDX_QRTZ_FT_J_G JOB_GROUP 1 3
106 qrtz_fired_triggers IDX_QRTZ_FT_TG SCHED_NAME 1 1
107 qrtz_fired_triggers IDX_QRTZ_FT_TG TRIGGER_GROUP 1 2
108 qrtz_fired_triggers IDX_QRTZ_FT_TRIG_INST_NAME SCHED_NAME 1 1
109 qrtz_fired_triggers IDX_QRTZ_FT_TRIG_INST_NAME INSTANCE_NAME 1 2
110 qrtz_fired_triggers IDX_QRTZ_FT_T_G SCHED_NAME 1 1
111 qrtz_fired_triggers IDX_QRTZ_FT_T_G TRIGGER_NAME 1 2
112 qrtz_fired_triggers IDX_QRTZ_FT_T_G TRIGGER_GROUP 1 3
113 qrtz_fired_triggers PRIMARY SCHED_NAME 0 1
114 qrtz_fired_triggers PRIMARY ENTRY_ID 0 2
115 qrtz_job_details IDX_QRTZ_J_GRP SCHED_NAME 1 1
116 qrtz_job_details IDX_QRTZ_J_GRP JOB_GROUP 1 2
117 qrtz_job_details IDX_QRTZ_J_REQ_RECOVERY SCHED_NAME 1 1
118 qrtz_job_details IDX_QRTZ_J_REQ_RECOVERY REQUESTS_RECOVERY 1 2
119 qrtz_job_details PRIMARY SCHED_NAME 0 1
120 qrtz_job_details PRIMARY JOB_NAME 0 2
121 qrtz_job_details PRIMARY JOB_GROUP 0 3
122 qrtz_locks PRIMARY SCHED_NAME 0 1
123 qrtz_locks PRIMARY LOCK_NAME 0 2
124 qrtz_paused_trigger_grps PRIMARY SCHED_NAME 0 1
125 qrtz_paused_trigger_grps PRIMARY TRIGGER_GROUP 0 2
126 qrtz_scheduler_state PRIMARY SCHED_NAME 0 1
127 qrtz_scheduler_state PRIMARY INSTANCE_NAME 0 2
128 qrtz_simple_triggers PRIMARY SCHED_NAME 0 1
129 qrtz_simple_triggers PRIMARY TRIGGER_NAME 0 2
130 qrtz_simple_triggers PRIMARY TRIGGER_GROUP 0 3
131 qrtz_simprop_triggers PRIMARY SCHED_NAME 0 1
132 qrtz_simprop_triggers PRIMARY TRIGGER_NAME 0 2
133 qrtz_simprop_triggers PRIMARY TRIGGER_GROUP 0 3
134 qrtz_triggers IDX_QRTZ_T_C CALENDAR_NAME 1 1
135 qrtz_triggers IDX_QRTZ_T_C SCHED_NAME 1 2
136 qrtz_triggers IDX_QRTZ_T_G TRIGGER_GROUP 1 1
137 qrtz_triggers IDX_QRTZ_T_G SCHED_NAME 1 2
138 qrtz_triggers IDX_QRTZ_T_JG JOB_GROUP 1 1
139 qrtz_triggers IDX_QRTZ_T_JG SCHED_NAME 1 2
140 qrtz_triggers IDX_QRTZ_T_NEXT_FIRE_TIME NEXT_FIRE_TIME 1 1
141 qrtz_triggers IDX_QRTZ_T_NEXT_FIRE_TIME SCHED_NAME 1 2
142 qrtz_triggers IDX_QRTZ_T_NFT_MISFIRE SCHED_NAME 1 1
143 qrtz_triggers IDX_QRTZ_T_NFT_MISFIRE MISFIRE_INSTR 1 2
144 qrtz_triggers IDX_QRTZ_T_NFT_MISFIRE NEXT_FIRE_TIME 1 3
145 qrtz_triggers IDX_QRTZ_T_NFT_ST NEXT_FIRE_TIME 1 1
146 qrtz_triggers IDX_QRTZ_T_NFT_ST SCHED_NAME 1 2
147 qrtz_triggers IDX_QRTZ_T_NFT_ST TRIGGER_STATE 1 3
148 qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE NEXT_FIRE_TIME 1 1
149 qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE TRIGGER_STATE 1 2
150 qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE MISFIRE_INSTR 1 3
151 qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE SCHED_NAME 1 4
152 qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP TRIGGER_GROUP 1 1
153 qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP SCHED_NAME 1 2
154 qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP MISFIRE_INSTR 1 3
155 qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP NEXT_FIRE_TIME 1 4
156 qrtz_triggers IDX_QRTZ_T_NFT_ST_MISFIRE_GRP TRIGGER_STATE 1 5
157 qrtz_triggers IDX_QRTZ_T_N_G_STATE SCHED_NAME 1 1
158 qrtz_triggers IDX_QRTZ_T_N_G_STATE TRIGGER_STATE 1 2
159 qrtz_triggers IDX_QRTZ_T_N_G_STATE TRIGGER_GROUP 1 3
160 qrtz_triggers IDX_QRTZ_T_N_STATE TRIGGER_STATE 1 1
161 qrtz_triggers IDX_QRTZ_T_N_STATE TRIGGER_NAME 1 2
162 qrtz_triggers IDX_QRTZ_T_N_STATE SCHED_NAME 1 3
163 qrtz_triggers IDX_QRTZ_T_N_STATE TRIGGER_GROUP 1 4
164 qrtz_triggers IDX_QRTZ_T_STATE TRIGGER_STATE 1 1
165 qrtz_triggers IDX_QRTZ_T_STATE SCHED_NAME 1 2
166 qrtz_triggers PRIMARY SCHED_NAME 0 1
167 qrtz_triggers PRIMARY TRIGGER_NAME 0 2
168 qrtz_triggers PRIMARY TRIGGER_GROUP 0 3
169 qrtz_triggers SYS_C0012788 SCHED_NAME 1 1
170 qrtz_triggers SYS_C0012788 JOB_NAME 1 2
171 qrtz_triggers SYS_C0012788 JOB_GROUP 1 3
@@ -0,0 +1,49 @@
=== cw_is_organization ===
+----------------------------------+-----------+----------+----------------------------------+----------------------------------+----------------------------------+--------+----------------------------------+---------------+----------------------------------+------------------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+----------+
| ID | NAME | ORDER_BY | PARENT_ID | BUSINESS_ID | TYPE_ID | IS_DEL | CREATE_USER_ID | CREATE_TIME | LAST_UPDATE_USER_ID | LAST_UPDATE_TIME | EXT1 | EXT2 | EXT3 | EXT4 | EXT5 | EXT6 | EXT7 | EXT8 | EXT9 | EXT10 | EXT11 | EXT12 | EXT13 | EXT14 | EXT15 | EXT16 | EXT17 | EXT18 | EXT19 | EXT20 | EXT21 | EXT22 | EXT23 | EXT24 | EXT25 | EXT26 | EXT27 | EXT28 | EXT29 | EXT30 | IS_VALID |
+----------------------------------+-----------+----------+----------------------------------+----------------------------------+----------------------------------+--------+----------------------------------+---------------+----------------------------------+------------------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+----------+
| fdeda9005dfa427da6bff924762917b7 | 617 | NULL | 99e9c6a09f534c0185e32664eb126be4 | 2524639890ba4f2cba9ba1a4eeaa4015 | 47f416aeae9f49f4a35bb22966b42181 | 0 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | 1756690761453 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | 1756690761453 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1 |
| fd478ee4ffa240519657ff12b3d48726 | 基建部 | NULL | eef0a610fa9e4720a20c58aef2f229e3 | 2524639890ba4f2cba9ba1a4eeaa4015 | 47f416aeae9f49f4a35bb22966b42181 | 0 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | 1701681239890 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | 1701681239890 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1 |
| fca1dd090e5d49eca3ee190bca014ca0 | 行政部 | NULL | a1d422625add4403b4e889a503cb2b12 | 2524639890ba4f2cba9ba1a4eeaa4015 | 47f416aeae9f49f4a35bb22966b42181 | 1 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | 1690849497428 | 896fc73df1f2408886081ee8ab65bc21 | 1764814211814 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1 |
+----------------------------------+-----------+----------+----------------------------------+----------------------------------+----------------------------------+--------+----------------------------------+---------------+----------------------------------+------------------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+----------+
=== cw_is_person ===
+--------------------+----------------------------------+-------------+-----------+--------------------+-------------+--------+-------------------+-----------------+--------------+---------------------------------+--------+---------------+----------------------------------+------------------+----------------------------------+-------+---------------------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------------------+----------------+--------+--------------+---------+------------+--------------+---------------+--------------+
| ID | BUSINESS_ID | PERSON_CODE | NAME | USER_NAME | PHONE | STATUS | EXPIRY_BEGIN_DATE | EXPIRY_END_DATE | SHOW_PICTURE | COMPARE_PICTURE | IS_DEL | CREATE_TIME | CREATE_USER_ID | LAST_UPDATE_TIME | LAST_UPDATE_USER_ID | EMAIL | IMAGE_ID | EXT1 | EXT2 | EXT3 | EXT4 | EXT5 | EXT6 | EXT7 | EXT8 | EXT9 | EXT10 | EXT11 | EXT12 | EXT13 | EXT14 | EXT15 | EXT16 | EXT17 | EXT18 | EXT19 | EXT20 | EXT21 | EXT22 | EXT23 | EXT24 | EXT25 | EXT26 | EXT27 | EXT28 | EXT29 | EXT30 | EXT31 | EXT32 | EXT33 | EXT34 | EXT35 | EXT36 | EXT37 | EXT38 | EXT39 | EXT40 | CREATE_SYS_ACCOUNT | SYS_ACCOUNT_ID | SOURCE | RESERVE_INFO | WELCOME | IC_CARD_NO | IC_CARD_TYPE | DEFAULT_FLOOR | CHOOSE_FLOOR |
+--------------------+----------------------------------+-------------+-----------+--------------------+-------------+--------+-------------------+-----------------+--------------+---------------------------------+--------+---------------+----------------------------------+------------------+----------------------------------+-------+---------------------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------------------+----------------+--------+--------------+---------+------------+--------------+---------------+--------------+
| 999998332677980160 | 2524639890ba4f2cba9ba1a4eeaa4015 | NULL | 蔡先生 | 999998333437149184 | 13929533370 | 0 | 1753154040000 | 1753183800000 | NULL | NULL | 1 | 1753154181778 | 6d1c78ee127b4883a4d4f914d344ce51 | 1753203600727 | 6d1c78ee127b4883a4d4f914d344ce51 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | NULL | 1 | NULL | NULL | NULL | NULL | NULL | NULL |
| 999998240135180288 | 2524639890ba4f2cba9ba1a4eeaa4015 | NULL | 赫俊国 | 999998240101314560 | 13903615836 | 0 | 1753113600091 | 1753199999091 | NULL | aiot_default_999998240013242368 | 1 | 1753154159628 | default | 1753203600727 | default | NULL | 1947495814782308352 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | NULL | 1 | NULL | NULL | NULL | NULL | NULL | NULL |
| 999997066723823616 | 2524639890ba4f2cba9ba1a4eeaa4015 | NULL | 黄贵明 | 999997066707169280 | 15920966886 | 0 | 1753113600128 | 1753199999128 | NULL | aiot_default_999997066593828864 | 1 | 1753153879843 | default | 1753203600727 | default | NULL | 1947494641274499072 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | NULL | 1 | NULL | NULL | NULL | NULL | NULL | NULL |
+--------------------+----------------------------------+-------------+-----------+--------------------+-------------+--------+-------------------+-----------------+--------------+---------------------------------+--------+---------------+----------------------------------+------------------+----------------------------------+-------+---------------------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------------------+----------------+--------+--------------+---------+------------+--------------+---------------+--------------+
=== cw_is_person_organization_ref ===
+----------------------------------+---------------------+----------------------------------+---------------+----------------------------------+------------------+---------------------+
| ID | PERSON_ID | ORG_ID | CREATE_TIME | CREATE_USER_ID | LAST_UPDATE_TIME | LAST_UPDATE_USER_ID |
+----------------------------------+---------------------+----------------------------------+---------------+----------------------------------+------------------+---------------------+
| fffe7b4d5ce9427ea8703d9d568306c2 | 956535134721798144 | f5d90d608d1042c487bf18af58345d5c | 1742791747779 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | NULL | NULL |
| fff80f46206942ecaa123365e5475f66 | 1069265515460378624 | 488b8ad049bb43408a6fbcc50bcb89ac | 1769668764966 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | NULL | NULL |
| fff4a8bdc90442749a8f463e5f07ebd3 | 822522654509887488 | e7c6ad5429434ec7b8c159d44e126579 | 1711008815845 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | NULL | NULL |
+----------------------------------+---------------------+----------------------------------+---------------+----------------------------------+------------------+---------------------+
=== cw_is_person_label_ref ===
+----------------------------------+--------------------+----------------------------------+---------------+----------------------------------+------------------+---------------------+
| ID | PERSON_ID | LABEL_ID | CREATE_TIME | CREATE_USER_ID | LAST_UPDATE_TIME | LAST_UPDATE_USER_ID |
+----------------------------------+--------------------+----------------------------------+---------------+----------------------------------+------------------+---------------------+
| ffea4b3636f0472cbc0104150371704a | 653604973099094016 | 7f1c603976294e06b3852eec9c2ca838 | 1761890229717 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | NULL | NULL |
| ffe60133fbee47e2b477b068a0169148 | 721670500450914304 | fe77c039dcbe40178192af1f6e1c3ab9 | 1756688047289 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | NULL | NULL |
| ffd8b3622a6846adb8c7193077e54d8f | 721662116968370176 | 834996aeb28d4ebe9695fe3757255d39 | 1757141790248 | 9ac7fc11589e4b32b5eff0b9019f1ef5 | NULL | NULL |
+----------------------------------+--------------------+----------------------------------+---------------+----------------------------------+------------------+---------------------+
=== cw_is_label ===
+----------------------------------+--------------------------------------+----------------+----------------------------------+--------+----------+----------------------------------+---------------+----------------------------------+------------------+
| ID | NAME | CODE | BUSINESS_ID | IS_DEL | ADD_TYPE | CREATE_USER_ID | CREATE_TIME | LAST_UPDATE_USER_ID | LAST_UPDATE_TIME |
+----------------------------------+--------------------------------------+----------------+----------------------------------+--------+----------+----------------------------------+---------------+----------------------------------+------------------+
| ffe50ecad80d4d53bb71f51f64399213 | 星中心物业人力资源_20251217 | 20251217627982 | 2524639890ba4f2cba9ba1a4eeaa4015 | 1 | 0 | e6fadb2224c948a69f51e85f3395e861 | 1765943025351 | e6fadb2224c948a69f51e85f3395e861 | 1766459862306 |
| fe77c039dcbe40178192af1f6e1c3ab9 | 低区通用权限 | 20240112301168 | 2524639890ba4f2cba9ba1a4eeaa4015 | 0 | 0 | 4712af264f1f4ce28cb4e6b6e2d0834b | 1705039784273 | 4712af264f1f4ce28cb4e6b6e2d0834b | 1705039784273 |
| fe1c3b305c1a41448289faaed06bc3d0 | VIP电梯厅-高区 | 20240121715379 | 2524639890ba4f2cba9ba1a4eeaa4015 | 0 | 0 | 4712af264f1f4ce28cb4e6b6e2d0834b | 1705824562257 | 4712af264f1f4ce28cb4e6b6e2d0834b | 1705824562257 |
+----------------------------------+--------------------------------------+----------------+----------------------------------+--------+----------+----------------------------------+---------------+----------------------------------+------------------+
=== org_floor ===
+----------------------------------+---------+--------+-----------+
| org_id | zone_id | is_all | zone_name |
+----------------------------------+---------+--------+-----------+
| f216235e54ca42bfa0379e69b3754aff | 1 | 0 | 1 |
| 8fc3f910bd834198a539832017fe920e | 1 | 0 | 1 |
| 3f591e6b4cb640b7b77978d27f47bd4b | 1 | 0 | 1 |
+----------------------------------+---------+--------+-----------+
=== cw_is_organization_area_ref ===
@@ -0,0 +1,39 @@
mysql: [Warning] Using a password on the command line interface can be insecure.
cw_is_device_image_store 8493 InnoDB
cw_is_device_person 6091835 InnoDB
cw_is_device_person_sync_log 1195561 InnoDB
cw_is_group_person_ref 194105 InnoDB
cw_is_image_store_associated_ref 18148 InnoDB 图库和机构,标签,个人的关联关系表
cw_is_label 353 InnoDB
cw_is_organization 642 InnoDB
cw_is_organization_area_ref 0 InnoDB 机构派梯楼层关联表
cw_is_organization_extend 0 InnoDB
cw_is_organization_extend_detail 0 InnoDB
cw_is_organization_image_store 0 InnoDB
cw_is_organization_type 9 InnoDB 图库机构类型表
cw_is_organization_type_properties 71 InnoDB 图库机构类型属性表
cw_is_person 43278 InnoDB 人员信息表
cw_is_person_audit 0 InnoDB
cw_is_person_batch_detail 1231 InnoDB 人员导入明细表
cw_is_person_batch_import 38 InnoDB 人员导入任务表
cw_is_person_label_ref 5676 InnoDB 人员标签关联表
cw_is_person_organization_ref 10098 InnoDB 人员组织关联表
cw_is_person_properties 30 InnoDB 人员属性表
cw_is_person_properties_switch 0 InnoDB 人员属性注册照优化参数表
cw_is_person_registry 0 InnoDB
cw_is_person_registry_device 0 InnoDB
cw_is_person_registry_properties 0 InnoDB
cw_operation_log 1257 InnoDB 操作日志
cw_task_job_everytime_details 12000 InnoDB
org_floor 12 InnoDB 机构楼层对应表
qrtz_blob_triggers 0 InnoDB
qrtz_calendars 0 InnoDB
qrtz_cron_triggers 8 InnoDB
qrtz_fired_triggers 2 InnoDB
qrtz_job_details 9 InnoDB
qrtz_locks 2 InnoDB
qrtz_paused_trigger_grps 0 InnoDB
qrtz_scheduler_state 3 InnoDB
qrtz_simple_triggers 86 InnoDB
qrtz_simprop_triggers 0 InnoDB
qrtz_triggers 94 InnoDB
1 mysql: [Warning] Using a password on the command line interface can be insecure.
2 cw_is_device_image_store 8493 InnoDB
3 cw_is_device_person 6091835 InnoDB
4 cw_is_device_person_sync_log 1195561 InnoDB
5 cw_is_group_person_ref 194105 InnoDB
6 cw_is_image_store_associated_ref 18148 InnoDB 图库和机构,标签,个人的关联关系表
7 cw_is_label 353 InnoDB
8 cw_is_organization 642 InnoDB
9 cw_is_organization_area_ref 0 InnoDB 机构派梯楼层关联表
10 cw_is_organization_extend 0 InnoDB
11 cw_is_organization_extend_detail 0 InnoDB
12 cw_is_organization_image_store 0 InnoDB
13 cw_is_organization_type 9 InnoDB 图库机构类型表
14 cw_is_organization_type_properties 71 InnoDB 图库机构类型属性表
15 cw_is_person 43278 InnoDB 人员信息表
16 cw_is_person_audit 0 InnoDB
17 cw_is_person_batch_detail 1231 InnoDB 人员导入明细表
18 cw_is_person_batch_import 38 InnoDB 人员导入任务表
19 cw_is_person_label_ref 5676 InnoDB 人员标签关联表
20 cw_is_person_organization_ref 10098 InnoDB 人员组织关联表
21 cw_is_person_properties 30 InnoDB 人员属性表
22 cw_is_person_properties_switch 0 InnoDB 人员属性注册照优化参数表
23 cw_is_person_registry 0 InnoDB
24 cw_is_person_registry_device 0 InnoDB
25 cw_is_person_registry_properties 0 InnoDB
26 cw_operation_log 1257 InnoDB 操作日志
27 cw_task_job_everytime_details 12000 InnoDB
28 org_floor 12 InnoDB 机构楼层对应表
29 qrtz_blob_triggers 0 InnoDB
30 qrtz_calendars 0 InnoDB
31 qrtz_cron_triggers 8 InnoDB
32 qrtz_fired_triggers 2 InnoDB
33 qrtz_job_details 9 InnoDB
34 qrtz_locks 2 InnoDB
35 qrtz_paused_trigger_grps 0 InnoDB
36 qrtz_scheduler_state 3 InnoDB
37 qrtz_simple_triggers 86 InnoDB
38 qrtz_simprop_triggers 0 InnoDB
39 qrtz_triggers 94 InnoDB
@@ -0,0 +1,919 @@
mysql: [Warning] Using a password on the command line interface can be insecure.
code_elevator_area zone_id varchar NO NULL 电梯编码
code_elevator_area code varchar NO NULL 地区编码
code_elevator_area create_time bigint YES NULL
code_elevator_area last_update_time bigint YES NULL
code_elevator_area is_first tinyint YES NULL 是否首层:0-不是,1-是
code_elevator_area parent_id varchar YES NULL 父级id
device_image_store building_id varchar NO NULL 楼栋id
device_image_store image_store_id varchar NO NULL 图库id
elevator_device ID bigint NO NULL PRI auto_increment 主键id
elevator_device create_time bigint NO NULL 创建时间
elevator_device last_update_time bigint NO NULL 最近修改时间
elevator_device delete_flag tinyint NO 0 是否删除(0,删除;1,未删除)
elevator_device device_id varchar YES NULL 设备id
elevator_device device_name varchar NO NULL 设备名称
elevator_device device_code varchar YES NULL 设备编码
elevator_device device_type_name varchar NO NULL 设备类型名称
elevator_device status tinyint YES NULL 设备状态(1:禁用,2:在线,3:离线)
elevator_device area_name varchar YES NULL 空间位置
elevator_device current_building_id varchar YES NULL 楼栋id
elevator_device current_building varchar YES NULL 当前楼栋
elevator_device current_floor_id varchar YES NULL 楼层id
elevator_device current_floor varchar YES NULL 当前楼层
elevator_device elevator_floor_list varchar YES NULL 派梯楼层(,隔开)
elevator_device elevator_floor_id_list varchar YES NULL 派梯楼层ID(,隔开)
elevator_device business_id varchar NO NULL 租户id
elevator_device area_id varchar YES NULL 地区编码
image_rule_ref id varchar NO NULL PRI 唯一标识
image_rule_ref zone_id varchar NO NULL 楼层id
image_rule_ref zone_name varchar YES NULL 楼层名
image_rule_ref name varchar YES NULL 规则名
image_rule_ref person_id varchar YES NULL 人员id
image_rule_ref include_labels varchar YES NULL MUL 人员包含的标签
image_rule_ref include_organizations varchar YES NULL MUL 人员所在的机构
image_rule_ref exclude_labels varchar YES NULL 排除的人员标签
image_rule_ref is_default tinyint YES 0 是否默认规则:0-不是,1-是
image_rule_ref start_time bigint YES NULL 开始时间
image_rule_ref end_time bigint YES NULL 结束时间
image_rule_ref create_time bigint YES NULL 创建时间
image_rule_ref last_update_time bigint YES NULL 最近修改时间
image_rule_ref business_id varchar YES NULL 企业id
image_rule_ref parent_rule varchar YES NULL 归属规则id
image_rule_ref person_delete tinyint YES 0 人员是否删除了:0-未删除,1-已删除
it_acs_device_task id varchar NO NULL PRI 任务id
it_acs_device_task ALL_DEVICES int NO NULL 需要处理设备总数
it_acs_device_task BIND_DEVICES int NO NULL 已处理设备数
it_acs_device_task IS_STOP int NO NULL 是否终止:0-执行,1-终止
it_acs_elevator_record ID varchar NO NULL PRI 主键
it_acs_elevator_record BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record ORG_ID varchar YES NULL 机构id
it_acs_elevator_record ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2020 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2020 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2020 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2020 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2020 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2020 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2020 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2020 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2020 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2020 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2020 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2020 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2020 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2020 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2020 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2020 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2020 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2020 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2020 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2020 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2020 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2020 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2020 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2020 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2020 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2020 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2020 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2020 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2020 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2020 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2020 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2021 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2021 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2021 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2021 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2021 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2021 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2021 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2021 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2021 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2021 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2021 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2021 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2021 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2021 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2021 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2021 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2021 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2021 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2021 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2021 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2021 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2021 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2021 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2021 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2021 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2021 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2021 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2021 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2021 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2021 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2021 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2022 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2022 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2022 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2022 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2022 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2022 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2022 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2022 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2022 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2022 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2022 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2022 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2022 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2022 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2022 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2022 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2022 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2022 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2022 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2022 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2022 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2022 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2022 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2022 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2022 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2022 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2022 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2022 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2022 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2022 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2022 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2023 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2023 BUSINESS_ID varchar NO NULL 企业ID
it_acs_elevator_record_2023 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2023 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2023 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2023 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2023 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2023 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2023 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2023 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2023 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2023 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2023 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2023 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2023 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2023 RECOGNITION_TIME bigint NO NULL MUL 识别时间
it_acs_elevator_record_2023 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2023 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2023 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2023 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2023 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2023 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2023 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2023 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2023 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2023 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2023 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2023 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2023 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2023 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2023 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2024 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2024 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2024 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2024 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2024 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2024 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2024 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2024 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2024 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2024 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2024 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2024 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2024 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2024 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2024 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2024 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2024 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2024 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2024 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2024 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2024 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2024 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2024 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2024 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2024 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2024 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2024 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2024 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2024 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2024 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2024 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2025 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2025 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2025 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2025 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2025 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2025 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2025 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2025 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2025 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2025 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2025 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2025 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2025 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2025 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2025 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2025 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2025 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2025 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2025 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2025 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2025 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2025 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2025 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2025 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2025 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2025 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2025 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2025 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2025 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2025 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2025 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2026 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2026 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2026 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2026 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2026 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2026 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2026 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2026 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2026 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2026 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2026 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2026 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2026 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2026 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2026 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2026 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2026 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2026 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2026 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2026 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2026 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2026 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2026 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2026 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2026 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2026 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2026 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2026 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2026 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2026 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2026 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2027 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2027 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2027 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2027 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2027 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2027 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2027 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2027 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2027 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2027 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2027 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2027 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2027 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2027 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2027 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2027 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2027 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2027 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2027 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2027 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2027 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2027 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2027 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2027 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2027 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2027 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2027 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2027 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2027 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2027 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2027 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2028 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2028 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2028 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2028 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2028 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2028 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2028 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2028 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2028 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2028 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2028 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2028 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2028 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2028 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2028 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2028 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2028 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2028 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2028 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2028 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2028 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2028 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2028 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2028 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2028 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2028 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2028 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2028 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2028 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2028 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2028 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2029 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2029 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2029 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2029 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2029 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2029 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2029 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2029 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2029 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2029 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2029 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2029 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2029 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2029 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2029 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2029 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2029 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2029 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2029 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2029 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2029 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2029 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2029 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2029 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2029 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2029 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2029 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2029 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2029 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2029 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2029 PERSON_CODE varchar YES NULL 工号
it_acs_elevator_record_2030 ID varchar NO NULL PRI 主键
it_acs_elevator_record_2030 BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_elevator_record_2030 DEVICE_ID varchar YES NULL 设备id
it_acs_elevator_record_2030 DEVICE_CODE varchar NO NULL 设备编号
it_acs_elevator_record_2030 DEVICE_NAME varchar YES NULL 设备名称
it_acs_elevator_record_2030 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_elevator_record_2030 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_elevator_record_2030 DISTRICT_ID varchar YES NULL 省市区id
it_acs_elevator_record_2030 AREA_ID varchar YES NULL 设备区位id
it_acs_elevator_record_2030 OPEN_DOOR_TYPE varchar NO NULL 开门方式
it_acs_elevator_record_2030 OPERATE_NAME varchar YES NULL 操作人员名称
it_acs_elevator_record_2030 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_elevator_record_2030 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_elevator_record_2030 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
it_acs_elevator_record_2030 RECOGNITION_NO varchar YES NULL 识别编号
it_acs_elevator_record_2030 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_elevator_record_2030 LOG_ID varchar YES NULL 请求唯一标志码
it_acs_elevator_record_2030 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
it_acs_elevator_record_2030 CREATE_TIME bigint YES NULL 创建时间
it_acs_elevator_record_2030 CREATE_USER_ID varchar YES NULL 创建人
it_acs_elevator_record_2030 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_elevator_record_2030 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_elevator_record_2030 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
it_acs_elevator_record_2030 DEST_FLOOR varchar YES NULL 选层楼层
it_acs_elevator_record_2030 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
it_acs_elevator_record_2030 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
it_acs_elevator_record_2030 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
it_acs_elevator_record_2030 INTERVIEWEE varchar YES NULL 被访人id
it_acs_elevator_record_2030 ORG_ID varchar YES NULL 机构id
it_acs_elevator_record_2030 ORG_NAME varchar YES NULL 机构名
it_acs_elevator_record_2030 PERSON_CODE varchar YES NULL 工号
it_acs_pass_rule ID varchar NO NULL PRI 唯一ID
it_acs_pass_rule BUSINESS_ID varchar NO NULL MUL 企业ID
it_acs_pass_rule ZONE_ID varchar NO NULL 楼层ID
it_acs_pass_rule ZONE_NAME varchar YES NULL 楼层名
it_acs_pass_rule NAME varchar NO NULL 通行规则名称
it_acs_pass_rule IMAGE_STORE_ID varchar NO NULL 图库id
it_acs_pass_rule PASSABLE_TIME_ID varchar YES NULL 通行时间id
it_acs_pass_rule VALID_DATE_CRON text YES NULL 通行时间cron
it_acs_pass_rule VALID_DATE_JSON text YES NULL 通行时间json
it_acs_pass_rule BEGIN_DATE bigint YES NULL 开始时间
it_acs_pass_rule END_DATE bigint YES NULL 结束时间
it_acs_pass_rule CREATE_TIME bigint YES NULL 创建时间
it_acs_pass_rule CREATE_USER_ID varchar YES NULL 创建人id
it_acs_pass_rule LAST_UPDATE_TIME bigint YES NULL 最后更新时间
it_acs_pass_rule LAST_UPDATE_USER_ID varchar YES NULL 最后更新人id
it_acs_pass_rule IS_DEFAULT tinyint YES 0 是否默认规则:0-不是,1-是
it_acs_recog_record ID varchar NO NULL PRI 主键
it_acs_recog_record PERSON_ID varchar YES NULL MUL 人员id
it_acs_recog_record PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record THRESHOLD decimal YES NULL 阈值
it_acs_recog_record DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record SCORE decimal NO NULL 识别分数
it_acs_recog_record RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record REMARK varchar YES NULL 备注
it_acs_recog_record CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record PERSON_LABEL_IDS text YES NULL 人员id列表
it_acs_recog_record_2020 ID varchar NO NULL PRI 主键
it_acs_recog_record_2020 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2020 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2020 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2020 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2020 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2020 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2020 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2020 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2020 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2020 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2020 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2020 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2020 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2020 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2020 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2020 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2020 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2020 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2020 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2020 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2020 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2020 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2020 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2020 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2020 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2020 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2020 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2020 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2020 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2020 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2020 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2020 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2020 REMARK varchar YES NULL 备注
it_acs_recog_record_2020 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2020 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2020 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2020 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2020 PERSON_LABEL_IDS varchar YES NULL 人员id列表
it_acs_recog_record_2021 ID varchar NO NULL PRI 主键
it_acs_recog_record_2021 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2021 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2021 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2021 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2021 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2021 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2021 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2021 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2021 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2021 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2021 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2021 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2021 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2021 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2021 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2021 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2021 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2021 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2021 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2021 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2021 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2021 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2021 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2021 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2021 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2021 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2021 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2021 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2021 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2021 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2021 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2021 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2021 REMARK varchar YES NULL 备注
it_acs_recog_record_2021 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2021 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2021 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2021 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2021 PERSON_LABEL_IDS varchar YES NULL 人员id列表
it_acs_recog_record_2022 ID varchar NO NULL PRI 主键
it_acs_recog_record_2022 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2022 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2022 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2022 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2022 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2022 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2022 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2022 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2022 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2022 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2022 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2022 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2022 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2022 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2022 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2022 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2022 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2022 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2022 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2022 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2022 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2022 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2022 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2022 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2022 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2022 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2022 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2022 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2022 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2022 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2022 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2022 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2022 REMARK varchar YES NULL 备注
it_acs_recog_record_2022 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2022 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2022 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2022 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2022 PERSON_LABEL_IDS varchar YES NULL 人员id列表
it_acs_recog_record_2023 ID varchar NO NULL PRI 主键
it_acs_recog_record_2023 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2023 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2023 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2023 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2023 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2023 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2023 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2023 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2023 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2023 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2023 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2023 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2023 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2023 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2023 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2023 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2023 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2023 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2023 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2023 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2023 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2023 RECOGNITION_TIME bigint NO NULL MUL 识别时间
it_acs_recog_record_2023 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2023 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2023 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2023 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2023 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2023 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2023 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2023 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2023 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2023 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2023 REMARK varchar YES NULL 备注
it_acs_recog_record_2023 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2023 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2023 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2023 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2023 PERSON_LABEL_IDS text YES NULL 人员id列表
it_acs_recog_record_2024 ID varchar NO NULL PRI 主键
it_acs_recog_record_2024 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2024 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2024 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2024 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2024 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2024 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2024 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2024 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2024 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2024 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2024 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2024 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2024 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2024 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2024 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2024 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2024 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2024 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2024 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2024 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2024 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2024 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2024 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2024 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2024 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2024 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2024 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2024 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2024 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2024 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2024 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2024 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2024 REMARK varchar YES NULL 备注
it_acs_recog_record_2024 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2024 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2024 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2024 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2024 PERSON_LABEL_IDS text YES NULL 人员id列表
it_acs_recog_record_2025 ID varchar NO NULL PRI 主键
it_acs_recog_record_2025 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2025 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2025 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2025 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2025 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2025 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2025 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2025 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2025 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2025 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2025 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2025 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2025 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2025 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2025 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2025 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2025 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2025 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2025 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2025 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2025 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2025 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2025 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2025 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2025 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2025 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2025 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2025 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2025 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2025 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2025 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2025 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2025 REMARK varchar YES NULL 备注
it_acs_recog_record_2025 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2025 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2025 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2025 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2025 PERSON_LABEL_IDS text YES NULL 人员id列表
it_acs_recog_record_2026 ID varchar NO NULL PRI 主键
it_acs_recog_record_2026 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2026 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2026 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2026 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2026 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2026 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2026 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2026 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2026 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2026 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2026 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2026 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2026 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2026 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2026 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2026 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2026 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2026 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2026 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2026 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2026 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2026 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2026 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2026 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2026 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2026 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2026 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2026 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2026 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2026 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2026 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2026 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2026 REMARK varchar YES NULL 备注
it_acs_recog_record_2026 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2026 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2026 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2026 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2026 PERSON_LABEL_IDS varchar YES NULL 人员id列表
it_acs_recog_record_2027 ID varchar NO NULL PRI 主键
it_acs_recog_record_2027 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2027 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2027 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2027 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2027 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2027 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2027 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2027 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2027 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2027 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2027 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2027 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2027 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2027 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2027 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2027 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2027 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2027 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2027 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2027 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2027 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2027 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2027 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2027 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2027 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2027 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2027 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2027 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2027 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2027 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2027 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2027 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2027 REMARK varchar YES NULL 备注
it_acs_recog_record_2027 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2027 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2027 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2027 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2027 PERSON_LABEL_IDS varchar YES NULL 人员id列表
it_acs_recog_record_2028 ID varchar NO NULL PRI 主键
it_acs_recog_record_2028 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2028 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2028 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2028 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2028 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2028 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2028 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2028 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2028 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2028 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2028 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2028 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2028 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2028 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2028 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2028 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2028 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2028 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2028 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2028 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2028 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2028 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2028 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2028 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2028 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2028 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2028 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2028 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2028 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2028 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2028 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2028 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2028 REMARK varchar YES NULL 备注
it_acs_recog_record_2028 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2028 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2028 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2028 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2028 PERSON_LABEL_IDS varchar YES NULL 人员id列表
it_acs_recog_record_2029 ID varchar NO NULL PRI 主键
it_acs_recog_record_2029 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2029 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2029 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2029 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2029 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2029 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2029 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2029 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2029 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2029 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2029 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2029 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2029 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2029 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2029 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2029 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2029 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2029 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2029 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2029 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2029 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2029 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2029 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2029 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2029 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2029 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2029 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2029 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2029 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2029 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2029 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2029 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2029 REMARK varchar YES NULL 备注
it_acs_recog_record_2029 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2029 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2029 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2029 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2029 PERSON_LABEL_IDS varchar YES NULL 人员id列表
it_acs_recog_record_2030 ID varchar NO NULL PRI 主键
it_acs_recog_record_2030 PERSON_ID varchar YES NULL 人员id
it_acs_recog_record_2030 PERSON_NAME varchar YES NULL 人员名称
it_acs_recog_record_2030 BUSINESS_ID varchar NO NULL 企业ID
it_acs_recog_record_2030 DEVICE_ID varchar YES NULL 设备id
it_acs_recog_record_2030 DEVICE_CODE varchar NO NULL 设备编号
it_acs_recog_record_2030 DEVICE_NAME varchar YES NULL 设备名称
it_acs_recog_record_2030 THRESHOLD decimal YES NULL 阈值
it_acs_recog_record_2030 DISTRICT_ID varchar YES NULL 省市区id
it_acs_recog_record_2030 AREA_ID varchar YES NULL 设备区位id
it_acs_recog_record_2030 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
it_acs_recog_record_2030 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
it_acs_recog_record_2030 SUB_DEVICE_ID varchar YES NULL 子设备id
it_acs_recog_record_2030 SUB_DEVICE_CODE varchar YES NULL 子设备编号
it_acs_recog_record_2030 SUB_DEVICE_NAME varchar YES NULL 子设备名称
it_acs_recog_record_2030 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
it_acs_recog_record_2030 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
it_acs_recog_record_2030 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
it_acs_recog_record_2030 FACE_IMAGE_PATH varchar YES NULL 抓拍照
it_acs_recog_record_2030 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
it_acs_recog_record_2030 SCORE decimal NO NULL 识别分数
it_acs_recog_record_2030 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
it_acs_recog_record_2030 RECOGNITION_TIME bigint NO NULL 识别时间
it_acs_recog_record_2030 GROUP_ID varchar YES NULL 用户所在底库编号
it_acs_recog_record_2030 FACE_ID varchar NO NULL 识别到对应的注册图片编号
it_acs_recog_record_2030 QUALITY_SCORE decimal YES NULL 人脸质量总分
it_acs_recog_record_2030 LOG_ID varchar NO NULL 请求唯一标志码
it_acs_recog_record_2030 TEMP_SCORE decimal YES NULL 体温
it_acs_recog_record_2030 MASK_SCORE decimal NO NULL 口罩得分
it_acs_recog_record_2030 TEMP_THRESHOLD decimal YES NULL 体温阈值
it_acs_recog_record_2030 CARD_TYPE varchar YES NULL 证件类型
it_acs_recog_record_2030 SOURCE tinyint YES NULL 来源 1 识别 2 人证
it_acs_recog_record_2030 TEMP_IMAGE_PATH varchar YES NULL 热像图
it_acs_recog_record_2030 REMARK varchar YES NULL 备注
it_acs_recog_record_2030 CREATE_TIME bigint YES NULL 创建时间
it_acs_recog_record_2030 CREATE_USER_ID varchar YES NULL 创建人
it_acs_recog_record_2030 LAST_UPDATE_TIME bigint YES NULL 修改时间
it_acs_recog_record_2030 LAST_UPDATE_USER_ID varchar YES NULL 修改人
it_acs_recog_record_2030 PERSON_LABEL_IDS varchar YES NULL 人员id列表
send_record_time time bigint NO NULL 时间戳
send_record_time type tinyint NO NULL 类型:1-通行记录,2-开门记录
send_record_timebak time bigint NO NULL 时间戳
send_record_timebak type tinyint NO NULL 类型:1-通行记录,2-开门记录
tenant_visitor_floor_policy id varchar NO NULL PRI 主键
tenant_visitor_floor_policy business_id varchar NO NULL MUL 机构/租户 ID
tenant_visitor_floor_policy policy_type varchar NO INTERSECT_ALLOWLIST 策略类型
tenant_visitor_floor_policy allow_zone_ids text YES NULL JSON 数组,zoneId 列表
tenant_visitor_floor_policy building_id varchar YES NULL 预留:楼栋维度;租户默认填 NULL
tenant_visitor_floor_policy enabled tinyint NO 1 1 启用 0 停用
tenant_visitor_floor_policy policy_version bigint NO 1 配置版本号
tenant_visitor_floor_policy remark varchar YES NULL
tenant_visitor_floor_policy created_by varchar YES NULL
tenant_visitor_floor_policy created_at bigint YES NULL
tenant_visitor_floor_policy updated_by varchar YES NULL
tenant_visitor_floor_policy updated_at bigint YES NULL
1 mysql: [Warning] Using a password on the command line interface can be insecure.
2 code_elevator_area zone_id varchar NO NULL 电梯编码
3 code_elevator_area code varchar NO NULL 地区编码
4 code_elevator_area create_time bigint YES NULL
5 code_elevator_area last_update_time bigint YES NULL
6 code_elevator_area is_first tinyint YES NULL 是否首层:0-不是,1-是
7 code_elevator_area parent_id varchar YES NULL 父级id
8 device_image_store building_id varchar NO NULL 楼栋id
9 device_image_store image_store_id varchar NO NULL 图库id
10 elevator_device ID bigint NO NULL PRI auto_increment 主键id
11 elevator_device create_time bigint NO NULL 创建时间
12 elevator_device last_update_time bigint NO NULL 最近修改时间
13 elevator_device delete_flag tinyint NO 0 是否删除(0,删除;1,未删除)
14 elevator_device device_id varchar YES NULL 设备id
15 elevator_device device_name varchar NO NULL 设备名称
16 elevator_device device_code varchar YES NULL 设备编码
17 elevator_device device_type_name varchar NO NULL 设备类型名称
18 elevator_device status tinyint YES NULL 设备状态(1:禁用,2:在线,3:离线)
19 elevator_device area_name varchar YES NULL 空间位置
20 elevator_device current_building_id varchar YES NULL 楼栋id
21 elevator_device current_building varchar YES NULL 当前楼栋
22 elevator_device current_floor_id varchar YES NULL 楼层id
23 elevator_device current_floor varchar YES NULL 当前楼层
24 elevator_device elevator_floor_list varchar YES NULL 派梯楼层(,隔开)
25 elevator_device elevator_floor_id_list varchar YES NULL 派梯楼层ID(,隔开)
26 elevator_device business_id varchar NO NULL 租户id
27 elevator_device area_id varchar YES NULL 地区编码
28 image_rule_ref id varchar NO NULL PRI 唯一标识
29 image_rule_ref zone_id varchar NO NULL 楼层id
30 image_rule_ref zone_name varchar YES NULL 楼层名
31 image_rule_ref name varchar YES NULL 规则名
32 image_rule_ref person_id varchar YES NULL 人员id
33 image_rule_ref include_labels varchar YES NULL MUL 人员包含的标签
34 image_rule_ref include_organizations varchar YES NULL MUL 人员所在的机构
35 image_rule_ref exclude_labels varchar YES NULL 排除的人员标签
36 image_rule_ref is_default tinyint YES 0 是否默认规则:0-不是,1-是
37 image_rule_ref start_time bigint YES NULL 开始时间
38 image_rule_ref end_time bigint YES NULL 结束时间
39 image_rule_ref create_time bigint YES NULL 创建时间
40 image_rule_ref last_update_time bigint YES NULL 最近修改时间
41 image_rule_ref business_id varchar YES NULL 企业id
42 image_rule_ref parent_rule varchar YES NULL 归属规则id
43 image_rule_ref person_delete tinyint YES 0 人员是否删除了:0-未删除,1-已删除
44 it_acs_device_task id varchar NO NULL PRI 任务id
45 it_acs_device_task ALL_DEVICES int NO NULL 需要处理设备总数
46 it_acs_device_task BIND_DEVICES int NO NULL 已处理设备数
47 it_acs_device_task IS_STOP int NO NULL 是否终止:0-执行,1-终止
48 it_acs_elevator_record ID varchar NO NULL PRI 主键
49 it_acs_elevator_record BUSINESS_ID varchar NO NULL MUL 企业ID
50 it_acs_elevator_record DEVICE_ID varchar YES NULL 设备id
51 it_acs_elevator_record DEVICE_CODE varchar NO NULL 设备编号
52 it_acs_elevator_record DEVICE_NAME varchar YES NULL 设备名称
53 it_acs_elevator_record DEVICE_TYPE_ID varchar YES NULL 设备类型ID
54 it_acs_elevator_record DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
55 it_acs_elevator_record DISTRICT_ID varchar YES NULL 省市区id
56 it_acs_elevator_record AREA_ID varchar YES NULL 设备区位id
57 it_acs_elevator_record OPEN_DOOR_TYPE varchar NO NULL 开门方式
58 it_acs_elevator_record OPERATE_NAME varchar YES NULL 操作人员名称
59 it_acs_elevator_record FACE_IMAGE_PATH varchar YES NULL 抓拍照
60 it_acs_elevator_record PANORAMA_IMAGE_PATH varchar YES NULL 全景照
61 it_acs_elevator_record RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
62 it_acs_elevator_record RECOGNITION_NO varchar YES NULL 识别编号
63 it_acs_elevator_record RECOGNITION_TIME bigint NO NULL 识别时间
64 it_acs_elevator_record LOG_ID varchar YES NULL 请求唯一标志码
65 it_acs_elevator_record RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
66 it_acs_elevator_record CREATE_TIME bigint YES NULL 创建时间
67 it_acs_elevator_record CREATE_USER_ID varchar YES NULL 创建人
68 it_acs_elevator_record LAST_UPDATE_TIME bigint YES NULL 修改时间
69 it_acs_elevator_record LAST_UPDATE_USER_ID varchar YES NULL 修改人
70 it_acs_elevator_record SRC_FLOOR varchar YES NULL 进梯(当前)楼层
71 it_acs_elevator_record DEST_FLOOR varchar YES NULL 选层楼层
72 it_acs_elevator_record DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
73 it_acs_elevator_record DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
74 it_acs_elevator_record IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
75 it_acs_elevator_record INTERVIEWEE varchar YES NULL 被访人id
76 it_acs_elevator_record ORG_ID varchar YES NULL 机构id
77 it_acs_elevator_record ORG_NAME varchar YES NULL 机构名
78 it_acs_elevator_record PERSON_CODE varchar YES NULL 工号
79 it_acs_elevator_record_2020 ID varchar NO NULL PRI 主键
80 it_acs_elevator_record_2020 BUSINESS_ID varchar NO NULL MUL 企业ID
81 it_acs_elevator_record_2020 DEVICE_ID varchar YES NULL 设备id
82 it_acs_elevator_record_2020 DEVICE_CODE varchar NO NULL 设备编号
83 it_acs_elevator_record_2020 DEVICE_NAME varchar YES NULL 设备名称
84 it_acs_elevator_record_2020 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
85 it_acs_elevator_record_2020 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
86 it_acs_elevator_record_2020 DISTRICT_ID varchar YES NULL 省市区id
87 it_acs_elevator_record_2020 AREA_ID varchar YES NULL 设备区位id
88 it_acs_elevator_record_2020 OPEN_DOOR_TYPE varchar NO NULL 开门方式
89 it_acs_elevator_record_2020 OPERATE_NAME varchar YES NULL 操作人员名称
90 it_acs_elevator_record_2020 FACE_IMAGE_PATH varchar YES NULL 抓拍照
91 it_acs_elevator_record_2020 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
92 it_acs_elevator_record_2020 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
93 it_acs_elevator_record_2020 RECOGNITION_NO varchar YES NULL 识别编号
94 it_acs_elevator_record_2020 RECOGNITION_TIME bigint NO NULL 识别时间
95 it_acs_elevator_record_2020 LOG_ID varchar YES NULL 请求唯一标志码
96 it_acs_elevator_record_2020 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
97 it_acs_elevator_record_2020 CREATE_TIME bigint YES NULL 创建时间
98 it_acs_elevator_record_2020 CREATE_USER_ID varchar YES NULL 创建人
99 it_acs_elevator_record_2020 LAST_UPDATE_TIME bigint YES NULL 修改时间
100 it_acs_elevator_record_2020 LAST_UPDATE_USER_ID varchar YES NULL 修改人
101 it_acs_elevator_record_2020 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
102 it_acs_elevator_record_2020 DEST_FLOOR varchar YES NULL 选层楼层
103 it_acs_elevator_record_2020 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
104 it_acs_elevator_record_2020 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
105 it_acs_elevator_record_2020 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
106 it_acs_elevator_record_2020 INTERVIEWEE varchar YES NULL 被访人id
107 it_acs_elevator_record_2020 ORG_ID varchar YES NULL 机构id
108 it_acs_elevator_record_2020 ORG_NAME varchar YES NULL 机构名
109 it_acs_elevator_record_2020 PERSON_CODE varchar YES NULL 工号
110 it_acs_elevator_record_2021 ID varchar NO NULL PRI 主键
111 it_acs_elevator_record_2021 BUSINESS_ID varchar NO NULL MUL 企业ID
112 it_acs_elevator_record_2021 DEVICE_ID varchar YES NULL 设备id
113 it_acs_elevator_record_2021 DEVICE_CODE varchar NO NULL 设备编号
114 it_acs_elevator_record_2021 DEVICE_NAME varchar YES NULL 设备名称
115 it_acs_elevator_record_2021 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
116 it_acs_elevator_record_2021 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
117 it_acs_elevator_record_2021 DISTRICT_ID varchar YES NULL 省市区id
118 it_acs_elevator_record_2021 AREA_ID varchar YES NULL 设备区位id
119 it_acs_elevator_record_2021 OPEN_DOOR_TYPE varchar NO NULL 开门方式
120 it_acs_elevator_record_2021 OPERATE_NAME varchar YES NULL 操作人员名称
121 it_acs_elevator_record_2021 FACE_IMAGE_PATH varchar YES NULL 抓拍照
122 it_acs_elevator_record_2021 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
123 it_acs_elevator_record_2021 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
124 it_acs_elevator_record_2021 RECOGNITION_NO varchar YES NULL 识别编号
125 it_acs_elevator_record_2021 RECOGNITION_TIME bigint NO NULL 识别时间
126 it_acs_elevator_record_2021 LOG_ID varchar YES NULL 请求唯一标志码
127 it_acs_elevator_record_2021 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
128 it_acs_elevator_record_2021 CREATE_TIME bigint YES NULL 创建时间
129 it_acs_elevator_record_2021 CREATE_USER_ID varchar YES NULL 创建人
130 it_acs_elevator_record_2021 LAST_UPDATE_TIME bigint YES NULL 修改时间
131 it_acs_elevator_record_2021 LAST_UPDATE_USER_ID varchar YES NULL 修改人
132 it_acs_elevator_record_2021 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
133 it_acs_elevator_record_2021 DEST_FLOOR varchar YES NULL 选层楼层
134 it_acs_elevator_record_2021 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
135 it_acs_elevator_record_2021 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
136 it_acs_elevator_record_2021 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
137 it_acs_elevator_record_2021 INTERVIEWEE varchar YES NULL 被访人id
138 it_acs_elevator_record_2021 ORG_ID varchar YES NULL 机构id
139 it_acs_elevator_record_2021 ORG_NAME varchar YES NULL 机构名
140 it_acs_elevator_record_2021 PERSON_CODE varchar YES NULL 工号
141 it_acs_elevator_record_2022 ID varchar NO NULL PRI 主键
142 it_acs_elevator_record_2022 BUSINESS_ID varchar NO NULL MUL 企业ID
143 it_acs_elevator_record_2022 DEVICE_ID varchar YES NULL 设备id
144 it_acs_elevator_record_2022 DEVICE_CODE varchar NO NULL 设备编号
145 it_acs_elevator_record_2022 DEVICE_NAME varchar YES NULL 设备名称
146 it_acs_elevator_record_2022 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
147 it_acs_elevator_record_2022 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
148 it_acs_elevator_record_2022 DISTRICT_ID varchar YES NULL 省市区id
149 it_acs_elevator_record_2022 AREA_ID varchar YES NULL 设备区位id
150 it_acs_elevator_record_2022 OPEN_DOOR_TYPE varchar NO NULL 开门方式
151 it_acs_elevator_record_2022 OPERATE_NAME varchar YES NULL 操作人员名称
152 it_acs_elevator_record_2022 FACE_IMAGE_PATH varchar YES NULL 抓拍照
153 it_acs_elevator_record_2022 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
154 it_acs_elevator_record_2022 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
155 it_acs_elevator_record_2022 RECOGNITION_NO varchar YES NULL 识别编号
156 it_acs_elevator_record_2022 RECOGNITION_TIME bigint NO NULL 识别时间
157 it_acs_elevator_record_2022 LOG_ID varchar YES NULL 请求唯一标志码
158 it_acs_elevator_record_2022 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
159 it_acs_elevator_record_2022 CREATE_TIME bigint YES NULL 创建时间
160 it_acs_elevator_record_2022 CREATE_USER_ID varchar YES NULL 创建人
161 it_acs_elevator_record_2022 LAST_UPDATE_TIME bigint YES NULL 修改时间
162 it_acs_elevator_record_2022 LAST_UPDATE_USER_ID varchar YES NULL 修改人
163 it_acs_elevator_record_2022 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
164 it_acs_elevator_record_2022 DEST_FLOOR varchar YES NULL 选层楼层
165 it_acs_elevator_record_2022 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
166 it_acs_elevator_record_2022 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
167 it_acs_elevator_record_2022 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
168 it_acs_elevator_record_2022 INTERVIEWEE varchar YES NULL 被访人id
169 it_acs_elevator_record_2022 ORG_ID varchar YES NULL 机构id
170 it_acs_elevator_record_2022 ORG_NAME varchar YES NULL 机构名
171 it_acs_elevator_record_2022 PERSON_CODE varchar YES NULL 工号
172 it_acs_elevator_record_2023 ID varchar NO NULL PRI 主键
173 it_acs_elevator_record_2023 BUSINESS_ID varchar NO NULL 企业ID
174 it_acs_elevator_record_2023 DEVICE_ID varchar YES NULL 设备id
175 it_acs_elevator_record_2023 DEVICE_CODE varchar NO NULL 设备编号
176 it_acs_elevator_record_2023 DEVICE_NAME varchar YES NULL 设备名称
177 it_acs_elevator_record_2023 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
178 it_acs_elevator_record_2023 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
179 it_acs_elevator_record_2023 DISTRICT_ID varchar YES NULL 省市区id
180 it_acs_elevator_record_2023 AREA_ID varchar YES NULL 设备区位id
181 it_acs_elevator_record_2023 OPEN_DOOR_TYPE varchar NO NULL 开门方式
182 it_acs_elevator_record_2023 OPERATE_NAME varchar YES NULL 操作人员名称
183 it_acs_elevator_record_2023 FACE_IMAGE_PATH varchar YES NULL 抓拍照
184 it_acs_elevator_record_2023 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
185 it_acs_elevator_record_2023 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
186 it_acs_elevator_record_2023 RECOGNITION_NO varchar YES NULL 识别编号
187 it_acs_elevator_record_2023 RECOGNITION_TIME bigint NO NULL MUL 识别时间
188 it_acs_elevator_record_2023 LOG_ID varchar YES NULL 请求唯一标志码
189 it_acs_elevator_record_2023 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
190 it_acs_elevator_record_2023 CREATE_TIME bigint YES NULL 创建时间
191 it_acs_elevator_record_2023 CREATE_USER_ID varchar YES NULL 创建人
192 it_acs_elevator_record_2023 LAST_UPDATE_TIME bigint YES NULL 修改时间
193 it_acs_elevator_record_2023 LAST_UPDATE_USER_ID varchar YES NULL 修改人
194 it_acs_elevator_record_2023 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
195 it_acs_elevator_record_2023 DEST_FLOOR varchar YES NULL 选层楼层
196 it_acs_elevator_record_2023 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
197 it_acs_elevator_record_2023 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
198 it_acs_elevator_record_2023 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
199 it_acs_elevator_record_2023 INTERVIEWEE varchar YES NULL 被访人id
200 it_acs_elevator_record_2023 ORG_ID varchar YES NULL 机构id
201 it_acs_elevator_record_2023 ORG_NAME varchar YES NULL 机构名
202 it_acs_elevator_record_2023 PERSON_CODE varchar YES NULL 工号
203 it_acs_elevator_record_2024 ID varchar NO NULL PRI 主键
204 it_acs_elevator_record_2024 BUSINESS_ID varchar NO NULL MUL 企业ID
205 it_acs_elevator_record_2024 DEVICE_ID varchar YES NULL 设备id
206 it_acs_elevator_record_2024 DEVICE_CODE varchar NO NULL 设备编号
207 it_acs_elevator_record_2024 DEVICE_NAME varchar YES NULL 设备名称
208 it_acs_elevator_record_2024 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
209 it_acs_elevator_record_2024 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
210 it_acs_elevator_record_2024 DISTRICT_ID varchar YES NULL 省市区id
211 it_acs_elevator_record_2024 AREA_ID varchar YES NULL 设备区位id
212 it_acs_elevator_record_2024 OPEN_DOOR_TYPE varchar NO NULL 开门方式
213 it_acs_elevator_record_2024 OPERATE_NAME varchar YES NULL 操作人员名称
214 it_acs_elevator_record_2024 FACE_IMAGE_PATH varchar YES NULL 抓拍照
215 it_acs_elevator_record_2024 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
216 it_acs_elevator_record_2024 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
217 it_acs_elevator_record_2024 RECOGNITION_NO varchar YES NULL 识别编号
218 it_acs_elevator_record_2024 RECOGNITION_TIME bigint NO NULL 识别时间
219 it_acs_elevator_record_2024 LOG_ID varchar YES NULL 请求唯一标志码
220 it_acs_elevator_record_2024 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
221 it_acs_elevator_record_2024 CREATE_TIME bigint YES NULL 创建时间
222 it_acs_elevator_record_2024 CREATE_USER_ID varchar YES NULL 创建人
223 it_acs_elevator_record_2024 LAST_UPDATE_TIME bigint YES NULL 修改时间
224 it_acs_elevator_record_2024 LAST_UPDATE_USER_ID varchar YES NULL 修改人
225 it_acs_elevator_record_2024 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
226 it_acs_elevator_record_2024 DEST_FLOOR varchar YES NULL 选层楼层
227 it_acs_elevator_record_2024 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
228 it_acs_elevator_record_2024 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
229 it_acs_elevator_record_2024 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
230 it_acs_elevator_record_2024 INTERVIEWEE varchar YES NULL 被访人id
231 it_acs_elevator_record_2024 ORG_ID varchar YES NULL 机构id
232 it_acs_elevator_record_2024 ORG_NAME varchar YES NULL 机构名
233 it_acs_elevator_record_2024 PERSON_CODE varchar YES NULL 工号
234 it_acs_elevator_record_2025 ID varchar NO NULL PRI 主键
235 it_acs_elevator_record_2025 BUSINESS_ID varchar NO NULL MUL 企业ID
236 it_acs_elevator_record_2025 DEVICE_ID varchar YES NULL 设备id
237 it_acs_elevator_record_2025 DEVICE_CODE varchar NO NULL 设备编号
238 it_acs_elevator_record_2025 DEVICE_NAME varchar YES NULL 设备名称
239 it_acs_elevator_record_2025 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
240 it_acs_elevator_record_2025 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
241 it_acs_elevator_record_2025 DISTRICT_ID varchar YES NULL 省市区id
242 it_acs_elevator_record_2025 AREA_ID varchar YES NULL 设备区位id
243 it_acs_elevator_record_2025 OPEN_DOOR_TYPE varchar NO NULL 开门方式
244 it_acs_elevator_record_2025 OPERATE_NAME varchar YES NULL 操作人员名称
245 it_acs_elevator_record_2025 FACE_IMAGE_PATH varchar YES NULL 抓拍照
246 it_acs_elevator_record_2025 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
247 it_acs_elevator_record_2025 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
248 it_acs_elevator_record_2025 RECOGNITION_NO varchar YES NULL 识别编号
249 it_acs_elevator_record_2025 RECOGNITION_TIME bigint NO NULL 识别时间
250 it_acs_elevator_record_2025 LOG_ID varchar YES NULL 请求唯一标志码
251 it_acs_elevator_record_2025 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
252 it_acs_elevator_record_2025 CREATE_TIME bigint YES NULL 创建时间
253 it_acs_elevator_record_2025 CREATE_USER_ID varchar YES NULL 创建人
254 it_acs_elevator_record_2025 LAST_UPDATE_TIME bigint YES NULL 修改时间
255 it_acs_elevator_record_2025 LAST_UPDATE_USER_ID varchar YES NULL 修改人
256 it_acs_elevator_record_2025 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
257 it_acs_elevator_record_2025 DEST_FLOOR varchar YES NULL 选层楼层
258 it_acs_elevator_record_2025 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
259 it_acs_elevator_record_2025 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
260 it_acs_elevator_record_2025 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
261 it_acs_elevator_record_2025 INTERVIEWEE varchar YES NULL 被访人id
262 it_acs_elevator_record_2025 ORG_ID varchar YES NULL 机构id
263 it_acs_elevator_record_2025 ORG_NAME varchar YES NULL 机构名
264 it_acs_elevator_record_2025 PERSON_CODE varchar YES NULL 工号
265 it_acs_elevator_record_2026 ID varchar NO NULL PRI 主键
266 it_acs_elevator_record_2026 BUSINESS_ID varchar NO NULL MUL 企业ID
267 it_acs_elevator_record_2026 DEVICE_ID varchar YES NULL 设备id
268 it_acs_elevator_record_2026 DEVICE_CODE varchar NO NULL 设备编号
269 it_acs_elevator_record_2026 DEVICE_NAME varchar YES NULL 设备名称
270 it_acs_elevator_record_2026 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
271 it_acs_elevator_record_2026 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
272 it_acs_elevator_record_2026 DISTRICT_ID varchar YES NULL 省市区id
273 it_acs_elevator_record_2026 AREA_ID varchar YES NULL 设备区位id
274 it_acs_elevator_record_2026 OPEN_DOOR_TYPE varchar NO NULL 开门方式
275 it_acs_elevator_record_2026 OPERATE_NAME varchar YES NULL 操作人员名称
276 it_acs_elevator_record_2026 FACE_IMAGE_PATH varchar YES NULL 抓拍照
277 it_acs_elevator_record_2026 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
278 it_acs_elevator_record_2026 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
279 it_acs_elevator_record_2026 RECOGNITION_NO varchar YES NULL 识别编号
280 it_acs_elevator_record_2026 RECOGNITION_TIME bigint NO NULL 识别时间
281 it_acs_elevator_record_2026 LOG_ID varchar YES NULL 请求唯一标志码
282 it_acs_elevator_record_2026 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
283 it_acs_elevator_record_2026 CREATE_TIME bigint YES NULL 创建时间
284 it_acs_elevator_record_2026 CREATE_USER_ID varchar YES NULL 创建人
285 it_acs_elevator_record_2026 LAST_UPDATE_TIME bigint YES NULL 修改时间
286 it_acs_elevator_record_2026 LAST_UPDATE_USER_ID varchar YES NULL 修改人
287 it_acs_elevator_record_2026 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
288 it_acs_elevator_record_2026 DEST_FLOOR varchar YES NULL 选层楼层
289 it_acs_elevator_record_2026 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
290 it_acs_elevator_record_2026 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
291 it_acs_elevator_record_2026 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
292 it_acs_elevator_record_2026 INTERVIEWEE varchar YES NULL 被访人id
293 it_acs_elevator_record_2026 ORG_ID varchar YES NULL 机构id
294 it_acs_elevator_record_2026 ORG_NAME varchar YES NULL 机构名
295 it_acs_elevator_record_2026 PERSON_CODE varchar YES NULL 工号
296 it_acs_elevator_record_2027 ID varchar NO NULL PRI 主键
297 it_acs_elevator_record_2027 BUSINESS_ID varchar NO NULL MUL 企业ID
298 it_acs_elevator_record_2027 DEVICE_ID varchar YES NULL 设备id
299 it_acs_elevator_record_2027 DEVICE_CODE varchar NO NULL 设备编号
300 it_acs_elevator_record_2027 DEVICE_NAME varchar YES NULL 设备名称
301 it_acs_elevator_record_2027 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
302 it_acs_elevator_record_2027 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
303 it_acs_elevator_record_2027 DISTRICT_ID varchar YES NULL 省市区id
304 it_acs_elevator_record_2027 AREA_ID varchar YES NULL 设备区位id
305 it_acs_elevator_record_2027 OPEN_DOOR_TYPE varchar NO NULL 开门方式
306 it_acs_elevator_record_2027 OPERATE_NAME varchar YES NULL 操作人员名称
307 it_acs_elevator_record_2027 FACE_IMAGE_PATH varchar YES NULL 抓拍照
308 it_acs_elevator_record_2027 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
309 it_acs_elevator_record_2027 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
310 it_acs_elevator_record_2027 RECOGNITION_NO varchar YES NULL 识别编号
311 it_acs_elevator_record_2027 RECOGNITION_TIME bigint NO NULL 识别时间
312 it_acs_elevator_record_2027 LOG_ID varchar YES NULL 请求唯一标志码
313 it_acs_elevator_record_2027 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
314 it_acs_elevator_record_2027 CREATE_TIME bigint YES NULL 创建时间
315 it_acs_elevator_record_2027 CREATE_USER_ID varchar YES NULL 创建人
316 it_acs_elevator_record_2027 LAST_UPDATE_TIME bigint YES NULL 修改时间
317 it_acs_elevator_record_2027 LAST_UPDATE_USER_ID varchar YES NULL 修改人
318 it_acs_elevator_record_2027 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
319 it_acs_elevator_record_2027 DEST_FLOOR varchar YES NULL 选层楼层
320 it_acs_elevator_record_2027 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
321 it_acs_elevator_record_2027 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
322 it_acs_elevator_record_2027 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
323 it_acs_elevator_record_2027 INTERVIEWEE varchar YES NULL 被访人id
324 it_acs_elevator_record_2027 ORG_ID varchar YES NULL 机构id
325 it_acs_elevator_record_2027 ORG_NAME varchar YES NULL 机构名
326 it_acs_elevator_record_2027 PERSON_CODE varchar YES NULL 工号
327 it_acs_elevator_record_2028 ID varchar NO NULL PRI 主键
328 it_acs_elevator_record_2028 BUSINESS_ID varchar NO NULL MUL 企业ID
329 it_acs_elevator_record_2028 DEVICE_ID varchar YES NULL 设备id
330 it_acs_elevator_record_2028 DEVICE_CODE varchar NO NULL 设备编号
331 it_acs_elevator_record_2028 DEVICE_NAME varchar YES NULL 设备名称
332 it_acs_elevator_record_2028 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
333 it_acs_elevator_record_2028 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
334 it_acs_elevator_record_2028 DISTRICT_ID varchar YES NULL 省市区id
335 it_acs_elevator_record_2028 AREA_ID varchar YES NULL 设备区位id
336 it_acs_elevator_record_2028 OPEN_DOOR_TYPE varchar NO NULL 开门方式
337 it_acs_elevator_record_2028 OPERATE_NAME varchar YES NULL 操作人员名称
338 it_acs_elevator_record_2028 FACE_IMAGE_PATH varchar YES NULL 抓拍照
339 it_acs_elevator_record_2028 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
340 it_acs_elevator_record_2028 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
341 it_acs_elevator_record_2028 RECOGNITION_NO varchar YES NULL 识别编号
342 it_acs_elevator_record_2028 RECOGNITION_TIME bigint NO NULL 识别时间
343 it_acs_elevator_record_2028 LOG_ID varchar YES NULL 请求唯一标志码
344 it_acs_elevator_record_2028 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
345 it_acs_elevator_record_2028 CREATE_TIME bigint YES NULL 创建时间
346 it_acs_elevator_record_2028 CREATE_USER_ID varchar YES NULL 创建人
347 it_acs_elevator_record_2028 LAST_UPDATE_TIME bigint YES NULL 修改时间
348 it_acs_elevator_record_2028 LAST_UPDATE_USER_ID varchar YES NULL 修改人
349 it_acs_elevator_record_2028 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
350 it_acs_elevator_record_2028 DEST_FLOOR varchar YES NULL 选层楼层
351 it_acs_elevator_record_2028 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
352 it_acs_elevator_record_2028 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
353 it_acs_elevator_record_2028 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
354 it_acs_elevator_record_2028 INTERVIEWEE varchar YES NULL 被访人id
355 it_acs_elevator_record_2028 ORG_ID varchar YES NULL 机构id
356 it_acs_elevator_record_2028 ORG_NAME varchar YES NULL 机构名
357 it_acs_elevator_record_2028 PERSON_CODE varchar YES NULL 工号
358 it_acs_elevator_record_2029 ID varchar NO NULL PRI 主键
359 it_acs_elevator_record_2029 BUSINESS_ID varchar NO NULL MUL 企业ID
360 it_acs_elevator_record_2029 DEVICE_ID varchar YES NULL 设备id
361 it_acs_elevator_record_2029 DEVICE_CODE varchar NO NULL 设备编号
362 it_acs_elevator_record_2029 DEVICE_NAME varchar YES NULL 设备名称
363 it_acs_elevator_record_2029 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
364 it_acs_elevator_record_2029 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
365 it_acs_elevator_record_2029 DISTRICT_ID varchar YES NULL 省市区id
366 it_acs_elevator_record_2029 AREA_ID varchar YES NULL 设备区位id
367 it_acs_elevator_record_2029 OPEN_DOOR_TYPE varchar NO NULL 开门方式
368 it_acs_elevator_record_2029 OPERATE_NAME varchar YES NULL 操作人员名称
369 it_acs_elevator_record_2029 FACE_IMAGE_PATH varchar YES NULL 抓拍照
370 it_acs_elevator_record_2029 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
371 it_acs_elevator_record_2029 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
372 it_acs_elevator_record_2029 RECOGNITION_NO varchar YES NULL 识别编号
373 it_acs_elevator_record_2029 RECOGNITION_TIME bigint NO NULL 识别时间
374 it_acs_elevator_record_2029 LOG_ID varchar YES NULL 请求唯一标志码
375 it_acs_elevator_record_2029 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
376 it_acs_elevator_record_2029 CREATE_TIME bigint YES NULL 创建时间
377 it_acs_elevator_record_2029 CREATE_USER_ID varchar YES NULL 创建人
378 it_acs_elevator_record_2029 LAST_UPDATE_TIME bigint YES NULL 修改时间
379 it_acs_elevator_record_2029 LAST_UPDATE_USER_ID varchar YES NULL 修改人
380 it_acs_elevator_record_2029 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
381 it_acs_elevator_record_2029 DEST_FLOOR varchar YES NULL 选层楼层
382 it_acs_elevator_record_2029 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
383 it_acs_elevator_record_2029 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
384 it_acs_elevator_record_2029 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
385 it_acs_elevator_record_2029 INTERVIEWEE varchar YES NULL 被访人id
386 it_acs_elevator_record_2029 ORG_ID varchar YES NULL 机构id
387 it_acs_elevator_record_2029 ORG_NAME varchar YES NULL 机构名
388 it_acs_elevator_record_2029 PERSON_CODE varchar YES NULL 工号
389 it_acs_elevator_record_2030 ID varchar NO NULL PRI 主键
390 it_acs_elevator_record_2030 BUSINESS_ID varchar NO NULL MUL 企业ID
391 it_acs_elevator_record_2030 DEVICE_ID varchar YES NULL 设备id
392 it_acs_elevator_record_2030 DEVICE_CODE varchar NO NULL 设备编号
393 it_acs_elevator_record_2030 DEVICE_NAME varchar YES NULL 设备名称
394 it_acs_elevator_record_2030 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
395 it_acs_elevator_record_2030 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
396 it_acs_elevator_record_2030 DISTRICT_ID varchar YES NULL 省市区id
397 it_acs_elevator_record_2030 AREA_ID varchar YES NULL 设备区位id
398 it_acs_elevator_record_2030 OPEN_DOOR_TYPE varchar NO NULL 开门方式
399 it_acs_elevator_record_2030 OPERATE_NAME varchar YES NULL 操作人员名称
400 it_acs_elevator_record_2030 FACE_IMAGE_PATH varchar YES NULL 抓拍照
401 it_acs_elevator_record_2030 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
402 it_acs_elevator_record_2030 RECORD_RESULT tinyint YES 1 开门结果 1:成功 2:失败
403 it_acs_elevator_record_2030 RECOGNITION_NO varchar YES NULL 识别编号
404 it_acs_elevator_record_2030 RECOGNITION_TIME bigint NO NULL 识别时间
405 it_acs_elevator_record_2030 LOG_ID varchar YES NULL 请求唯一标志码
406 it_acs_elevator_record_2030 RECOGNITION_FACE_ID varchar YES NULL MUL 识别记录唯一标志码
407 it_acs_elevator_record_2030 CREATE_TIME bigint YES NULL 创建时间
408 it_acs_elevator_record_2030 CREATE_USER_ID varchar YES NULL 创建人
409 it_acs_elevator_record_2030 LAST_UPDATE_TIME bigint YES NULL 修改时间
410 it_acs_elevator_record_2030 LAST_UPDATE_USER_ID varchar YES NULL 修改人
411 it_acs_elevator_record_2030 SRC_FLOOR varchar YES NULL 进梯(当前)楼层
412 it_acs_elevator_record_2030 DEST_FLOOR varchar YES NULL 选层楼层
413 it_acs_elevator_record_2030 DISPATCH_ELEVATOR_NO varchar YES NULL 派梯梯号
414 it_acs_elevator_record_2030 DISPATCH_ELEVATOR_TIME bigint YES NULL 派梯时间
415 it_acs_elevator_record_2030 IS_VISITOR varchar YES NULL 是否访客:0-不是,1-是
416 it_acs_elevator_record_2030 INTERVIEWEE varchar YES NULL 被访人id
417 it_acs_elevator_record_2030 ORG_ID varchar YES NULL 机构id
418 it_acs_elevator_record_2030 ORG_NAME varchar YES NULL 机构名
419 it_acs_elevator_record_2030 PERSON_CODE varchar YES NULL 工号
420 it_acs_pass_rule ID varchar NO NULL PRI 唯一ID
421 it_acs_pass_rule BUSINESS_ID varchar NO NULL MUL 企业ID
422 it_acs_pass_rule ZONE_ID varchar NO NULL 楼层ID
423 it_acs_pass_rule ZONE_NAME varchar YES NULL 楼层名
424 it_acs_pass_rule NAME varchar NO NULL 通行规则名称
425 it_acs_pass_rule IMAGE_STORE_ID varchar NO NULL 图库id
426 it_acs_pass_rule PASSABLE_TIME_ID varchar YES NULL 通行时间id
427 it_acs_pass_rule VALID_DATE_CRON text YES NULL 通行时间cron
428 it_acs_pass_rule VALID_DATE_JSON text YES NULL 通行时间json
429 it_acs_pass_rule BEGIN_DATE bigint YES NULL 开始时间
430 it_acs_pass_rule END_DATE bigint YES NULL 结束时间
431 it_acs_pass_rule CREATE_TIME bigint YES NULL 创建时间
432 it_acs_pass_rule CREATE_USER_ID varchar YES NULL 创建人id
433 it_acs_pass_rule LAST_UPDATE_TIME bigint YES NULL 最后更新时间
434 it_acs_pass_rule LAST_UPDATE_USER_ID varchar YES NULL 最后更新人id
435 it_acs_pass_rule IS_DEFAULT tinyint YES 0 是否默认规则:0-不是,1-是
436 it_acs_recog_record ID varchar NO NULL PRI 主键
437 it_acs_recog_record PERSON_ID varchar YES NULL MUL 人员id
438 it_acs_recog_record PERSON_NAME varchar YES NULL 人员名称
439 it_acs_recog_record BUSINESS_ID varchar NO NULL 企业ID
440 it_acs_recog_record DEVICE_ID varchar YES NULL 设备id
441 it_acs_recog_record DEVICE_CODE varchar NO NULL 设备编号
442 it_acs_recog_record DEVICE_NAME varchar YES NULL 设备名称
443 it_acs_recog_record THRESHOLD decimal YES NULL 阈值
444 it_acs_recog_record DISTRICT_ID varchar YES NULL 省市区id
445 it_acs_recog_record AREA_ID varchar YES NULL 设备区位id
446 it_acs_recog_record DEVICE_TYPE_ID varchar YES NULL 设备类型ID
447 it_acs_recog_record DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
448 it_acs_recog_record SUB_DEVICE_ID varchar YES NULL 子设备id
449 it_acs_recog_record SUB_DEVICE_CODE varchar YES NULL 子设备编号
450 it_acs_recog_record SUB_DEVICE_NAME varchar YES NULL 子设备名称
451 it_acs_recog_record SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
452 it_acs_recog_record SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
453 it_acs_recog_record REGISTER_IMAGE_PATH varchar YES NULL 注册照片
454 it_acs_recog_record FACE_IMAGE_PATH varchar YES NULL 抓拍照
455 it_acs_recog_record PANORAMA_IMAGE_PATH varchar YES NULL 全景照
456 it_acs_recog_record SCORE decimal NO NULL 识别分数
457 it_acs_recog_record RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
458 it_acs_recog_record RECOGNITION_TIME bigint NO NULL 识别时间
459 it_acs_recog_record GROUP_ID varchar YES NULL 用户所在底库编号
460 it_acs_recog_record FACE_ID varchar NO NULL 识别到对应的注册图片编号
461 it_acs_recog_record QUALITY_SCORE decimal YES NULL 人脸质量总分
462 it_acs_recog_record LOG_ID varchar NO NULL 请求唯一标志码
463 it_acs_recog_record TEMP_SCORE decimal YES NULL 体温
464 it_acs_recog_record MASK_SCORE decimal NO NULL 口罩得分
465 it_acs_recog_record TEMP_THRESHOLD decimal YES NULL 体温阈值
466 it_acs_recog_record CARD_TYPE varchar YES NULL 证件类型
467 it_acs_recog_record SOURCE tinyint YES NULL 来源 1 识别 2 人证
468 it_acs_recog_record TEMP_IMAGE_PATH varchar YES NULL 热像图
469 it_acs_recog_record REMARK varchar YES NULL 备注
470 it_acs_recog_record CREATE_TIME bigint YES NULL 创建时间
471 it_acs_recog_record CREATE_USER_ID varchar YES NULL 创建人
472 it_acs_recog_record LAST_UPDATE_TIME bigint YES NULL 修改时间
473 it_acs_recog_record LAST_UPDATE_USER_ID varchar YES NULL 修改人
474 it_acs_recog_record PERSON_LABEL_IDS text YES NULL 人员id列表
475 it_acs_recog_record_2020 ID varchar NO NULL PRI 主键
476 it_acs_recog_record_2020 PERSON_ID varchar YES NULL 人员id
477 it_acs_recog_record_2020 PERSON_NAME varchar YES NULL 人员名称
478 it_acs_recog_record_2020 BUSINESS_ID varchar NO NULL 企业ID
479 it_acs_recog_record_2020 DEVICE_ID varchar YES NULL 设备id
480 it_acs_recog_record_2020 DEVICE_CODE varchar NO NULL 设备编号
481 it_acs_recog_record_2020 DEVICE_NAME varchar YES NULL 设备名称
482 it_acs_recog_record_2020 THRESHOLD decimal YES NULL 阈值
483 it_acs_recog_record_2020 DISTRICT_ID varchar YES NULL 省市区id
484 it_acs_recog_record_2020 AREA_ID varchar YES NULL 设备区位id
485 it_acs_recog_record_2020 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
486 it_acs_recog_record_2020 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
487 it_acs_recog_record_2020 SUB_DEVICE_ID varchar YES NULL 子设备id
488 it_acs_recog_record_2020 SUB_DEVICE_CODE varchar YES NULL 子设备编号
489 it_acs_recog_record_2020 SUB_DEVICE_NAME varchar YES NULL 子设备名称
490 it_acs_recog_record_2020 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
491 it_acs_recog_record_2020 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
492 it_acs_recog_record_2020 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
493 it_acs_recog_record_2020 FACE_IMAGE_PATH varchar YES NULL 抓拍照
494 it_acs_recog_record_2020 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
495 it_acs_recog_record_2020 SCORE decimal NO NULL 识别分数
496 it_acs_recog_record_2020 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
497 it_acs_recog_record_2020 RECOGNITION_TIME bigint NO NULL 识别时间
498 it_acs_recog_record_2020 GROUP_ID varchar YES NULL 用户所在底库编号
499 it_acs_recog_record_2020 FACE_ID varchar NO NULL 识别到对应的注册图片编号
500 it_acs_recog_record_2020 QUALITY_SCORE decimal YES NULL 人脸质量总分
501 it_acs_recog_record_2020 LOG_ID varchar NO NULL 请求唯一标志码
502 it_acs_recog_record_2020 TEMP_SCORE decimal YES NULL 体温
503 it_acs_recog_record_2020 MASK_SCORE decimal NO NULL 口罩得分
504 it_acs_recog_record_2020 TEMP_THRESHOLD decimal YES NULL 体温阈值
505 it_acs_recog_record_2020 CARD_TYPE varchar YES NULL 证件类型
506 it_acs_recog_record_2020 SOURCE tinyint YES NULL 来源 1 识别 2 人证
507 it_acs_recog_record_2020 TEMP_IMAGE_PATH varchar YES NULL 热像图
508 it_acs_recog_record_2020 REMARK varchar YES NULL 备注
509 it_acs_recog_record_2020 CREATE_TIME bigint YES NULL 创建时间
510 it_acs_recog_record_2020 CREATE_USER_ID varchar YES NULL 创建人
511 it_acs_recog_record_2020 LAST_UPDATE_TIME bigint YES NULL 修改时间
512 it_acs_recog_record_2020 LAST_UPDATE_USER_ID varchar YES NULL 修改人
513 it_acs_recog_record_2020 PERSON_LABEL_IDS varchar YES NULL 人员id列表
514 it_acs_recog_record_2021 ID varchar NO NULL PRI 主键
515 it_acs_recog_record_2021 PERSON_ID varchar YES NULL 人员id
516 it_acs_recog_record_2021 PERSON_NAME varchar YES NULL 人员名称
517 it_acs_recog_record_2021 BUSINESS_ID varchar NO NULL 企业ID
518 it_acs_recog_record_2021 DEVICE_ID varchar YES NULL 设备id
519 it_acs_recog_record_2021 DEVICE_CODE varchar NO NULL 设备编号
520 it_acs_recog_record_2021 DEVICE_NAME varchar YES NULL 设备名称
521 it_acs_recog_record_2021 THRESHOLD decimal YES NULL 阈值
522 it_acs_recog_record_2021 DISTRICT_ID varchar YES NULL 省市区id
523 it_acs_recog_record_2021 AREA_ID varchar YES NULL 设备区位id
524 it_acs_recog_record_2021 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
525 it_acs_recog_record_2021 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
526 it_acs_recog_record_2021 SUB_DEVICE_ID varchar YES NULL 子设备id
527 it_acs_recog_record_2021 SUB_DEVICE_CODE varchar YES NULL 子设备编号
528 it_acs_recog_record_2021 SUB_DEVICE_NAME varchar YES NULL 子设备名称
529 it_acs_recog_record_2021 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
530 it_acs_recog_record_2021 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
531 it_acs_recog_record_2021 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
532 it_acs_recog_record_2021 FACE_IMAGE_PATH varchar YES NULL 抓拍照
533 it_acs_recog_record_2021 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
534 it_acs_recog_record_2021 SCORE decimal NO NULL 识别分数
535 it_acs_recog_record_2021 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
536 it_acs_recog_record_2021 RECOGNITION_TIME bigint NO NULL 识别时间
537 it_acs_recog_record_2021 GROUP_ID varchar YES NULL 用户所在底库编号
538 it_acs_recog_record_2021 FACE_ID varchar NO NULL 识别到对应的注册图片编号
539 it_acs_recog_record_2021 QUALITY_SCORE decimal YES NULL 人脸质量总分
540 it_acs_recog_record_2021 LOG_ID varchar NO NULL 请求唯一标志码
541 it_acs_recog_record_2021 TEMP_SCORE decimal YES NULL 体温
542 it_acs_recog_record_2021 MASK_SCORE decimal NO NULL 口罩得分
543 it_acs_recog_record_2021 TEMP_THRESHOLD decimal YES NULL 体温阈值
544 it_acs_recog_record_2021 CARD_TYPE varchar YES NULL 证件类型
545 it_acs_recog_record_2021 SOURCE tinyint YES NULL 来源 1 识别 2 人证
546 it_acs_recog_record_2021 TEMP_IMAGE_PATH varchar YES NULL 热像图
547 it_acs_recog_record_2021 REMARK varchar YES NULL 备注
548 it_acs_recog_record_2021 CREATE_TIME bigint YES NULL 创建时间
549 it_acs_recog_record_2021 CREATE_USER_ID varchar YES NULL 创建人
550 it_acs_recog_record_2021 LAST_UPDATE_TIME bigint YES NULL 修改时间
551 it_acs_recog_record_2021 LAST_UPDATE_USER_ID varchar YES NULL 修改人
552 it_acs_recog_record_2021 PERSON_LABEL_IDS varchar YES NULL 人员id列表
553 it_acs_recog_record_2022 ID varchar NO NULL PRI 主键
554 it_acs_recog_record_2022 PERSON_ID varchar YES NULL 人员id
555 it_acs_recog_record_2022 PERSON_NAME varchar YES NULL 人员名称
556 it_acs_recog_record_2022 BUSINESS_ID varchar NO NULL 企业ID
557 it_acs_recog_record_2022 DEVICE_ID varchar YES NULL 设备id
558 it_acs_recog_record_2022 DEVICE_CODE varchar NO NULL 设备编号
559 it_acs_recog_record_2022 DEVICE_NAME varchar YES NULL 设备名称
560 it_acs_recog_record_2022 THRESHOLD decimal YES NULL 阈值
561 it_acs_recog_record_2022 DISTRICT_ID varchar YES NULL 省市区id
562 it_acs_recog_record_2022 AREA_ID varchar YES NULL 设备区位id
563 it_acs_recog_record_2022 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
564 it_acs_recog_record_2022 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
565 it_acs_recog_record_2022 SUB_DEVICE_ID varchar YES NULL 子设备id
566 it_acs_recog_record_2022 SUB_DEVICE_CODE varchar YES NULL 子设备编号
567 it_acs_recog_record_2022 SUB_DEVICE_NAME varchar YES NULL 子设备名称
568 it_acs_recog_record_2022 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
569 it_acs_recog_record_2022 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
570 it_acs_recog_record_2022 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
571 it_acs_recog_record_2022 FACE_IMAGE_PATH varchar YES NULL 抓拍照
572 it_acs_recog_record_2022 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
573 it_acs_recog_record_2022 SCORE decimal NO NULL 识别分数
574 it_acs_recog_record_2022 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
575 it_acs_recog_record_2022 RECOGNITION_TIME bigint NO NULL 识别时间
576 it_acs_recog_record_2022 GROUP_ID varchar YES NULL 用户所在底库编号
577 it_acs_recog_record_2022 FACE_ID varchar NO NULL 识别到对应的注册图片编号
578 it_acs_recog_record_2022 QUALITY_SCORE decimal YES NULL 人脸质量总分
579 it_acs_recog_record_2022 LOG_ID varchar NO NULL 请求唯一标志码
580 it_acs_recog_record_2022 TEMP_SCORE decimal YES NULL 体温
581 it_acs_recog_record_2022 MASK_SCORE decimal NO NULL 口罩得分
582 it_acs_recog_record_2022 TEMP_THRESHOLD decimal YES NULL 体温阈值
583 it_acs_recog_record_2022 CARD_TYPE varchar YES NULL 证件类型
584 it_acs_recog_record_2022 SOURCE tinyint YES NULL 来源 1 识别 2 人证
585 it_acs_recog_record_2022 TEMP_IMAGE_PATH varchar YES NULL 热像图
586 it_acs_recog_record_2022 REMARK varchar YES NULL 备注
587 it_acs_recog_record_2022 CREATE_TIME bigint YES NULL 创建时间
588 it_acs_recog_record_2022 CREATE_USER_ID varchar YES NULL 创建人
589 it_acs_recog_record_2022 LAST_UPDATE_TIME bigint YES NULL 修改时间
590 it_acs_recog_record_2022 LAST_UPDATE_USER_ID varchar YES NULL 修改人
591 it_acs_recog_record_2022 PERSON_LABEL_IDS varchar YES NULL 人员id列表
592 it_acs_recog_record_2023 ID varchar NO NULL PRI 主键
593 it_acs_recog_record_2023 PERSON_ID varchar YES NULL 人员id
594 it_acs_recog_record_2023 PERSON_NAME varchar YES NULL 人员名称
595 it_acs_recog_record_2023 BUSINESS_ID varchar NO NULL 企业ID
596 it_acs_recog_record_2023 DEVICE_ID varchar YES NULL 设备id
597 it_acs_recog_record_2023 DEVICE_CODE varchar NO NULL 设备编号
598 it_acs_recog_record_2023 DEVICE_NAME varchar YES NULL 设备名称
599 it_acs_recog_record_2023 THRESHOLD decimal YES NULL 阈值
600 it_acs_recog_record_2023 DISTRICT_ID varchar YES NULL 省市区id
601 it_acs_recog_record_2023 AREA_ID varchar YES NULL 设备区位id
602 it_acs_recog_record_2023 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
603 it_acs_recog_record_2023 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
604 it_acs_recog_record_2023 SUB_DEVICE_ID varchar YES NULL 子设备id
605 it_acs_recog_record_2023 SUB_DEVICE_CODE varchar YES NULL 子设备编号
606 it_acs_recog_record_2023 SUB_DEVICE_NAME varchar YES NULL 子设备名称
607 it_acs_recog_record_2023 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
608 it_acs_recog_record_2023 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
609 it_acs_recog_record_2023 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
610 it_acs_recog_record_2023 FACE_IMAGE_PATH varchar YES NULL 抓拍照
611 it_acs_recog_record_2023 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
612 it_acs_recog_record_2023 SCORE decimal NO NULL 识别分数
613 it_acs_recog_record_2023 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
614 it_acs_recog_record_2023 RECOGNITION_TIME bigint NO NULL MUL 识别时间
615 it_acs_recog_record_2023 GROUP_ID varchar YES NULL 用户所在底库编号
616 it_acs_recog_record_2023 FACE_ID varchar NO NULL 识别到对应的注册图片编号
617 it_acs_recog_record_2023 QUALITY_SCORE decimal YES NULL 人脸质量总分
618 it_acs_recog_record_2023 LOG_ID varchar NO NULL 请求唯一标志码
619 it_acs_recog_record_2023 TEMP_SCORE decimal YES NULL 体温
620 it_acs_recog_record_2023 MASK_SCORE decimal NO NULL 口罩得分
621 it_acs_recog_record_2023 TEMP_THRESHOLD decimal YES NULL 体温阈值
622 it_acs_recog_record_2023 CARD_TYPE varchar YES NULL 证件类型
623 it_acs_recog_record_2023 SOURCE tinyint YES NULL 来源 1 识别 2 人证
624 it_acs_recog_record_2023 TEMP_IMAGE_PATH varchar YES NULL 热像图
625 it_acs_recog_record_2023 REMARK varchar YES NULL 备注
626 it_acs_recog_record_2023 CREATE_TIME bigint YES NULL 创建时间
627 it_acs_recog_record_2023 CREATE_USER_ID varchar YES NULL 创建人
628 it_acs_recog_record_2023 LAST_UPDATE_TIME bigint YES NULL 修改时间
629 it_acs_recog_record_2023 LAST_UPDATE_USER_ID varchar YES NULL 修改人
630 it_acs_recog_record_2023 PERSON_LABEL_IDS text YES NULL 人员id列表
631 it_acs_recog_record_2024 ID varchar NO NULL PRI 主键
632 it_acs_recog_record_2024 PERSON_ID varchar YES NULL 人员id
633 it_acs_recog_record_2024 PERSON_NAME varchar YES NULL 人员名称
634 it_acs_recog_record_2024 BUSINESS_ID varchar NO NULL 企业ID
635 it_acs_recog_record_2024 DEVICE_ID varchar YES NULL 设备id
636 it_acs_recog_record_2024 DEVICE_CODE varchar NO NULL 设备编号
637 it_acs_recog_record_2024 DEVICE_NAME varchar YES NULL 设备名称
638 it_acs_recog_record_2024 THRESHOLD decimal YES NULL 阈值
639 it_acs_recog_record_2024 DISTRICT_ID varchar YES NULL 省市区id
640 it_acs_recog_record_2024 AREA_ID varchar YES NULL 设备区位id
641 it_acs_recog_record_2024 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
642 it_acs_recog_record_2024 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
643 it_acs_recog_record_2024 SUB_DEVICE_ID varchar YES NULL 子设备id
644 it_acs_recog_record_2024 SUB_DEVICE_CODE varchar YES NULL 子设备编号
645 it_acs_recog_record_2024 SUB_DEVICE_NAME varchar YES NULL 子设备名称
646 it_acs_recog_record_2024 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
647 it_acs_recog_record_2024 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
648 it_acs_recog_record_2024 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
649 it_acs_recog_record_2024 FACE_IMAGE_PATH varchar YES NULL 抓拍照
650 it_acs_recog_record_2024 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
651 it_acs_recog_record_2024 SCORE decimal NO NULL 识别分数
652 it_acs_recog_record_2024 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
653 it_acs_recog_record_2024 RECOGNITION_TIME bigint NO NULL 识别时间
654 it_acs_recog_record_2024 GROUP_ID varchar YES NULL 用户所在底库编号
655 it_acs_recog_record_2024 FACE_ID varchar NO NULL 识别到对应的注册图片编号
656 it_acs_recog_record_2024 QUALITY_SCORE decimal YES NULL 人脸质量总分
657 it_acs_recog_record_2024 LOG_ID varchar NO NULL 请求唯一标志码
658 it_acs_recog_record_2024 TEMP_SCORE decimal YES NULL 体温
659 it_acs_recog_record_2024 MASK_SCORE decimal NO NULL 口罩得分
660 it_acs_recog_record_2024 TEMP_THRESHOLD decimal YES NULL 体温阈值
661 it_acs_recog_record_2024 CARD_TYPE varchar YES NULL 证件类型
662 it_acs_recog_record_2024 SOURCE tinyint YES NULL 来源 1 识别 2 人证
663 it_acs_recog_record_2024 TEMP_IMAGE_PATH varchar YES NULL 热像图
664 it_acs_recog_record_2024 REMARK varchar YES NULL 备注
665 it_acs_recog_record_2024 CREATE_TIME bigint YES NULL 创建时间
666 it_acs_recog_record_2024 CREATE_USER_ID varchar YES NULL 创建人
667 it_acs_recog_record_2024 LAST_UPDATE_TIME bigint YES NULL 修改时间
668 it_acs_recog_record_2024 LAST_UPDATE_USER_ID varchar YES NULL 修改人
669 it_acs_recog_record_2024 PERSON_LABEL_IDS text YES NULL 人员id列表
670 it_acs_recog_record_2025 ID varchar NO NULL PRI 主键
671 it_acs_recog_record_2025 PERSON_ID varchar YES NULL 人员id
672 it_acs_recog_record_2025 PERSON_NAME varchar YES NULL 人员名称
673 it_acs_recog_record_2025 BUSINESS_ID varchar NO NULL 企业ID
674 it_acs_recog_record_2025 DEVICE_ID varchar YES NULL 设备id
675 it_acs_recog_record_2025 DEVICE_CODE varchar NO NULL 设备编号
676 it_acs_recog_record_2025 DEVICE_NAME varchar YES NULL 设备名称
677 it_acs_recog_record_2025 THRESHOLD decimal YES NULL 阈值
678 it_acs_recog_record_2025 DISTRICT_ID varchar YES NULL 省市区id
679 it_acs_recog_record_2025 AREA_ID varchar YES NULL 设备区位id
680 it_acs_recog_record_2025 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
681 it_acs_recog_record_2025 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
682 it_acs_recog_record_2025 SUB_DEVICE_ID varchar YES NULL 子设备id
683 it_acs_recog_record_2025 SUB_DEVICE_CODE varchar YES NULL 子设备编号
684 it_acs_recog_record_2025 SUB_DEVICE_NAME varchar YES NULL 子设备名称
685 it_acs_recog_record_2025 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
686 it_acs_recog_record_2025 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
687 it_acs_recog_record_2025 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
688 it_acs_recog_record_2025 FACE_IMAGE_PATH varchar YES NULL 抓拍照
689 it_acs_recog_record_2025 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
690 it_acs_recog_record_2025 SCORE decimal NO NULL 识别分数
691 it_acs_recog_record_2025 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
692 it_acs_recog_record_2025 RECOGNITION_TIME bigint NO NULL 识别时间
693 it_acs_recog_record_2025 GROUP_ID varchar YES NULL 用户所在底库编号
694 it_acs_recog_record_2025 FACE_ID varchar NO NULL 识别到对应的注册图片编号
695 it_acs_recog_record_2025 QUALITY_SCORE decimal YES NULL 人脸质量总分
696 it_acs_recog_record_2025 LOG_ID varchar NO NULL 请求唯一标志码
697 it_acs_recog_record_2025 TEMP_SCORE decimal YES NULL 体温
698 it_acs_recog_record_2025 MASK_SCORE decimal NO NULL 口罩得分
699 it_acs_recog_record_2025 TEMP_THRESHOLD decimal YES NULL 体温阈值
700 it_acs_recog_record_2025 CARD_TYPE varchar YES NULL 证件类型
701 it_acs_recog_record_2025 SOURCE tinyint YES NULL 来源 1 识别 2 人证
702 it_acs_recog_record_2025 TEMP_IMAGE_PATH varchar YES NULL 热像图
703 it_acs_recog_record_2025 REMARK varchar YES NULL 备注
704 it_acs_recog_record_2025 CREATE_TIME bigint YES NULL 创建时间
705 it_acs_recog_record_2025 CREATE_USER_ID varchar YES NULL 创建人
706 it_acs_recog_record_2025 LAST_UPDATE_TIME bigint YES NULL 修改时间
707 it_acs_recog_record_2025 LAST_UPDATE_USER_ID varchar YES NULL 修改人
708 it_acs_recog_record_2025 PERSON_LABEL_IDS text YES NULL 人员id列表
709 it_acs_recog_record_2026 ID varchar NO NULL PRI 主键
710 it_acs_recog_record_2026 PERSON_ID varchar YES NULL 人员id
711 it_acs_recog_record_2026 PERSON_NAME varchar YES NULL 人员名称
712 it_acs_recog_record_2026 BUSINESS_ID varchar NO NULL 企业ID
713 it_acs_recog_record_2026 DEVICE_ID varchar YES NULL 设备id
714 it_acs_recog_record_2026 DEVICE_CODE varchar NO NULL 设备编号
715 it_acs_recog_record_2026 DEVICE_NAME varchar YES NULL 设备名称
716 it_acs_recog_record_2026 THRESHOLD decimal YES NULL 阈值
717 it_acs_recog_record_2026 DISTRICT_ID varchar YES NULL 省市区id
718 it_acs_recog_record_2026 AREA_ID varchar YES NULL 设备区位id
719 it_acs_recog_record_2026 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
720 it_acs_recog_record_2026 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
721 it_acs_recog_record_2026 SUB_DEVICE_ID varchar YES NULL 子设备id
722 it_acs_recog_record_2026 SUB_DEVICE_CODE varchar YES NULL 子设备编号
723 it_acs_recog_record_2026 SUB_DEVICE_NAME varchar YES NULL 子设备名称
724 it_acs_recog_record_2026 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
725 it_acs_recog_record_2026 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
726 it_acs_recog_record_2026 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
727 it_acs_recog_record_2026 FACE_IMAGE_PATH varchar YES NULL 抓拍照
728 it_acs_recog_record_2026 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
729 it_acs_recog_record_2026 SCORE decimal NO NULL 识别分数
730 it_acs_recog_record_2026 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
731 it_acs_recog_record_2026 RECOGNITION_TIME bigint NO NULL 识别时间
732 it_acs_recog_record_2026 GROUP_ID varchar YES NULL 用户所在底库编号
733 it_acs_recog_record_2026 FACE_ID varchar NO NULL 识别到对应的注册图片编号
734 it_acs_recog_record_2026 QUALITY_SCORE decimal YES NULL 人脸质量总分
735 it_acs_recog_record_2026 LOG_ID varchar NO NULL 请求唯一标志码
736 it_acs_recog_record_2026 TEMP_SCORE decimal YES NULL 体温
737 it_acs_recog_record_2026 MASK_SCORE decimal NO NULL 口罩得分
738 it_acs_recog_record_2026 TEMP_THRESHOLD decimal YES NULL 体温阈值
739 it_acs_recog_record_2026 CARD_TYPE varchar YES NULL 证件类型
740 it_acs_recog_record_2026 SOURCE tinyint YES NULL 来源 1 识别 2 人证
741 it_acs_recog_record_2026 TEMP_IMAGE_PATH varchar YES NULL 热像图
742 it_acs_recog_record_2026 REMARK varchar YES NULL 备注
743 it_acs_recog_record_2026 CREATE_TIME bigint YES NULL 创建时间
744 it_acs_recog_record_2026 CREATE_USER_ID varchar YES NULL 创建人
745 it_acs_recog_record_2026 LAST_UPDATE_TIME bigint YES NULL 修改时间
746 it_acs_recog_record_2026 LAST_UPDATE_USER_ID varchar YES NULL 修改人
747 it_acs_recog_record_2026 PERSON_LABEL_IDS varchar YES NULL 人员id列表
748 it_acs_recog_record_2027 ID varchar NO NULL PRI 主键
749 it_acs_recog_record_2027 PERSON_ID varchar YES NULL 人员id
750 it_acs_recog_record_2027 PERSON_NAME varchar YES NULL 人员名称
751 it_acs_recog_record_2027 BUSINESS_ID varchar NO NULL 企业ID
752 it_acs_recog_record_2027 DEVICE_ID varchar YES NULL 设备id
753 it_acs_recog_record_2027 DEVICE_CODE varchar NO NULL 设备编号
754 it_acs_recog_record_2027 DEVICE_NAME varchar YES NULL 设备名称
755 it_acs_recog_record_2027 THRESHOLD decimal YES NULL 阈值
756 it_acs_recog_record_2027 DISTRICT_ID varchar YES NULL 省市区id
757 it_acs_recog_record_2027 AREA_ID varchar YES NULL 设备区位id
758 it_acs_recog_record_2027 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
759 it_acs_recog_record_2027 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
760 it_acs_recog_record_2027 SUB_DEVICE_ID varchar YES NULL 子设备id
761 it_acs_recog_record_2027 SUB_DEVICE_CODE varchar YES NULL 子设备编号
762 it_acs_recog_record_2027 SUB_DEVICE_NAME varchar YES NULL 子设备名称
763 it_acs_recog_record_2027 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
764 it_acs_recog_record_2027 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
765 it_acs_recog_record_2027 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
766 it_acs_recog_record_2027 FACE_IMAGE_PATH varchar YES NULL 抓拍照
767 it_acs_recog_record_2027 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
768 it_acs_recog_record_2027 SCORE decimal NO NULL 识别分数
769 it_acs_recog_record_2027 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
770 it_acs_recog_record_2027 RECOGNITION_TIME bigint NO NULL 识别时间
771 it_acs_recog_record_2027 GROUP_ID varchar YES NULL 用户所在底库编号
772 it_acs_recog_record_2027 FACE_ID varchar NO NULL 识别到对应的注册图片编号
773 it_acs_recog_record_2027 QUALITY_SCORE decimal YES NULL 人脸质量总分
774 it_acs_recog_record_2027 LOG_ID varchar NO NULL 请求唯一标志码
775 it_acs_recog_record_2027 TEMP_SCORE decimal YES NULL 体温
776 it_acs_recog_record_2027 MASK_SCORE decimal NO NULL 口罩得分
777 it_acs_recog_record_2027 TEMP_THRESHOLD decimal YES NULL 体温阈值
778 it_acs_recog_record_2027 CARD_TYPE varchar YES NULL 证件类型
779 it_acs_recog_record_2027 SOURCE tinyint YES NULL 来源 1 识别 2 人证
780 it_acs_recog_record_2027 TEMP_IMAGE_PATH varchar YES NULL 热像图
781 it_acs_recog_record_2027 REMARK varchar YES NULL 备注
782 it_acs_recog_record_2027 CREATE_TIME bigint YES NULL 创建时间
783 it_acs_recog_record_2027 CREATE_USER_ID varchar YES NULL 创建人
784 it_acs_recog_record_2027 LAST_UPDATE_TIME bigint YES NULL 修改时间
785 it_acs_recog_record_2027 LAST_UPDATE_USER_ID varchar YES NULL 修改人
786 it_acs_recog_record_2027 PERSON_LABEL_IDS varchar YES NULL 人员id列表
787 it_acs_recog_record_2028 ID varchar NO NULL PRI 主键
788 it_acs_recog_record_2028 PERSON_ID varchar YES NULL 人员id
789 it_acs_recog_record_2028 PERSON_NAME varchar YES NULL 人员名称
790 it_acs_recog_record_2028 BUSINESS_ID varchar NO NULL 企业ID
791 it_acs_recog_record_2028 DEVICE_ID varchar YES NULL 设备id
792 it_acs_recog_record_2028 DEVICE_CODE varchar NO NULL 设备编号
793 it_acs_recog_record_2028 DEVICE_NAME varchar YES NULL 设备名称
794 it_acs_recog_record_2028 THRESHOLD decimal YES NULL 阈值
795 it_acs_recog_record_2028 DISTRICT_ID varchar YES NULL 省市区id
796 it_acs_recog_record_2028 AREA_ID varchar YES NULL 设备区位id
797 it_acs_recog_record_2028 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
798 it_acs_recog_record_2028 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
799 it_acs_recog_record_2028 SUB_DEVICE_ID varchar YES NULL 子设备id
800 it_acs_recog_record_2028 SUB_DEVICE_CODE varchar YES NULL 子设备编号
801 it_acs_recog_record_2028 SUB_DEVICE_NAME varchar YES NULL 子设备名称
802 it_acs_recog_record_2028 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
803 it_acs_recog_record_2028 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
804 it_acs_recog_record_2028 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
805 it_acs_recog_record_2028 FACE_IMAGE_PATH varchar YES NULL 抓拍照
806 it_acs_recog_record_2028 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
807 it_acs_recog_record_2028 SCORE decimal NO NULL 识别分数
808 it_acs_recog_record_2028 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
809 it_acs_recog_record_2028 RECOGNITION_TIME bigint NO NULL 识别时间
810 it_acs_recog_record_2028 GROUP_ID varchar YES NULL 用户所在底库编号
811 it_acs_recog_record_2028 FACE_ID varchar NO NULL 识别到对应的注册图片编号
812 it_acs_recog_record_2028 QUALITY_SCORE decimal YES NULL 人脸质量总分
813 it_acs_recog_record_2028 LOG_ID varchar NO NULL 请求唯一标志码
814 it_acs_recog_record_2028 TEMP_SCORE decimal YES NULL 体温
815 it_acs_recog_record_2028 MASK_SCORE decimal NO NULL 口罩得分
816 it_acs_recog_record_2028 TEMP_THRESHOLD decimal YES NULL 体温阈值
817 it_acs_recog_record_2028 CARD_TYPE varchar YES NULL 证件类型
818 it_acs_recog_record_2028 SOURCE tinyint YES NULL 来源 1 识别 2 人证
819 it_acs_recog_record_2028 TEMP_IMAGE_PATH varchar YES NULL 热像图
820 it_acs_recog_record_2028 REMARK varchar YES NULL 备注
821 it_acs_recog_record_2028 CREATE_TIME bigint YES NULL 创建时间
822 it_acs_recog_record_2028 CREATE_USER_ID varchar YES NULL 创建人
823 it_acs_recog_record_2028 LAST_UPDATE_TIME bigint YES NULL 修改时间
824 it_acs_recog_record_2028 LAST_UPDATE_USER_ID varchar YES NULL 修改人
825 it_acs_recog_record_2028 PERSON_LABEL_IDS varchar YES NULL 人员id列表
826 it_acs_recog_record_2029 ID varchar NO NULL PRI 主键
827 it_acs_recog_record_2029 PERSON_ID varchar YES NULL 人员id
828 it_acs_recog_record_2029 PERSON_NAME varchar YES NULL 人员名称
829 it_acs_recog_record_2029 BUSINESS_ID varchar NO NULL 企业ID
830 it_acs_recog_record_2029 DEVICE_ID varchar YES NULL 设备id
831 it_acs_recog_record_2029 DEVICE_CODE varchar NO NULL 设备编号
832 it_acs_recog_record_2029 DEVICE_NAME varchar YES NULL 设备名称
833 it_acs_recog_record_2029 THRESHOLD decimal YES NULL 阈值
834 it_acs_recog_record_2029 DISTRICT_ID varchar YES NULL 省市区id
835 it_acs_recog_record_2029 AREA_ID varchar YES NULL 设备区位id
836 it_acs_recog_record_2029 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
837 it_acs_recog_record_2029 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
838 it_acs_recog_record_2029 SUB_DEVICE_ID varchar YES NULL 子设备id
839 it_acs_recog_record_2029 SUB_DEVICE_CODE varchar YES NULL 子设备编号
840 it_acs_recog_record_2029 SUB_DEVICE_NAME varchar YES NULL 子设备名称
841 it_acs_recog_record_2029 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
842 it_acs_recog_record_2029 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
843 it_acs_recog_record_2029 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
844 it_acs_recog_record_2029 FACE_IMAGE_PATH varchar YES NULL 抓拍照
845 it_acs_recog_record_2029 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
846 it_acs_recog_record_2029 SCORE decimal NO NULL 识别分数
847 it_acs_recog_record_2029 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
848 it_acs_recog_record_2029 RECOGNITION_TIME bigint NO NULL 识别时间
849 it_acs_recog_record_2029 GROUP_ID varchar YES NULL 用户所在底库编号
850 it_acs_recog_record_2029 FACE_ID varchar NO NULL 识别到对应的注册图片编号
851 it_acs_recog_record_2029 QUALITY_SCORE decimal YES NULL 人脸质量总分
852 it_acs_recog_record_2029 LOG_ID varchar NO NULL 请求唯一标志码
853 it_acs_recog_record_2029 TEMP_SCORE decimal YES NULL 体温
854 it_acs_recog_record_2029 MASK_SCORE decimal NO NULL 口罩得分
855 it_acs_recog_record_2029 TEMP_THRESHOLD decimal YES NULL 体温阈值
856 it_acs_recog_record_2029 CARD_TYPE varchar YES NULL 证件类型
857 it_acs_recog_record_2029 SOURCE tinyint YES NULL 来源 1 识别 2 人证
858 it_acs_recog_record_2029 TEMP_IMAGE_PATH varchar YES NULL 热像图
859 it_acs_recog_record_2029 REMARK varchar YES NULL 备注
860 it_acs_recog_record_2029 CREATE_TIME bigint YES NULL 创建时间
861 it_acs_recog_record_2029 CREATE_USER_ID varchar YES NULL 创建人
862 it_acs_recog_record_2029 LAST_UPDATE_TIME bigint YES NULL 修改时间
863 it_acs_recog_record_2029 LAST_UPDATE_USER_ID varchar YES NULL 修改人
864 it_acs_recog_record_2029 PERSON_LABEL_IDS varchar YES NULL 人员id列表
865 it_acs_recog_record_2030 ID varchar NO NULL PRI 主键
866 it_acs_recog_record_2030 PERSON_ID varchar YES NULL 人员id
867 it_acs_recog_record_2030 PERSON_NAME varchar YES NULL 人员名称
868 it_acs_recog_record_2030 BUSINESS_ID varchar NO NULL 企业ID
869 it_acs_recog_record_2030 DEVICE_ID varchar YES NULL 设备id
870 it_acs_recog_record_2030 DEVICE_CODE varchar NO NULL 设备编号
871 it_acs_recog_record_2030 DEVICE_NAME varchar YES NULL 设备名称
872 it_acs_recog_record_2030 THRESHOLD decimal YES NULL 阈值
873 it_acs_recog_record_2030 DISTRICT_ID varchar YES NULL 省市区id
874 it_acs_recog_record_2030 AREA_ID varchar YES NULL 设备区位id
875 it_acs_recog_record_2030 DEVICE_TYPE_ID varchar YES NULL 设备类型ID
876 it_acs_recog_record_2030 DEVICE_TYPE_NAME varchar YES NULL 设备类型名称
877 it_acs_recog_record_2030 SUB_DEVICE_ID varchar YES NULL 子设备id
878 it_acs_recog_record_2030 SUB_DEVICE_CODE varchar YES NULL 子设备编号
879 it_acs_recog_record_2030 SUB_DEVICE_NAME varchar YES NULL 子设备名称
880 it_acs_recog_record_2030 SUB_DEVICE_TYPE_ID varchar YES NULL 子设备类型ID
881 it_acs_recog_record_2030 SUB_DEVICE_TYPE_NAME varchar YES NULL 子设备类型名称
882 it_acs_recog_record_2030 REGISTER_IMAGE_PATH varchar YES NULL 注册照片
883 it_acs_recog_record_2030 FACE_IMAGE_PATH varchar YES NULL 抓拍照
884 it_acs_recog_record_2030 PANORAMA_IMAGE_PATH varchar YES NULL 全景照
885 it_acs_recog_record_2030 SCORE decimal NO NULL 识别分数
886 it_acs_recog_record_2030 RECOGNITION_RESULT tinyint YES NULL 识别结果 1:成功 2:失败
887 it_acs_recog_record_2030 RECOGNITION_TIME bigint NO NULL 识别时间
888 it_acs_recog_record_2030 GROUP_ID varchar YES NULL 用户所在底库编号
889 it_acs_recog_record_2030 FACE_ID varchar NO NULL 识别到对应的注册图片编号
890 it_acs_recog_record_2030 QUALITY_SCORE decimal YES NULL 人脸质量总分
891 it_acs_recog_record_2030 LOG_ID varchar NO NULL 请求唯一标志码
892 it_acs_recog_record_2030 TEMP_SCORE decimal YES NULL 体温
893 it_acs_recog_record_2030 MASK_SCORE decimal NO NULL 口罩得分
894 it_acs_recog_record_2030 TEMP_THRESHOLD decimal YES NULL 体温阈值
895 it_acs_recog_record_2030 CARD_TYPE varchar YES NULL 证件类型
896 it_acs_recog_record_2030 SOURCE tinyint YES NULL 来源 1 识别 2 人证
897 it_acs_recog_record_2030 TEMP_IMAGE_PATH varchar YES NULL 热像图
898 it_acs_recog_record_2030 REMARK varchar YES NULL 备注
899 it_acs_recog_record_2030 CREATE_TIME bigint YES NULL 创建时间
900 it_acs_recog_record_2030 CREATE_USER_ID varchar YES NULL 创建人
901 it_acs_recog_record_2030 LAST_UPDATE_TIME bigint YES NULL 修改时间
902 it_acs_recog_record_2030 LAST_UPDATE_USER_ID varchar YES NULL 修改人
903 it_acs_recog_record_2030 PERSON_LABEL_IDS varchar YES NULL 人员id列表
904 send_record_time time bigint NO NULL 时间戳
905 send_record_time type tinyint NO NULL 类型:1-通行记录,2-开门记录
906 send_record_timebak time bigint NO NULL 时间戳
907 send_record_timebak type tinyint NO NULL 类型:1-通行记录,2-开门记录
908 tenant_visitor_floor_policy id varchar NO NULL PRI 主键
909 tenant_visitor_floor_policy business_id varchar NO NULL MUL 机构/租户 ID
910 tenant_visitor_floor_policy policy_type varchar NO INTERSECT_ALLOWLIST 策略类型
911 tenant_visitor_floor_policy allow_zone_ids text YES NULL JSON 数组,zoneId 列表
912 tenant_visitor_floor_policy building_id varchar YES NULL 预留:楼栋维度;租户默认填 NULL
913 tenant_visitor_floor_policy enabled tinyint NO 1 1 启用 0 停用
914 tenant_visitor_floor_policy policy_version bigint NO 1 配置版本号
915 tenant_visitor_floor_policy remark varchar YES NULL
916 tenant_visitor_floor_policy created_by varchar YES NULL
917 tenant_visitor_floor_policy created_at bigint YES NULL
918 tenant_visitor_floor_policy updated_by varchar YES NULL
919 tenant_visitor_floor_policy updated_at bigint YES NULL
@@ -0,0 +1,82 @@
mysql: [Warning] Using a password on the command line interface can be insecure.
elevator_device PRIMARY ID 0 1
image_rule_ref image_rule_ref_include_labels_IDX include_labels 1 1
image_rule_ref image_rule_ref_include_organizations_IDX include_organizations 1 1
image_rule_ref PRIMARY id 0 1
it_acs_device_task PRIMARY id 0 1
it_acs_elevator_record IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record PRIMARY ID 0 1
it_acs_elevator_record RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2020 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2020 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2020 PRIMARY ID 0 1
it_acs_elevator_record_2020 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2021 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2021 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2021 PRIMARY ID 0 1
it_acs_elevator_record_2021 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2022 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2022 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2022 PRIMARY ID 0 1
it_acs_elevator_record_2022 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2023 it_acs_elevator_record_2023_RECOGNITION_TIME_IDX RECOGNITION_TIME 1 1
it_acs_elevator_record_2023 PRIMARY ID 0 1
it_acs_elevator_record_2023 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2024 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2024 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2024 PRIMARY ID 0 1
it_acs_elevator_record_2024 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2025 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2025 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2025 PRIMARY ID 0 1
it_acs_elevator_record_2025 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2026 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2026 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2026 PRIMARY ID 0 1
it_acs_elevator_record_2026 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2027 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2027 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2027 PRIMARY ID 0 1
it_acs_elevator_record_2027 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2028 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2028 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2028 PRIMARY ID 0 1
it_acs_elevator_record_2028 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2029 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2029 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2029 PRIMARY ID 0 1
it_acs_elevator_record_2029 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_elevator_record_2030 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
it_acs_elevator_record_2030 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
it_acs_elevator_record_2030 PRIMARY ID 0 1
it_acs_elevator_record_2030 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
it_acs_pass_rule IDX_BUSINESS_DEVICE BUSINESS_ID 1 1
it_acs_pass_rule IDX_BUSINESS_DEVICE ZONE_ID 1 2
it_acs_pass_rule IDX_BUSINESS_IMG_STORE BUSINESS_ID 1 1
it_acs_pass_rule IDX_BUSINESS_IMG_STORE IMAGE_STORE_ID 1 2
it_acs_pass_rule IDX_BUSINESS_TIME BUSINESS_ID 1 1
it_acs_pass_rule IDX_BUSINESS_TIME PASSABLE_TIME_ID 1 2
it_acs_pass_rule PRIMARY ID 0 1
it_acs_recog_record it_acs_recog_record_PERSON_ID_IDX PERSON_ID 1 1
it_acs_recog_record it_acs_recog_record_PERSON_ID_IDX DEVICE_ID 1 2
it_acs_recog_record it_acs_recog_record_PERSON_ID_IDX RECOGNITION_TIME 1 3
it_acs_recog_record it_acs_recog_record_PERSON_ID_IDX RECOGNITION_RESULT 1 4
it_acs_recog_record PRIMARY ID 0 1
it_acs_recog_record_2020 PRIMARY ID 0 1
it_acs_recog_record_2021 PRIMARY ID 0 1
it_acs_recog_record_2022 PRIMARY ID 0 1
it_acs_recog_record_2023 it_acs_recog_record_2023_RECOGNITION_TIME_IDX RECOGNITION_TIME 1 1
it_acs_recog_record_2023 PRIMARY ID 0 1
it_acs_recog_record_2024 PRIMARY ID 0 1
it_acs_recog_record_2025 PRIMARY ID 0 1
it_acs_recog_record_2026 PRIMARY ID 0 1
it_acs_recog_record_2027 PRIMARY ID 0 1
it_acs_recog_record_2028 PRIMARY ID 0 1
it_acs_recog_record_2029 PRIMARY ID 0 1
it_acs_recog_record_2030 PRIMARY ID 0 1
tenant_visitor_floor_policy idx_business_enabled business_id 1 1
tenant_visitor_floor_policy idx_business_enabled enabled 1 2
tenant_visitor_floor_policy PRIMARY id 0 1
tenant_visitor_floor_policy uk_biz_building business_id 0 1
tenant_visitor_floor_policy uk_biz_building building_id 0 2
1 mysql: [Warning] Using a password on the command line interface can be insecure.
2 elevator_device PRIMARY ID 0 1
3 image_rule_ref image_rule_ref_include_labels_IDX include_labels 1 1
4 image_rule_ref image_rule_ref_include_organizations_IDX include_organizations 1 1
5 image_rule_ref PRIMARY id 0 1
6 it_acs_device_task PRIMARY id 0 1
7 it_acs_elevator_record IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
8 it_acs_elevator_record IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
9 it_acs_elevator_record PRIMARY ID 0 1
10 it_acs_elevator_record RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
11 it_acs_elevator_record_2020 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
12 it_acs_elevator_record_2020 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
13 it_acs_elevator_record_2020 PRIMARY ID 0 1
14 it_acs_elevator_record_2020 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
15 it_acs_elevator_record_2021 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
16 it_acs_elevator_record_2021 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
17 it_acs_elevator_record_2021 PRIMARY ID 0 1
18 it_acs_elevator_record_2021 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
19 it_acs_elevator_record_2022 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
20 it_acs_elevator_record_2022 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
21 it_acs_elevator_record_2022 PRIMARY ID 0 1
22 it_acs_elevator_record_2022 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
23 it_acs_elevator_record_2023 it_acs_elevator_record_2023_RECOGNITION_TIME_IDX RECOGNITION_TIME 1 1
24 it_acs_elevator_record_2023 PRIMARY ID 0 1
25 it_acs_elevator_record_2023 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
26 it_acs_elevator_record_2024 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
27 it_acs_elevator_record_2024 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
28 it_acs_elevator_record_2024 PRIMARY ID 0 1
29 it_acs_elevator_record_2024 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
30 it_acs_elevator_record_2025 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
31 it_acs_elevator_record_2025 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
32 it_acs_elevator_record_2025 PRIMARY ID 0 1
33 it_acs_elevator_record_2025 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
34 it_acs_elevator_record_2026 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
35 it_acs_elevator_record_2026 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
36 it_acs_elevator_record_2026 PRIMARY ID 0 1
37 it_acs_elevator_record_2026 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
38 it_acs_elevator_record_2027 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
39 it_acs_elevator_record_2027 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
40 it_acs_elevator_record_2027 PRIMARY ID 0 1
41 it_acs_elevator_record_2027 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
42 it_acs_elevator_record_2028 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
43 it_acs_elevator_record_2028 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
44 it_acs_elevator_record_2028 PRIMARY ID 0 1
45 it_acs_elevator_record_2028 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
46 it_acs_elevator_record_2029 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
47 it_acs_elevator_record_2029 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
48 it_acs_elevator_record_2029 PRIMARY ID 0 1
49 it_acs_elevator_record_2029 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
50 it_acs_elevator_record_2030 IDX_BUSINESS_RECOGTIME BUSINESS_ID 1 1
51 it_acs_elevator_record_2030 IDX_BUSINESS_RECOGTIME RECOGNITION_TIME 1 2
52 it_acs_elevator_record_2030 PRIMARY ID 0 1
53 it_acs_elevator_record_2030 RECOGNITION_FACE_ID RECOGNITION_FACE_ID 1 1
54 it_acs_pass_rule IDX_BUSINESS_DEVICE BUSINESS_ID 1 1
55 it_acs_pass_rule IDX_BUSINESS_DEVICE ZONE_ID 1 2
56 it_acs_pass_rule IDX_BUSINESS_IMG_STORE BUSINESS_ID 1 1
57 it_acs_pass_rule IDX_BUSINESS_IMG_STORE IMAGE_STORE_ID 1 2
58 it_acs_pass_rule IDX_BUSINESS_TIME BUSINESS_ID 1 1
59 it_acs_pass_rule IDX_BUSINESS_TIME PASSABLE_TIME_ID 1 2
60 it_acs_pass_rule PRIMARY ID 0 1
61 it_acs_recog_record it_acs_recog_record_PERSON_ID_IDX PERSON_ID 1 1
62 it_acs_recog_record it_acs_recog_record_PERSON_ID_IDX DEVICE_ID 1 2
63 it_acs_recog_record it_acs_recog_record_PERSON_ID_IDX RECOGNITION_TIME 1 3
64 it_acs_recog_record it_acs_recog_record_PERSON_ID_IDX RECOGNITION_RESULT 1 4
65 it_acs_recog_record PRIMARY ID 0 1
66 it_acs_recog_record_2020 PRIMARY ID 0 1
67 it_acs_recog_record_2021 PRIMARY ID 0 1
68 it_acs_recog_record_2022 PRIMARY ID 0 1
69 it_acs_recog_record_2023 it_acs_recog_record_2023_RECOGNITION_TIME_IDX RECOGNITION_TIME 1 1
70 it_acs_recog_record_2023 PRIMARY ID 0 1
71 it_acs_recog_record_2024 PRIMARY ID 0 1
72 it_acs_recog_record_2025 PRIMARY ID 0 1
73 it_acs_recog_record_2026 PRIMARY ID 0 1
74 it_acs_recog_record_2027 PRIMARY ID 0 1
75 it_acs_recog_record_2028 PRIMARY ID 0 1
76 it_acs_recog_record_2029 PRIMARY ID 0 1
77 it_acs_recog_record_2030 PRIMARY ID 0 1
78 tenant_visitor_floor_policy idx_business_enabled business_id 1 1
79 tenant_visitor_floor_policy idx_business_enabled enabled 1 2
80 tenant_visitor_floor_policy PRIMARY id 0 1
81 tenant_visitor_floor_policy uk_biz_building business_id 0 1
82 tenant_visitor_floor_policy uk_biz_building building_id 0 2
@@ -0,0 +1,51 @@
=== tenant_visitor_floor_policy ===
+----------------------------------+----------------------------------+---------------------+------------------------+-------------+---------+----------------+--------------------------------------------------------------------------------------------------------------------------+------------+---------------+------------+---------------+
| id | business_id | policy_type | allow_zone_ids | building_id | enabled | policy_version | remark | created_by | created_at | updated_by | updated_at |
+----------------------------------+----------------------------------+---------------------+------------------------+-------------+---------+----------------+--------------------------------------------------------------------------------------------------------------------------+------------+---------------+------------+---------------+
| gf_vstr_policy_guangfa_fund_001x | 2524639890ba4f2cba9ba1a4eeaa4015 | INTERSECT_ALLOWLIST | ["605560545117995008"] | NULL | 1 | 1 | 广发基金:访客与 floorList 求交后仅保留 allowlist(默认仅 28F zone)。业务配置见产品方案。 | NULL | 1777437481000 | NULL | 1777437481000 |
+----------------------------------+----------------------------------+---------------------+------------------------+-------------+---------+----------------+--------------------------------------------------------------------------------------------------------------------------+------------+---------------+------------+---------------+
=== image_rule_ref ===
+--------------------+--------------------+-----------+--------------+--------------------+----------------+-----------------------+----------------+------------+------------+----------+---------------+------------------+----------------------------------+--------------------+---------------+
| id | zone_id | zone_name | name | person_id | include_labels | include_organizations | exclude_labels | is_default | start_time | end_time | create_time | last_update_time | business_id | parent_rule | person_delete |
+--------------------+--------------------+-----------+--------------+--------------------+----------------+-----------------------+----------------+------------+------------+----------+---------------+------------------+----------------------------------+--------------------+---------------+
| 999998333961596928 | 605560541473144832 | 6F | 默认规则 | 999998332677980160 | NULL | NULL | NULL | NULL | NULL | NULL | 1753154181887 | 1753154181887 | 2524639890ba4f2cba9ba1a4eeaa4015 | 606253695058837504 | 0 |
| 999998241204416512 | 605560542752407552 | 15F | 默认规则 | 999998240135180288 | NULL | NULL | NULL | NULL | NULL | NULL | 1753154159772 | 1753154159772 | 2524639890ba4f2cba9ba1a4eeaa4015 | 605594273001242624 | 0 |
| 999997067843825664 | 605560543834537984 | 20F | 默认规则 | 999997066723823616 | NULL | NULL | NULL | NULL | NULL | NULL | 1753153880021 | 1753153880021 | 2524639890ba4f2cba9ba1a4eeaa4015 | 605786764719685632 | 0 |
+--------------------+--------------------+-----------+--------------+--------------------+----------------+-----------------------+----------------+------------+------------+----------+---------------+------------------+----------------------------------+--------------------+---------------+
=== code_elevator_area ===
+--------------------+------+---------------+------------------+----------+--------------------+
| zone_id | code | create_time | last_update_time | is_first | parent_id |
+--------------------+------+---------------+------------------+----------+--------------------+
| 605560548330831872 | 0x2F | 1659120800248 | 1659120800248 | 0 | 605560539791228928 |
| 605560548167254016 | 0x2E | 1659120788063 | 1659120788063 | 0 | 605560539791228928 |
| 605560547923984384 | 0x2D | 1659120766841 | 1659120766841 | 0 | 605560539791228928 |
+--------------------+------+---------------+------------------+----------+--------------------+
=== elevator_device ===
+-----+---------------+------------------+-------------+----------------------------------+--------------------------+------------------+------------------------------------------+--------+-----------+---------------------+------------------+--------------------+---------------+----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------+--------------------+
| ID | create_time | last_update_time | delete_flag | device_id | device_name | device_code | device_type_name | status | area_name | current_building_id | current_building | current_floor_id | current_floor | elevator_floor_list | elevator_floor_id_list | business_id | area_id |
+-----+---------------+------------------+-------------+----------------------------------+--------------------------+------------------+------------------------------------------+--------+-----------+---------------------+------------------+--------------------+---------------+----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------+--------------------+
| 985 | 1767517871574 | 1770433604213 | 1 | 5f670e84771547bba65eb612f1eae85c | 28F办公电梯厅东 | 0166124040000056 | 云从-人脸识别终端CW-IS1330系列 | NULL | 28F | 605560539791228928 | 星河湾中心 | 605560545117995008 | 28F | 1F,30F,31F,32F,33F,34F,35F,36F,37F,38F | 605560545449345024,605560545596145664,605560545738752000,605560545893941248,605560546036547584,605560546242068480,605560546401452032,605560546552446976,605560546711830528,605560540432957440 | 2524639890ba4f2cba9ba1a4eeaa4015 | 605560545117995008 |
| 983 | 1766567284252 | 1766567284252 | 1 | dd16a57af07a4466a37fa863ece02d52 | 30F办公电梯厅东新 | 0166124040000034 | 云从-人脸识别终端CW-IS1330系列 | NULL | 30F | 605560539791228928 | 星河湾中心 | 605560545449345024 | 30F | 1F,28F,31F,32F,33F,34F,35F,36F,37F,38F | 605560545117995008,605560545596145664,605560545738752000,605560545893941248,605560546036547584,605560546242068480,605560546401452032,605560546552446976,605560546711830528,605560540432957440 | 2524639890ba4f2cba9ba1a4eeaa4015 | 605560545449345024 |
| 981 | 1765949061198 | 1765949061198 | 1 | 78df9e4433294dff975f743e8e8cd801 | 35F办公电梯厅东 | 0166124040000033 | 云从-人脸识别终端CW-IS1330系列 | NULL | 35F | 605560539791228928 | 星河湾中心 | 605560546242068480 | 35F | 1F,28F,30F,31F,32F,33F,34F,36F,37F,38F | 605560540432957440,605560545117995008,605560545449345024,605560545596145664,605560545738752000,605560545893941248,605560546036547584,605560546401452032,605560546552446976,605560546711830528 | 2524639890ba4f2cba9ba1a4eeaa4015 | 605560546242068480 |
+-----+---------------+------------------+-------------+----------------------------------+--------------------------+------------------+------------------------------------------+--------+-----------+---------------------+------------------+--------------------+---------------+----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------+--------------------+
=== it_acs_device_task ===
+--------------------+-------------+--------------+---------+
| id | ALL_DEVICES | BIND_DEVICES | IS_STOP |
+--------------------+-------------+--------------+---------+
| 995659162337738752 | 1 | 0 | 1 |
| 992730189924626432 | 1 | 0 | 1 |
| 992730084085411840 | 1 | 1 | 1 |
+--------------------+-------------+--------------+---------+
=== send_record_time ===
+---------------+------+
| time | type |
+---------------+------+
| 1776933769715 | 2 |
| 1687645800000 | 1 |
+---------------+------+
=== device_image_store ===
+--------------------+----------------------------------+
| building_id | image_store_id |
+--------------------+----------------------------------+
| 605560539791228928 | 7a83a5d268844c3a9ea0b22b32f8757b |
+--------------------+----------------------------------+
@@ -0,0 +1,34 @@
mysql: [Warning] Using a password on the command line interface can be insecure.
code_elevator_area 43 InnoDB 电梯编码(编码与地区编号)
device_image_store 0 InnoDB 楼栋图库关联表
elevator_device 126 InnoDB 派梯设备
image_rule_ref 69087 InnoDB 通行规则信息表
it_acs_device_task 525 InnoDB 派梯楼层绑定任务进度表
it_acs_elevator_record 0 InnoDB 开门记录表
it_acs_elevator_record_2020 0 InnoDB 开门记录表
it_acs_elevator_record_2021 0 InnoDB 开门记录表
it_acs_elevator_record_2022 364141 InnoDB 开门记录表
it_acs_elevator_record_2023 1295207 InnoDB 开门记录表
it_acs_elevator_record_2024 1859518 InnoDB 开门记录表
it_acs_elevator_record_2025 1847669 InnoDB 开门记录表
it_acs_elevator_record_2026 664815 InnoDB 开门记录表
it_acs_elevator_record_2027 0 InnoDB 开门记录表
it_acs_elevator_record_2028 0 InnoDB 开门记录表
it_acs_elevator_record_2029 0 InnoDB 开门记录表
it_acs_elevator_record_2030 0 InnoDB 开门记录表
it_acs_pass_rule 0 InnoDB 通行规则表
it_acs_recog_record 0 InnoDB 识别记录表
it_acs_recog_record_2020 0 InnoDB 识别记录表
it_acs_recog_record_2021 0 InnoDB 识别记录表
it_acs_recog_record_2022 735055 InnoDB 识别记录表
it_acs_recog_record_2023 5751205 InnoDB 识别记录表
it_acs_recog_record_2024 4046343 InnoDB 识别记录表
it_acs_recog_record_2025 3503798 InnoDB 识别记录表
it_acs_recog_record_2026 976180 InnoDB 识别记录表
it_acs_recog_record_2027 0 InnoDB 识别记录表
it_acs_recog_record_2028 0 InnoDB 识别记录表
it_acs_recog_record_2029 0 InnoDB 识别记录表
it_acs_recog_record_2030 0 InnoDB 识别记录表
send_record_time 2 InnoDB 记录推送时间戳
send_record_timebak 2 InnoDB 记录推送时间戳
tenant_visitor_floor_policy 1 InnoDB 租户访客默认楼层策略(与组织 floorList 求交)
1 mysql: [Warning] Using a password on the command line interface can be insecure.
2 code_elevator_area 43 InnoDB 电梯编码(编码与地区编号)
3 device_image_store 0 InnoDB 楼栋图库关联表
4 elevator_device 126 InnoDB 派梯设备
5 image_rule_ref 69087 InnoDB 通行规则信息表
6 it_acs_device_task 525 InnoDB 派梯楼层绑定任务进度表
7 it_acs_elevator_record 0 InnoDB 开门记录表
8 it_acs_elevator_record_2020 0 InnoDB 开门记录表
9 it_acs_elevator_record_2021 0 InnoDB 开门记录表
10 it_acs_elevator_record_2022 364141 InnoDB 开门记录表
11 it_acs_elevator_record_2023 1295207 InnoDB 开门记录表
12 it_acs_elevator_record_2024 1859518 InnoDB 开门记录表
13 it_acs_elevator_record_2025 1847669 InnoDB 开门记录表
14 it_acs_elevator_record_2026 664815 InnoDB 开门记录表
15 it_acs_elevator_record_2027 0 InnoDB 开门记录表
16 it_acs_elevator_record_2028 0 InnoDB 开门记录表
17 it_acs_elevator_record_2029 0 InnoDB 开门记录表
18 it_acs_elevator_record_2030 0 InnoDB 开门记录表
19 it_acs_pass_rule 0 InnoDB 通行规则表
20 it_acs_recog_record 0 InnoDB 识别记录表
21 it_acs_recog_record_2020 0 InnoDB 识别记录表
22 it_acs_recog_record_2021 0 InnoDB 识别记录表
23 it_acs_recog_record_2022 735055 InnoDB 识别记录表
24 it_acs_recog_record_2023 5751205 InnoDB 识别记录表
25 it_acs_recog_record_2024 4046343 InnoDB 识别记录表
26 it_acs_recog_record_2025 3503798 InnoDB 识别记录表
27 it_acs_recog_record_2026 976180 InnoDB 识别记录表
28 it_acs_recog_record_2027 0 InnoDB 识别记录表
29 it_acs_recog_record_2028 0 InnoDB 识别记录表
30 it_acs_recog_record_2029 0 InnoDB 识别记录表
31 it_acs_recog_record_2030 0 InnoDB 识别记录表
32 send_record_time 2 InnoDB 记录推送时间戳
33 send_record_timebak 2 InnoDB 记录推送时间戳
34 tenant_visitor_floor_policy 1 InnoDB 租户访客默认楼层策略(与组织 floorList 求交)
@@ -0,0 +1,27 @@
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/api/ApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppBusinessMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/ApplicationApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/ApplicationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppResMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthorizationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/dict/DictMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/dict/DictTypeMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/enterprise/EnterpriseMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/group/GroupInfoMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/group/GroupRoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/resource/ResourceApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/resource/ResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleAuthMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/service/ServiceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserAccountMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserApplicationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserGroupMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserResMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserRoleMapper.xml
+89
View File
@@ -0,0 +1,89 @@
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.xml
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/device/mapper/AcsDeviceTaskMapper.xml
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/device/mapper/AcsElevatorDeviceMapper.xml
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/device/mapper/DeviceImageStoreMapper.xml
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/mapper/TenantVisitorFloorPolicyMapper.xml
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/AcsElevatorRecordMapper.xml
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/AcsPassRuleMapper.xml
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/AcsRecogRecordMapper.xml
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/ImageRuleRefMapper.xml
./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/SendRecordTimeMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/api/ApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/AppApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/ApplicationApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/ApplicationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/AppResMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/authorization/AuthApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/authorization/AuthorizationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/authorization/AuthResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/dict/DictMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/dict/DictTypeMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/enterprise/EnterpriseMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/group/GroupInfoMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/group/GroupRoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/resource/ResourceApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/resource/ResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleAuthMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/service/ServiceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserAccountMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserApplicationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserGroupMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserResMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserRoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/api/ApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppBusinessMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/ApplicationApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/ApplicationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppResMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthorizationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/dict/DictMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/dict/DictTypeMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/enterprise/EnterpriseMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/group/GroupInfoMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/group/GroupRoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/resource/ResourceApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/resource/ResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleAuthMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/service/ServiceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserAccountMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserApplicationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserGroupMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserResMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserRoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/api/ApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/AppApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/ApplicationApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/ApplicationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/AppResMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/authorization/AuthApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/authorization/AuthorizationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/authorization/AuthResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/dict/DictMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/dict/DictTypeMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/enterprise/EnterpriseMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/group/GroupInfoMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/group/GroupRoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/resource/ResourceApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/resource/ResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleApiMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleAuthMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleResourceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/service/ServiceMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserAccountMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserApplicationMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserGroupMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserResMapper.xml
./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserRoleMapper.xml
+89
View File
@@ -0,0 +1,89 @@
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.xml
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/device/mapper/AcsDeviceTaskMapper.xml
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/device/mapper/AcsElevatorDeviceMapper.xml
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/device/mapper/DeviceImageStoreMapper.xml
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/mapper/TenantVisitorFloorPolicyMapper.xml
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/AcsElevatorRecordMapper.xml
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/AcsPassRuleMapper.xml it_acs_pass_rule
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/AcsRecogRecordMapper.xml
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/ImageRuleRefMapper.xml image_rule_ref
maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/SendRecordTimeMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/api/ApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/AppApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/ApplicationApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/ApplicationMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/AppResMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/authorization/AuthApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/authorization/AuthorizationMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/authorization/AuthResourceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/dict/DictMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/dict/DictTypeMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/enterprise/EnterpriseMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/group/GroupInfoMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/group/GroupRoleMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/resource/ResourceApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/resource/ResourceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleAuthMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleResourceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/service/ServiceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserAccountMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserApplicationMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserGroupMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserResMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserRoleMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/api/ApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppBusinessMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/ApplicationApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/ApplicationMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppResMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthorizationMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthResourceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/dict/DictMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/dict/DictTypeMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/enterprise/EnterpriseMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/group/GroupInfoMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/group/GroupRoleMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/resource/ResourceApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/resource/ResourceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleAuthMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleResourceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/service/ServiceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserAccountMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserApplicationMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserGroupMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserResMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserRoleMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/api/ApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/AppApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/ApplicationApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/ApplicationMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/AppResMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/authorization/AuthApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/authorization/AuthorizationMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/authorization/AuthResourceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/dict/DictMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/dict/DictTypeMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/enterprise/EnterpriseMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/group/GroupInfoMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/group/GroupRoleMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/resource/ResourceApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/resource/ResourceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleApiMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleAuthMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleResourceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/service/ServiceMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserAccountMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserApplicationMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserGroupMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserResMapper.xml
maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserRoleMapper.xml
1 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/codeElevatorArea/mapper/AcsElevatorCodeMapper.xml
2 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/device/mapper/AcsDeviceTaskMapper.xml
3 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/device/mapper/AcsElevatorDeviceMapper.xml
4 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/device/mapper/DeviceImageStoreMapper.xml
5 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/mapper/TenantVisitorFloorPolicyMapper.xml
6 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/AcsElevatorRecordMapper.xml
7 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/AcsPassRuleMapper.xml it_acs_pass_rule
8 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/AcsRecogRecordMapper.xml
9 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/ImageRuleRefMapper.xml image_rule_ref
10 maven-cw-elevator-application ./maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/SendRecordTimeMapper.xml
11 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/api/ApiMapper.xml
12 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/AppApiMapper.xml
13 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/ApplicationApiMapper.xml
14 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/ApplicationMapper.xml
15 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/application/AppResMapper.xml
16 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/authorization/AuthApiMapper.xml
17 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/authorization/AuthorizationMapper.xml
18 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/authorization/AuthResourceMapper.xml
19 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/dict/DictMapper.xml
20 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/dict/DictTypeMapper.xml
21 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/enterprise/EnterpriseMapper.xml
22 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/group/GroupInfoMapper.xml
23 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/group/GroupRoleMapper.xml
24 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/resource/ResourceApiMapper.xml
25 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/resource/ResourceMapper.xml
26 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleApiMapper.xml
27 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleAuthMapper.xml
28 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleMapper.xml
29 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/role/RoleResourceMapper.xml
30 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/service/ServiceMapper.xml
31 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserAccountMapper.xml
32 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserApplicationMapper.xml
33 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserGroupMapper.xml
34 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserMapper.xml
35 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserResMapper.xml
36 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/db2/user/UserRoleMapper.xml
37 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/api/ApiMapper.xml
38 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppApiMapper.xml
39 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppBusinessMapper.xml
40 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/ApplicationApiMapper.xml
41 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/ApplicationMapper.xml
42 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/application/AppResMapper.xml
43 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthApiMapper.xml
44 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthorizationMapper.xml
45 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/authorization/AuthResourceMapper.xml
46 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/dict/DictMapper.xml
47 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/dict/DictTypeMapper.xml
48 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/enterprise/EnterpriseMapper.xml
49 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/group/GroupInfoMapper.xml
50 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/group/GroupRoleMapper.xml
51 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/resource/ResourceApiMapper.xml
52 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/resource/ResourceMapper.xml
53 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleApiMapper.xml
54 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleAuthMapper.xml
55 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleMapper.xml
56 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/role/RoleResourceMapper.xml
57 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/service/ServiceMapper.xml
58 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserAccountMapper.xml
59 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserApplicationMapper.xml
60 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserGroupMapper.xml
61 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserMapper.xml
62 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserResMapper.xml
63 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/mysql/user/UserRoleMapper.xml
64 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/api/ApiMapper.xml
65 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/AppApiMapper.xml
66 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/ApplicationApiMapper.xml
67 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/ApplicationMapper.xml
68 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/application/AppResMapper.xml
69 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/authorization/AuthApiMapper.xml
70 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/authorization/AuthorizationMapper.xml
71 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/authorization/AuthResourceMapper.xml
72 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/dict/DictMapper.xml
73 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/dict/DictTypeMapper.xml
74 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/enterprise/EnterpriseMapper.xml
75 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/group/GroupInfoMapper.xml
76 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/group/GroupRoleMapper.xml
77 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/resource/ResourceApiMapper.xml
78 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/resource/ResourceMapper.xml
79 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleApiMapper.xml
80 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleAuthMapper.xml
81 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleMapper.xml
82 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/role/RoleResourceMapper.xml
83 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/service/ServiceMapper.xml
84 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserAccountMapper.xml
85 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserApplicationMapper.xml
86 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserGroupMapper.xml
87 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserMapper.xml
88 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserResMapper.xml
89 maven-cwos-resource ./maven-cwos-resource/cwos-component-resource-data/src/main/java/cn/cloudwalk/data/resource/mapper/oracle/user/UserRoleMapper.xml
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,396 @@
# 数据库表结构参考手册 — 实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 走查全部 5 个数据库(2 库直连 + 3 库代码推导),输出带 Mermaid ER 图 + 脱敏样本数据的 Markdown 参考手册。
**Architecture:** 分三层执行 — 数据库查询层(直连 INFORMATION_SCHEMA + SELECT 样本)、代码扫描层(并行读取全部 MyBatis Mapper XML 提取表/列/JOIN)、文档生成层(交叉验证 + 组装 Markdown)。直连库与代码扫描完全并行。
**Tech Stack:** MySQL CLI (`mysql`), Bash, Python 3JSON 缓存), Mermaid erDiagram
**Spec:** `docs/superpowers/specs/2026-05-01-database-schema-reference-design.md`
---
## 前置检查
- [ ] **Step 0: 确认数据库可达**
```bash
mysql -h 192.168.3.12 -P 3307 -u root -p123456 -e "SELECT VERSION(); SHOW DATABASES LIKE '%component%'; SHOW DATABASES LIKE '%elevator%';"
```
期望输出: MySQL 版本号 + `component-organization``cw-elevator-application` 两个库存在。
> 若失败:全量降级为代码推导模式(见 Task 4 备选路径)。
---
### Task 1: 采集组件组织库 schema + 样本
**Files:**
- Create: `docs/superpowers/data/component-organization/schema_raw.json`
- Create: `docs/superpowers/data/component-organization/tables.json`
- Create: `docs/superpowers/data/component-organization/samples/`
- [ ] **Step 1: 导出表清单**
```bash
mkdir -p docs/superpowers/data/component-organization/samples
mysql -h 192.168.3.12 -P 3307 -u root -p123456 component-organization -N -e \
"SELECT TABLE_NAME, IFNULL(TABLE_ROWS,0), ENGINE, IFNULL(TABLE_COMMENT,'') \
FROM INFORMATION_SCHEMA.TABLES \
WHERE TABLE_SCHEMA='component-organization' AND TABLE_TYPE='BASE TABLE' \
ORDER BY TABLE_NAME;" > docs/superpowers/data/component-organization/tables.tsv
```
- [ ] **Step 2: 导出全部列定义**
```bash
mysql -h 192.168.3.12 -P 3307 -u root -p123456 component-organization -N -e \
"SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, IFNULL(COLUMN_DEFAULT,'NULL'), COLUMN_KEY, EXTRA, IFNULL(COLUMN_COMMENT,'') \
FROM INFORMATION_SCHEMA.COLUMNS \
WHERE TABLE_SCHEMA='component-organization' AND TABLE_NAME NOT LIKE 'QRTZ_%' AND TABLE_NAME NOT LIKE 'quartz_%' \
ORDER BY TABLE_NAME, ORDINAL_POSITION;" > docs/superpowers/data/component-organization/columns.tsv
```
- [ ] **Step 3: 导出索引**
```bash
mysql -h 192.168.3.12 -P 3307 -u root -p123456 component-organization -N -e \
"SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, NON_UNIQUE, SEQ_IN_INDEX \
FROM INFORMATION_SCHEMA.STATISTICS \
WHERE TABLE_SCHEMA='component-organization' \
ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;" > docs/superpowers/data/component-organization/indexes.tsv
```
- [ ] **Step 4: 逐表采集样本(每表 3 行)**
```bash
# 读取表清单,排除系统表,对每张表执行 SELECT * LIMIT 3
while IFS=$'\t' read -r table_name rest; do
if [[ "$table_name" != QRTZ_* ]] && [[ "$table_name" != quartz_* ]]; then
echo "--- Extracting: $table_name ---"
mysql -h 192.168.3.12 -P 3307 -u root -p123456 component-organization -t -e \
"SELECT * FROM \`$table_name\` ORDER BY 1 DESC LIMIT 3;" \
> "docs/superpowers/data/component-organization/samples/${table_name}.txt" 2>&1
fi
done < <(cut -f1 docs/superpowers/data/component-organization/tables.tsv)
```
- [ ] **Step 5: 提交中间产物**
```bash
git add docs/superpowers/data/component-organization/
git commit -m "data: add component-organization schema raw dump and samples"
```
---
### Task 2: 采集电梯应用库 schema + 样本
**Files:**
- Create: `docs/superpowers/data/cw-elevator-application/schema_raw.json`
- Create: `docs/superpowers/data/cw-elevator-application/tables.json`
- Create: `docs/superpowers/data/cw-elevator-application/samples/`
- [ ] **Step 1: 导出表清单**
```bash
mkdir -p docs/superpowers/data/cw-elevator-application/samples
mysql -h 192.168.3.12 -P 3307 -u root -p123456 cw-elevator-application -N -e \
"SELECT TABLE_NAME, IFNULL(TABLE_ROWS,0), ENGINE, IFNULL(TABLE_COMMENT,'') \
FROM INFORMATION_SCHEMA.TABLES \
WHERE TABLE_SCHEMA='cw-elevator-application' AND TABLE_TYPE='BASE TABLE' \
ORDER BY TABLE_NAME;" > docs/superpowers/data/cw-elevator-application/tables.tsv
```
- [ ] **Step 2: 导出全部列定义**
```bash
mysql -h 192.168.3.12 -P 3307 -u root -p123456 cw-elevator-application -N -e \
"SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, IFNULL(COLUMN_DEFAULT,'NULL'), COLUMN_KEY, EXTRA, IFNULL(COLUMN_COMMENT,'') \
FROM INFORMATION_SCHEMA.COLUMNS \
WHERE TABLE_SCHEMA='cw-elevator-application' AND TABLE_NAME NOT LIKE 'QRTZ_%' AND TABLE_NAME NOT LIKE 'quartz_%' \
ORDER BY TABLE_NAME, ORDINAL_POSITION;" > docs/superpowers/data/cw-elevator-application/columns.tsv
```
- [ ] **Step 3: 导出索引**
```bash
mysql -h 192.168.3.12 -P 3307 -u root -p123456 cw-elevator-application -N -e \
"SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, NON_UNIQUE, SEQ_IN_INDEX \
FROM INFORMATION_SCHEMA.STATISTICS \
WHERE TABLE_SCHEMA='cw-elevator-application' \
ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;" > docs/superpowers/data/cw-elevator-application/indexes.tsv
```
- [ ] **Step 4: 逐表采集样本(每表 3 行)**
```bash
while IFS=$'\t' read -r table_name rest; do
if [[ "$table_name" != QRTZ_* ]] && [[ "$table_name" != quartz_* ]]; then
echo "--- Extracting: $table_name ---"
mysql -h 192.168.3.12 -P 3307 -u root -p123456 cw-elevator-application -t -e \
"SELECT * FROM \`$table_name\` ORDER BY 1 DESC LIMIT 3;" \
> "docs/superpowers/data/cw-elevator-application/samples/${table_name}.txt" 2>&1
fi
done < <(cut -f1 docs/superpowers/data/cw-elevator-application/tables.tsv)
```
- [ ] **Step 5: 提交中间产物**
```bash
git add docs/superpowers/data/cw-elevator-application/
git commit -m "data: add cw-elevator-application schema raw dump and samples"
```
---
### Task 3: 扫描所有 MyBatis Mapper XML 提取表/列/JOIN
**Files:**
- Create: `docs/superpowers/data/mapper_tables.tsv`
- [ ] **Step 1: 枚举所有 Mapper XML 文件**
```bash
find ./maven-cw-elevator-application ./maven-cwos-resource ./maven-ninca-crk ./maven-ninca-qk-alarm \
-name "*Mapper.xml" -path "*/src/main/*" 2>/dev/null | sort \
> docs/superpowers/data/mapper_files.txt
wc -l docs/superpowers/data/mapper_files.txt
```
期望输出: ~80+ 个 Mapper XML 文件。
- [ ] **Step 2: 从 Mapper XML 提取 INSERT/UPDATE/FROM 表名**
```bash
# 提取 INSERT INTO / UPDATE / FROM / JOIN 后的表名
> docs/superpowers/data/mapper_tables.tsv
while IFS= read -r xmlfile; do
module=$(echo "$xmlfile" | cut -d'/' -f2)
tablenames=$(grep -oP '(INSERT\s+INTO\s+|UPDATE\s+|FROM\s+|JOIN\s+)\s*\`?\K[a-z_][a-z0-9_]*' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
echo -e "$module\t$xmlfile\t$tablenames"
done < docs/superpowers/data/mapper_files.txt > docs/superpowers/data/mapper_tables.tsv
```
- [ ] **Step 3: 提取 resultMap 列映射**
对每个 Mapper XML,读取 `<resultMap>` 中的 `<result column="..." property="...">` 提取列名。用下面脚本:
```bash
> docs/superpowers/data/mapper_columns.tsv
while IFS= read -r xmlfile; do
cols=$(grep -oP '<result\s+column="\K[^"]+' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
ids=$(grep -oP '<id\s+column="\K[^"]+' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
echo -e "${xmlfile}\t${ids}|${cols}"
done < docs/superpowers/data/mapper_files.txt > docs/superpowers/data/mapper_columns.tsv
```
- [ ] **Step 4: 提取 JOIN 关系**
```bash
> docs/superpowers/data/mapper_joins.tsv
while IFS= read -r xmlfile; do
joins=$(grep -oP '(LEFT\s+|RIGHT\s+|INNER\s+)?JOIN\s+\`?\K[a-z_][a-z0-9_]*\s+ON\s+\K[^;]+' "$xmlfile" 2>/dev/null | tr '\n' '|')
if [ -n "$joins" ]; then
echo -e "${xmlfile}\t${joins}"
fi
done < docs/superpowers/data/mapper_files.txt > docs/superpowers/data/mapper_joins.tsv
```
- [ ] **Step 5: 扫描 ShardingSphere 分表配置**
```bash
grep -r "actual-data-nodes\|sharding-column\|table-strategy" \
--include="*.properties" --include="*.yml" --include="*.yaml" \
./maven-cw-elevator-application/ ./maven-ninca-crk/ 2>/dev/null \
> docs/superpowers/data/sharding_config.txt
```
- [ ] **Step 6: 提交**
```bash
git add docs/superpowers/data/mapper_*.tsv docs/superpowers/data/mapper_files.txt docs/superpowers/data/sharding_config.txt
git commit -m "data: add MyBatis mapper table/column/join extraction"
```
---
### Task 4: 代码推导不可达库的表结构
**Files:**
- Create: `docs/superpowers/data/ninca-crk-std/mapper_tables.tsv`
- Create: `docs/superpowers/data/alarm-deploy/mapper_tables.tsv`
- Create: `docs/superpowers/data/cwos-resource/mapper_tables.tsv`
**ninca_crk_std****alarm_deploy** 的 MyBatis mapper 路径在 `application.properties` 中声明:
- ninca-crk: `classpath*:cn/cloudwalk/data/**/mysql/*.xml,classpath*:cn/cloudwalk/task/data/**/mysql/*.xml`
- alarm: `classpath:cn/cloudwalk/data/**/mysql/*.xml`
- cwos-resource: Mapper XML 已在 Task 3 中扫描
- [ ] **Step 1: 从 ninca-crk 的 Mapper XML 提取表信息**
```bash
# ninca-crk 的 Mapper XML 位于 src/main/java 下(非 resources/mapper
find ./maven-ninca-crk -name "*.xml" -path "*/mysql/*" 2>/dev/null | sort > docs/superpowers/data/ninca-crk-std/mapper_files.txt
while IFS= read -r xmlfile; do
tablenames=$(grep -oP '(INSERT\s+INTO\s+|UPDATE\s+|FROM\s+|JOIN\s+)\s*\`?\K[a-z_][a-z0-9_]*' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
echo -e "ninca-crk-std\t$xmlfile\t$tablenames"
done < docs/superpowers/data/ninca-crk-std/mapper_files.txt > docs/superpowers/data/ninca-crk-std/mapper_tables.tsv
```
- [ ] **Step 2: 从 alarm 的 Mapper XML 提取表信息**
```bash
find ./maven-ninca-qk-alarm -name "*.xml" -path "*/mysql/*" 2>/dev/null | sort > docs/superpowers/data/alarm-deploy/mapper_files.txt
while IFS= read -r xmlfile; do
tablenames=$(grep -oP '(INSERT\s+INTO\s+|UPDATE\s+|FROM\s+|JOIN\s+)\s*\`?\K[a-z_][a-z0-9_]*' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
echo -e "alarm-deploy\t$xmlfile\t$tablenames"
done < docs/superpowers/data/alarm-deploy/mapper_files.txt > docs/superpowers/data/alarm-deploy/mapper_tables.tsv
```
- [ ] **Step 3: 从 cwos-resource 的 Mapper XML 提取表信息**
```bash
# cwos-resource 有 db2/mysql/oracle 三个方言目录,以 mysql/ 为准
find ./maven-cwos-resource -name "*.xml" -path "*/mysql/*" 2>/dev/null | sort > docs/superpowers/data/cwos-resource/mapper_files.txt
while IFS= read -r xmlfile; do
tablenames=$(grep -oP '(INSERT\s+INTO\s+|UPDATE\s+|FROM\s+|JOIN\s+)\s*\`?\K[a-z_][a-z0-9_]*' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
echo -e "cwos-resource\t$xmlfile\t$tablenames"
done < docs/superpowers/data/cwos-resource/mapper_files.txt > docs/superpowers/data/cwos-resource/mapper_tables.tsv
```
- [ ] **Step 4: 提交**
```bash
git add docs/superpowers/data/ninca-crk-std/ docs/superpowers/data/alarm-deploy/ docs/superpowers/data/cwos-resource/
git commit -m "data: add code-derived table info for unreachable databases"
```
---
### Task 5: 交叉验证与生成最终 Markdown 文档
**Files:**
- Create: `docs/superpowers/specs/2026-05-01-database-schema-reference.md`(最终产物)
此任务通过 subagent 执行——将 Task 1-4 采集的原始数据 + 现有架构文档 + Mapper 扫描结果汇总为最终手册。
- [ ] **Step 1: 交付 subagent 生成文档**
委托 `deep` agent,传入以下 prompt
```
TASK: 根据以下原始数据生成数据库表结构参考手册 Markdown 文件。
EXPECTED OUTCOME:
- 文件写入 docs/superpowers/specs/2026-05-01-database-schema-reference.md
- 包含 9 个章节(见设计说明 §2)
- 每库有 Mermaid erDiagram ER 图
- 每表有列清单(列名、类型、可空、键、注释)
- 可连库的表有脱敏样本数据(Markdown 表格,≤3 行)
- 跨库关系总图
- 代码-表映射索引
REQUIRED TOOLS: Read, Write, Bash
MUST DO:
1. 读取设计说明: docs/superpowers/specs/2026-05-01-database-schema-reference-design.md
2. 读取现有架构文档: docs/architecture/租户组织人员访客-数据模型与用例.md
3. 读取 Task 1-2 的 schema 原始数据: docs/superpowers/data/component-organization/ 和 cw-elevator-application/ 下的 tables.tsv, columns.tsv, indexes.tsv
4. 读取 Task 1-2 的样本数据: samples/ 目录下各 .txt 文件
5. 读取 Task 3-4 的 Mapper 扫描结果: docs/superpowers/data/mapper_tables.tsv, mapper_columns.tsv, mapper_joins.tsv
6. 对每张表应用脱敏规则(设计说明 §5.3):姓名截断、手机号截断、IP替换、密码列跳过、时间戳转换
7. 按设计说明 §4 规范绘制 Mermaid ER 图:业务关键列、三种关系线(约束/JOIN/跨库)、subgraph 分包
8. 交叉验证:列出「库中有但代码无 Mapper」的表(标注为运维/外部表),对比 DDL 与实际列
9. 对不可达库(ninca-crk-std, alarm-deploy, cwos-resource)显式标注「⚠️ 未连接生产库,从代码推导」
10. Mermaid 语法必须可渲染(erDiagram 关键字、正确的 {} 语法、||--o{ 关系线)
11. 文档中不出现 "TBD"、"TODO"、"待补充"
MUST NOT DO:
- 不要编造未在原始数据中出现的表名或列名
- 不要对不可达库声称有样本数据
- 不要包含系统表(QRTZ_*, quartz_*
- 不要包含未脱敏的姓名/手机号/IP
CONTEXT:
- 仓库路径: /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/源码
- 数据库环境: 192.168.3.12:3307 (MySQL), user=root, password=123456
- 数据库: component-organization, cw-elevator-application (直连); ninca_crk_std, alarm_deploy, cwos_resource (代码推导)
- 现有架构文档已有 organization 库 5 表 + elevator 库 2 表的 ER 模型,以此为起点扩展
- MyBatis Mapper XML 路径已在 mapper_files.txt 中列出
```
- [ ] **Step 2: 验证文档完整性**
```bash
# 检查文档存在且非空
wc -l docs/superpowers/specs/2026-05-01-database-schema-reference.md
# 检查 Mermaid 块数量(应有 ≥5 个 erDiagram 块)
grep -c 'erDiagram' docs/superpowers/specs/2026-05-01-database-schema-reference.md
# 检查无占位符
! grep -n 'TBD\|TODO\|待补充' docs/superpowers/specs/2026-05-01-database-schema-reference.md
echo "Exit: $?"
```
期望: 文件 ≥ 500 行,≥ 5 个 erDiagram 块,无占位符匹配(exit 0)。
- [ ] **Step 3: 提交**
```bash
git add docs/superpowers/specs/2026-05-01-database-schema-reference.md
git commit -m "docs: add full database schema reference manual with ER diagrams and sample data"
```
---
### Task 6: 收尾清理
- [ ] **Step 1: 取消中间数据跟踪(可选)**
若中间数据不应入库,更新 `.gitignore`
```bash
# 如需排除原始数据
echo "docs/superpowers/data/" >> .gitignore
```
- [ ] **Step 2: 最终提交**
```bash
git add -A
git status
git commit -m "chore: finalize database schema reference delivery"
```
---
## 备选路径
### 若 192.168.3.12 不可达
跳过 Task 1 和 Task 2。所有表结构从代码 Mapper XML 推导,标注「⚠️ 数据库不可达,全部信息从代码推导」。在 Task 5 的 subagent prompt 中移除「读取样本数据」步骤。
### 若某个库的 Mapper XML 为空
对应章节仅输出「该模块未发现 MyBatis Mapper XML,无法从代码推导表结构」,不生成 ER 图。
---
## 完成检查清单
- [ ] 产物文件 `docs/superpowers/specs/2026-05-01-database-schema-reference.md` 存在且 ≥ 500 行
- [ ] 5 个数据库各有独立章节 + ER 图
- [ ] 跨库关系总图存在
- [ ] 代码-表映射索引覆盖全部 Mapper XML
- [ ] 可连库的每张表有 1-3 行脱敏样本
- [ ]`TBD` / `TODO` / `待补充`
- [ ] 所有 Mermaid 块语法正确可渲染
- [ ] 脱敏规则已应用(姓名截断、手机号截断等)
@@ -0,0 +1,647 @@
# 租户访客楼层策略 org_id 粒度修复 — 实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:**`tenant_visitor_floor_policy` 的策略键从 `business_id` 改为 `org_id`,实现二选一语义(有策略用 allow,无策略用 floorList),修复 F1/F2/W2 问题。
**Architecture:** DDL 先上线(加列+改约束,不影响行为)→ 代码切换(Mapper/DAO/Service 三层的 business_id → org_id + 二选一逻辑)→ 数据迁移(运维 SQL 填 org_id)。整体改动控制在 7 个文件内,最小风险。
**Tech Stack:** Java 8, Spring Boot, MyBatis, MySQL 5.7
**Spec:** `docs/superpowers/specs/2026-05-01-org-id-policy-fix-design.md`
---
## 前置条件
- [ ] **Step 0: 确认分支与编译环境**
```bash
git checkout -b fix/org-id-policy-granularity
cd maven-cw-elevator-application && mvn formatter:validate -Dformatter-maven-plugin.version=2.16.0
```
期望: formatter 校验通过。
---
### Task 1: DDL — 策略表结构变更
**Files:**
- Create: `docs/sql/tenant_visitor_floor_policy_v2.sql`
- [ ] **Step 1: 编写 DDL 脚本**
```sql
-- 租户访客楼层策略:org_id 粒度修复
-- 执行顺序:先 DDL → 数据迁移(Task 5)→ 发应用包
-- 回滚:DROP INDEX uk_org_building, DROP COLUMN org_id, ADD UNIQUE KEY uk_biz_building (business_id, building_id)
USE `cw-elevator-application`;
-- 1. 新增 org_id 列
ALTER TABLE tenant_visitor_floor_policy
ADD COLUMN org_id VARCHAR(32) NULL COMMENT '组织节点ID(cw_is_organization.ID)'
AFTER business_id;
-- 2. 替换唯一约束(business_id → org_id
ALTER TABLE tenant_visitor_floor_policy
DROP INDEX uk_biz_building,
ADD UNIQUE KEY uk_org_building (org_id, building_id);
-- 3. 标记 business_id 为废弃
ALTER TABLE tenant_visitor_floor_policy
MODIFY COLUMN business_id VARCHAR(64) NULL COMMENT 'DEPRECATED: 已废弃,以 org_id 为准';
-- 验证
SELECT COLUMN_NAME, COLUMN_KEY, COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'cw-elevator-application'
AND TABLE_NAME = 'tenant_visitor_floor_policy'
ORDER BY ORDINAL_POSITION;
```
- [ ] **Step 2: 在开发库执行 DDL**
```bash
mysql -h 192.168.3.12 -P 3307 -u root -p123456 cw-elevator-application < docs/sql/tenant_visitor_floor_policy_v2.sql
```
期望: 无错误,`org_id` 列存在,`uk_org_building` 索引存在,`uk_biz_building` 已删除。
- [ ] **Step 3: 提交**
```bash
git add docs/sql/tenant_visitor_floor_policy_v2.sql
git commit -m "feat: add org_id column and uk_org_building constraint to tenant_visitor_floor_policy"
```
---
### Task 2: DTO — 新增 orgId 字段
**Files:**
- Modify: `maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/dto/TenantVisitorFloorPolicyDto.java`
- [ ] **Step 1: 添加 orgId 字段 + getter/setter**
`businessId` 的 setter 之后插入:
```java
// 新增字段
private String orgId;
public String getOrgId() {
return orgId;
}
public void setOrgId(String orgId) {
this.orgId = orgId;
}
```
> 注意:`businessId` 字段保留不删,兼容旧序列化。
- [ ] **Step 2: 验证编译**
```bash
cd maven-cw-elevator-application && mvn compile -pl cw-elevator-application-data -am -DskipTests
```
期望: BUILD SUCCESS。
- [ ] **Step 3: 提交**
```bash
git add maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/dto/TenantVisitorFloorPolicyDto.java
git commit -m "feat: add orgId field to TenantVisitorFloorPolicyDto"
```
---
### Task 3: Mapper — SQL 切换 business_id → org_id
**Files:**
- Modify: `maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/mapper/TenantVisitorFloorPolicyMapper.xml`
- Modify: `maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/mapper/TenantVisitorFloorPolicyMapper.java`
- [ ] **Step 1: 修改 Mapper XML — WHERE 条件 + 映射**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.cloudwalk.elevator.person.mapper.TenantVisitorFloorPolicyMapper">
<select id="selectEnabledByOrgId" resultType="cn.cloudwalk.elevator.person.dto.TenantVisitorFloorPolicyDto">
SELECT id,
org_id AS orgId,
policy_type AS policyType,
allow_zone_ids AS allowZoneIds,
building_id AS buildingId,
enabled AS enabled,
policy_version AS policyVersion
FROM tenant_visitor_floor_policy
WHERE org_id = #{orgId,jdbcType=VARCHAR}
AND enabled = 1
AND policy_type = 'INTERSECT_ALLOWLIST'
AND (building_id IS NULL OR building_id = '')
ORDER BY updated_at DESC, policy_version DESC
LIMIT 1
</select>
<!-- 旧方法保留作历史参考(可选删除)
<select id="selectEnabledTenantDefault" resultType="...">
... business_id ...
</select>
-->
</mapper>
```
- [ ] **Step 2: 修改 Mapper 接口**
```java
package cn.cloudwalk.elevator.person.mapper;
import cn.cloudwalk.elevator.person.dto.TenantVisitorFloorPolicyDto;
import org.apache.ibatis.annotations.Param;
public interface TenantVisitorFloorPolicyMapper {
/**
* 按组织节点 ID 查询启用中的 INTERSECT_ALLOWLIST 策略(building_id 为空)。
*/
TenantVisitorFloorPolicyDto selectEnabledByOrgId(@Param("orgId") String orgId);
// 旧方法(废弃,保留以兼容编译)
// TenantVisitorFloorPolicyDto selectEnabledTenantDefault(@Param("businessId") String businessId);
}
```
- [ ] **Step 3: 验证编译**
```bash
cd maven-cw-elevator-application && mvn compile -pl cw-elevator-application-data -am -DskipTests
```
期望: BUILD SUCCESS。
- [ ] **Step 4: 提交**
```bash
git add maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/mapper/TenantVisitorFloorPolicyMapper.xml
git add maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/mapper/TenantVisitorFloorPolicyMapper.java
git commit -m "feat: change policy query from business_id to org_id in TenantVisitorFloorPolicyMapper"
```
---
### Task 4: DAO — 接口与实现切换
**Files:**
- Modify: `maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/dao/TenantVisitorFloorPolicyDao.java`
- Modify: `maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/impl/TenantVisitorFloorPolicyDaoImpl.java`
- [ ] **Step 1: 修改 DAO 接口**
```java
package cn.cloudwalk.elevator.person.dao;
import cn.cloudwalk.elevator.person.dto.TenantVisitorFloorPolicyDto;
public interface TenantVisitorFloorPolicyDao {
/**
* 按组织节点 ID 查询启用中的 INTERSECT_ALLOWLIST 策略(building_id 为空)。
*
* @param orgId 组织节点 IDcw_is_organization.ID
* @return 无配置时 null
*/
TenantVisitorFloorPolicyDto selectEnabledByOrgId(String orgId);
// 旧方法(废弃)
// TenantVisitorFloorPolicyDto selectEnabledTenantDefault(String businessId);
}
```
- [ ] **Step 2: 修改 DAO 实现**
```java
package cn.cloudwalk.elevator.person.impl;
import cn.cloudwalk.elevator.person.dao.TenantVisitorFloorPolicyDao;
import cn.cloudwalk.elevator.person.dto.TenantVisitorFloorPolicyDto;
import cn.cloudwalk.elevator.person.mapper.TenantVisitorFloorPolicyMapper;
import javax.annotation.Resource;
import org.springframework.stereotype.Repository;
@Repository
public class TenantVisitorFloorPolicyDaoImpl implements TenantVisitorFloorPolicyDao {
@Resource
private TenantVisitorFloorPolicyMapper tenantVisitorFloorPolicyMapper;
@Override
public TenantVisitorFloorPolicyDto selectEnabledByOrgId(String orgId) {
return this.tenantVisitorFloorPolicyMapper.selectEnabledByOrgId(orgId);
}
}
```
- [ ] **Step 3: 验证编译**
```bash
cd maven-cw-elevator-application && mvn compile -pl cw-elevator-application-data -am -DskipTests
```
期望: BUILD SUCCESS。
- [ ] **Step 4: 提交**
```bash
git add maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/dao/TenantVisitorFloorPolicyDao.java
git add maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/person/impl/TenantVisitorFloorPolicyDaoImpl.java
git commit -m "feat: update DAO interface and impl to use org_id query"
```
---
### Task 5: Service — addVisitor 核心逻辑重写
**Files:**
- Modify: `maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/person/impl/PersonRuleServiceImpl.java`
这是改动最大的文件。分 3 个子步骤。
- [ ] **Step 1: 重写 addVisitor 方法(第 174-275 行)**
完整替换:
```java
@CloudwalkParamsValidate
public CloudwalkResult<Boolean> addVisitor(AcsPersonAddVisitorParam param, CloudwalkCallContext context)
throws ServiceException {
this.logger.info("根据被访人添加访客派梯权限开始,AcsPersonAddVisitorParam=[{}], CloudwalkCallContext=[{}]",
JSONObject.toJSONString(param), JSONObject.toJSONString(context));
try {
// ===== Step 1: 获取被访人信息(UC-01/02 都需要) =====
PersonDetailParam detailParam = new PersonDetailParam();
detailParam.setId(param.getPersonId());
detailParam.setBusinessId(context.getCompany().getCompanyId());
CloudwalkResult<PersonResult> detail = this.personService.detail(detailParam, context);
if (detail == null || !detail.isSuccess()) {
String code = detail != null ? detail.getCode() : "76260531";
String msg = detail != null ? detail.getMessage() : getMessage("76260531");
return CloudwalkResult.fail(code, msg);
}
PersonResult personResult = (PersonResult) detail.getData();
if (personResult == null) {
return CloudwalkResult.fail("76260531", getMessage("76260531"));
}
List<String> hostFloors = personResult.getFloorList();
if (CollectionUtils.isEmpty(hostFloors)) {
return CloudwalkResult.fail("76260531", getMessage("76260531"));
}
// ===== Step 2: 按 org_id 查找策略 =====
TenantVisitorFloorPolicyDto policy = findPolicyByOrgIds(personResult.getOrganizationIds());
// ===== Step 3: 确定生效楼层(二选一,不求交) =====
List<String> effectiveFloors;
boolean callerProvidedFloors = !CollectionUtils.isEmpty(param.getFloorIds());
if (policy != null) {
// 有策略:直接用 allow,忽略调用方 floorIds
effectiveFloors = resolveEffectiveFloors(
callerProvidedFloors ? param.getFloorIds() : hostFloors,
hostFloors, policy, param.getPersonId());
} else {
// 无策略:用调用方 floorIds 或 hostFloors
effectiveFloors = callerProvidedFloors ? param.getFloorIds() : hostFloors;
if (callerProvidedFloors) {
// UC-02 软校验:记录不在 hostFloors 中的楼层
Set<String> hostSet = new HashSet<>(hostFloors);
List<String> outliers = param.getFloorIds().stream()
.filter(f -> !hostSet.contains(f))
.collect(Collectors.toList());
if (!outliers.isEmpty()) {
this.logger.warn("UC-02 传入非被访人授权楼层 businessId={} personId={} outliers={}",
context.getCompany().getCompanyId(), param.getPersonId(), outliers);
}
}
}
if (CollectionUtils.isEmpty(effectiveFloors)) {
return CloudwalkResult.fail("76260531", getMessage("76260531"));
}
param.setFloorIds(effectiveFloors);
// ===== Step 4: 落库(不变) =====
ZoneQueryParam zoneQueryParam = new ZoneQueryParam();
zoneQueryParam.setId(param.getFloorIds().get(0));
zoneQueryParam.setRowsOfPage(10);
zoneQueryParam.setCurrentPage(1);
CloudwalkResult<CloudwalkPageAble<ZoneResult>> zonePage = this.zoneService.page(zoneQueryParam, context);
List<ZoneResult> zoneResults = (List<ZoneResult>) ((CloudwalkPageAble) zonePage.getData()).getDatas();
String imageStoreId =
this.deviceImageStoreDao.getByBuildingId(((ZoneResult) zoneResults.get(0)).getParentId());
List<ImageRuleRefAddDto> insertList = new ArrayList<>();
for (String floorId : param.getFloorIds()) {
ImageRuleRefResultDto defaultRule = this.imageRuleRefDao.getDefaultByZoneId(floorId);
ImageRuleRefAddDto addDto = new ImageRuleRefAddDto();
addDto.setId(genUUID());
addDto.setBusinessId(context.getCompany().getCompanyId());
addDto.setPersonId(param.getVisitorId());
addDto.setParentRule(defaultRule.getId());
addDto.setName(defaultRule.getName());
addDto.setZoneId(defaultRule.getZoneId());
addDto.setZoneName(defaultRule.getZoneName());
addDto.setCreateTime(Long.valueOf(System.currentTimeMillis()));
addDto.setLastUpdateTime(Long.valueOf(System.currentTimeMillis()));
addDto.setPersonDelete(Integer.valueOf(0));
insertList.add(addDto);
}
this.logger.info("访客添加派梯权限开始,数据为=[{}]", JSONObject.toJSONString(insertList));
if (!CollectionUtils.isEmpty(insertList)) {
this.imageRuleRefDao.insertList(insertList);
}
ImageStorePersonBindParam imageStorePersonBindParam = new ImageStorePersonBindParam();
imageStorePersonBindParam.setImageStoreId(imageStoreId);
imageStorePersonBindParam.setPersonIds(Collections.singletonList(param.getVisitorId()));
imageStorePersonBindParam.setNullDateIsLongTerm(Boolean.valueOf(true));
imageStorePersonBindParam.setExpiryBeginDate(param.getBegVisitorTime());
imageStorePersonBindParam.setExpiryEndDate(param.getEndVisitorTime());
this.logger.info("远程调用绑定人员图库开始,imageStorePersonBindParam=[{}], CloudwalkCallContext=[{}]",
JSONObject.toJSONString(imageStorePersonBindParam), JSONObject.toJSONString(context));
CloudwalkResult<ImgStoreBatchBindPersonResult> bindResult =
this.imageStorePersonService.batchBind(imageStorePersonBindParam, context);
if (!bindResult.isSuccess()) {
this.logger.error("远程调用绑定人员图库异常,原因:[{}],失败人员id:[{}]", bindResult.getMessage(), param.getVisitorId());
return CloudwalkResult.fail(bindResult.getCode(), bindResult.getMessage());
}
UpdateGroupPersonRefParam refParam = new UpdateGroupPersonRefParam();
refParam.setBusinessId(context.getCompany().getCompanyId());
refParam.setPersonIds(Collections.singletonList(param.getVisitorId()));
refParam.setImageStoreId(imageStoreId);
this.imageStorePersonService.updateGroupPersonRef(refParam, context);
} catch (ServiceException e) {
throw e;
} catch (Exception e) {
this.logger.error("根据被访人添加访客派梯权限失败,原因:[{}]", e);
throw new ServiceException("76260530", getMessage("76260530"));
}
return CloudwalkResult.success(Boolean.valueOf(true));
}
```
- [ ] **Step 2: 添加两个新辅助方法 + 修改 W2(JSON 日志升级)**
`addVisitor` 方法之后插入:
```java
/**
* 按 org_id 查找策略,遍历 organizationIds 取第一个命中。
*/
private TenantVisitorFloorPolicyDto findPolicyByOrgIds(List<String> orgIds) {
if (CollectionUtils.isEmpty(orgIds)) return null;
for (String orgId : orgIds) {
TenantVisitorFloorPolicyDto p = this.tenantVisitorFloorPolicyDao.selectEnabledByOrgId(orgId);
if (p != null && p.getEnabled() != null && p.getEnabled().intValue() == 1) {
List<String> allow = parseAllowZoneIds(p.getAllowZoneIds());
if (!CollectionUtils.isEmpty(allow)) return p;
}
}
return null;
}
/**
* 二选一:用 allow 替换 fallbackFloors。
* 约束:allow 必须是 hostFloors 的子集,否则拒绝(76260533)。
*/
private List<String> resolveEffectiveFloors(
List<String> fallbackFloorsUnused, List<String> hostFloors,
TenantVisitorFloorPolicyDto policy, String personId) {
List<String> allow = parseAllowZoneIds(policy.getAllowZoneIds());
if (CollectionUtils.isEmpty(allow)) return fallbackFloorsUnused;
// 安全校验:allow 中每个值必须在 hostFloors 中存在
Set<String> hostSet = new HashSet<>(hostFloors);
List<String> unknownAllow = allow.stream()
.filter(a -> !hostSet.contains(a))
.collect(Collectors.toList());
if (!unknownAllow.isEmpty()) {
this.logger.error("策略配置错误:allow 包含不在被访人 floorList 中的 zoneId"
+ "orgId={} policyId={} personId={} unknownAllow={} hostFloors={}",
policy.getOrgId(), policy.getId(), personId, unknownAllow, hostFloors);
throw new ServiceException("76260533",
"策略配置了被访人无权访问的楼层,请联系管理员");
}
this.logger.info("策略生效 orgId={} policyId={} v={} allowSize={} hostSize={}",
policy.getOrgId(), policy.getId(), policy.getPolicyVersion(),
allow.size(), hostFloors.size());
return allow;
}
```
同时修改 `parseAllowZoneIds` 的 catch 块(W2 修复):
```java
// 旧代码:
// this.logger.warn("allow_zone_ids JSON 无效,按无策略处理: {}", e.getMessage());
// 新代码:
this.logger.error("allow_zone_ids JSON 无效,策略失效!policyId={} raw={}",
"policy.id", json, e); // 注意:此处无法获取 policy.id,改用实际可用字段
```
> 实际实现时,`parseAllowZoneIds` 不持有 `policyId`,可以在 `resolveEffectiveFloors` 中调用 `parseAllowZoneIds` 之前先做 null 检查,将 ERROR 日志放在调用处:
```java
private List<String> resolveEffectiveFloors(...) {
String rawJson = policy.getAllowZoneIds();
List<String> allow = parseAllowZoneIds(rawJson);
if (CollectionUtils.isEmpty(allow)) {
if (!StringUtils.isBlank(rawJson)) {
this.logger.error("allow_zone_ids JSON 无效或为空,策略失效!orgId={} policyId={} raw={}",
policy.getOrgId(), policy.getId(), rawJson);
}
return fallbackFloorsUnused;
}
// ... 后续校验
}
```
- [ ] **Step 3: 删除旧辅助方法 `intersectPreserveHostOrder`(不再需要)**
该方法已被 `resolveEffectiveFloors` 替代,可删除或保留(无调用方即可)。
- [ ] **Step 4: 验证编译**
```bash
cd maven-cw-elevator-application && mvn compile -DskipTests
```
期望: BUILD SUCCESS。
- [ ] **Step 5: 提交**
```bash
git add maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/person/impl/PersonRuleServiceImpl.java
git commit -m "feat: rewrite addVisitor with org_id policy lookup and either-or semantics
- Replace business_id policy key with org_id from PersonResult.getOrganizationIds()
- Change from intersection (floorList ∩ allow) to either-or (policy? allow : floorList)
- Add resolveEffectiveFloors with allow ⊆ floorList safety check (76260533)
- UC-02 now also checks policy (policy takes precedence over caller floorIds)
- Upgrade JSON parse failure log from WARN to ERROR
- Remove unused intersectPreserveHostOrder method"
```
---
### Task 6: 错误码注册(76260533
**Files:**
- Check: `maven-cw-elevator-application/cw-elevator-application-starter/src/main/resources/access-control.properties`(或对应的 messages 资源文件)
- [ ] **Step 1: 查找错误码资源文件**
```bash
grep -rn "76260531\|76260532" --include="*.properties" --include="*.xml" maven-cw-elevator-application/
```
- [ ] **Step 2: 在对应的 messages 文件中新增**
```properties
76260533=策略配置了被访人无权访问的楼层,请联系管理员
```
- [ ] **Step 3: 提交**
```bash
git add <错误码资源文件路径>
git commit -m "feat: add error code 76260533 for policy-host floor mismatch"
```
---
### Task 7: 数据迁移 SQL
**Files:**
- Create: `docs/sql/tenant_visitor_floor_policy_migrate_org_id.sql`
- [ ] **Step 1: 编写迁移脚本**
```sql
-- 租户访客楼层策略:business_id → org_id 数据迁移
-- 前提:DDLTask 1)已执行
-- 执行方式:人工确认 org_id 对应关系后逐行执行
USE cw-elevator-application;
-- 1. 列出所有公司级组织节点(供确认)
-- 在 component-organization 库执行:
-- SELECT o.ID, o.NAME, o.PARENT_ID
-- FROM `component-organization`.cw_is_organization o
-- WHERE o.BUSINESS_ID = '2524639890ba4f2cba9ba1a4eeaa4015'
-- AND o.IS_DEL = 0
-- ORDER BY o.NAME;
-- 2. 为现有策略行填入 org_id(示例:广发基金)
-- 请先确认 NAME 匹配正确
UPDATE tenant_visitor_floor_policy
SET org_id = '<广发基金的 org_id>',
business_id = NULL -- 可选:标记 business_id 已废弃
WHERE id = 'gf_vstr_policy_guangfa_fund_001x';
-- 3. 为其他公司新增策略行(模板)
-- INSERT INTO tenant_visitor_floor_policy
-- (id, org_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, remark, created_at, updated_at)
-- VALUES
-- (REPLACE(UUID(),'-',''), '<公司 org_id>', 'INTERSECT_ALLOWLIST',
-- '["<zone_id>"]', NULL, 1, 1, '', UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000);
-- 4. 验证迁移结果
SELECT id, org_id, business_id, policy_type, allow_zone_ids, enabled
FROM tenant_visitor_floor_policy
ORDER BY org_id;
```
- [ ] **Step 2: 提交**
```bash
git add docs/sql/tenant_visitor_floor_policy_migrate_org_id.sql
git commit -m "docs: add org_id data migration SQL for tenant_visitor_floor_policy"
```
---
### Task 8: 构建验证 + 发布准备
- [ ] **Step 1: 全量构建**
```bash
cd maven-cw-elevator-application && mvn clean install -DskipTests
```
期望: BUILD SUCCESS,无编译错误。
- [ ] **Step 2: formatter 校验**
```bash
cd maven-cw-elevator-application && mvn formatter:validate -Dformatter-maven-plugin.version=2.16.0
```
期望: 无格式化违规。
- [ ] **Step 3: 生成发布包**
```bash
bash scripts/release-cw-elevator-application.sh 2.0.10
```
- [ ] **Step 4: 提交发布包**
```bash
git add releases/
git commit -m "release: cw-elevator-application v2.0.10 with org_id policy fix"
```
---
## 回滚方案
| 步骤 | 操作 |
|------|------|
| 1. 回滚应用包 | 部署旧版本 JAR(用 `business_id` 查询的代码) |
| 2. 回滚 DDL(可选) | `DROP INDEX uk_org_building; ALTER TABLE ... DROP COLUMN org_id; ADD UNIQUE KEY uk_biz_building (business_id, building_id);` |
| 3. 恢复数据(可选) | `UPDATE tenant_visitor_floor_policy SET business_id = '252463...' WHERE org_id IS NOT NULL;` |
> DDL 回滚不影响旧代码行为(旧代码不查 `org_id` 列)。
---
## 发布顺序(生产环境)
```
1. DDL 上线(Task 1) → 表结构变更,不影响线上行为
2. 数据迁移(Task 7) → 运维手工填 org_id
3. 发应用包(Task 8) → 代码切换到 org_id 查询
4. 验证(Task 8 后) → 抽样确认策略生效
```
---
## 完成检查清单
- [ ] DDL 在开发库执行成功
- [ ] `TenantVisitorFloorPolicyDto``orgId` 字段
- [ ] Mapper XML/Java 使用 `org_id` 查询
- [ ] DAO 接口/实现已切换
- [ ] `addVisitor` 使用 `findPolicyByOrgIds` + `resolveEffectiveFloors`
- [ ] W2 修复:JSON 解析失败打 ERROR 而非 WARN
- [ ] 错误码 76260533 已在资源文件注册
- [ ] 数据迁移 SQL 已编写
- [ ] `mvn clean install` 通过
- [ ] `mvn formatter:validate` 通过
@@ -0,0 +1,544 @@
# org_id 策略修复验证脚本 — 实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 编写 Python 无鉴权验证脚本 `verify_org_policy_fix.py`,自动准备测试数据、执行 7 个用例、清理数据、输出 JSON 报告。
**Architecture:** 单脚本 4 个 PhasePhase0 健康检查 → Phase1 MySQL 准备数据 → Phase2 HTTP 逐用例调用 add/visitor + passRule/image → Phase3 MySQL 清理 → Phase4 输出 JSON。复用现有 `quick_verify_visitor_floor_policy.py` 的 noauth 调用模式。
**Tech Stack:** Python 3.8+, `requests`, `pymysql`, JSON
**Spec:** `docs/superpowers/specs/2026-05-01-org-policy-verify-design.md`
---
### Task 1: 脚本骨架与配置
**Files:**
- Create: `maven-cw-elevator-application/tools/visitor_floor_verification/scripts/verify_org_policy_fix.py`
- [ ] **Step 1: 写入脚本骨架**
```python
#!/usr/bin/env python3
"""org_id 策略修复 — 无鉴权验证脚本"""
import argparse
import json
import sys
import time
from datetime import datetime, timedelta
from typing import Any, Dict, List, Optional
import pymysql
import requests
# ===== 配置常量 =====
DB_CONFIG = {
"host": "192.168.3.12",
"port": 3307,
"user": "root",
"password": "123456",
"db_org": "component-organization",
"db_elevator": "cw-elevator-application",
}
BUSINESS_ID = "2524639890ba4f2cba9ba1a4eeaa4015"
# 测试用组织节点
ORG_1403 = "72fb65ec5de94201b909a98b8bae1892"
ORG_1405 = "2095de3d541f44eba686c78fda68336f"
ORG_GUANGFA = "488b8ad049bb43408a6fbcc50bcb89ac"
# 被访人
HOST_CHEN = "1060601019894960128" # 陈国辉 (1403+星中心)
HOST_WANG = "1090779433129840640" # 王姣 (1405)
HOST_QIN = "1072908835884208128" # 秦夏 (广发基金)
# 访客(测试专用号段)
VISITOR_IDS = [
"9199000100000000001", "9199000100000000002", "9199000100000000003",
"9199000100000000004", "9199000100000000005", "9199000100000000006",
"9199000100000000007",
]
ZONE_28F = "605560545117995008"
ZONE_99F = "605560540000000000" # 不存在,用于 T3
OK_CODES = {"0", "200"}
TEST_CASES = [
{
"id": "T1", "name": "有策略→allow替换floorList",
"host_id": HOST_CHEN, "visitor_id": VISITOR_IDS[0],
"policy_id": "policy_t1_1403", "expected_pass": True,
"expected_floors": [ZONE_28F],
},
{
"id": "T2", "name": "无策略→floorList",
"host_id": HOST_WANG, "visitor_id": VISITOR_IDS[1],
"policy_id": None, "expected_pass": True,
"expected_floors": None, # 不做楼层精确比对,只验证成功
},
{
"id": "T3", "name": "allow含无效zone→拒绝",
"host_id": HOST_CHEN, "visitor_id": VISITOR_IDS[2],
"policy_id": "policy_t3_invalid", "expected_pass": False,
"expected_code": "76260533",
},
{
"id": "T4", "name": "多组织命中第一个策略",
"host_id": HOST_CHEN, "visitor_id": VISITOR_IDS[3],
"policy_id": "policy_t1_1403", "expected_pass": True,
"expected_floors": [ZONE_28F],
},
{
"id": "T5", "name": "enabled=0等同无策略",
"host_id": HOST_CHEN, "visitor_id": VISITOR_IDS[4],
"policy_id": "policy_t5_disabled", "expected_pass": True,
"expected_floors": None,
},
{
"id": "T6", "name": "UC-02策略优先",
"host_id": HOST_CHEN, "visitor_id": VISITOR_IDS[5],
"policy_id": "policy_t1_1403", "expected_pass": True,
"expected_floors": [ZONE_28F],
"floor_ids_override": ["605560541473144832"], # 传6F,策略应覆盖为28F
},
{
"id": "T7", "name": "广发基金迁移验证",
"host_id": HOST_QIN, "visitor_id": VISITOR_IDS[6],
"policy_id": "gf_vstr_policy_guangfa_fund_001x", "expected_pass": True,
"expected_floors": [ZONE_28F],
},
]
def parse_args():
p = argparse.ArgumentParser(description="org_id 策略修复验证")
p.add_argument("--elevator-base-url", default="http://127.0.0.1:18081")
p.add_argument("--skip-db", action="store_true", help="跳过数据库准备/清理")
return p.parse_args()
if __name__ == "__main__":
args = parse_args()
print(f"elevator: {args.elevator_base_url}")
print(f"skip-db: {args.skip_db}")
print(f"cases: {len(TEST_CASES)}")
```
- [ ] **Step 2: 验证导入可用**
```bash
cd maven-cw-elevator-application/tools/visitor_floor_verification
python3 -c "import requests; import pymysql; print('OK')"
```
期望: `OK`
- [ ] **Step 3: 提交**
```bash
git add maven-cw-elevator-application/tools/visitor_floor_verification/scripts/verify_org_policy_fix.py
git commit -m "test: scaffold verify_org_policy_fix.py with config and test cases"
```
---
### Task 2: Phase 0 — 健康检查 + Phase 1 — 数据准备/清理
**Files:**
- Modify: `verify_org_policy_fix.py` (追加函数)
- [ ] **Step 1: 添加健康检查函数**
```python
def health_check(base_url: str) -> bool:
"""GET /actuator/health"""
try:
r = requests.get(f"{base_url}/actuator/health", timeout=10)
ok = r.status_code == 200
print(f"[HEALTH] {base_url} -> {r.status_code} {'OK' if ok else 'FAIL'}")
return ok
except Exception as e:
print(f"[HEALTH] {base_url} -> ERROR: {e}")
return False
```
- [ ] **Step 2: 添加数据库连接函数**
```python
def get_db_conn():
return pymysql.connect(
host=DB_CONFIG["host"], port=DB_CONFIG["port"],
user=DB_CONFIG["user"], password=DB_CONFIG["password"],
database=DB_CONFIG["db_elevator"],
charset="utf8mb4", autocommit=True,
)
def execute_sql(sql: str, params=None):
conn = get_db_conn()
try:
with conn.cursor() as cur:
cur.execute(sql, params)
finally:
conn.close()
```
- [ ] **Step 3: 添加数据准备函数**
```python
def prepare_test_data():
"""INSERT 测试策略 + UPDATE 广发基金 org_id"""
policies = [
("policy_t1_1403", ORG_1403, f'["{ZONE_28F}"]', 1),
("policy_t3_invalid", ORG_1403, f'["{ZONE_28F}","{ZONE_99F}"]', 1),
("policy_t5_disabled", ORG_1403, f'["{ZONE_28F}"]', 0),
]
for pid, oid, zones_json, enabled in policies:
execute_sql("DELETE FROM tenant_visitor_floor_policy WHERE id=%s", (pid,))
execute_sql(
"INSERT INTO tenant_visitor_floor_policy "
"(id, org_id, business_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, created_at, updated_at) "
"VALUES (%s, %s, NULL, 'INTERSECT_ALLOWLIST', %s, NULL, %s, 1, UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000)",
(pid, oid, zones_json, enabled),
)
print(f" INSERT policy {pid} org={oid} enabled={enabled}")
# 广发基金迁移
execute_sql(
"UPDATE tenant_visitor_floor_policy SET org_id=%s WHERE id='gf_vstr_policy_guangfa_fund_001x'",
(ORG_GUANGFA,),
)
print(f" UPDATE 广发基金 org_id={ORG_GUANGFA}")
```
- [ ] **Step 4: 添加数据清理函数**
```python
def cleanup_test_data():
"""DELETE 测试策略 + 回滚广发基金 org_id"""
for pid in ["policy_t1_1403", "policy_t3_invalid", "policy_t5_disabled"]:
execute_sql("DELETE FROM tenant_visitor_floor_policy WHERE id=%s", (pid,))
print(f" DELETE {pid}")
execute_sql(
"UPDATE tenant_visitor_floor_policy SET org_id=NULL WHERE id='gf_vstr_policy_guangfa_fund_001x'"
)
print(" UPDATE 广发基金 org_id=NULL (回滚)")
```
- [ ] **Step 5: 测试 DB 函数**
```bash
python3 -c "
import verify_org_policy_fix as v
v.prepare_test_data()
print('prepared')
v.cleanup_test_data()
print('cleaned')
"
```
期望: 看到 INSERT/DELETE 输出,无异常。
- [ ] **Step 6: 提交**
```bash
git add verify_org_policy_fix.py
git commit -m "test: add Phase 0-1: health check + DB prepare/cleanup"
```
---
### Task 3: Phase 2 — noauth HTTP 调用 + 回读验证
**Files:**
- Modify: `verify_org_policy_fix.py` (追加函数)
- [ ] **Step 1: 添加 noauth 请求头构建**
```python
def build_noauth_headers() -> Dict[str, str]:
return {
"Content-Type": "application/json",
"businessid": BUSINESS_ID,
}
def now_ms() -> int:
return int(time.time() * 1000)
def tomorrow_ms() -> int:
return int((time.time() + 86400) * 1000)
```
- [ ] **Step 2: 添加 add_visitor 调用函数**
```python
def call_add_visitor(base_url: str, person_id: str, visitor_id: str,
floor_ids: Optional[List[str]] = None) -> Dict[str, Any]:
"""POST /elevator/person/add/visitor"""
body = {
"personId": person_id,
"visitorId": visitor_id,
"floorIds": floor_ids if floor_ids is not None else [],
"begVisitorTime": now_ms(),
"endVisitorTime": tomorrow_ms(),
}
try:
r = requests.post(
f"{base_url}/elevator/person/add/visitor",
json=body, headers=build_noauth_headers(), timeout=30,
)
return {
"http_status": r.status_code,
"body": r.json() if r.headers.get("content-type", "").startswith("application/json") else r.text,
}
except Exception as e:
return {"http_status": 0, "error": str(e)}
```
- [ ] **Step 3: 添加 passRule/image 回读函数**
```python
def call_passrule_image(base_url: str, visitor_id: str) -> Dict[str, Any]:
"""POST /elevator/passRule/image"""
body = {"personId": visitor_id}
try:
r = requests.post(
f"{base_url}/elevator/passRule/image",
json=body, headers=build_noauth_headers(), timeout=30,
)
return {
"http_status": r.status_code,
"body": r.json() if r.headers.get("content-type", "").startswith("application/json") else r.text,
}
except Exception as e:
return {"http_status": 0, "error": str(e)}
def extract_zone_ids(passrule_response: Dict) -> List[str]:
"""从 passRule/image 响应中提取 zoneId 列表"""
try:
datas = passrule_response["body"]["data"]["datas"]
return [d["zoneId"] for d in datas if "zoneId" in d]
except (KeyError, TypeError):
return []
```
- [ ] **Step 4: 测试 HTTP 调用(需 V2 运行中)**
```bash
python3 -c "
import verify_org_policy_fix as v
r = v.call_add_visitor('http://127.0.0.1:18081', '1060601019894960128', '9199000100000000001')
print(json.dumps(r, indent=2, ensure_ascii=False))
"
```
期望: HTTP 200,响应中包含 `success` 字段。
- [ ] **Step 5: 提交**
```bash
git add verify_org_policy_fix.py
git commit -m "test: add Phase 2: noauth HTTP calls + passRule/image extraction"
```
---
### Task 4: Phase 2 — 用例执行器 + Phase 3-4 — 报告
**Files:**
- Modify: `verify_org_policy_fix.py` (追加函数 + main)
- [ ] **Step 1: 添加用例执行函数**
```python
def run_case(base_url: str, case: Dict[str, Any]) -> Dict[str, Any]:
"""执行单个用例,返回结果 dict"""
cid = case["id"]
print(f"\n[{cid}] {case['name']}")
floor_ids = case.get("floor_ids_override")
# Step A: 确保正确的策略行生效
pid = case.get("policy_id")
if pid:
# T3: 需要切换到 policy_t3_invalid(先停用 policy_t1_1403
if cid == "T3":
execute_sql("DELETE FROM tenant_visitor_floor_policy WHERE id='policy_t1_1403'")
print(f" [DB] 临时删除 policy_t1_1403 以启用 T3 策略")
result = {"id": cid, "name": case["name"]}
# Step B: add/visitor
r = call_add_visitor(base_url, case["host_id"], case["visitor_id"], floor_ids)
result["add_visitor"] = {
"http_status": r.get("http_status"),
"success": r.get("body", {}).get("success") if isinstance(r.get("body"), dict) else None,
"code": r.get("body", {}).get("code") if isinstance(r.get("body"), dict) else None,
"message": r.get("body", {}).get("message") if isinstance(r.get("body"), dict) else None,
"error": r.get("error"),
}
av = result["add_visitor"]
business_ok = av["http_status"] == 200 and str(av.get("code", "")) in OK_CODES
# Step C: 判定
if case["expected_pass"]:
if business_ok:
# 回读楼层
pr = call_passrule_image(base_url, case["visitor_id"])
actual_zones = extract_zone_ids(pr)
result["passrule_image"] = {"zones": actual_zones}
expected = case.get("expected_floors")
if expected is not None:
match = set(actual_zones) == set(expected)
result["floor_match"] = match
result["passed"] = match
print(f" add/visitor OK, floors: actual={actual_zones} expected={expected} match={match}")
else:
result["passed"] = True
print(f" add/visitor OK, floors={actual_zones} (no strict check)")
else:
result["passed"] = False
print(f" expected success but got code={av.get('code')} msg={av.get('message')}")
else:
# 期望失败
expected_code = case.get("expected_code")
actual_code = str(av.get("code", ""))
result["passed"] = (not business_ok) and (actual_code == expected_code)
print(f" expected fail code={expected_code} actual={actual_code} passed={result['passed']}")
# Step D: 恢复策略(T3 执行后)
if cid == "T3":
execute_sql(
"INSERT INTO tenant_visitor_floor_policy "
"(id, org_id, business_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, created_at, updated_at) "
"VALUES ('policy_t1_1403', %s, NULL, 'INTERSECT_ALLOWLIST', %s, NULL, 1, 1, UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000)",
(ORG_1403, f'["{ZONE_28F}"]'),
)
print(f" [DB] 恢复 policy_t1_1403")
return result
```
- [ ] **Step 2: 添加报告生成函数**
```python
def generate_report(results: List[Dict], base_url: str) -> Dict:
passed = sum(1 for r in results if r.get("passed"))
failed = len(results) - passed
return {
"test": "org_id policy fix verification",
"timestamp": datetime.now().isoformat(),
"elevator_url": base_url,
"mode": "noauth-probe",
"business_id": BUSINESS_ID,
"summary": {"total": len(results), "passed": passed, "failed": failed},
"results": results,
}
```
- [ ] **Step 3: 完善 main 函数**
```python
if __name__ == "__main__":
args = parse_args()
base = args.elevator_base_url.rstrip("/")
# Phase 0
if not health_check(base):
print("FATAL: elevator service not reachable")
sys.exit(1)
# Phase 1
if not args.skip_db:
print("\n=== Phase 1: prepare test data ===")
prepare_test_data()
# Phase 2
print(f"\n=== Phase 2: run {len(TEST_CASES)} cases ===")
results = []
for case in TEST_CASES:
r = run_case(base, case)
results.append(r)
# Phase 3
if not args.skip_db:
print("\n=== Phase 3: cleanup ===")
cleanup_test_data()
# Phase 4
report = generate_report(results, base)
report_path = f"report/org-policy-fix-verify-{datetime.now().strftime('%Y%m%d-%H%M%S')}.json"
import os
os.makedirs("report", exist_ok=True)
with open(report_path, "w", encoding="utf-8") as f:
json.dump(report, f, indent=2, ensure_ascii=False)
print(f"\n=== Report: {report_path} ===")
print(f"Passed: {report['summary']['passed']}/{report['summary']['total']}")
for r in results:
status = "" if r.get("passed") else ""
print(f" {status} [{r['id']}] {r['name']}")
sys.exit(0 if report["summary"]["failed"] == 0 else 1)
```
- [ ] **Step 4: 提交**
```bash
git add verify_org_policy_fix.py
git commit -m "test: add Phase 2-4: case runner + report generation + main entry"
```
---
### Task 5: 端到端运行验证
- [ ] **Step 1: 确保 V2 运行中**
```bash
curl -s http://127.0.0.1:18081/actuator/health
```
期望: `{"status":"UP"}`
- [ ] **Step 2: 执行全量验证**
```bash
cd maven-cw-elevator-application/tools/visitor_floor_verification
python3 scripts/verify_org_policy_fix.py --elevator-base-url http://127.0.0.1:18081
```
- [ ] **Step 3: 检查报告**
```bash
ls -la report/org-policy-fix-verify-*.json | tail -1
python3 -c "import json; r=json.load(open('$(ls -t report/org-policy-fix-verify-*.json | head -1)')); print(f\"{r['summary']['passed']}/{r['summary']['total']} passed\")"
```
期望: `7/7 passed`
- [ ] **Step 4: 提交报告(可选,不提交 JSON 到 git)**
```bash
git status
```
---
## 完成检查清单
- [ ] `verify_org_policy_fix.py` 存在且可导入
- [ ] Phase 0: `health_check()` 返回 True
- [ ] Phase 1: `prepare_test_data()` 无异常
- [ ] Phase 2: 7 个用例全部执行
- [ ] Phase 3: `cleanup_test_data()` 无异常
- [ ] Phase 4: JSON 报告生成,7/7 passed
- [ ] 无脱敏泄露(报告中不出现真实姓名/手机号)
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,327 @@
# V2 完整环境部署 + V1/V2 对比测试 — 实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development or superpowers:executing-plans. Steps use checkbox (`- [ ]`) syntax.
**Goal:** 搭建 V2 电梯功能测试所需的最小服务集(infra + 3 Java 服务),运行 V1/V2 API 对拍及策略差异验证。
**Architecture:** Docker 提供 Consul/Redis/Nginx,复用 MySQL 192.168.3.12:3307,按 ninca-common → component-org → elevator V2 → elevator V1 顺序启动,最终执行 pytest 对拍 + curl 策略测试。
**Tech Stack:** Bash, Docker Compose v2, JDK 8, Maven 3.9, Python 3.10 + pytest, MySQL 5.7
**关联 Spec:** `docs/superpowers/specs/2026-05-01-v2-test-env-setup-design.md`
---
## 前置状态
```bash
MySQL: 192.168.3.12:3307 root/123456 ✅
Docker: Compose v2.40.3 可用 ✅
JDK 8: /usr/lib/jvm/java-8-openjdk-amd64 ✅
部署包: 13 个 tar.gz, 7.2 GB ✅
DB 数据: 11 个库已恢复, 策略表已创建 ✅
```
---
### Task 1: 启动基础设施 (Docker Compose)
**Files:**
- Use: `scripts/test-env/docker-compose.infra.yml`
- Use: `scripts/test-env/config/env.sh`
- [ ] **Step 1: 清理旧容器并启动**
```bash
source scripts/test-env/config/env.sh
cd scripts/test-env
docker rm -f v2test-consul v2test-redis v2test-nginx 2>/dev/null || true
docker compose -f docker-compose.infra.yml down --remove-orphans 2>/dev/null || true
docker compose -f docker-compose.infra.yml up -d
sleep 5
curl -sf http://127.0.0.1:9517/v1/status/leader && echo "Consul UP" || echo "FAIL"
redis-cli -p 6380 -a '1qaz!QAZ' PING && echo "Redis UP" || echo "FAIL"
```
- [ ] **Step 2: 验证 MySQL**
```bash
mysql -h 192.168.3.12 -P 3307 -u root -p123456 -e "SELECT 1" && echo "MySQL UP"
```
---
### Task 2: 启动 ninca-common (port 33010)
**Files:**
- Create: `scripts/test-env/config/ninca-common-override.properties`
- Use: `services/ninca-common/ninca_common_01-ninca_common_backend/ninca-common-backend-V2.9.2_20210730.jar`
**关键**: ninca-common 用 ShardingSphere,需覆盖 `spring.shardingsphere.datasource.ds0.jdbc-url`
- [ ] **Step 1: 创建 ShardingSphere 覆盖配置**
```bash
source scripts/test-env/config/env.sh
cat > $TEST_ENV_DIR/config/ninca-common-override.properties << EOF
spring.shardingsphere.datasource.names=ds0
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://$MYSQL_HOST:$MYSQL_PORT/ninca_common?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.shardingsphere.datasource.ds0.username=$MYSQL_USER
spring.shardingsphere.datasource.ds0.password=$MYSQL_PASS
spring.shardingsphere.sharding.default-data-source-name=ds0
EOF
```
- [ ] **Step 2: 启动**
```bash
NC_JAR="$SERVICE_DIR/ninca-common/ninca_common_01-ninca_common_backend/ninca-common-backend-V2.9.2_20210730.jar"
nohup /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar -Xmx1024m "$NC_JAR" \
--server.port=33010 \
--spring.config.additional-location="$TEST_ENV_DIR/config/ninca-common-override.properties" \
--spring.cloud.consul.host=$CONSUL_HOST --spring.cloud.consul.port=$CONSUL_PORT \
--spring.redis.host=$REDIS_HOST --spring.redis.port=$REDIS_PORT --spring.redis.password=$REDIS_PASS \
&> /tmp/ninca-common-plan.log &
echo "PID=$!"
sleep 30
curl -sf http://127.0.0.1:33010/health && echo " ✅" || echo " ❌"
```
- [ ] **Step 3: 如启动失败 → Python stub**
```bash
# 若 ninca-common 无法启动,创建 stub 模拟 person 属性查询
# 组件 org 的 person/detail 内部调 ninca-common,可用空响应 stub 绕过
```
---
### Task 3: 启动 component-organization (port 33011)
**Files:**
- Use: `services/component-org/.../ninca-common-component-organization-V2.9.2_20210730.jar`
- [ ] **Step 1: 确保 Quartz 表存在**
```bash
mysql -h 192.168.3.12 -P 3307 -u root -p123456 -e "
CREATE TABLE IF NOT EXISTS \`component-organization\`.QRTZ_LOCKS (
SCHED_NAME VARCHAR(120) NOT NULL, LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME, LOCK_NAME)
) ENGINE=InnoDB;" 2>/dev/null
```
- [ ] **Step 2: 启动 (带 ninca-common Ribbon 路由)**
```bash
COMP_JAR="$SERVICE_DIR/component-org/ninca_common_component_organization_01-ninca_common_component_organization/ninca-common-component-organization-V2.9.2_20210730.jar"
nohup /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Dlogging.config=/tmp/logback-comp-org.xml -jar -Xmx1024m "$COMP_JAR" \
--server.port=33011 \
--spring.datasource.url="jdbc:mysql://$MYSQL_HOST:$MYSQL_PORT/component-organization?useSSL=false&characterEncoding=utf-8" \
--spring.datasource.username=$MYSQL_USER --spring.datasource.password=$MYSQL_PASS \
--spring.cloud.consul.host=$CONSUL_HOST --spring.cloud.consul.port=$CONSUL_PORT \
--spring.redis.host=$REDIS_HOST --spring.redis.port=$REDIS_PORT --spring.redis.password=$REDIS_PASS \
--ninca-common.ribbon.listOfServers=127.0.0.1:33010 \
&> /tmp/comp-org-plan.log &
echo "PID=$!"
sleep 30
curl -sf http://127.0.0.1:17116/actuator/health | python3 -c "import sys,json;print(json.load(sys.stdin)['status'])" && echo " ✅"
```
- [ ] **Step 3: 验证 person/detail**
```bash
curl -sf -X POST http://127.0.0.1:33011/component/person/detail \
-H "Content-Type: application/json" \
-d '{"id":"1072908835884208128"}' | python3 -c "import sys,json;d=json.load(sys.stdin);print(f'code={d[\"code\"]}')"
# 预期: code=00000000 (非 53014011)
```
- [ ] **Step 4: 如果 still 53014011**
放弃启动 ninca-common,改为 Python stub 方案:
- 创建 `scripts/test-env/stub-person-service.py`
- 监听 33010,响应 `/health` 和任意 person 查询
- 重启 comp-org(它只需 ninca-common 可达,不关心响应内容)
---
### Task 4: 启动 elevator V2 (port 18081)
**Files:**
- Use: `maven-cw-elevator-application/deploy/v2-maven/cw-elevator-application-2.0.9.jar`
- [ ] **Step 1: 重启 V2 带全量 Ribbon 路由**
```bash
pkill -f "elevator.*18081" 2>/dev/null; sleep 2
source scripts/test-env/config/env.sh
DEPLOY_DIR="$REPO_ROOT/maven-cw-elevator-application/deploy/v2-maven"
V2_JAR=$(ls -t "$DEPLOY_DIR"/cw-elevator-application-*.jar | head -1)
nohup /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar -Xmx2048m "$V2_JAR" \
--server.port=18081 --spring.redis.port=6380 --spring.redis.password='1qaz!QAZ' \
--spring.cloud.consul.host=127.0.0.1 --spring.cloud.consul.port=9517 \
--ninca-common-component-organization.ribbon.listOfServers=127.0.0.1:33011 \
--spring.config.location="$DEPLOY_DIR/" \
&> /tmp/v2-plan.log &
echo "PID=$!"
sleep 35
curl -sf http://127.0.0.1:18081/health && echo " ✅"
```
---
### Task 5: 启动 elevator V1 (port 18080)
**Files:**
- Use: `maven-cw-elevator-application/deploy/v1-legacy/cw-elevator-application-V1.0.0.20211103.jar`
- [ ] **Step 1: 启动 V1**
```bash
pkill -f "elevator.*18080" 2>/dev/null; sleep 2
source scripts/test-env/config/env.sh
V1_DIR="$REPO_ROOT/maven-cw-elevator-application/deploy/v1-legacy"
V1_JAR=$(ls -t "$V1_DIR"/cw-elevator-application-*.jar | head -1)
nohup /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar -Xmx2048m "$V1_JAR" \
--server.port=18080 --spring.redis.port=6380 --spring.redis.password='1qaz!QAZ' \
--spring.cloud.consul.host=127.0.0.1 --spring.cloud.consul.port=9517 \
--ninca-common-component-organization.ribbon.listOfServers=127.0.0.1:33011 \
--spring.config.location="$V1_DIR/" \
&> /tmp/v1-plan.log &
echo "PID=$!"
sleep 35
curl -sf http://127.0.0.1:18080/health && echo " ✅"
```
---
### Task 6: 对拍测试
**Files:**
- Use: `maven-cw-elevator-application/tools/elevator_api_parity/`
- [ ] **Step 1: 运行全量对拍**
```bash
cd maven-cw-elevator-application/tools/elevator_api_parity
ELEVATOR_BASE_OLD=http://127.0.0.1:18080 ELEVATOR_BASE_NEW=http://127.0.0.1:18081 \
python3 -m pytest tests/ -v --tb=short -p no:allure_pytest
# 预期: 8/8 passed
```
---
### Task 7: 策略差异验证
**Files:**
- DB: `tenant_visitor_floor_policy` (广发基金 org_id=488b8ad049bb43408a6fbcc50bcb89ac)
- 人员: `1072908835884208128` (秦夏)
- [ ] **Step 1: V1 add/visitor (无策略 → floorList 全集)**
```bash
curl -s -X POST http://127.0.0.1:18080/elevator/person/add/visitor \
-H "Content-Type: application/json" \
-d '{"personId":"1072908835884208128","businessId":"2524639890ba4f2cba9ba1a4eeaa4015","visitorName":"test","phone":"13800000000"}'
# 预期: code != 76260532, 使用 floorList 全集
```
- [ ] **Step 2: V2 add/visitor (策略 → allow_zone_ids 替换)**
```bash
curl -s -X POST http://127.0.0.1:18081/elevator/person/add/visitor \
-H "Content-Type: application/json" \
-d '{"personId":"1072908835884208128","businessId":"2524639890ba4f2cba9ba1a4eeaa4015","visitorName":"test","phone":"13800000000"}'
# 预期: 策略生效 → 返回 allow_zone_ids 交集 或 floorList 全集 (V1 无策略)
```
- [ ] **Step 3: 差异判定**
```bash
# V1_CODE != V2_CODE → STRATEGY DIVERGENCE CONFIRMED
# V1_CODE == V2_CODE → policy not triggered (check comp-org person/detail)
```
---
### Task 8: 失败回退 — Python stub 方案
**如果 Task 2-3 的 Java 服务无法启动:**
**Files:**
- Create: `scripts/test-env/stub-person-service.py`
- [ ] **Step 1: 创建 stub (模拟 ninca-common + comp-org)**
```python
#!/usr/bin/env python3
"""Stub: 模拟 component-organization person/detail,返回广发基金秦夏数据"""
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
class PersonStub(BaseHTTPRequestHandler):
def do_POST(self):
body_len = int(self.headers.get('Content-Length', 0))
body = json.loads(self.rfile.read(body_len)) if body_len > 0 else {}
person_id = body.get('id', body.get('personId', 'unknown'))
if self.path in ('/health', '/actuator/health'):
self._json(200, {"status": "UP"})
elif '/person/detail' in self.path or '/component/person/detail' in self.path:
self._json(200, {
"code": "00000000", "success": True, "message": "success",
"data": {
"id": person_id, "name": "秦夏", "businessId": "2524639890ba4f2cba9ba1a4eeaa4015",
"phone": "13666667067",
"organizationIds": ["488b8ad049bb43408a6fbcc50bcb89ac"],
"floorList": ["605560541473144832", "605560541657694208"],
"labelIds": [], "labelNames": []
}
})
elif '/component/person/page' in self.path:
self._json(200, {"code": "00000000", "success": True, "data": {"datas": [], "total": 0}})
else:
self._json(200, {"code": "00000000", "success": True, "data": None})
def do_GET(self):
self._json(200, {"status": "UP"})
def _json(self, status, data):
self.send_response(status)
self.send_header('Content-Type', 'application/json;charset=utf-8')
self.end_headers()
self.wfile.write(json.dumps(data, ensure_ascii=False).encode())
HTTPServer(('127.0.0.1', 33010), PersonStub).serve_forever()
```
- [ ] **Step 2: 启动 stub 并重新配置电梯**
```bash
python3 scripts/test-env/stub-person-service.py &
echo "Stub PID=$!"
# 重新启动 elevator V2Feign 路由到 stub:33010
```
---
## 实施依赖
```
Task 1 (infra) ──→ Task 2 (ninca-common)
↓ ↘ (fail → Task 8 stub)
Task 3 (comp-org)
Task 4 (elevator V2) + Task 5 (elevator V1)
Task 6 (对拍) + Task 7 (策略差异)
```
Task 4/5 可并行;Task 6/7 可在 4/5 完成后立即执行。
@@ -0,0 +1,920 @@
# 目录结构重组 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Restructure the monorepo directory tree — rename to kebab-case English, separate source/runtime/packages/archive, consolidate scripts, remove naming inconsistencies — while preserving all files and git history.
**Architecture:** The project spans two git repos: `源码/` (submodule, ~29K files) and the parent repo (星中心/, 部署包/, data_backup/, etc.). Each task specifies which repo it operates in. Cross-repo moves use `mv` + separate `git add`/`git rm` in each repo. No files are deleted — outdated content is relocated to `archive/`.
**Tech Stack:** git, bash, Python (path update scripts)
---
### Task 0: Safety Preflight
**Context:** Verify workspace state before any changes.
- [ ] **Step 0.1: Check git status in parent repo**
Run: `git status`
Expected: clean working tree, or note ongoing work
- [ ] **Step 0.2: Check git status in submodule (源码/)**
Run: `git status`
Expected: clean working tree (last commit was the spec doc)
- [ ] **Step 0.3: Record the current tree state for rollback**
Run: `git rev-parse HEAD` (parent repo) and `git rev-parse HEAD` (submodule)
Expected: record these SHAs for rollback reference
---
### Phase 1: Parent Repo — Rename Top-Level Directories
---
### Task 1: Rename 星中心/ → runtime/
**Files:**
- Rename: `星中心/``runtime/`
- [ ] **Step 1.1: git mv 星中心 to runtime**
Run (from repo root):
```bash
git mv 星中心 runtime
```
Expected: directory renamed, no content changes
- [ ] **Step 1.2: Rename internal directories (remove `_01-` prefix)**
```bash
git mv runtime/cwos_manager_01-cwos_manager runtime/cwos-manager
git mv runtime/cwos_system_api_01-cwos_system_api runtime/cwos-system-api
git mv runtime/cw-elevator-application-V1.0.0.20211103 runtime/elevator-v1
git mv runtime/ninca_crk_std_01-ninca_crk_std_backend runtime/ninca-crk-std
git mv runtime/ninca_qk_alarm_app_01-ninca_qk_alarm_app runtime/ninca-qk-alarm
git mv runtime/ninca-crk-std-backend-V2.9.1_20210630 runtime/ninca-crk-std-lib
```
Expected: all 6 directories renamed
- [ ] **Step 1.3: Rename internal frontend subdirs (runtime/frontend/)**
```bash
git mv runtime/frontend/cwos_manager_frontend runtime/frontend/cwos-manager-frontend
```
Expected: dir renamed
- [ ] **Step 1.4: Verify**
Run: `ls runtime/`
Expected: `cwos-manager/ cwos-system-api/ elevator-v1/ frontend/ ninca-crk-std/ ninca-crk-std-lib/ ninca-qk-alarm/`
- [ ] **Step 1.5: Commit**
```bash
git add runtime/
git commit -m "refactor: rename 星中心/ => runtime/, normalize service dir names"
```
---
### Task 2: Rename 部署包/ → packages/
**Files:**
- Rename: `部署包/``packages/`
- [ ] **Step 2.1: git mv**
Run (from repo root):
```bash
git mv 部署包 packages
```
Expected: directory renamed
- [ ] **Step 2.2: Rename tar.gz files (remove `01-` prefix)**
List all files first:
```bash
ls packages/*.tar.gz
```
For each file, rename. Example pattern:
```bash
git mv packages/cwos_manager_01-cwos_manager.tar.gz packages/cwos-manager.tar.gz
git mv packages/cwos_system_api_01-cwos_system_api.tar.gz packages/cwos-system-api.tar.gz
git mv packages/ninca_common_backend_01-ninca_common_backend.tar.gz packages/ninca-common-backend.tar.gz
git mv packages/ninca_common_component_organization_01-ninca_common_component_organization.tar.gz packages/ninca-common-component-organization.tar.gz
git mv packages/ninca_common_monitor_app_01-ninca_common_monitor_app.tar.gz packages/ninca-common-monitor-app.tar.gz
git mv packages/ninca_common_snap_app_01-ninca_common_snap_app.tar.gz packages/ninca-common-snap-app.tar.gz
git mv packages/ninca_common_vehicle_app_01-ninca_common_vehicle_app.tar.gz packages/ninca-common-vehicle-app.tar.gz
git mv packages/ninca_crk_std_01-ninca_crk_std_backend.tar.gz packages/ninca-crk-std-backend.tar.gz
git mv packages/ninca_md_heat_analysis_01-ninca_md_heat_analysis_backend.tar.gz packages/ninca-md-heat-analysis-backend.tar.gz
git mv packages/ninca_qk_alarm_app_01-ninca_qk_alarm_app.tar.gz packages/ninca-qk-alarm-app.tar.gz
git mv packages/ninca-person-file-app-V2.9.2_20210216.tar.gz packages/ninca-person-file-app-v2.9.2.tar.gz
git mv packages/frontend.tar.gz packages/frontend.tar.gz
git mv packages/cw-elevator-application-V1.0.0.20211103.tar.gz packages/cw-elevator-application-v1.0.0.tar.gz
```
- [ ] **Step 2.3: Rename expanded component directory**
```bash
git mv packages/ninca_common_component_organization_01-ninca_common_component_organization packages/ninca-common-component-organization
```
Then rename sub-subdirs:
```bash
git mv packages/ninca-common-component-organization/ninca_common_component_organization_01-ninca_common_component_organization207 packages/ninca-common-component-organization/v207
git mv packages/ninca-common-component-organization/ninca_common_component_organization_01-ninca_common_component_organization208 packages/ninca-common-component-organization/v208
git mv packages/ninca-common-component-organization/ninca_common_component_organization_01-ninca_common_component_organization209 packages/ninca-common-component-organization/v209
```
- [ ] **Step 2.4: Verify**
Run: `ls packages/` and `ls packages/ninca-common-component-organization/`
- [ ] **Step 2.5: Commit**
```bash
git add packages/
git commit -m "refactor: rename 部署包/ => packages/, normalize tar.gz names"
```
---
### Task 3: Rename data_backup/ → data-backups/
**Files:**
- Rename: `data_backup/``data-backups/`
- [ ] **Step 3.1: git mv**
```bash
git mv data_backup data-backups
```
- [ ] **Step 3.2: Commit**
```bash
git add data-backups/
git commit -m "refactor: rename data_backup/ => data-backups/ (kebab-case)"
```
---
### Task 4: Move cn/ and media/ to archive/
**Files:**
- Move: `cn/``archive/miscellaneous/cn/`
- Move: `media/``archive/miscellaneous/media/`
- Create: `archive/miscellaneous/`
- [ ] **Step 4.1: Create archive directories**
```bash
mkdir -p archive/miscellaneous
```
- [ ] **Step 4.2: Move cn/ into archive**
```bash
git mv cn archive/miscellaneous/cn
```
- [ ] **Step 4.3: Move media/ into archive**
```bash
git mv media archive/miscellaneous/media
```
- [ ] **Step 4.4: Commit**
```bash
git add archive/
git commit -m "refactor: move cn/, media/ to archive/miscellaneous/"
```
---
### Phase 2: Submodule (源码/) — Maven & Scripts Restructure
---
### Task 5: Rename Maven projects (remove `maven-` prefix)
**Files (within 源码/):**
- Rename: `maven-cloudwalk-cloud/``source/backend/cloudwalk-cloud/`
- Rename: `maven-cloudwalk-device-manager/``source/backend/cloudwalk-device-manager/`
- Rename: `maven-cloudwalk-device-sdk/``source/backend/cloudwalk-device-sdk/`
- Rename: `maven-cloudwalk-intelligent-davinci-manager/``source/backend/intelligent-davinci-manager/`
- Rename: `maven-cloudwalk-legacy-public/``source/backend/cloudwalk-legacy-public/`
- Rename: `maven-cw-elevator-application/``source/backend/cw-elevator-application/`
- Rename: `maven-cwos-common-aks/``source/backend/cwos-common-aks/`
- Rename: `maven-cwos-device-authentication/``source/backend/cwos-device-authentication/`
- Rename: `maven-cwos-resource/``source/backend/cwos-resource/`
- Rename: `maven-intelligent-cwoscomponent/``source/backend/intelligent-cwoscomponent/`
- Rename: `maven-ninca-common-component-organization/``source/backend/ninca-common-component-organization/`
- Rename: `maven-ninca-crk-from-lib/``source/backend/ninca-crk-from-lib/`
- Rename: `maven-ninca-qk-alarm/``source/backend/ninca-qk-alarm/`
Note: `源码/` (submodule) already means "source code" in Chinese. Creating `源码/source/` inside it would be redundant. Instead, Maven projects go under `源码/backend/`.
- [ ] **Step 5.1: Create backend/ directory**
Run (from 源码/):
```bash
mkdir -p backend
```
- [ ] **Step 5.2: Move and rename all Maven projects**
```bash
git mv maven-cloudwalk-cloud backend/cloudwalk-cloud
git mv maven-cloudwalk-device-manager backend/cloudwalk-device-manager
git mv maven-cloudwalk-device-sdk backend/cloudwalk-device-sdk
git mv maven-cloudwalk-intelligent-davinci-manager backend/intelligent-davinci-manager
git mv maven-cloudwalk-legacy-public backend/cloudwalk-legacy-public
git mv maven-cw-elevator-application backend/cw-elevator-application
git mv maven-cwos-common-aks backend/cwos-common-aks
git mv maven-cwos-device-authentication backend/cwos-device-authentication
git mv maven-cwos-resource backend/cwos-resource
git mv maven-intelligent-cwoscomponent backend/intelligent-cwoscomponent
git mv maven-ninca-common-component-organization backend/ninca-common-component-organization
git mv maven-ninca-crk-from-lib backend/ninca-crk-from-lib
git mv maven-ninca-qk-alarm backend/ninca-qk-alarm
```
Expected: all 13 projects moved, check `ls backend/`
- [ ] **Step 5.3: Verify no broken symlinks or missing dirs**
Run:
```bash
ls backend/ | wc -l
```
Expected: 13
- [ ] **Step 5.4: Commit**
```bash
git add backend/ && git rm -r maven-cloudwalk-cloud maven-cloudwalk-device-manager maven-cloudwalk-device-sdk maven-cloudwalk-intelligent-davinci-manager maven-cloudwalk-legacy-public maven-cw-elevator-application maven-cwos-common-aks maven-cwos-device-authentication maven-cwos-resource maven-intelligent-cwoscomponent maven-ninca-common-component-organization maven-ninca-crk-from-lib maven-ninca-qk-alarm
git commit -m "refactor: move Maven projects to backend/, remove maven- prefix"
```
---
### Task 6: Create source/frontend/ from frontend-source/
**Files:**
- Move: `frontend-source/``source/frontend/`
Note: After Task 11 and Task 13, the old `frontend/` (runtime) is emptied. The actual frontend source (`frontend-source/`) takes its place.
- [ ] **Step 6.1: Remove empty frontend/ dir (runtime moved out)**
```bash
rmdir frontend 2>/dev/null || echo "not empty, check manually"
```
- [ ] **Step 6.2: Rename frontend-source to frontend**
```bash
git mv frontend-source frontend
```
- [ ] **Step 6.3: Commit**
```bash
git add frontend/
git commit -m "refactor: rename frontend-source/ => frontend/ (actual source)"
```
---
### Task 7: Consolidate scripts/ into submodule scripts/
**Files:**
- Move: `scripts/` (from 源码/ root) → `source/backend/cw-elevator-application/scripts/` (keep with elevator project)
- Create: `scripts/` (consolidated, at source/ root)
Actually, the design says to keep scripts at the parent source/ level, organized by function. Let me adjust.
- [ ] **Step 7.1: Create consolidated scripts/ structure**
```bash
mkdir -p scripts/build scripts/deploy scripts/tools
```
- [ ] **Step 7.2: Classify and move scripts**
Build/release scripts:
```bash
git mv scripts/release-cw-elevator-application.sh scripts/build/
git mv scripts/format_maven_formatter_all.sh scripts/build/
git mv scripts/check_maven_formatter_validate.sh scripts/build/
```
Tools/analysis scripts:
```bash
git mv scripts/check_elevator_fatjar_lib_parity.sh scripts/tools/
git mv scripts/compare_jar_to_sources.py scripts/tools/
git mv scripts/decompile_ninca_crk_lib_modules.py scripts/tools/
git mv scripts/generate_v1_v2_elevator_dependency_diff.py scripts/tools/
git mv scripts/run_full_elevator_api_suite.sh scripts/tools/
git mv scripts/run_v1v2_parity_automated.sh scripts/tools/
git mv scripts/scan_java_tail_block_comments.py scripts/tools/
git mv scripts/strip_jdcore_java_noise.py scripts/tools/
git mv scripts/verify_frontend_runtime.py scripts/tools/
git mv scripts/verify_v1_v2_config_load_order.sh scripts/tools/
git mv scripts/collect_elevator_runtime_evidence.sh scripts/tools/
git mv scripts/alibaba_heuristic_audit.py scripts/tools/
```
The `test-env/` directory stays as is under scripts/:
```bash
# test-env is already at scripts/test-env/, keep it
```
- [ ] **Step 7.3: Commit**
```bash
git add scripts/
git commit -m "refactor: consolidate scripts/ by function (build/deploy/tools)"
```
---
### Task 8: Move self-referencing 源码/源码/ to archive
**Files (in submodule):**
- Move: `源码/源码/` → parent repo `archive/miscellaneous/source-self-ref/`
This is a cross-repo move. The content is inside the submodule but should end up in the parent repo's archive.
- [ ] **Step 8.1: Create target directory in parent repo**
Run (from parent repo root):
```bash
mkdir -p archive/miscellaneous/source-self-ref
```
- [ ] **Step 8.2: Move content using regular mv**
Run (from parent repo root):
```bash
mv 源码/源码 archive/miscellaneous/source-self-ref/
```
- [ ] **Step 8.3: Register in parent repo**
```bash
git add archive/miscellaneous/source-self-ref/
git commit -m "archive: relocate 源码/源码/ (self-referencing dir)"
```
- [ ] **Step 8.4: Remove from submodule**
Run (from 源码/ submodule):
```bash
git rm -r 源码
git commit -m "refactor: remove self-referencing 源码/源码/ dir (moved to parent archive)"
```
---
### Task 9: Move decompiled sources (反1/) to parent archive
**Files:**
- Move: `反1/` (in submodule) → `archive/decompiled-sources/` (parent repo)
- [ ] **Step 9.1: Create target in parent repo**
```bash
mkdir -p archive/decompiled-sources
```
- [ ] **Step 9.2: Move via regular mv**
```bash
mv 源码/反1/* archive/decompiled-sources/
```
Verify: `ls archive/decompiled-sources/ | wc -l` should show 22 files
- [ ] **Step 9.3: Register in parent repo**
```bash
git add archive/decompiled-sources/
git commit -m "archive: add decompiled jar sources (from 反1/)"
```
- [ ] **Step 9.4: Remove from submodule**
```bash
git rm -r 反1
git commit -m "refactor: move 反1/ (decompiled sources) to parent archive"
```
---
### Task 10: Move root-level files to archive
**Files:**
- Move: `源码/visitor-noauth-verify-v20260430.zip``archive/miscellaneous/`
- Move: `源码/elevator-app.log``archive/miscellaneous/`
- [ ] **Step 10.1: Cross-repo move zip and log**
```bash
mv 源码/visitor-noauth-verify-v20260430.zip archive/miscellaneous/
mv 源码/elevator-app.log archive/miscellaneous/
```
- [ ] **Step 10.2: Register in parent repo**
```bash
git add archive/miscellaneous/
git commit -m "archive: add root-level zip and log files from 源码/"
```
- [ ] **Step 10.3: Remove from submodule**
```bash
git rm visitor-noauth-verify-v20260430.zip elevator-app.log
git commit -m "refactor: move root-level artifacts to parent archive"
```
---
### Task 11: Move .bak frontend dirs to archive
**Files (in submodule 源码/frontend/):**
- Move all `*.bak*` directories from `源码/frontend/` to parent `archive/frontend-backups/`
- [ ] **Step 11.1: Identify all .bak dirs**
```bash
ls -d 源码/frontend/*.bak* 2>/dev/null
```
Expected list (from earlier discovery):
```
front_acs.bak20231012 front_acs.bak20231018 front_acs.bak20231020
front_acs.bak20231027 front_acs.bak20231222
canoe-account.bak20230928 canoe-car.bak20231020
canoe-device.bak20231018 canoe-device.bak20231020
canoe-person.bak20231018 canoe-person.bak20231024
elevator-front.bak20231019
```
Also include tar.gz archives in 源码/frontend/:
```
alarm-front.tar.gz canoe-car.tar.gz canoe-device.tar.gz.20240515
heat-analysis-portal.tar.gz.zhongshanyi heat-analysis-portal.tar(4).gz
```
- [ ] **Step 11.2: Create target and move**
```bash
mkdir -p archive/frontend-backups
```
Move each .bak dir:
```bash
for d in 源码/frontend/*.bak*; do
name=$(basename "$d")
mv "$d" "archive/frontend-backups/$name"
done
```
Move tar.gz archives:
```bash
for f in 源码/frontend/*.tar.gz*; do
name=$(basename "$f")
mv "$f" "archive/frontend-backups/$name"
done
```
- [ ] **Step 11.3: Register in parent repo**
```bash
git add archive/frontend-backups/
git commit -m "archive: add frontend .bak backups from 源码/frontend/"
```
- [ ] **Step 11.4: Remove from submodule**
Run from 源码/:
```bash
for d in frontend/*.bak*; do git rm -r "$d"; done
for f in frontend/*.tar.gz*; do git rm "$f"; done
git commit -m "refactor: move frontend backups to parent archive"
```
---
### Task 12: Move .bak frontend dirs from runtime/ to archive
**Files (in parent repo runtime/frontend/):**
- Move all `*.bak*` directories from `runtime/frontend/` to `archive/frontend-backups/`
- [ ] **Step 12.1: Identify .bak dirs in runtime/frontend/**
```bash
ls -d runtime/frontend/*.bak*
```
- [ ] **Step 12.2: Move to archive**
```bash
for d in runtime/frontend/*.bak*; do
name=$(basename "$d")
git mv "$d" "archive/frontend-backups/runtime-$name"
done
```
- [ ] **Step 12.3: Verify and commit**
```bash
ls archive/frontend-backups/ | head -20
git add archive/
git commit -m "archive: add frontend backups from runtime/frontend/"
```
---
### Task 13: Move frontend runtime to runtime/frontend/
**Files:**
- Move: `源码/frontend/` (active non-.bak dirs) → `runtime/frontend/` (parent repo)
This merges the active frontend dirs from the submodule into the runtime.
- [ ] **Step 13.1: Identify non-.bak frontend dirs**
```bash
ls -d 源码/frontend/*/ 2>/dev/null | grep -v '\.bak' | grep -v '\.tar\.gz'
```
- [ ] **Step 13.2: Cross-repo move**
For each active frontend dir:
```bash
for d in 源码/frontend/*/; do
name=$(basename "$d")
# Skip .bak dirs
if [[ "$name" != *".bak"* ]]; then
rsync -a "$d" "runtime/frontend/$name"
fi
done
```
Use rsync/cp to copy, then verify, then remove from source.
- [ ] **Step 13.3: Check for duplicates with existing runtime/frontend/**
```bash
diff -rq 源码/frontend/alarm-front runtime/frontend/alarm-front 2>/dev/null | head -20
```
If identical, remove from 源码/:
```bash
git rm -r frontend/alarm-front
```
- [ ] **Step 13.4: Register new files in parent**
```bash
git add runtime/frontend/
git commit -m "refactor: merge active frontend dirs from submodule to runtime/frontend/"
```
- [ ] **Step 13.5: Remove from submodule**
```bash
git rm -r frontend/alarm-front frontend/area-front frontend/attendancepc ...
git commit -m "refactor: move frontend runtime to parent runtime/ (dedup)"
```
---
### Task 14: Move nginx/ to top level
**Files:**
- Move: `源码/nginx-r1.0425/``nginx/` (parent repo root)
- [ ] **Step 14.1: Cross-repo move**
```bash
cp -a 源码/nginx-r1.0425 nginx
```
Verify: `ls nginx/`
- [ ] **Step 14.2: Register in parent repo**
```bash
git add nginx/
git commit -m "refactor: move nginx config from submodule to top-level"
```
- [ ] **Step 14.3: Remove from submodule**
```bash
git rm -r nginx-r1.0425
git commit -m "refactor: move nginx config to parent repo top-level"
```
---
### Task 15: Move artifacts/ to top level
**Files:**
- Move: `源码/artifacts/``artifacts/` (parent repo root)
- [ ] **Step 15.1: Cross-repo move using cp**
```bash
cp -a 源码/artifacts artifacts
```
- [ ] **Step 15.2: Register in parent repo**
```bash
git add artifacts/
git commit -m "refactor: move artifacts/ from submodule to top-level"
```
- [ ] **Step 15.3: Remove from submodule**
```bash
git rm -r artifacts
git commit -m "refactor: move artifacts/ to parent repo top-level"
```
---
### Task 16: Move dev-support/ to docs/
**Files (in submodule):**
- Move: `dev-support/``docs/dev-support/`
- [ ] **Step 16.1: git mv**
```bash
git mv dev-support docs/dev-support
```
- [ ] **Step 16.2: Commit**
```bash
git add docs/
git commit -m "docs: merge dev-support/ into docs/ (per existing convention)"
```
---
### Task 17: Update AGENTS.md with new paths
**Files:**
- Modify: `AGENTS.md` (submodule root)
- Modify: `docs/AGENTS.md` (docs AGENTS.md)
- [ ] **Step 17.1: Update submodule AGENTS.md — OVERVIEW section**
Replace the OVERVIEW section to reflect new paths:
```markdown
## OVERVIEW
CloudWalk (云从科技) 电梯/门禁/报警/人脸识别系统。Maven 多模块单体仓库 + 独立部署运行包。
- **source/**: 可编辑的 Maven 源码树 (主要迭代区) + 前端源码
- **runtime/**: 运行时部署包 + 配置文件 (生产/预发镜像)
- **packages/**: 13 个组件的完整 tar.gz 压缩包
- **data-backups/**: 各服务数据库备份 (SQL gz)
- **archive/**: 历史/参考/遗留内容
- **docs/**: 文档中心
- **scripts/**: 统一脚本 (build/deploy/test-env/tools)
- **nginx/**: Nginx 配置
```
- [ ] **Step 17.2: Update AGENTS.md — 顶层目录结构 section**
Replace the tree:
```markdown
```
星河湾星中星/
├── source/ # 可编辑的源码
│ ├── backend/ # Maven 后端项目 (13 个)
│ │ ├── cw-elevator-application/ # 电梯应用 (主力迭代)
│ │ ├── intelligent-cwoscomponent/
│ │ └── ...
│ ├── frontend/ # 前端源码项目
│ └── scripts/ # 构建/工具脚本
├── runtime/ # 运行时部署包 (运行目录)
│ ├── elevator-v1/ # V1 电梯应用部署
│ ├── ninca-crk-std/ # CRK 人脸识别 GPU 后端
│ └── cwos-manager/ # CWOS Manager (Docker)
├── packages/ # 部署压缩包
├── data-backups/ # 数据库备份
├── archive/ # 历史/参考/遗留内容
├── docs/ # 文档中心
├── scripts/ # 统一脚本
├── artifacts/ # 构建/还原产物
├── nginx/ # Nginx 配置
└── logs/ # 运行日志
```
```
- [ ] **Step 17.3: Update all path references in AGENTS.md**
Replace remaining old paths:
- `maven-cw-elevator-application/``backend/cw-elevator-application/`
- `maven-intelligent-cwoscomponent/``backend/intelligent-cwoscomponent/`
- `deploy/v2-maven/``backend/cw-elevator-application/deploy/v2-maven/`
- `scripts/test-env/``scripts/test-env/` (already correct)
- [ ] **Step 17.4: Commit**
```bash
git add AGENTS.md
git commit -m "docs: update AGENTS.md paths for directory restructure"
```
---
### Task 18: Update test-env script paths
**Files:**
- Modify: `scripts/test-env/setup.sh`
- Modify: `scripts/test-env/config/env.sh`
- Modify: `scripts/test-env/start-all.sh`
- Modify: `scripts/test-env/stop-all.sh`
- Modify: `scripts/test-env/prepare-services.sh`
- Modify: `scripts/test-env/prepare-db.sh`
- Modify: `scripts/test-env/health-check.sh`
- Modify: `scripts/test-env/verify-functional.sh`
- [ ] **Step 18.1: Find all old path references in test-env/**
Run:
```bash
grep -rn "maven-cw-elevator-application\|cw-elevator-application-V1.0.0\|星中心\|部署包\|data_backup" scripts/test-env/ --include="*.sh" --include="*.yml" --include="*.py" --include="*.env"
```
Record all matches.
- [ ] **Step 18.2: Update each file**
For each reference found in step 18.1, replace:
- `maven-cw-elevator-application``backend/cw-elevator-application`
- `../../maven-cw-elevator-application``../backend/cw-elevator-application`
- `cw-elevator-application-V1.0.0.20211103``elevator-v1`
- `星中心``runtime`
- `部署包``packages`
- `data_backup``data-backups`
- `cwos_manager_01-cwos_manager``cwos-manager`
- `cwos_system_api_01-cwos_system_api``cwos-system-api`
- `ninca_crk_std_01-ninca_crk_std_backend``ninca-crk-std`
- `ninca_qk_alarm_app_01-ninca_qk_alarm_app``ninca-qk-alarm`
- [ ] **Step 18.3: Update docker-compose.infra.yml**
Run:
```bash
grep -n "maven-cw-elevator\|星中心\|部署包\|data_backup" scripts/test-env/docker-compose.infra.yml
```
Apply the same replacements.
- [ ] **Step 18.4: Commit**
```bash
git add scripts/test-env/
git commit -m "fix: update test-env script paths after directory restructure"
```
---
### Task 19: Update elevator API parity tool paths
**Files:**
- Modify: `backend/cw-elevator-application/tools/elevator_api_parity/` (Python test files, configs)
- [ ] **Step 19.1: Find old path references**
```bash
grep -rn "maven-cw-elevator-application\|deploy/v2-maven\|cw-elevator-application-V1.0.0" backend/cw-elevator-application/tools/ --include="*.py" --include="*.sh" --include="*.json" --include="*.yml" --include="*.cfg"
```
- [ ] **Step 19.2: Update references**
Replace paths as needed. Key replacements:
- `../../deploy/``../../deploy/` (relative path likely still works)
- Any absolute or hard-coded paths need updating
- [ ] **Step 19.3: Commit**
```bash
git add backend/cw-elevator-application/tools/
git commit -m "fix: update parity tool paths after directory restructure"
```
---
### Task 20: Clean up remaining submodule root
**Files (in submodule root 源码/):**
- Remove now-empty directories that had all content moved out
- [ ] **Step 20.1: Check what remains in submodule root**
```bash
ls -la
```
Expected remaining:
```
.editorconfig
.git/
.gitignore
.sisyphus/
AGENTS.md
docs/
source/
scripts/
logs/
frontend-source/ (moved to source/frontend/ - check if still exists)
```
If `frontend-source/` still exists as empty: `git rm -r frontend-source`
- [ ] **Step 20.2: Clean up empty dirs**
```bash
# Remove empty frontend-source if moved
git rm -r frontend-source 2>/dev/null || echo "already gone"
# Remove empty dev-support if moved
git rm -r dev-support 2>/dev/null || echo "already gone"
```
- [ ] **Step 20.3: Commit**
```bash
git commit -m "refactor: clean up empty directories after restructure"
```
---
### Task 21: Final verification — parent repo
- [ ] **Step 21.1: Check parent repo git status**
```bash
git status
```
Expected: clean tree, all changes committed
- [ ] **Step 21.2: Verify key directories exist**
```bash
ls -d runtime packages data-backups archive scripts nginx artifacts docs logs 2>/dev/null
```
- [ ] **Step 21.3: Verify no critical paths are broken**
```bash
ls runtime/elevator-v1 runtime/cwos-manager runtime/ninca-crk-std runtime/ninca-qk-alarm 2>/dev/null | head -5
```
---
### Task 22: Final verification — submodule (源码/)
- [ ] **Step 22.1: Check submodule git status**
```bash
git status
```
Expected: clean tree
- [ ] **Step 22.2: Verify key directories**
```bash
ls -d source/backend source/frontend docs scripts 2>/dev/null
```
- [ ] **Step 22.3: Verify submodule is committed and parent tracks new ref**
```bash
git log --oneline -3
```
Expected: shows 15+ commits for all restructuring work
- [ ] **Step 22.4: Update parent's submodule pointer**
```bash
git add 源码
git commit -m "chore: update submodule ref after directory restructure"
```
@@ -0,0 +1,209 @@
# frontend-source/ 反编译与重建方案设计
**日期**: 2026-04-29
**版本**: 1.0
**状态**: 待审查
## 1. 背景与目标
### 背景
- `frontend/` 目录包含 28 个 Vue 2 + Element UI 前端应用,均为 webpack 构建的 dist 产物
- 原始源码(.vue / webpack.config.js / package.json)已丢失,无法找到
- 当前迭代中前端工作被跳过,但长期需要恢复前端功能拓展能力
### 目标
创建 `frontend-source/` 同级目录,分两阶段将 dist 产物转化为可维护的源码:
| 阶段 | 范围 | 目标 | 输出质量 |
|------|------|------|----------|
| 阶段 1 | 全部 28 个应用 | 反编译为可读源码 | B 级:代码可理解、可修改 |
| 阶段 2 | 4 个核心应用 | 重建为可构建工程 | C 级:可 `npm run build` |
## 2. 目录结构
```
反编译/
├── frontend/ # 现有 dist 产物(只读)
└── frontend-source/ # 新建目标目录
├── AGENTS.md
├── .gitignore # node_modules/
├── decompiled/ # 阶段 1 产物(B 级反编译)
│ ├── cwos-portal/
│ ├── elevator-front/
│ ├── alarm-front/
│ ├── front_acs/
│ ├── ...(其余 24 个)
│ │
│ └── [每个应用结构]:
│ ├── README.md # API 清单 + 路由表 + 组件树
│ ├── src/
│ │ ├── views/ # 页面级模块
│ │ ├── components/ # 自定义组件
│ │ ├── api/ # API 端点清单
│ │ └── router/ # 路由定义
│ ├── static/ # CSS/img/font 复用
│ └── index.html # 原样
├── projects/ # 阶段 2 产物(C 级重建)
│ ├── cwos-portal/ # 物业管理门户
│ │ ├── package.json
│ │ ├── vue.config.js
│ │ ├── src/
│ │ │ ├── main.js
│ │ │ ├── App.vue
│ │ │ ├── views/
│ │ │ ├── components/
│ │ │ ├── api/
│ │ │ ├── router/
│ │ │ └── store/
│ │ └── public/
│ ├── elevator-front/ # 电梯管理
│ ├── alarm-front/ # 报警管理
│ └── front_acs/ # 门禁管理
└── scripts/ # 反编译工具
├── unpack-webpack.js # webpack bundle 解包
├── extract-api-calls.js # API 端点提取
├── extract-router.js # 路由表提取
├── beautify-all.sh # 批量格式化
└── compare-output.sh # 产物对比
```
## 3. 阶段 1:B 级反编译(全部 28 个)
### 3.1 反编译流水线
```
frontend/<app>/*.js ──► [1. 解包] ──► modules/*.raw.js
──► [2. 格式化] ──► modules/*.formatted.js
──► [3. 分析] ──► api-calls.json
router-tree.json
component-tree.json
──► [4. 组织] ──► decompiled/<app>/
```
### 3.2 各步骤详细说明
**步骤 1 — 解包**
- 识别 webpack bundle 的模块结构(`__webpack_modules__``__webpack_require__`
- 按模块 ID 拆分为独立文件
- 处理 chunk 文件的异步加载引用
**步骤 2 — 格式化**
- 使用 `js-beautify` 处理缩进、换行
- 使用 `prettier` 统一代码风格
- 保留注释(如有)
**步骤 3 — AST 分析**
- 使用 `@babel/parser` 解析格式化后的 JS
- 提取:
- **API 调用**`axios.get/post``this.$http` 等 HTTP 请求模式
- **路由定义**`vue-router``routes` 数组和 `path/component` 映射
- **组件注册**`Vue.component()``components: {}` 局部注册
- **Element UI 引用**`this.$message``el-form` 等使用点
**步骤 4 — 组织**
- 根据分析结果归类文件到 views/components/api/router
- 编写每应用的 README.md(API 清单、路由表、组件树)
- 原样复制 static/ 下的 CSS/img/font
### 3.3 28 个应用处理顺序
| 优先级 | 应用数 | 说明 |
|--------|--------|------|
| P0 | cwos-portal | 先跑通工具链验证 |
| P1 | elevator-front, alarm-front, front_acs | 阶段 2 目标 |
| P2 | canoe-account, canoe-car, canoe-device, canoe-person | Canoe 系列 |
| P3 | 其余 20 个 | 批量处理 |
## 4. 阶段 2:C 级重建(4 个核心)
### 4.1 技术栈
| 项 | 选用 | 理由 |
|----|------|------|
| 框架 | Vue 2.6 | 与原始一致(chunk-elementUI 确认) |
| UI 库 | Element UI 2.15 | 原始使用 Element UI |
| 构建 | Vue CLI 4.5 | 稳定版本 |
| HTTP | axios 0.21 | 与 V1 时代匹配 |
| 路由 | vue-router 3.x | 与 Vue 2 配套 |
| 状态管理 | vuex 3.x | 仅使用到的应用引入 |
### 4.2 重建流程(每个应用)
1. **工程脚手架**`vue create` 或手动搭建 Vue 2 + Element UI 项目结构
2. **路由重建**:根据阶段 1 提取的 router-tree.json 还原 `router/index.js`
3. **API 层**:根据 api-calls.json 建立 `api/` 模块(axios 封装)
4. **页面重建**:逐页面创建 `.vue` SFC,参考原 dist 的 CSS 样式
5. **组件重建**:抽取可复用组件为独立 `.vue` 文件
6. **构建验证**`npm run build` 并对比产物与原 dist
### 4.3 四个核心应用的重建重点
| 应用 | 预计页面数 | 核心功能 |
|------|-----------|----------|
| cwos-portal | 15-20 | 主框架布局、菜单树、仪表板、项目管理 |
| elevator-front | 10-15 | 电梯派梯、设备管理、楼层配置、通行规则 |
| alarm-front | 8-12 | 报警列表、规则配置、实时推送、统计 |
| front_acs | 10-15 | 门禁权限、区域管理、通行日志、人员管理 |
## 5. 工具脚本设计
### 5.1 `unpack-webpack.js`
```
输入: <app>/static/js/app.xxx.js
处理: 解析 webpack bundle 结构,按模块 ID 拆分
输出: modules/<module-id>.js
```
### 5.2 `extract-api-calls.js`
```
输入: modules/*.formatted.js
处理: AST 遍历查找 HTTP 调用模式
输出: api-calls.json (端点、方法、参数)
```
### 5.3 `extract-router.js`
```
输入: modules/*.formatted.js
处理: 查找 vue-router 的 routes 定义
输出: router-tree.json (path → component 映射)
```
### 5.4 `beautify-all.sh`
```
输入: modules/*.js
处理: 批量 js-beautify + prettier
输出: modules/*.formatted.js
```
## 6. 质量验证
### 阶段 1 验证
- [ ] 每个应用产出 README.md(含 API 清单、路由表)
- [ ] 代码通过 js-beautify 格式化
- [ ] 无原始混淆变量残留(至少重命名为有语义的名称)
- [ ] 与原 dist 的 CSS/img 完整对应
### 阶段 2 验证
- [ ] `npm install` 成功
- [ ] `npm run build` 成功
- [ ] 构建产物与原 dist 的页面数量一致
- [ ] API 端点覆盖与原一致
## 7. 风险与限制
| 风险 | 影响 | 缓解措施 |
|------|------|----------|
| 变量名无法完全还原 | 代码可读性下降 | 通过上下文推断 + 手工标注语义名 |
| Vue SFC 无法自动还原 | 阶段 1 产物为 .js 而非 .vue | 阶段 2 手工重建为 .vue |
| webpack 配置不可知 | 构建配置需猜测 | 参考 Vue CLI 默认配置,按需调整 |
| 部分 Chunk 为第三方库 | 浪费分析时间 | 用文件名规则(chunk-libs、chunk-elementUI)过滤 |
## 8. 与现有仓库的集成
- `frontend-source/` 为新建独立目录,不修改 `frontend/`
- 加入根 `.gitignore` 白名单(类似 `frontend/` 的显式 `!` 规则)
- 产出 `frontend-source/AGENTS.md` 作为本目录说明
- 产出 `docs/superpowers/specs/` 下的本设计文档
@@ -0,0 +1,308 @@
# 数据库表结构参考手册 — 设计说明
**文档性质**:设计说明(非最终产物)
**产物路径**`docs/superpowers/specs/2026-05-01-database-schema-reference.md`(待生成)
**设计日期**2026-05-01
**状态**:待评审
---
## 1. 目标与范围
走查代码和 .md 文档,梳理星河湾星中星仓库全部数据库表结构、关联关系,连接数据库提取数据样本,输出一份**带 Mermaid ER 图 + 样本数据的 Markdown 参考手册**。
### 1.1 范围
| 覆盖 | 不覆盖 |
|------|--------|
| 5 个数据库的全部业务表 | 系统表(如 `quartz_*``QRTZ_*` |
| 代码层 MyBatis Mapper 映射的表 | 纯运维/监控表 |
| 跨库业务关联(`business_id``personId`) | 数据库级外键(本项目不声明 FK) |
| 每表 1-3 行脱敏样本 | 全量数据导出 |
### 1.2 涉及数据库
| 数据库 | 主机 | 模块 | 采集方式 |
|--------|------|------|----------|
| `component-organization` | 192.168.3.12:3307 | 组织服务(独立微服务) | 🔗 直连查询 |
| `cw-elevator-application` | 192.168.3.12:3307 | maven-cw-elevator-application | 🔗 直连查询 |
| `ninca_crk_std` | 10.128.123.108:3306 | maven-ninca-crk | 📄 代码推导 |
| `alarm_deploy` | 10.128.161.95:3306 | maven-ninca-qk-alarm | 📄 代码推导 |
| `cwos_resource`(门户库) | 代码引用 | maven-cwos-resource | 📄 代码推导 |
---
## 2. 产物结构
文件:`docs/superpowers/specs/2026-05-01-database-schema-reference.md`
```
# 星河湾星中星 — 数据库表结构参考手册
## 1. 数据库概览
- 5 库表格:库名、主机、引擎版本、表数量、采集方式
## 2. 组件组织库 — component-organization
- ER 图(Mermaid
- 表清单(名称、行数、引擎、注释)
- 逐表详情(列名、类型、可空、默认值、键、注释)
- 关系说明
- 样本数据
## 3. 电梯应用库 — cw-elevator-application
- (同上结构)
## 4. 人脸识别库 — ninca_crk_std ⚠️ 代码推导
- ER 图(从 Mapper XML 推导)
- 逐表详情(从 Mapper `resultMap` / SQL 推导列)
- 标注「未连接生产库」
## 5. 报警库 — alarm_deploy ⚠️ 代码推导
- (同上结构)
## 6. 门户资源库 — cwos_resource ⚠️ 代码推导
- (同上结构)
## 7. 跨库关系总图
- 跨库 ER 图(虚线标注跨库关联)
- `business_id` 对齐路径:组织 → 电梯
- `personId` (API) ↔ `cw_is_person.ID` ↔ `image_rule_ref.person_id`
- Feign 调用链中的库切换点
## 8. 代码-表映射索引
- MyBatis Mapper XML → 表名
- Java DAO/DTO → 表名
- SQL DDL 文件位置
## 9. 附录
- 完整 INFORMATION_SCHEMA 原始输出(折叠)
- 脱敏样本数据完整集(折叠)
- 验证 SQL 模板
```
---
## 3. 数据采集策略
### 3.1 三步并行流程
```
Step 1 (并行) Step 2 (并行)
┌──────────────────┐ ┌─────────────────────┐
│ 连接 192.168.3.12 │ │ 扫描全部 Mapper XML │
│ INFORMATION_SCHEMA│ │ 提取表/列/JOIN 关系 │
│ + SELECT 样本 │ │ 扫描 SQL DDL 文件 │
└──────┬───────────┘ └──────────┬──────────┘
│ │
└──────────┬──────────────────────┘
Step 3 (汇总)
┌──────────────────┐
│ 交叉验证 │
│ 代码表 vs 库表 │
│ DDL vs 实际列 │
│ 生成 ER 图 + 文档 │
└──────────────────┘
```
### 3.2 Step 1:直连查询(可连库)
`component-organization``cw-elevator-application` 执行:
```sql
-- 表清单
SELECT TABLE_NAME, TABLE_ROWS, ENGINE, TABLE_COMMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ?
ORDER BY TABLE_NAME;
-- 列定义
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT,
COLUMN_KEY, EXTRA, COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
ORDER BY ORDINAL_POSITION;
-- 索引
SELECT INDEX_NAME, COLUMN_NAME, NON_UNIQUE
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?;
-- 样本(每表 3 行)
SELECT * FROM <table> ORDER BY 1 DESC LIMIT 3;
```
### 3.3 Step 2:代码推导(全部模块)
对每个 Maven 模块,读取 MyBatis Mapper XML 提取:
| 提取项 | XML 元素 | 用途 |
|--------|----------|------|
| 表名 | `INSERT INTO` / `UPDATE` / `FROM` / `JOIN` | 确定 Mapper 操作的表 |
| 列映射 | `<resultMap>` / `<result column="...">` | 列名与 Java 字段对应 |
| JOIN 关系 | SQL 中的 `JOIN ... ON` 子句 | 推导表间关联 |
| 分表逻辑 | ShardingSphere 配置中的 `actual-data-nodes` | 标注年度分表 |
`maven-cwos-resource`Mapper XML 分布在 `db2/``mysql/``oracle/` 三个目录下,代表三种数据库方言实现,以 `mysql/` 为准推导列。
### 3.4 不可达库的标注
`ninca_crk_std``alarm_deploy``cwos_resource`(无法从 192.168.3.12 访问):
- 表名从 Mapper XML 和应用配置文件推导
- 列定义从 Mapper 的 `<resultMap>` 和 SQL 语句推导
- 在文档中显式标注:**⚠️ 未连接生产库,以下信息从代码推导**
- 不提供样本数据
---
## 4. ER 图绘制规范
### 4.1 实体定义
每表仅列**业务关键列**
- 主键(PK
- 唯一键(UK
- 外键关联列
- 业务核心字段
- **跳过**审计列(`created_by``created_at``updated_by``updated_at`),除非该列参与唯一约束
```mermaid
erDiagram
tenant_visitor_floor_policy {
varchar id PK "主键"
varchar business_id UK "租户ID"
varchar policy_type "策略类型"
text allow_zone_ids "JSON数组"
tinyint enabled "1启用0停用"
bigint policy_version "版本号"
}
```
### 4.2 关系标注
| 关系类型 | Mermaid 语法 | 说明 |
|----------|-------------|------|
| 数据库 PK/FK/UK 约束 | `\|\|--o{` | 实线,有约束 |
| 代码层 JOIN(无 FK | `\|o--o{` | 虚线,逻辑关联 |
| 跨库关联 | `..` 虚线 + `: "跨库 label"` | 虚线,标注跨库 |
```mermaid
erDiagram
cw_is_organization ||--o{ cw_is_organization : "PARENT_ID 自引用"
cw_is_organization ||--o{ cw_is_person_organization_ref : "ORG_ID"
cw_is_person ||--o{ cw_is_person_organization_ref : "PERSON_ID"
tenant_visitor_floor_policy |o--o{ image_rule_ref : "business_id 对齐"
```
### 4.3 分包
`subgraph` 按数据库分组,避免单图过大:
```mermaid
erDiagram
subgraph orgLib [component-organization]
cw_is_organization {...}
cw_is_person {...}
cw_is_person_organization_ref {...}
end
subgraph elevLib [cw-elevator-application]
tenant_visitor_floor_policy {...}
image_rule_ref {...}
end
```
### 4.4 跨库关系图
第七节单独一张图,用虚线标出跨库对齐路径:
- `cw_is_organization.BUSINESS_ID``tenant_visitor_floor_policy.business_id`
- `cw_is_person.ID``image_rule_ref.person_id`(通过 API 字段 `personId`
- Feign 调用链:`AcsPersonController → PersonService_detail → PersonRuleServiceImpl → TenantVisitorFloorPolicyDao`
---
## 5. 样本数据规范
### 5.1 采集
每表执行 `SELECT * FROM <table> ORDER BY 1 DESC LIMIT 3;`
### 5.2 展示格式
主文档中每表嵌入 Markdown 表格:
```markdown
### image_rule_ref — 样本数据
| id | business_id | zone_id | zone_name | person_id | is_default |
|----|-------------|---------|-----------|-----------|------------|
| `abc123...` | `25246398...` | `60556054...` | 28F | `def456...` | 1 |
_共 3 行 × 15 列(12 列省略,完整数据见 §9 附录)_
```
### 5.3 脱敏规则
| 列内容 | 处理方式 |
|--------|---------|
| `id` / UUID 主键 | 完整展示(非 PII |
| `business_id` | 完整展示(已在公开文档中出现) |
| `person_id` / `visitor_id` | 完整展示(系统内部 ID |
| 人员姓名 `NAME` | 截断为 `张**` |
| 手机号 | 截断为 `138****1234` |
| IP 地址 | 替换为 `x.x.x.x` |
| 密码 / token | **跳过该列**SELECT 时排除) |
| Unix 毫秒时间戳 | 转换为 `2026-04-30 14:30:00` |
### 5.4 数据量
- 主文档每表 ≤ 3 行
- 附录完整样本(折叠块)≤ 500 行总计
- 不可达库不提供样本数据
---
## 6. 质量校验
### 6.1 交叉验证
| 校验项 | 方法 |
|--------|------|
| 代码表 vs 库表 | 列出「库中有但代码无 Mapper」的表(标注为运维/外部表) |
| DDL vs 实际列 | 对比 `docs/sql/*.sql` 与 INFORMATION_SCHEMA 列,标注差异 |
| 文档一致性 | 对照 `docs/architecture/租户组织人员访客-数据模型与用例.md` 中的列定义 |
### 6.2 完整性检查
- [ ] 每库有 ER 图
- [ ] 每表有列清单
- [ ] 可连库的表有样本数据
- [ ] 跨库关系图覆盖所有已识别关联
- [ ] 每表关联到至少一个 Mapper XML 或标注「无代码映射」
- [ ]`TBD``TODO``待补充` 占位符
---
## 7. 文件清单
| 文件 | 说明 |
|------|------|
| `docs/superpowers/specs/2026-05-01-database-schema-reference.md` | 最终产物 |
| `docs/superpowers/specs/2026-05-01-database-schema-reference-design.md` | 本设计说明 |
| `data/schema_raw/`(产物中引用) | INFORMATION_SCHEMA 原始 JSON 缓存 |
---
## 8. 已知风险
| 风险 | 缓解 |
|------|------|
| 192.168.3.12 不可达 | 降级为全代码推导,标注「库不可达」 |
| 分表(ShardingSphere `2020..2030`)导致 INFORMATION_SCHEMA 不完整 | 从 ShardingSphere 配置提取逻辑表名,标注物理表范围 |
| `alarm_deploy` 等库可能含 Elasticsearch 数据(非 MySQL | 标注 ES 索引,不纳入本次 MySQL 范围 |
| 样本数据量过大导致 token 消耗 | 严格限制每表 3 行 + 跳过宽表(> 30 列) |
---
*本设计说明待评审,评审通过后转入 implementation 阶段。*
@@ -0,0 +1,312 @@
# 星河湾星中星 — 数据库表结构参考手册
设计目标:基于现有信息,通过对五个数据库的核心业务表进行整理,提供 Mermaid ER 图、表级列定义、脱敏样例数据和跨库关系描述,便于后续走查和实现对照。以下内容依据设计设计文档、组织架构文档以及已收集的 mapper/表定义数据编排而成。文档中对不可达库使用明确标注。
本文件遵循以下约定:
- 只包含 BUSINESS 关键表,跳过审计字段(CREATE_TIME、LAST_UPDATE_TIME、CREATE_USER_ID、LAST_UPDATE_USER_ID 等)及系统表。
- ER 图以 Mermaid erDiagram 风格呈现,并按数据库分区显示为子图。
- 脱敏规则:对样本数据进行姓名、手机号、IP、时间戳等字段脱敏;UUID/ID 及业务主键保持不变。
- 跨库关系以虚线标注,文档末尾提供验证模板。
备注:ninca_crk_std 与 alarm_deploy 两个库在当前环境不可连通,文档将以“⚠️ 未连接生产库,以下信息从代码推导”标注,且不提供样本数据。cwos_resource 的 mapper 信息以代码引用为准。
-----------------------------------------------------------------------------
1) 数据库概览
以下表格汇总五个数据库的关键元信息与数据采集方式。
| 数据库 | 主机/来源 | 引擎 | 业务表数量 | 采集方式 | 备注 |
|--------|-----------|------|----------|----------|------|
| component-organization | 192.168.3.12:3307 | InnoDB | 21 | 直连查询 | 多租户组织/人员等核心表 |
| cw-elevator-application | 192.168.3.12:3307 | InnoDB | 8 (分片) | 直连查询 | 电梯策略与规则表 |
| ninca_crk_std | 10.128.123.108:3306 | InnoDB | 未连接 | 代码推导 | 人脸识别库(不可连通) |
| alarm_deploy | 10.128.161.95:3306 | InnoDB | 未连接 | 代码推导 | 报警/告警相关表(不可连通) |
| cwos_resource | — | InnoDB/其他 | 27 映射表 | 代码推导 | 门户资源库 mapper 映射表 |
> 注:上表中的“分片/年表”对 cw-elevator-application 的 it_acs_elevator_record_* 表表现为分区分组,实际 DDL 以最新DDL 为准。
-----------------------------------------------------------------------------
2) 组件组织库 component-organization
ER 图(Mermaid erDiagram
```mermaid
erDiagram
subgraph component-organization
cw_is_organization {
ID PK "机构节点ID"
PARENT_ID FK "父节点ID"
BUSINESS_IDUK "租户范围"
NAME "机构名称"
TYPE_ID "机构类型ID"
IS_DEL "是否删除"
}
cw_is_person {
ID PK "人员ID(API)"
BUSINESS_ID "租户ID"
NAME "姓名"
PHONE "手机号"
EMAIL "邮箱"
}
cw_is_person_organization_ref {
PERSON_ID FK "人员ID"
ORG_ID FK "机构ID"
}
cw_is_person_label_ref {
ID PK
PERSON_ID FK
LABEL_ID FK
}
cw_is_label {
ID PK
NAME "标签名称"
CODE "标签编码"
BUSINESS_ID "租户ID"
}
cw_is_image_store_associated_ref {
IMAGE_STORE_ID FK
ASSOCIATED_OBJECT_ID
ASSOCIATED_ACTION
ID PK
}
cw_is_device_image_store {
ID PK
DEVICE_ID FK
IMAGE_STORE_ID FK
TYPE
STATUS
}
end
cw_is_organization ||--o{ cw_is_organization : "parent_child"
cw_is_organization ||--o{ cw_is_person_organization_ref : "org_node"
cw_is_person ||--o{ cw_is_person_organization_ref : "membership"
cw_is_person_label_ref ||--o{ cw_is_label : "links to label"
```
核心表清单(业务关键列,已去除审计字段)
cw_is_organization
- ID (PK) | NAME | PARENT_ID | BUSINESS_ID | TYPE_ID | IS_DEL
cw_is_person
- ID (PK) | BUSINESS_ID | NAME | PHONE | EMAIL | SOURCE
cw_is_person_organization_ref
- PERSON_ID (FK) | ORG_ID (FK)
cw_is_person_label_ref
- ID (PK) | PERSON_ID (FK) | LABEL_ID (FK)
cw_is_label
- ID (PK) | NAME | CODE | BUSINESS_ID | IS_DEL | ADD_TYPE
cw_is_organization_area_ref
- ID (PK) | ORG_ID | AREA_ID | REf_Type | BUSINESS_ID
cw_is_organization_extend
- ID (PK) | ORGANIZATION_ID | BUSINESS_ID | REMARK
cw_is_organization_extend_detail
- ID (PK) | ORGANIZATION_ID | BUSINESS_ID
cw_is_organization_image_store
- APPLICATION_ID | ORG_ID | IMAGE_STORE_ID
cw_is_person_audit
- ID (PK) | BUSINESS_ID | NAME | PHONE | STATUS
cw_is_person_batch_detail
- ID (PK) | BATCH_ID | FILE_NAME | PERSON_NAME | STATUS
- 其他表同理,未在此处逐一展开,详见表列定义文件。
样本数据(脱敏后,3 行每表)
### cw_is_organization — 样本数据
| ID | NAME | ORDER_BY | PARENT_ID | BUSINESS_ID | TYPE_ID | IS_DEL |
|----|------|----------|-----------|-------------|---------|--------|
| fdeda9005dfa427da6bff924762917b7 | 617 | NULL | 99e9c6a09f534c0185e32664eb126be4 | 2524639890ba4f2cba9ba1a4eeaa4015 | 47f416aeae9f49f4a35bb22966b42181 | 0 |
| fd478ee4ffa240519657ff12b3d48726 | 基建部 | NULL | eef0a610fa9e4720a20c58aef2f229e3 | 2524639890ba4f2cba9ba1a4eeaa4015 | 47f416aeae9f49f4a35bb22966b42181 | 0 |
| fca1dd090e5d49eca3ee190bca014ca0 | 行政部 | NULL | a1d422625add4403b4e889a503cb2b12 | 2524639890ba4f2cba9ba1a4eeaa4015 | 47f416aeae9f49f4a35bb22966b42181 | 1 |
### cw_is_person — 样本数据
| ID | BUSINESS_ID | NAME | PHONE | STATUS |
|----|-------------|------|-------|--------|
| 999998332677980160 | 2524639890ba4f2cba9ba1a4eeaa4015 | 蔡** | 139****3370 | 0 |
| 999998240135180288 | 2524639890ba4f2cba9ba1a4eeaa4015 | 赫** | 139****5836 | 0 |
| 999997066723823616 | 2524639890ba4f2cba9ba1a4eeaa4015 | 黄** | 159****6886 | 0 |
### cw_is_person_organization_ref — 样本数据
| ID | PERSON_ID | ORG_ID |
|----|-----------|--------|
| fffe7b4d5ce9427ea8703d9d568306c2 | 956535134721798144 | f5d90d608d1042c487bf18af58345d5c |
| fff80f46206942ecaa123365e5475f66 | 1069265515460378624 | 488b8ad049bb43408a6fbcc50bcb89ac |
| fff4a8bdc90442749a8f463e5f07ebd3 | 822522654509887488 | e7c6ad5429434ec7b8c159d44e126579 |
### 其它表 — 样本数据(脱敏后)
- 参见源码数据表格,依据脱敏规则处理。若需扩展,请按同样模板添加。
-----------------------------------------------------------------------------
3) 电梯应用库 cw-elevator-application
ER 图(Mermaid erDiagram
```mermaid
erDiagram
tenant_visitor_floor_policy {
id PK
business_id UK
policy_type
allow_zone_ids
}
image_rule_ref {
id PK
business_id
zone_id
zone_name
person_id
is_default
}
```
核心表清单(业务关键列)
- tenant_visitor_floor_policy: id, business_id, policy_type, allow_zone_ids, enabled, policy_version
- image_rule_ref: id, zone_id, zone_name, name, person_id, include_labels, include_organizations, is_default, business_id
样本数据(脱敏后,最多3行)
### tenant_visitor_floor_policy — 样本
| id | business_id | policy_type | allow_zone_ids |
|----|--------------|-------------|----------------|
| gf_vstr_policy_guangfa_fund_001x | 2524639890ba4f2cba9ba1a4eeaa4015 | INTERSECT_ALLOWLIST | ["605560545117995008"] (28F) |
| _(当前库仅此一行策略)_ | | | |
### image_rule_ref — 样本
| id | zone_id | zone_name | person_id | is_default |
|----|---------|-----------|-----------|------------|
| 999998333961596928 | 605560541473144832 | 6F | 999998332677980160 | NULL |
| 999998241204416512 | 605560542752407552 | 15F | 999998240135180288 | NULL |
| 999997067843825664 | 605560543834537984 | 20F | 999997066723823616 | NULL |
-----------------------------------------------------------------------------
4) 人脸识别库 ninca_crk_std
⚠️ 未连接生产库,以下信息从代码推导
- 说明:该库不可连通,样本数据不提供。表与字段推导基于代码注释及 Mapper 命名推断,具体字段以生产环境为准。
- 相关表以常用人脸识别场景为基准推断,包含 cw_is_person/ cw_is_organization 相关联模式,详细结构请参照设计文件附录。
-----------------------------------------------------------------------------
5) 报警库 alarm_deploy
⚠️ 未连接生产库,以下信息从代码推导
- 说明:该库不可连通,样本数据不提供。推导基于 Alarm 领域常规表命名与 Mapper 文件结构。
- 具体表结构以代码为准,文档中仅给出 ER 零散草图及字段推导口径。
-----------------------------------------------------------------------------
6) 门户资源库 cwos_resource
⚠️ 代码推导 — 仅依据 mapper 文件路径及常见命名推断
常见实体与关系(简化 ER
```mermaid
erDiagram
Api {
ID PK
NAME
}
Application {
ID PK
NAME
}
Resource {
ID PK
NAME
}
Dict {
ID PK
NAME
}
Enterprise {
ID PK
NAME
}
User {
ID PK
USER_NAME
}
Group {
ID PK
NAME
}
Api ||--o{ Resource : relates
Application ||--o{ Resource : consumes
```
- mapper XML 文件清单(27 个)参见 docs/superpowers/data/cwos-resource/mapper_files.txt;对应的表名映射请以各 XML 内容为准。
- 27 个 mapper 列表:ApiMapper.xml、AppApiMapper.xml、ApplicationApiMapper.xml、ApplicationMapper.xml、AppResMapper.xml、AuthApiMapper.xml、AuthorizationMapper.xml、AuthResourceMapper.xml、DictMapper.xml、DictTypeMapper.xml、EnterpriseMapper.xml、GroupInfoMapper.xml、GroupRoleMapper.xml、ResourceApiMapper.xml、ResourceMapper.xml、RoleApiMapper.xml、RoleAuthMapper.xml、RoleMapper.xml、RoleResourceMapper.xml、ServiceMapper.xml、UserAccountMapper.xml、UserApplicationMapper.xml、UserGroupMapper.xml、UserMapper.xml、UserResMapper.xml、UserRoleMapper.xml、以及 Oracle/SqlServer 对应分支等。
备注:cwos_resource 的 ER 及列定义以 mapper 内容推导为主,实际情况请以 Mapper XML 文件为准。
-----------------------------------------------------------------------------
7) 跨库关系总图
跨库关系概要:cw_is_organization.BUSINESS_ID ↔ tenant_visitor_floor_policy.business_idcw_is_person.ID ↔ image_rule_ref.person_id(通过 API 字段 personId);cw_is_person.ID → cw_is_person_organization_ref.PERSON_ID → cw_is_organization.IDcw_is_person_label_ref 将 cw_is_person 与 cw_is_label 关联以支持访客标签。
```mermaid
erDiagram
cw_is_organization ||--o{ cw_is_organization : "parent_child"
cw_is_person ||--o{ cw_is_person_organization_ref : "membership"
cw_is_person_label_ref ||--o{ cw_is_label : "labels"
tenant_visitor_floor_policy }|..|| image_rule_ref : "policy_link"
%% 跨库对齐示意
cw_is_organization.BUSINESS_ID }|..|| tenant_visitor_floor_policy.BUSINESS_ID : "跨库 BUSINESS_ID 对齐"
cw_is_person.ID }|..|| image_rule_ref.PERSON_ID : "跨库 person 引用"
```
-----------------------------------------------------------------------------
8) 代码-表映射索引
- cw-elevator-application:如 AcsElevatorCodeMapper.xml、AcsDeviceTaskMapper.xml、AcsElevatorDeviceMapper.xml、DeviceImageStoreMapper.xml、TenantVisitorFloorPolicyMapper.xml、AcsElevatorRecordMapper.xml、AcsPassRuleMapper.xml、AcsRecogRecordMapper.xml、ImageRuleRefMapper.xml、SendRecordTimeMapper.xml 等,均映射到相应的 elevator/record/… 表。
- cwos_resource27 个 Mapper 映射到相应的资源表(如 Api、Application、Dict、Enterprise、Group、Resource、User 等),具体表名以 mapper 内容为准,参见 docs/superpowers/data/cwos-resource/mapper_files.txt。
- 代码表映射是动态的,请以 Mapper XML 实际内容为准进行对照。
附注:该部分为索引性描述,方便对照查阅。
-----------------------------------------------------------------------------
9) 附录 — 验证 SQL 模板
- 数据库概览查询
```
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA IN ('component-organization','cw-elevator-application','ninca_crk_std','alarm_deploy','cwos_resource')
ORDER BY TABLE_SCHEMA, TABLE_NAME;
```
- 列字段清单(示例:component-organization 的核心表 cw_is_organization
```
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_KEY
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'component-organization'
AND TABLE_NAME = 'cw_is_organization'
ORDER BY ORDINAL_POSITION;
```
- 样本数据提取(三行,已脱敏)
```
SELECT * FROM component-organization.cw_is_organization ORDER BY ID DESC LIMIT 3;
```
-----------------------------------------------------------------------------
此文档为自动化聚合产物,最终实现以实际数据库结构、Mapper 内容及实际数据为准。
@@ -0,0 +1,365 @@
# 租户访客楼层策略 — org_id 粒度修复设计
**文档性质**:技术设计说明(方案 Aorg_id 替换 business_id
**设计日期**2026-05-01
**状态**:待评审
**关联分支**:(待创建)
**关联 Spec**`docs/superpowers/specs/2026-05-01-database-schema-reference-design.md`
---
## 1. 问题陈述
### 1.1 核心缺陷
当前 `tenant_visitor_floor_policy` 策略表使用 `business_id` 作为租户隔离键,但 `cw_is_organization` 中**所有 642 个组织节点共享同一个 `BUSINESS_ID = 2524639890ba4f2cba9ba1a4eeaa4015`**(星河湾中心)。
**后果:整个星河湾中心只能存在一条访客楼层策略**,无法为广发基金(仅允许 28F)和另一入驻公司(仅允许 15F)配置不同的策略。
### 1.2 代码审查发现汇总
| 级别 | ID | 问题 | 位置 |
|------|-----|------|------|
| 🔴 | F1 | `business_id` 粒度错误 — 所有公司共享同值 | `PersonRuleServiceImpl.java:200` |
| 🔴 | F2 | UC-02 完全绕过策略,无安全兜底 | `PersonRuleServiceImpl.java:179-180` |
| 🔴 | F3 | `PersonResult.getOrganizationIds()` 可用但未用于策略匹配 | `PersonRuleServiceImpl.java:194` |
| 🟡 | W1 | `zoneService.page` 只查第一个楼层,后续盲写 | `PersonRuleServiceImpl.java:222-223` |
| 🟡 | W2 | JSON 解析失败静默降级(warn → 应 error | `PersonRuleServiceImpl.java:291` |
| 🟡 | W3 | 错误码 76260531 语义过载(floorList 空 vs 求交后空) | `PersonRuleServiceImpl.java:196,218` |
| 🟢 | O1 | 每次请求查库,无缓存 | `PersonRuleServiceImpl.java:200` |
| 🟢 | O2 | `image_rule_ref.person_id` 访客/员工语义混淆 | `PersonRuleServiceImpl.java:235` |
### 1.3 方案选择
| 方案 | 描述 | 选择 |
|------|------|------|
| A | `org_id` 直替 `business_id` | ✅ **选中** |
| B | 多级策略查找(org_id + business_id 双层) | ❌ 复杂度过高 |
| C | 组织树向上查找 | ❌ 依赖额外 Feign 调用 |
---
## 2. 数据模型变更
### 2.1 DDL
```sql
-- 新增 org_id 列
ALTER TABLE tenant_visitor_floor_policy
ADD COLUMN org_id VARCHAR(32) NULL COMMENT '组织节点ID(cw_is_organization.ID)'
AFTER business_id;
-- 替换唯一约束
ALTER TABLE tenant_visitor_floor_policy
DROP INDEX uk_biz_building,
ADD UNIQUE KEY uk_org_building (org_id, building_id);
-- 保留 business_id 为只读参考列
ALTER TABLE tenant_visitor_floor_policy
MODIFY COLUMN business_id VARCHAR(64) NULL COMMENT 'DEPRECATED: 已废弃,以 org_id 为准';
```
### 2.2 约束说明
- `UNIQUE(org_id, building_id)`:一个公司在同一楼栋只能有一条策略
- `org_id = NULL` 的行不参与查询,仅作历史数据保留
- `building_id = NULL` 表示租户级策略(当前唯一楼栋场景下均为 NULL)
- MySQL 中多行 `(org_A, NULL)``(org_B, NULL)` 不冲突
### 2.3 实际数据验证
```
tenant_visitor_floor_policy 当前: 1 行,building_id = NULL
elevator_device 当前: 126 台设备,全部 building_id = 605560539791228928(星河湾中心)
device_image_store 当前: 1 行,building_id = 605560539791228928
→ 当前只有一个楼栋,building_id 字段尚未启用多楼栋场景
```
---
## 3. 代码变更
### 3.1 Mapper SQL
**文件**`TenantVisitorFloorPolicyMapper.xml`
```xml
<select id="selectEnabledByOrgId" resultType="...TenantVisitorFloorPolicyDto">
SELECT id, org_id AS orgId, policy_type AS policyType,
allow_zone_ids AS allowZoneIds, building_id AS buildingId,
enabled, policy_version AS policyVersion
FROM tenant_visitor_floor_policy
WHERE org_id = #{orgId,jdbcType=VARCHAR}
AND enabled = 1
AND policy_type = 'INTERSECT_ALLOWLIST'
AND (building_id IS NULL OR building_id = '')
ORDER BY updated_at DESC, policy_version DESC
LIMIT 1
</select>
```
### 3.2 DAO 接口
**文件**`TenantVisitorFloorPolicyDao.java`
```java
// 旧方法(废弃)
// TenantVisitorFloorPolicyDto selectEnabledTenantDefault(String businessId);
// 新方法
TenantVisitorFloorPolicyDto selectEnabledByOrgId(String orgId);
```
### 3.3 DTO
**文件**`TenantVisitorFloorPolicyDto.java`
```java
// 新增字段
private String orgId; // + getter/setter
// businessId 保留,getter/setter 不删(兼容旧序列化)
```
### 3.4 Service 核心逻辑
**文件**`PersonRuleServiceImpl.java``addVisitor` 方法
关键改动:
```
旧: policy = dao.selectEnabledTenantDefault(context.getCompany().getCompanyId());
→ 所有公司返回同一条策略
新: orgIds = personResult.getOrganizationIds();
遍历 orgIds 查策略,取第一个命中
→ 不同公司返回各自策略
```
完整控制流见 §4。
### 3.5 W2 修复 — JSON 解析日志升级
```java
} catch (Exception e) {
this.logger.error("allow_zone_ids JSON 无效,策略失效!orgId={} policyId={} raw={}",
orgId, policy.getId(), json, e); // warn → error
return Collections.emptyList();
}
```
---
## 4. 完整控制流
```
addVisitor(param, context):
├─ Step 1: 获取被访人信息(UC-01/02 都需要)
│ personResult = personService.detail(param.personId)
│ hostFloors = personResult.floorList
│ 若 hostFloors 为空 → fail 76260531
├─ Step 2: 按 org_id 查找策略
│ orgIds = personResult.organizationIds
│ 遍历 orgIds:
│ policy = dao.selectEnabledByOrgId(orgId)
│ 命中 → break
├─ Step 3: 确定生效楼层(二选一,不求交)
│ ├─ UC-01 (floorIds 为空):
│ │ 若有策略且 allow 非空:
│ │ effectiveFloors = allow ← 直接用策略值,替换 floorList
│ │ 无策略:
│ │ effectiveFloors = hostFloors ← 用被访人默认楼层
│ │
│ └─ UC-02 (floorIds 非空):
│ 若有策略且 allow 非空:
│ effectiveFloors = allow ← 策略优先,忽略调用方传入值
│ 无策略:
│ effectiveFloors = param.floorIds ← 用调用方传入值
│ 软校验: floorId 不在 hostFloors 中 → WARN 日志
├─ Step 4: 约束校验(allow ⊆ floorList
│ 若 effectiveFloors 中任何值不在 hostFloors 中 → ERROR 日志 + fail 76260533
│ (策略配置了被访人无权访问的楼层 = 安全风险,拒绝)
└─ Step 5: 落库(不变)
zoneService.page → image_rule_ref insert → batchBind → updateGroupPersonRef
```
### 4.1 核心语义:二选一,不求交
| 条件 | 生效楼层 |
|------|----------|
| 策略存在且 allow 非空 | **`allow`**(直接替换,不做交集) |
| 无策略 / enabled=0 / allow 为空 | **被访人 floorList**UC-01)或 **调用方 floorIds**UC-02 |
| 维度 | 变更前 | 变更后 |
|------|--------|--------|
| 策略生效逻辑 | `floorList ∩ allow`(求交) | `allow` 直接替换 `floorList` |
| UC-02 是否查策略 | ❌ 不查 | ✅ 查(策略优先) |
| allow 含无效楼层 | 交集自动排除 | ERROR 日志 + fail 76260533 |
### 4.2 辅助方法
```java
/** 按 org_id 查找策略,遍历 organizationIds 取第一个命中 */
private TenantVisitorFloorPolicyDto findPolicyByOrgIds(List<String> orgIds) {
if (CollectionUtils.isEmpty(orgIds)) return null;
for (String orgId : orgIds) {
TenantVisitorFloorPolicyDto p = tenantVisitorFloorPolicyDao.selectEnabledByOrgId(orgId);
if (p != null && p.getEnabled() != null && p.getEnabled() == 1) {
List<String> allow = parseAllowZoneIds(p.getAllowZoneIds());
if (!CollectionUtils.isEmpty(allow)) return p;
}
}
return null;
}
/**
* 二选一:有策略用 allow,无策略用 fallbackFloors。
* 约束:allow 必须是 hostFloors 的子集,否则拒绝。
*/
private List<String> resolveEffectiveFloors(
List<String> fallbackFloors, List<String> hostFloors,
TenantVisitorFloorPolicyDto policy, String personId) {
if (policy == null) return fallbackFloors;
List<String> allow = parseAllowZoneIds(policy.getAllowZoneIds());
if (CollectionUtils.isEmpty(allow)) return fallbackFloors;
// 安全校验:allow 中每个值必须在 hostFloors 中存在
Set<String> hostSet = new HashSet<>(hostFloors);
List<String> unknownAllow = allow.stream()
.filter(a -> !hostSet.contains(a))
.collect(Collectors.toList());
if (!unknownAllow.isEmpty()) {
this.logger.error("策略配置错误:allow 包含不在被访人 floorList 中的 zoneId"
+ "orgId={} policyId={} personId={} unknownAllow={} hostFloors={}",
policy.getOrgId(), policy.getId(), personId, unknownAllow, hostFloors);
throw new ServiceException("76260533",
"策略配置了被访人无权访问的楼层,请联系管理员");
}
this.logger.info("策略生效 orgId={} policyId={} v={} allow={} hostSize={}",
policy.getOrgId(), policy.getId(), policy.getPolicyVersion(),
allow.size(), hostFloors.size());
return allow; // 直接用 allow,不求交
}
```
### 4.3 关键设计约束:allow ⊆ floorList(强制)
策略的 `allow_zone_ids` **必须是被访人 `floorList` 的子集**。因为生效逻辑是「有策略直接用 allow」,如果 allow 包含被访人无权访问的楼层 → 访客获得越权 → **直接拒绝**
| 场景 | 处理 |
|------|------|
| `allow = [28F]`, `floorList = [28F, 29F]` | ✅ 正常:allow ⊆ floorList,生效 [28F] |
| `allow = [28F, 99F]`, `floorList = [28F, 29F]` | ❌ 配置错误:99F 不在 floorList → ERROR + fail 76260533 |
| `allow = [28F]`, `floorList = [29F, 30F]` | ❌ 配置错误:28F 不在 floorList → ERROR + fail 76260533 |
- 校验在 `resolveEffectiveFloors` 中执行
- 不满足时 **`throw ServiceException("76260533")`**,请求失败
- 新增错误码 **76260533**:「策略配置了被访人无权访问的楼层,请联系管理员」
---
## 5. 数据迁移
### 5.1 执行顺序
```
Step 1: DDL 上线(表结构变更,不影响行为)
→ ALTER TABLE 加 org_id 列 + 新唯一约束
Step 2: 数据迁移(人工 SQL,按公司逐行执行)
→ 查询 cw_is_organization 获取各公司 org_id
→ UPDATE tenant_visitor_floor_policy SET org_id = ? WHERE ...
Step 3: 发应用包(代码切到 org_id 查询)
→ Mapper SQL: business_id → org_id
→ Service: 取 organizationIds 遍历查策略
Step 4(可选): 废弃 business_id 列
→ MODIFY COLUMN ... COMMENT 'DEPRECATED'
```
### 5.2 数据迁移 SQL 模板
```sql
-- 1. 列出所有公司级组织节点
SELECT o.ID, o.NAME, o.PARENT_ID
FROM component-organization.cw_is_organization o
WHERE o.BUSINESS_ID = '2524639890ba4f2cba9ba1a4eeaa4015'
AND o.IS_DEL = 0
ORDER BY o.NAME;
-- 2. 为指定公司设置策略
UPDATE cw-elevator-application.tenant_visitor_floor_policy
SET org_id = '<目标公司 org_id>'
WHERE business_id = '2524639890ba4f2cba9ba1a4eeaa4015'
AND org_id IS NULL;
-- 3. 为其他公司新增策略行
INSERT INTO tenant_visitor_floor_policy
(id, org_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, remark, created_at, updated_at)
VALUES
(REPLACE(UUID(),'-',''), '<org_id>', 'INTERSECT_ALLOWLIST', '["<zone_id>"]', NULL, 1, 1, '', UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000);
```
### 5.3 向后兼容
| 场景 | 行为 |
|------|------|
| `org_id = NULL` 的行 | `WHERE org_id = ?` 不匹配,等同于无策略 |
| 旧 `business_id` 策略未迁移 | 全量 floorList(与现网一致) |
| 新代码 + 旧表结构 | SQL 报错 → 回滚应用包 |
| 应用回滚 | 旧代码仍用 `business_id` 查询,行为不变 |
---
## 6. 测试策略
| ID | 场景 | 期望结果 |
|----|------|----------|
| T1 | A公司有策略 allow=[28F],被访人 floorList=[28F,29F]UC-01 | effective=[28F](直接用 allow |
| T2 | A公司有策略 allow=[28F],被访人 floorList=[29F,30F]UC-01 | **fail 76260533**28F 不在 floorList 中) |
| T3 | B公司无策略,被访人 floorList=[15F,16F]UC-01 | effective=[15F,16F](用 floorList |
| T4 | 被访人属 [A公司, C公司]A有策略 allow=[28F] | 命中A策略→effective=[28F] |
| T5 | 被访人属 [B公司, D公司],均无策略 | effective=floorList 全集 |
| T6 | UC-02 传 [15F]B公司无策略 | effective=[15F](用调用方值) |
| T7 | UC-02 传 [15F]A公司有策略 allow=[28F] | effective=[28F](策略优先,忽略调用方) |
| T8 | 策略 enabled=0 | 等同无策略→用 floorList |
| T9 | `allow_zone_ids` 为非法 JSON `["28F"` | ERROR 日志 + 等同无策略 |
| T10 | 策略 allow=[28F,99F]floorList=[28F,29F] | **fail 76260533**99F 不在 floorList |
| T11 | 回滚:新 DDL + 旧代码 | 行为不变 |
---
## 7. 风险与缓解
| 风险 | 概率 | 缓解 |
|------|------|------|
| `organizationIds` 为空(被访人无组织归属) | 低 | 降级为无策略→全量 floorList |
| DBA 迁移时填错 org_id | 中 | 迁移前 `SELECT` 确认 NAME 匹配,迁移后抽样验证 |
| 多公司共用一个 org_id(父子组织) | 低 | 当前需求是公司级粒度;未来如需子树继承可升级到方案C |
| UC-02 调用方依赖旧行为(不查策略) | 中 | 发版说明明确标注行为变更;灰度发布 |
---
## 8. 文件清单
| 文件 | 操作 | 说明 |
|------|------|------|
| `docs/sql/tenant_visitor_floor_policy_v2.sql` | 新增 | DDL 变更脚本 |
| `TenantVisitorFloorPolicyMapper.xml` | 修改 | `business_id``org_id` |
| `TenantVisitorFloorPolicyMapper.java` | 修改 | 方法签名 |
| `TenantVisitorFloorPolicyDao.java` | 修改 | 接口方法 |
| `TenantVisitorFloorPolicyDaoImpl.java` | 修改 | 调用新 Mapper 方法 |
| `TenantVisitorFloorPolicyDto.java` | 修改 | 新增 `orgId` 字段 |
| `PersonRuleServiceImpl.java` | 修改 | `addVisitor` + 新增辅助方法 |
---
*本文档为 org_id 粒度修复的技术设计;实施以代码评审与安全评审结论为准。*
@@ -0,0 +1,356 @@
# org_id 策略修复 — 无鉴权验证方案设计
**文档性质**:验证方案设计说明
**设计日期**2026-05-01
**状态**:待评审
**关联 Spec**`docs/superpowers/specs/2026-05-01-org-id-policy-fix-design.md`
**被测应用**`cw-elevator-application`V2, port 18081
---
## 1. 目标
通过无鉴权 HTTP 调用 `POST /elevator/person/add/visitor``POST /elevator/passRule/image`,验证 org_id 策略修复的 7 个核心场景,确保业务逻辑满足需求。
**不验证**:鉴权正确性、Feign 调用链、图库绑定、Consul 服务发现。
---
## 2. 完整业务流程与接口调用链
### 2.1 业务全景
```
Step 0: 访客邀约(上游,非电梯侧)
┌─────────────────────────────────────────────────┐
│ 第三方业务系统(BFF / intelligent / 登记页) │
│ ├── 创建访客人员档案(cw_is_person + 访客标签) │
│ └── 确定被访人(host personId
└─────────────────────────────────────────────────┘
→ 访客已存在于组织库中,personId 可用
→ 本方案使用预置测试访客(919900... 号段),跳过此步
Step 1: 设置访客可访问楼层(电梯侧,核心验证目标)
POST /elevator/person/add/visitor
┌──────────────────────────────────────────────────────┐
│ ① Feign → /component/person/detail │
│ 取被访人 floorList + organizationIds │
│ │
│ ② 查 tenant_visitor_floor_policy │
│ WHERE org_id = ? (从 organizationIds 取) │
│ │
│ ③ 二选一: │
│ 有策略 → effectiveFloors = allow(直接替换) │
│ 无策略 → effectiveFloors = floorList │
│ allow 含无效值 → fail 76260533 │
│ │
│ ④ Feign → /sysetting/zone/page │
│ 取楼栋 + 图库 imageStoreId │
│ │
│ ⑤ 写 image_rule_ref(访客 personId ← visitorId
│ │
│ ⑥ Feign → /component/imagestore/person/batchBind │
│ 访客绑定到楼栋图库 │
└──────────────────────────────────────────────────────┘
Step 2: 回读验证(确认楼层写入正确)
POST /elevator/passRule/image
Body: { "personId": "<visitorId>" }
→ 返回该访客可访问的 zoneId 列表
→ 与期望楼层比对
```
### 2.2 接口调用细节
#### POST /elevator/person/add/visitor
| 项目 | 值 |
|------|-----|
| Method | POST |
| Path | `/elevator/person/add/visitor` |
| Content-Type | `application/json` |
| 鉴权模式 | noauth-probe(仅 `businessid` 头) |
**请求体:**
```json
{
"personId": "1060601019894960128",
"visitorId": "9199000100000000001",
"floorIds": [],
"begVisitorTime": 1751319780000,
"endVisitorTime": 1751406180000
}
```
| 字段 | 必填 | 说明 |
|------|------|------|
| `personId` | 是 | 被访人 ID(决定 floorList 和 org_id 来源) |
| `visitorId` | 是 | 访客 ID(落库 image_rule_ref 的 person_id |
| `floorIds` | 否 | **空数组**=UC-01 由电梯补全;**非空**=UC-02 调用方指定 |
| `begVisitorTime` | 是 | Unix 毫秒,访客有效期开始 |
| `endVisitorTime` | 是 | Unix 毫秒,访客有效期结束 |
**响应体(成功):**
```json
{ "success": true, "code": "0", "data": true }
```
**响应体(策略拒绝):**
```json
{ "success": false, "code": "76260533", "message": "策略配置了被访人无权访问的楼层,请联系管理员" }
```
#### POST /elevator/passRule/image(回读)
| 项目 | 值 |
|------|-----|
| Method | POST |
| Path | `/elevator/passRule/image` |
| Body | `{ "personId": "<visitorId>" }` |
**响应体:**
```json
{
"success": true,
"data": {
"datas": [
{ "zoneId": "605560545117995008", "zoneName": "28F" }
]
}
}
```
### 2.3 策略在流程中的位置
```
add/visitor 请求进入
├─ personId → Feign detail() → { floorList, organizationIds }
├─ organizationIds[0] → SELECT ... FROM tenant_visitor_floor_policy
│ WHERE org_id = ? ← 新:org_id 粒度
│ AND enabled = 1
├─ 有策略行 → effectiveFloors = allow ← 二选一,不求交
│ allow ⊆ floorList 校验
│ └─ 不通过 → 76260533
└─ 无策略行 → effectiveFloors = floorList ← 默认行为
```
---
## 3. 测试环境
| 项目 | 值 |
|------|-----|
| 电梯服务 | `http://127.0.0.1:18081` |
| MySQL 组织库 | `192.168.3.12:3307 / component-organization` |
| MySQL 电梯库 | `192.168.3.12:3307 / cw-elevator-application` |
| 租户 | `businessId = 2524639890ba4f2cba9ba1a4eeaa4015` |
| 调用方式 | noauth-probe(仅 businessid 头,无鉴权 token |
---
## 4. 测试矩阵(7 个用例)
### 4.1 测试数据
| 实体 | ID |
|------|-----|
| 1403艾斯 org | `72fb65ec5de94201b909a98b8bae1892` |
| 1405一博环保 org | `2095de3d541f44eba686c78fda68336f` |
| 星中心物业 org | `f216235e54ca42bfa0379e69b3754aff` |
| 广发基金 org | `488b8ad049bb43408a6fbcc50bcb89ac` |
| 陈国辉(1403+星中心) | `1060601019894960128` |
| 王姣(1405 | `1090779433129840640` |
| 秦夏(广发基金) | `1072908835884208128` |
| 28F zone | `605560545117995008` |
| 6F zone | `605560541473144832` |
### 4.1.1 访客数据
测试使用开发库中已预置的**专用测试访客**(号段 `9199000100000000001`~`9199000100000000020`,均已标注"访客"标签 `LABEL_ID = ed2dbab6d6234a7287106b80857c819e`)。这些是测试专用人员,非真实业务访客。
`add/visitor` 写入 `image_rule_ref` 时以 `visitorId` 为键,为避免同一访客的多次写入相互干扰,每个用例轮换使用不同测试访客。
| 用例 | visitorId | 访客标识 |
|------|-----------|----------|
| T1 | `9199000100000000001` | 测试访客AUTO-01 |
| T2 | `9199000100000000002` | 测试访客AUTO-02 |
| T3 | `9199000100000000003` | 测试访客AUTO-03 |
| T4 | `9199000100000000004` | 测试访客AUTO-04 |
| T5 | `9199000100000000005` | 测试访客AUTO-05 |
| T6 | `9199000100000000006` | 测试访客AUTO-06 |
| T7 | `9199000100000000007` | 测试访客AUTO-07 |
### 4.2 用例
| ID | 场景 | 被访人 | 策略 org | allow | enabled | 期望 |
|----|------|--------|----------|-------|---------|------|
| T1 | 有策略→allow 替换 floorList | 陈国辉 | 1403 | [28F] | 1 | passRule 返回仅 [28F] |
| T2 | 无策略→floorList | 王姣 | 1405 | 无 | — | passRule 返回 floorList 全集 |
| T3 | allow 含无效zone→拒绝 | 陈国辉 | 1403 | [28F, 99F] | 1 | code=76260533 |
| T4 | 多组织命中第一个策略 | 陈国辉 | 1403+星中心 | 1403有,星中心无 | 1 | 命中1403→[28F] |
| T5 | enabled=0 等同无策略 | 陈国辉 | 1403 | [28F] | 0 | passRule 返回 floorList 全集 |
| T6 | UC-02 策略优先 | 陈国辉 | 1403 | [28F] | 1 | 传floorIds被忽略→[28F] |
| T7 | 广发基金迁移验证 | 秦夏 | 广发基金 | [28F] | 1 | 迁移后→仅 [28F] |
---
## 5. 脚本结构
**文件**`maven-cw-elevator-application/tools/visitor_floor_verification/scripts/verify_org_policy_fix.py`
```
verify_org_policy_fix.py
├── Phase 0: health_check()
│ GET /actuator/health
├── Phase 1: prepare_test_data()
│ ① INSERT policy_t1_1403 (org=1403, allow=[28F], enabled=1)
│ ② INSERT policy_t3_invalid (org=1403, allow=[28F,99F], enabled=1)
│ ③ INSERT policy_t5_disabled (org=1403, allow=[28F], enabled=0)
│ ④ UPDATE 广发基金 SET org_id='488b8adb...' WHERE id='gf_vstr_...'
├── Phase 2: run_all_cases()
│ 每个用例:
│ POST add/visitor → 检查 HTTP 200 + code + success
│ 成功 → POST passRule/image → 比对 zoneIds
│ 失败 → 检查 code == 期望错误码
├── Phase 3: cleanup_test_data()
│ ① DELETE 测试策略行
│ ② UPDATE 广发基金 SET org_id=NULL
└── Phase 4: print_report()
输出 JSON 报告到 report/org-policy-fix-verify-{timestamp}.json
```
### 5.1 HTTP 请求格式(noauth-probe
```python
headers = {
"Content-Type": "application/json",
"businessid": "2524639890ba4f2cba9ba1a4eeaa4015"
}
# add/visitor
POST /elevator/person/add/visitor
{
"personId": "1060601019894960128",
"visitorId": "<轮换访客ID>",
"floorIds": [],
"begVisitorTime": <now_ms>,
"endVisitorTime": <now_ms + 86400000>
}
# passRule/image(回读)
POST /elevator/passRule/image
{
"personId": "<visitorId>"
}
```
---
## 6. 数据准备与清理
### 6.1 准备 SQL
```sql
-- T1/T4/T6 共用
INSERT INTO tenant_visitor_floor_policy
(id, org_id, business_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, created_at, updated_at)
VALUES ('policy_t1_1403', '72fb65ec5de94201b909a98b8bae1892', NULL, 'INTERSECT_ALLOWLIST',
'["605560545117995008"]', NULL, 1, 1, UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000);
-- T3
INSERT INTO tenant_visitor_floor_policy
(id, org_id, business_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, created_at, updated_at)
VALUES ('policy_t3_invalid', '72fb65ec5de94201b909a98b8bae1892', NULL, 'INTERSECT_ALLOWLIST',
'["605560545117995008","605560540000000000"]', NULL, 1, 1, UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000);
-- T5
INSERT INTO tenant_visitor_floor_policy
(id, org_id, business_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, created_at, updated_at)
VALUES ('policy_t5_disabled', '72fb65ec5de94201b909a98b8bae1892', NULL, 'INTERSECT_ALLOWLIST',
'["605560545117995008"]', NULL, 0, 1, UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000);
-- T7: 广发基金迁移
UPDATE tenant_visitor_floor_policy
SET org_id = '488b8ad049bb43408a6fbcc50bcb89ac'
WHERE id = 'gf_vstr_policy_guangfa_fund_001x';
```
### 6.2 清理 SQL
```sql
DELETE FROM tenant_visitor_floor_policy WHERE id IN ('policy_t1_1403','policy_t3_invalid','policy_t5_disabled');
UPDATE tenant_visitor_floor_policy SET org_id = NULL WHERE id = 'gf_vstr_policy_guangfa_fund_001x';
```
### 6.3 执行顺序
```text
prepare:
INSERT policy_t1_1403 (T1/T4/T6 使用)
INSERT policy_t3_invalid (T3 使用)
INSERT policy_t5_disabled (T5 使用)
UPDATE 广发基金 SET org_id (T7 使用)
execute:
T1: 陈国辉 + policy_t1_1403 → allow=[28F]
T3: 陈国辉 + policy_t3_invalid → 76260533(需先改1403的org_id或先DELETE T1再切换)
T4: 陈国辉(多组织) + policy_t1 → allow=[28F]
T5: 陈国辉 + policy_t5_disabled → floorList全集
T2: 王姣(无策略) → floorList全集
T6: 陈国辉(UC-02) + policy_t1 → allow=[28F]
T7: 秦夏 + 广发基金策略 → allow=[28F]
cleanup:
DELETE 测试行
UPDATE 广发基金 SET org_id=NULL
```
> T3 执行前需确保 policy_t1_1403 不生效(相同 org_id 只能有一条启用策略)。方案:T3 前 DELETE policy_t1_1403T3 后恢复 INSERT。
---
## 7. 验证判定规则
| 判定项 | 通过条件 |
|--------|----------|
| HTTP 状态 | `add/visitor` 返回 200 |
| 业务成功 | `response.success == true` |
| 业务失败 | `response.code == "76260533"` |
| 楼层匹配 | `passRule/image` 返回的 zoneId 集合 == 期望集合(顺序无关) |
| 脱敏 | 报告中不出现 PII(姓名/手机号) |
---
## 8. 输出
```
report/org-policy-fix-verify-{timestamp}.json
```
包含:每个用例的请求/响应摘要、passRule 结果、期望 vs 实际对比、通过/失败汇总。
---
## 9. 文件清单
| 文件 | 操作 | 说明 |
|------|------|------|
| `tools/visitor_floor_verification/scripts/verify_org_policy_fix.py` | 新增 | 主验证脚本 |
| `tools/visitor_floor_verification/report/` | — | 报告输出目录(已有) |
---
*本设计说明待评审,通过后转入 implementation。*
@@ -0,0 +1,113 @@
# org_id 策略修复 — 人工验证操作手册
## 前置条件
- V2 JAR 已构建:`deploy/v2-maven/cw-elevator-application-V1.0.0.20211103.jar`v2.0.17
- 配置文件:`/tmp/v2-redis-fix.properties`
- Redis Docker`v2-test-redis`(端口 6380,密码 `1qaz!QAZ`
- 桩服务脚本:`stub_org_service.py`
---
## 步骤 1:启动 V2 电梯应用
打开**终端 1**,执行:
```bash
/usr/lib/jvm/java-8-openjdk-amd64/bin/java \
-jar /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/源码/maven-cw-elevator-application/deploy/v2-maven/cw-elevator-application-V1.0.0.20211103.jar \
--spring.config.location=file:/tmp/v2-redis-fix.properties
```
等待约 **35 秒**,看到 `Started AppApplication` 后验证:
```bash
curl http://127.0.0.1:18081/health
```
期望输出:`{"status":"UP"}`
---
## 步骤 2:启动组织服务桩
打开**终端 2**,执行:
```bash
python3 /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/源码/maven-cw-elevator-application/tools/stub_org_service.py
```
验证:
```bash
curl http://127.0.0.1:18082/health
```
期望输出:`{"status":"UP"}`
---
## 步骤 3:运行验证脚本
打开**终端 3**,执行:
```bash
cd /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/源码/maven-cw-elevator-application/tools/visitor_floor_verification
python3 scripts/verify_org_policy_fix.py --elevator-base-url http://127.0.0.1:18081
```
期望输出:
```
=== Phase 2: run 7 cases ===
[T1] 有策略→allow替换floorList → ✅
[T2] 无策略→floorList → ✅
[T3] allow含无效zone→拒绝 (76260533) → ✅
[T4] 多组织命中第一个策略 → ✅
[T5] enabled=0等同无策略 → ✅
[T6] UC-02策略优先 → ✅
[T7] 广发基金迁移验证 → ✅
Passed: 7/7
```
报告文件:`report/org-policy-fix-verify-YYYYMMDD-HHMMSS.json`
---
## 步骤 4:停止服务
```bash
# 终端1 按 Ctrl+C
# 终端2 按 Ctrl+C
```
---
## 故障排查
| 症状 | 原因 | 解决 |
|------|------|------|
| V2 启动报 `RedisConnectionException` | Redis 密码未配置或端口错误 | 确认 `v2-test-redis` 运行中:`docker ps \| grep v2-test-redis` |
| V2 报 `UnknownHostException: mysql_01` | ShardingSphere 数据源未覆盖 | 确认使用了 `--spring.config.location=file:/tmp/v2-redis-fix.properties` |
| 桩服务端口被占用 | 上次未正常退出 | `pkill -f stub_org_service` |
| 验证脚本 `Connection refused` | V2 或桩未启动 | 检查终端 1/2 的服务日志 |
| DB 连接失败 | MySQL 密码错误 | 确认 `192.168.3.12:3307 root/123456` 可达 |
---
## 本地 Docker 基础设施
| 服务 | 容器名 | 端口 | 说明 |
|------|--------|------|------|
| Redis | `v2-test-redis` | 6380 | 密码 `1qaz!QAZ` |
| Kafka | `ybs-kafka` | 9092 | 无认证 |
| Consul | — | 192.168.3.12:8500 | 远程 |
| MySQL | — | 192.168.3.12:3307 | root/123456 |
如需重建 Redis
```bash
docker rm -f v2-test-redis
docker run -d --name v2-test-redis -p 6380:6379 redis:7-alpine --requirepass "1qaz!QAZ"
```
@@ -0,0 +1,137 @@
# 电梯应用 — 服务发现架构设计
**日期**2026-05-01(初稿)/ 2026-05-05(基线更新)
**版本**v2.0.17(当前基线)
**状态**:已实施
> **说明**:本文档最初记录 Dubbo/ZooKeeper 发现方案(目标架构),但在实践中发现该方案与 V1 生产实际不符。下方 §1~§5 保留为历史方案记录,§6 起为 **实际实施态**。当前基线 v2.0.17 以 §6 为准。
---
## 实际实施态(v2.0.17
### §6. 实际服务发现架构
电梯应用(cw-elevator-application)的三个上游 Feign 客户端通过 **Ribbon + ConfigurationBasedServerList + 静态 IP 列表** 实现服务寻址,与 V1 生产行为一致。
| 上游服务 | Feign 名称 | 实际发现方式 |
|---------|-----------|------------|
| 人脸识别 GPU | `ninca-crk-std` | **ConfigurationBasedServerList**V1 同) |
| 组织组件 | `ninca-common-component-organization` | **ConfigurationBasedServerList**V1 同) |
| 公共组件 | `ninca-common` | **ConfigurationBasedServerList**V1 同) |
### §7. 实际发现链路
```
业务代码 → @FeignClient(name = "${feign.xxx.name:...}")
Feign → Ribbon LoadBalancer
ConfigurationBasedServerList ← discovery.enabled=false 时 Ribbon 默认
│ (无 Consul/ConsulServerList 参与)
{name}.ribbon.listOfServers ← 从 application.properties 读取
目标 HTTP 服务 (IP:Port)
```
**关键配置**
```properties
# bootstrap.properties — 与 V1 生产完全一致
spring.cloud.consul.discovery.enabled=false # 不启用 Consul 发现客户端
spring.cloud.consul.discovery.register=true # 仅注册自身到 Consul
```
```properties
# application.properties — 服务名映射(运行时需按环境配置)
feign.ninca-crk-std.name=ninca-crk-std
feign.component-organization.name=ninca-common-component-organization
feign.ninca-common.name=ninca-common
# 静态 IP 列表由环境中 application.properties 按需配置:
# ninca-crk-std.ribbon.listOfServers=10.0.22.102:16106
# ninca-common-component-organization.ribbon.listOfServers=...
```
### §8. V1 vs V2 对比(实施态)
| | V1 生产 | V2 v2.0.17 |
|------|---------|-----------|
| ninca-crk-std | ConfigurationBasedServerList | ConfigurationBasedServerList ✅ |
| ninca-common-component-organization | ConfigurationBasedServerList | ConfigurationBasedServerList ✅ |
| ninca-common | ConfigurationBasedServerList | ConfigurationBasedServerList ✅ |
| @RibbonClients | 无 | 无 ✅ |
| RibbonConfiguration 类 | 无 | 无 ✅ |
| bootstrap.properties | 见星中心 | **完全一致** ✅ |
| 主类名 | AppApplication | AppApplication ✅ |
| JAR 文件名 | cw-elevator-application-V1.0.0.20211103.jar | **一致** ✅ |
### §9. 关键设计决策
| 决策 | 选择 | 原因 |
|------|------|------|
| Consul 发现 | `discovery.enabled=false` | 与 V1 生产一致;只注册不发现 |
| 服务寻址 | ConfigurationBasedServerList | Ribbon 默认行为,无需额外配置 |
| ZK 发现依赖 | **已从 POM 移除** | V1 没有该依赖,V2 不需要引入 |
| 静态 IP 配置 | 通过 `{name}.ribbon.listOfServers` 注入 | 与 V1 生产实际部署方式一致 |
### §10. 运维说明
- **每台服务器需配置本机的 `listOfServers`**(三台服务器各自指向本机或对端实例)。
- 若使用 Consul 做健康检查,`discovery.enabled=false` 不影响 Consul 注册(`register=true`)。
- 测试环境可使用 `application-test.properties` 覆盖 `listOfServers` 指向本地桩服务。
---
## 历史方案记录(目标架构,未实施)
以下 §1~§5 为 2026-05-01 设计的目标架构,**实际 v2.0.17 未采用此方案**。保留以记录设计历史。
### §1. 原计划核心决策
电梯应用的三个上游 Feign 客户端 **统一走 Dubbo/ZooKeeper 动态发现**,不依赖任何 `@RibbonClient` 定制或 `ConfigurationBasedServerList` 静态列表。
| 上游服务 | Feign 名称 | 原计划发现方式 |
|---------|-----------|--------------|
| 人脸识别 GPU | `ninca-crk-std` | Dubbo/ZooKeeper(❌ 未实施) |
| 组织组件 | `ninca-common-component-organization` | Dubbo/ZooKeeper(❌ 未实施) |
| 公共组件 | `ninca-common` | Dubbo/ZooKeeper(❌ 未实施) |
### §2. 原计划服务发现链路(未实施)
```
ElevatorApplication
│ @EnableFeignClients(basePackages={...})
├── Feign Client ──→ Ribbon (默认) ──→ DiscoveryClient ──→ Dubbo Registry
│ zookeeper://10.0.22.207:2181
```
### §3. 原计划配置清单(未实施)
```properties
# bootstrap.properties — 原计划使用 ZK 发现
spring.cloud.consul.discovery.enabled=false
dubbo.registry.address=zookeeper://10.0.22.207:2181
# 实际 v2.0.17 已移除 ZK 发现依赖,此配置不生效
```
### §4. 原计划 V1 vs V2 对比(未实施)
| | V1 生产 | V2(原计划) |
|------|---------|------------|
| ninca-crk-std | ConfigurationBasedServerList | Dubbo/ZK(❌ 未实施) |
| ninca-common-component-organization | ConfigurationBasedServerList | Dubbo/ZK(❌ 未实施) |
| ninca-common | ConfigurationBasedServerList | Dubbo/ZK(❌ 未实施) |
### §5. 原计划删除清单(已执行)
| 文件 | 操作 | 状态 |
|------|------|------|
| `NincaCrkStdRibbonConfiguration.java` | 删除 | ✅ 已删除 |
| `OrgServiceRibbonConfiguration.java` | 从未存在 | — |
| `CommonServiceRibbonConfiguration.java` | 从未存在 | — |
| `ElevatorApplication.java``@RibbonClients` | 删除 | ✅ 已清理 |
@@ -0,0 +1,280 @@
# V2 全系统功能测试环境搭建 — 设计文档
**日期**: 2026-05-01
**状态**: 待实施
**关联**: AGENTS.md, maven-cw-elevator-application/deploy/
---
## 1. 目标
搭建 cw-elevator-application V2 (v2.0.7) 的全系统集成功能测试环境,包含电梯应用及其所有上下游依赖服务(CRK人脸识别、报警、cwos-manager、ninca-common、component-organization等),能够:
- 一键搭建全部 17 个组件
- 运行 V1 vs V2 API 对拍测试
- 验证 V2.0.7 租户访客固定楼层功能
- 验证 CRK 联动、报警联动等端到端链路
- 15-20 分钟内完成从零到全部验证
---
## 2. 环境约束
| 约束 | 值 |
|------|-----|
| 部署方式 | 本机进程 (Java服务) + Docker 容器 (基础组件) |
| MySQL | 复用现有: `192.168.3.12:3307`, `root/123456` |
| JDK | Java 8 (`/usr/lib/jvm/java-8-openjdk-amd64`) |
| Maven | 3.5+ |
| Docker | 已安装, `docker compose` 可用 |
| 代码分支 | `release/cw-elevator-v1-lib-min-risk` |
| 测试范围 | 全系统集成 — 全部 17 个组件 |
---
## 3. 组件清单
### 3.1 基础组件 (Docker)
| # | 组件 | 端口 | 来源 |
|---|------|------|------|
| I1 | Consul | 8500 | 已有 `deploy/consul-docker/docker-compose.yml` |
| I2 | Redis | 6379 | 需要新增 compose 条目 (`redis:7-alpine`) |
| I3 | Kafka + Zookeeper | 9092, 2181 | 需要新增 compose 条目 (`bitnami/kafka:3.6`) |
| I4 | Nginx (前端代理) | 8090 | 已有 `docker-compose.frontend-local.yml` |
### 3.2 应用服务 (本机进程)
| # | 组件 | 端口 | 来源 | 数据库 |
|---|------|------|------|--------|
| A1 | ninca-common-backend | 33010 | `星中心/ninca_common_01-ninca_common_backend.tar.gz` | `ninca_common` |
| A2 | component-organization | 33011 | `星中心/ninca_common_component_organization_01-...tar.gz` | `component-organization` |
| A3 | cwos-system-api | 3333 | `星中心/cwos_system_api_01-cwos_system_api/` (已解压) | — |
| A4 | cwos-manager | 3721 | Docker Harbor 镜像 (已有 compose) | `cwos_manager` |
| A5 | cwos-portal | 33008 | `星中心/cwos_portal` SQL 备份 → 重建 | `cwos_portal` |
| A6 | snap-app | 33012 | `星中心/ninca_common_snap_app_01-...tar.gz` | — |
| A7 | vehicle-app | 33013 | `星中心/ninca_common_vehicle_app_01-...tar.gz` | — |
| A8 | person-file-app | 33014 | `星中心/ninca-person-file-app-V2.9.2_20210216.tar.gz` | — |
| A9 | monitor-app | 33015 | `星中心/ninca_common_monitor_app_01-...tar.gz` | — |
| A10 | CRK-std | 16106 (app), 16114 (mgmt) | `星中心/ninca_crk_std_01-ninca_crk_std_backend/` (JAR已就绪) | `ninca_crk_std` |
| A11 | alarm-app | 17011 (app), 17211 (mgmt) | `星中心/ninca_qk_alarm_app_01-ninca_qk_alarm_app/` (JAR已就绪) | `alarm_deploy` |
| A12 | elevator V2 | 18081 | Maven 构建 `maven-cw-elevator-application` | `cw-elevator-application` |
| A13 | elevator V1 | 18080 | 对照基线 (已有 JAR) | `cw-elevator-application` |
### 3.3 数据库 (MySQL 192.168.3.12:3307)
| 数据库 | 备份文件 | 大小 |
|--------|---------|------|
| `cw-elevator-application` | `data_backup/12_*.sql.gz` + `34_*.sql.gz` | 158M + 2.5G |
| `ninca_crk_std` | (含在 CRK 配置中,需确认备份) | — |
| `alarm_deploy` | `data_backup/alarm_deploy_*.sql.gz` | 15M |
| `cwos_manager` | `data_backup/cwos_manager_*.sql.gz` | 51K |
| `cwos_portal` | `data_backup/cwos_portal_*.sql.gz` | 212M |
| `ninca_common` | `data_backup/ninca_common_*.sql.gz` | 6M |
| `component-organization` | `data_backup/component-organization_*.sql.gz` | 212M |
| `ods` | `data_backup/ods_*.sql.gz` | 485K |
| `cloudwalk_device_thirdparty` | `data_backup/cloudwalk_device_thirdparty_*.sql.gz` | 4K |
| `g` / `p` / `12` / `34` | 其他备份 | 小量 |
---
## 4. 配置统一化
### 4.1 环境变量 (`config/env.sh`)
```bash
# 基础设施
MYSQL_HOST=192.168.3.12
MYSQL_PORT=3307
MYSQL_USER=root
MYSQL_PASS=123456
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASS=1qaz!QAZ
CONSUL_HOST=127.0.0.1
CONSUL_PORT=8500
KAFKA_HOST=127.0.0.1
KAFKA_PORT=9092
ZK_HOST=127.0.0.1
ZK_PORT=2181
# 服务端口
PORT_ELEVATOR_V2=18081
PORT_ELEVATOR_V1=18080
PORT_CRK_STD=16106
PORT_CRK_MGMT=16114
PORT_ALARM=17011
PORT_ALARM_MGMT=17211
PORT_CWOS_PORTAL=33008
PORT_COMPONENT_ORG=33011
PORT_NINCA_COMMON=33010
PORT_CWOS_MANAGER=3721
PORT_SYSTEM_API=3333
PORT_SNAP=33012
PORT_VEHICLE=33013
PORT_PERSON_FILE=33014
PORT_MONITOR=33015
PORT_NGINX=8090
# Java
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
JAVA_OPTS="-Xmx2048m -Xms512m"
```
### 4.2 配置替换规则
每个 Java 服务的 `application.properties` / `bootstrap.properties` 中需要替换:
| 原始值 (生产) | 替换为 (测试) |
|--------------|-------------|
| `mysql_01.mysql_ip` | `192.168.3.12` |
| `redis_01.redis_ip` | `127.0.0.1` |
| `371bfca....` (Consul UUID host) | `127.0.0.1` |
| `44700995e....` (Kafka broker 1) | `127.0.0.1:9092` |
| `0837a70b5....` (Kafka broker 2) | (移除,仅保留一个 broker) |
| `10.128.161.95` (内网 IP 地址) | `127.0.0.1` |
| `10.0.22.207` (内网 ZK) | `127.0.0.1:2181` |
| `10.128.123.108` (内网 DB) | `192.168.3.12` |
| `10.0.22.102` (内网 CRK IP) | `127.0.0.1` |
| `3306` (生产 DB 端口) | `3307` |
---
## 5. 脚本设计
### 5.1 文件结构
```
源码/scripts/test-env/
├── docker-compose.infra.yml # 合并 Consul+Redis+Kafka+Nginx
├── config/
│ ├── env.sh # 统一环境变量
│ ├── consul/consul-config.json # Consul 初始化配置
│ └── service-templates/ # 配置文件模板 (.properties 模板)
├── setup.sh # 主入口: 一键搭建
├── start-all.sh # 启动全部服务
├── stop-all.sh # 停止全部服务
├── health-check.sh # 探活检查
├── prepare-db.sh # 数据库恢复
├── prepare-services.sh # 解压 + 配置注入
├── build-elevator-v2.sh # 编译 V2 电梯应用
└── verify-functional.sh # 功能验证
```
### 5.2 启动依赖拓扑
```
I1 Consul ──┐
I2 Redis ───┤ (Docker 并行启动)
I3 Kafka ───┤
I4 Nginx ───┘
A1 ninca-common ─────────────────────────┐
A2 component-org ←── common ─────────────┤
A3 system-api ←── manager ───────────────┤
A4 cwos-manager (Docker) ────────────────┤
A5 cwos-portal ←── org + manager ────────┤
A6 snap-app ←── portal + common ─────────┤
A7 vehicle-app ←── portal + common ──────┤
A8 person-file ←── portal ───────────────┤
A9 monitor-app (独立) ───────────────────┤
A10 CRK-std ←── portal + org + elevator ─┤
A11 alarm-app ←── portal + org + Kafka ──┤
A12 elevator-V2 ←── CRK + portal + org ──┤
A13 elevator-V1 (对拍对照) ───────────────┘
```
### 5.3 主入口执行流程
```
setup.sh:
Phase 1: 环境检查 (< 10s)
├── JDK 8 检查
├── Maven 检查
├── Docker 检查
├── MySQL 连通性检查 (192.168.3.12:3307)
└── 端口冲突检查
Phase 2: 数据库准备 (~5min)
├── 创建所有数据库 (如不存在)
├── 解压并导入 11 个 SQL 备份
└── 执行 V2 DDL (tenant_visitor_floor_policy.sql)
Phase 3: Docker 启动 (~30s)
├── docker compose up infra
├── 等待 Consul Ready
├── 等待 Kafka Ready
└── 启动 Nginx
Phase 4: 服务准备 (~5-10min)
├── 解压 5 个 tar.gz
├── 从模板生成各服务配置文件
├── 编译 V2 电梯应用
└── 同步 JAR 到 deploy/
Phase 5: 服务启动 (~2min)
├── 按拓扑序依次启动 13 个 Java 服务
├── 每个服务启动后探活确认
└── 失败自动重试 (max 3 次)
Phase 6: 验证 (~2min)
├── 全端口探活
├── Consul 注册检查
├── V1/V2 API 对拍 (pytest)
└── 输出验证报告
总耗时: ~15-20 分钟
```
---
## 6. 验证矩阵
| ID | 验证项 | 命令/方法 | 通过标准 |
|----|--------|----------|---------|
| H1 | 所有端口可达 | `nc -z 127.0.0.1 <port>` x 15 | 全部 open |
| H2 | 所有 HTTP 健康检查 | `curl /actuator/health` x 8 | 全部 200 + UP |
| H3 | Consul 服务注册 | `curl :8500/v1/agent/services` | 10+ 服务已注册 |
| F1 | V1/V2 API 对拍 | `pytest tools/elevator_api_parity/tests/` | 全部通过 |
| F2 | V2.0.7 UC-01 基线 | 不传 floorIds, 无策略 | floorList 全集 |
| F3 | V2.0.7 UC-01 固定楼层 | 不传 floorIds, 有策略 | detail.floorList(组织侧 **替代** 后;电梯不求交) |
| F4 | V2.0.7 无交集 | allow 与 floorList 无交集 | 错误码 76260532 |
| F5 | V2.0.7 被访人无楼层 | personId 无楼层 | 错误码 76260531 |
| F6 | V2.0.7 UC-02 | 显式传 floorIds | 不读策略表 |
| F7 | CRK 联动 | curl CRK → 电梯回调 | CRK 日志有 Feign 记录 |
| F8 | 报警 Kafka 消费 | 提交事件 → alarm 日志 | Kafka 消息到达 |
| F9 | Nginx 前端代理 | `curl :8090` | cwos-portal 首页 |
| I1 | MySQL 连通 | `mysql -h 192.168.3.12 -P3307 -e 'SELECT 1'` | 1 |
---
## 7. 已知风险与缓解
| 风险 | 影响 | 缓解 |
|------|------|------|
| `星中心/*.tar.gz` 内 JAR 版本与 DB 备份不匹配 | 启动失败 | 从同一时间点导出 (2026-04-23) 的 DB 备份对齐 |
| Docker Kafka 首次启动慢 | Phase 3 超时 | 脚本增加 60s 等待 + 重试逻辑 |
| V2 Maven 编译需 Nexus 私服 | 编译失败 | 已有 `build_nexus_only.sh` 降级方案 |
| cwos-portal 无独立 JAR | 无法启动 | 从 DB 备份 `cwos_portal` 库确认部署方式 |
| 端口冲突 (已有进程占用) | 启动失败 | Phase 1 预先检查, 用 `lsof` 检测并提示 |
| ES (Elasticsearch) 依赖 | alarm 启动可能失败 | alarm `application.properties` 配置 ES, 需 Docker 添加 |
---
## 8. 未解决问题
1. **cwos-portal 部署方式**: 星中心中没有 cwos-portal 的 JAR 或 tarball, 仅 DB 备份中有 `cwos_portal` 数据。需确认其部署形态 (fat JAR? war? Docker?)。
2. **cwos-system-api 启动入口**: `cwos_system_api_01-cwos_system_api/` 已解压, 需确认 JAR 入口和端口。
3. **Elasticsearch**: alarm 依赖 ES (`elasticsearch.ip`), 是否需要在 Docker Compose 中添加 ES 容器?
4. **Dubbo/ZK**: V1 电梯 bootstrap 配置有 Dubbo + ZK, V2 是否需要?可以在 Docker Compose 中添加 ZK。
---
## 9. 产出物
- `源码/scripts/test-env/docker-compose.infra.yml` — 基础组件 Docker Compose
- `源码/scripts/test-env/setup.sh` — 一键搭建脚本
- `源码/scripts/test-env/config/env.sh` — 统一环境变量
- `源码/scripts/test-env/config/service-templates/` — 14 个配置模板
- `源码/scripts/test-env/start-all.sh` / `stop-all.sh` — 启停脚本
- `源码/scripts/test-env/verify-functional.sh` — 功能验证脚本
@@ -0,0 +1,279 @@
# 租户访客默认楼层策略 — 业务逻辑设计
**日期**2026-05-05
**状态**:设计稿(待审核)
**基线版本**v2.0.20
---
## 1. 现有问题
`PersonRuleServiceImpl.addVisitor` 中策略查询被包裹在 `if (!callerProvidedFloors)` 条件内,导致调用方一旦传了 `floorIds`UC-02),策略被完全跳过。
**修正要求**:任何时候都应当查询策略,有策略且生效则以策略 `allow_zone_ids` **替代** 候选楼层。
---
## 2. 完整时序图
### 2.1 UC-01:调用方未传 floorIds(组织默认楼层)
```
调用方 电梯应用 组织服务 tenant_visitor_floor_policy
│ │ │ │
│ POST /add/visitor │ │ │
│ (无floorIds) │ │ │
│ ────────────────────→ │ │ │
│ │ │ │
│ │ ── Phase1: 查组织 ── │ │
│ │ POST /component/person/detail(personId) │
│ │ ─────────────────────→ │ │
│ │ ←───────────────────── │ │
│ │ PersonResult { │ │
│ │ floorList: [A,B,C], │ │
│ │ organizationIds:[...] │ │
│ │ } │ │
│ │ │ │
│ │ ── Phase2: 候选楼层 ── │ │
│ │ candidate = floorList │ │
│ │ = [A,B,C] │ │
│ │ │ │
│ │ ── Phase3: ALWAYS 查策略 ── │
│ │ SELECT * WHERE org_id=? AND enabled=1 │
│ │ ──────────────────────────────────────────→ │
│ │ ←────────────────────────────────────────── │
│ │ │ │
│ │ ┌─ policy存在? ─┐ │ │
│ │ │ │ │ │
│ │ YES NO │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ effective= effective │ │
│ │ allow_zone_ids =candidate │ │
│ │ =[6F] =[A,B,C] │ │
│ │ │ │
│ │ ── Phase4: 空集校验 ── │ │
│ │ effective=[6F] │ │
│ │ │ │
│ │ ── Phase5: 写规则绑图库 ── │
│ ←──────────────────── │ │ │
│ success(6F) │ │ │
```
### 2.2 UC-02:调用方传了 floorIds
```
调用方 电梯应用 组织服务 tenant_visitor_floor_policy
│ │ │ │
│ POST /add/visitor │ │ │
│ floorIds=[7F,8F] │ │ │
│ ────────────────────→ │ │ │
│ │ │ │
│ │ ── Phase1: 查组织 ── │ │
│ │ POST /component/person/detail(personId) │
│ │ ─────────────────────→ │ │
│ │ ←───────────────────── │ │
│ │ PersonResult { │ │
│ │ organizationIds │ │
│ │ } ← 仅取orgIds,不用floorList │
│ │ │ │
│ │ ── Phase2: 候选楼层 ── │ │
│ │ candidate = param.floorIds │
│ │ = [7F,8F] │ │
│ │ │ │
│ │ ── Phase3: ALWAYS 查策略 ── │
│ │ SELECT * WHERE org_id=? AND enabled=1 │
│ │ ──────────────────────────────────────────→ │
│ │ ←────────────────────────────────────────── │
│ │ │ │
│ │ ┌─ policy存在? ─┐ │ │
│ │ │ │ │ │
│ │ YES NO │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ effective= effective │ │
│ │ allow_zone_ids =candidate │ │
│ │ =[6F] =[7F,8F] │ │
│ │ │ │
│ │ ── Phase4: 空集校验 ── │ │
│ │ effective=[6F] │ │
│ │ │ │
│ │ ── Phase5: 写规则绑图库 ── │
│ ←──────────────────── │ │ │
│ success(6F) │ │ │
```
---
## 3. 完整控制流
```
addVisitor(param, context):
┌────────────────────────────────────────────────────────┐
│ Phase1: 查被访人组织(ALWAYS,用于策略获取) │
│ detail = personService.detail(personId, businessId) │
│ if detail fail → return detail.code/msg │
│ personResult = detail.getData() │
│ orgIds = personResult.getOrganizationIds() │
└────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────┐
│ Phase2: 确定候选楼层 candidate │
│ if (param.floorIds 非空): ← UC-02 │
│ candidate = param.floorIds │
│ else: ← UC-01 │
│ candidate = personResult.getFloorList() │
│ if candidate 为空 → return 76260531 │
└────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────┐
│ Phase3: ALWAYS 查策略,有策略则替代 │
│ policy = DAO.selectEnabledByOrgId(orgId) │
│ if (policy 存在 && enabled=1): │
│ effective = parseAllowZoneIds(policy.allow_zone_ids)│
│ ← 策略的 allow 直接替代,非求交 │
│ else: │
│ effective = candidate ← 无策略约束,原值 │
└────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────┐
│ Phase4: 空集校验 │
│ if effective 为空 → return 76260531 │
│ param.setFloorIds(effective) │
└────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────┐
│ Phase5: 写规则 + 绑图库(不变) │
│ zoneService.page → image_rule_ref → batchBind → ... │
└────────────────────────────────────────────────────────┘
```
---
## 4. 决策矩阵
| 场景 | caller传floorIds | 有生效策略 | 行为 | 最终楼层 |
|------|----------------|-----------|------|---------|
| **A** | 空 | 无 | 取组织 floorList | `floorList` |
| **B** | 空 | 有,allow=[6F] | 策略替代 | `[6F]` |
| **C** | `[7F]` | 无 | 用调用方传入值 | `[7F]` |
| **D** | `[7F]` | 有,allow=[6F] | 策略替代(忽略调用方) | `[6F]` |
| **E** | `[6F,7F]` | 有,allow=[6F] | 策略替代 | `[6F]` |
| **F** | 空 | 有,allow=[](无效或空) | 等同无策略 | `floorList` |
### 关键差异
| 场景 | 旧行为(v2.0.18 | 新行为(v2.0.20 |
|------|-----------------|-----------------|
| **D**:传 7F,策略 allow=6F | 开通 7F(绕过策略 ❌) | 开通 6F(策略替代 ✅) |
| **E**:传 6F+7F,策略 allow=6F | 开通 6F+7F(绕过策略 ❌) | 仅开通 6F(策略替代 ✅) |
---
## 5. 错误码
| 错误码 | 场景 | 说明 |
|--------|------|------|
| 76260531 | 无可用楼层 | Phase4 中 `effective` 为空(含被访人无楼层、策略 allow 为空等) |
| 76260533 | 策略配置错误 | `allow_zone_ids` JSON 解析失败(已有 `parseAllowZoneIds` 兜底返回空) |
---
## 6. 日志设计
| 路径 | 级别 | 内容 |
|------|------|------|
| 请求入口 | INFO | businessId, personId, visitorId, requestFloorSize |
| Phase1 detail 失败 | WARN | personId, code, msg |
| Phase2 UC-01 | INFO | candidate = floorList |
| Phase2 UC-02 | INFO | candidate = param.floorIds |
| Phase2 空 floorList | WARN | personId |
| Phase3 查策略 | INFO | orgIds |
| Phase3 策略存在 | INFO | policyId, orgId, allow_zone_ids |
| Phase3 策略不存在 | INFO | 使用候选楼层原值 |
| Phase4 空集 | WARN | businessId, personId, visitorId, candidate |
---
## 7. 初始化流程分析(登记页楼层展示)
### 7.1 调用路径
基于 `cwos-component-organization-service` 反编译分析,初始化时的 `/component/person/detail` 调用链:
```
登记页初始化
├─ GET/POST /component/person/detail ───→ 组织服务 (ninca-common-component-organization)
│ │
│ PersonController.java:132 │
│ → imgStorePersonService.detail() │
│ → ImgPersonServiceImpl.java │
│ line 639-650 │
│ → elevatorFeignClient │
│ .listByImageId(...) │ ← 调电梯查询人员授权楼层
│ → image_rule_ref 表查询 │
│ ← floorList (List<zoneId>) │
│ │
│ ← PersonResult { │
│ floorList: ["zoneId1","zoneId2",...], │ ← 被访人当前授权楼层
│ organizationIds: [...], │ ← 用于 addVisitor 策略查询
│ defaultFloor, chooseFloor, ... │
│ } │
│ │
└─ 展示 floorList → 用户选择 → POST /add/visitor
→ 策略替代(如有)
```
### 7.2 floorList 的数据来源
`ImgPersonServiceImpl.java``floorList` 的组装逻辑:
```java
// line 639-650 (ImgPersonServiceImpl.java)
ArrayList<String> floorList = new ArrayList<>();
// 调电梯 Feign 接口获取该人员在 image_rule_ref 中的授权区域
CloudwalkResult<List<AcsPassRuleImageResultDto>> images =
this.elevatorFeignClient.listByImageId(acsPassRuleImageForm);
for (int i = 0; i < acsPassRuleImageResultDtoList.size(); i++) {
floorList.add(((AcsPassRuleImageResultDto)acsPassRuleImageResultDtoList.get(i)).getZoneId());
}
personResult.setFloorList(floorList);
```
**结论**`floorList` 是被访人在电梯 `image_rule_ref` 中**已有授权的楼层集合**,不是全量楼层。所以初始化页展示的本身就是被访人有权限的楼层。
### 7.3 初始化和提交的联动关系
| 阶段 | 调用接口 | 返回数据 | 是否经过策略 |
|------|---------|---------|------------|
| 初始化 | `组织服务 /component/person/detail` | `floorList`(授权楼层)| ❌ 策略在组织服务中不存在 |
| 提交 | `电梯应用 /add/visitor` | 开通结果 | ✅ v2.0.20 已修复 |
### 7.4 潜在问题
由于初始化时不经过策略,存在展示与开通不一致的可能:
| 场景 | 初始化展示 | 用户选择 | addVisitor 实际开通 | 用户体验 |
|------|-----------|---------|-------------------|---------|
| 被访人授权多楼层,策略 allow=[6F] | floorList=[6F,7F,8F] | 选 7F | **6F(策略替代)** | 用户困惑 |
| 被访人授权多楼层,策略 allow=[6F] | floorList=[6F,7F,8F] | 不选(UC-01 | **6F(策略替代)** | 与预期一致 |
| 无策略 | floorList | 任意 | 与选择一致 | 正常 |
**解决方案建议**(后续阶段):
在电梯应用新增 `/elevator/person/effective-floors` 预览接口,供初始化时展示策略约束后的有效楼层。当前阶段可先通过前端交互说明,或由第三方 BFF 自行做策略感知。
---
## 8. 与现有文档的差异
| 文档 | 旧逻辑 | 新逻辑 |
|------|--------|--------|
| 数据库阶段技术设计 §5.2 | UC-02 不读策略表 | UC-02 读策略表,替代 |
| 数据库阶段技术设计 §5.3 | UC-02 以请求为准 | UC-02 以策略为准 |
| 当前代码 `if(!callerProvidedFloors)` | 策略仅在 UC-01 查 | 策略 ALWAYS 查 |
| `resolveEffectiveFrozens` 方法 | 历史:∩ + 校验 hostFloors | **废止**;规范语义为组织侧 **替代**,电梯透传 `floorList` |
@@ -0,0 +1,188 @@
# 租户访客默认楼层策略 — 业务逻辑重设计
> **废止 / 仅作历史归档(2026-05-06**
> **现行规范**以 **[租户访客默认楼层策略 — 迁入组织组件](./2026-05-06-tenant-visitor-policy-organization-implementation.md)** 为准:租户策略 **`allow_zone_ids` 只能在组织 `PersonService.detail` 以「**替代**」写入 `floorList`**;**禁止**将策略定义为与被访人楼层 **「求交(∩)」**。电梯 `addVisitor` **不再**读取策略表、**不再**做 ∩。
> 下文保留 **2026-05-05** 草稿中的电梯侧求交流程图,**仅供对照旧表述**,勿作为实现或验收依据。
**日期**2026-05-05
**状态**:已废止(见上)
**设计依据**:产品方案 [租户访客默认楼层技术产品方案](../../business/租户访客默认楼层技术产品方案.md)
**涉及代码**`PersonRuleServiceImpl.addVisitor`(现行代码已按 2026-05-06 规范移除电梯侧策略 ∩)
---
## 1. 业务规则(核心不变量)—— **历史草案,已被「替代语义」取代**
| 规则 | 说明(历史) |
|------|------|
| ~~**策略全时生效**~~ | **废止**:电梯侧不再全时查策略表;策略在组织 detail **替代** `floorList`。 |
| **策略即安全边界** | `allow_zone_ids` 仍表达租户允许的 zone 集合;落实方式为 **替代写入 detail**,而非 ∩。 |
| **无策略不禁锢** | 组织未命中策略时,`floorList` 仍为 `listByImageId` 遍历结果。 |
| ~~**交集为空必须拒绝**~~ | **废止**:不再使用 `candidate ∩ allow`;空 `floorList`/effective 走 **`76260531`**。 |
---
## 2. 总流程
### 2.1 UC-01:调用方未传 floorIds
```mermaid
sequenceDiagram
participant Caller as 调用方/BFF
participant Elevator as 电梯应用<br/>cw-elevator-application
participant Org as 组织服务<br/>ninca-common-component-organization
participant PolicyDB as 策略表<br/>tenant_visitor_floor_policy
Caller->>Elevator: POST /elevator/person/add/visitor<br/>{personId, visitorId}<br/>(不传 floorIds)
Note over Elevator: 阶段1:查被访人信息
Elevator->>Org: POST /component/person/detail<br/>{personId, businessId}
Org-->>Elevator: PersonResult<br/>{floorList, organizationIds}
Note over Elevator: 阶段2:候选楼层 = floorList
Note over Elevator: floorList 来自组织服务
Note over Elevator: 阶段3:查策略
Elevator->>PolicyDB: SELECT * FROM tenant_visitor_floor_policy<br/>WHERE org_id IN (organizationIds) AND enabled=1
PolicyDB-->>Elevator: policy 行 / 空
alt 策略存在且生效
Note over Elevator: 最终楼层 = floorList ∩ allow_zone_ids
alt 交集为空
Elevator-->>Caller: 失败 76260532<br/>(租户策略与被访人授权无交集)
else 交集非空
Note over Elevator: 继续开通流程
Elevator-->>Caller: 成功,仅开通交集内楼层
end
else 无策略或未启用
Note over Elevator: 最终楼层 = floorList(原值)
Elevator-->>Caller: 成功
end
```
### 2.2 UC-02:调用方传入 floorIds
```mermaid
sequenceDiagram
participant Caller as 调用方/BFF
participant Elevator as 电梯应用<br/>cw-elevator-application
participant Org as 组织服务<br/>ninca-common-component-organization
participant PolicyDB as 策略表<br/>tenant_visitor_floor_policy
Caller->>Elevator: POST /elevator/person/add/visitor<br/>{personId, visitorId, floorIds:[...]}
Note over Elevator: 阶段1:查被访人信息(仅取 organizationIds
Elevator->>Org: POST /component/person/detail<br/>{personId, businessId}
Org-->>Elevator: PersonResult<br/>{organizationIds}
Note over Elevator: 阶段2:候选楼层 = 调用方传入的 floorIds
Note over Elevator: 阶段3:查策略(ALWAYS
Elevator->>PolicyDB: SELECT * FROM tenant_visitor_floor_policy<br/>WHERE org_id IN (organizationIds) AND enabled=1
PolicyDB-->>Elevator: policy 行 / 空
alt 策略存在且生效
Note over Elevator: 最终楼层 = callerFloorIds ∩ allow_zone_ids
alt 交集为空
Elevator-->>Caller: 失败 76260532<br/>(请求楼层不在策略允许范围内)
else 交集非空
Elevator-->>Caller: 成功,仅开通交集内楼层
end
else 无策略或未启用
Note over Elevator: 最终楼层 = callerFloorIds(原值)
Elevator-->>Caller: 成功
end
```
---
## 3. 控制流伪代码
```
addVisitor(param, context):
// === 阶段1:查被访人组织信息(ALWAYS)===
detailResult = personService.detail(personId, businessId)
if failed: return detailResult.error
person = detailResult.data
// === 阶段2:确定候选楼层 ===
if param.floorIds 非空: ← UC-02
candidate = param.floorIds
else: ← UC-01
candidate = person.floorList
if candidate 为空: return 76260531
// === 阶段3ALWAYS 查策略 ===
policy = findEnabledPolicy(person.organizationIds)
if policy != null:
effective = intersect(candidate, policy.allow_zone_ids)
if effective 为空: return 76260532
else:
effective = candidate
// === 阶段4:空集校验 ===
if effective 为空: return 76260531
param.floorIds = effective
// === 阶段5:开通流程(不变)===
zoneService.page → image_rule_ref → batchBind → ...
```
---
## 4. 场景对照矩阵
| 场景 | 调用方 floorIds | 策略状态 | 候选楼层 | 最终结果 |
|------|----------------|---------|---------|---------|
| UC-01 无策略 | 空 | 无策略行 | `floorList` | `floorList` ✅ |
| UC-01 + 策略通过 | 空 | 有且生效 | `floorList` | `floorList ∩ allow` ✅ |
| UC-01 + 策略无交集 | 空 | allow 与 floorList 无交集 | `floorList` | 失败 76260532 ✅ |
| UC-01 被访人无楼层 | 空 | 任意 | `floorList`=空 | 失败 76260531 ✅ |
| UC-02 无策略 | [A,B] | 无策略行 | [A,B] | [A,B] ✅ |
| UC-02 + 策略包含 | [A,B] | allow=[A,C] | [A,B] | [A] ✅ |
| UC-02 + 策略不包含 | [A,B] | allow=[C,D] | [A,B] | 失败 76260532 ✅ |
### 与当前实现的差异
| 场景 | 当前实现 | 重设计后 |
|------|---------|---------|
| UC-02 + 策略存在 | 绕过策略,按请求楼层开通 ❌ | 策略求交 ✅ |
| UC-02 + 策略不包含请求楼层 | 成功开通(本应拒绝)❌ | 失败 76260532 ✅ |
---
## 5. 错误码
| 错误码 | 触发条件 | 说明 |
|--------|---------|------|
| 76260531 | 候选楼层为空 | 被访人 `floorList` 为空,或有效楼层为空 |
| 76260532 | `candidate ∩ allow` 无交集 | 策略约束了可访楼层,但候选楼层全部不在允许范围内 |
| 76260533 | 策略配置错误 | `allow_zone_ids` 包含被访人无权限的 zoneId |
---
## 6. 日志规范
| 关键路径 | 日志内容 |
|---------|---------|
| 入口 | `businessId, personId, visitorId, requestFloorSize` |
| UC-01 | `调用方未传楼层,取被访人默认楼层 floorList=xxx` |
| UC-02 | `调用方已指定楼层,候选楼层=candidate` |
| 策略查询 | `查询组织 orgIds=xxx` |
| 策略命中 | `找到启用策略 policyId=xxx allow=xxx` |
| 策略未命中 | `未找到启用策略,使用候选楼层原值` |
| 求交成功 | `策略生效,最终楼层=effective` |
| 求交为空 | `候选楼层与策略无交集,返回 76260532` |
| 空楼层 | `无可用楼层,返回 76260531` |
---
## 7. 实施范围
| 变更点 | 影响 | 风险 |
|--------|------|------|
| UC-02 增加 `personService.detail()` 调用 | 多一次 RPC(数百微秒) | 低 |
| UC-02 增加策略求交逻辑 | 对传入楼层做过滤 | 中——调用方可能不符合预期 |
| 删除 `callerProvidedFloors` 分支 | 简化代码结构 | 低 |
> **兼容性提醒**:UC-02 行为改变意味着:之前能开通的请求(传入策略允许范围外的楼层)现在会失败。需通知集成方。
@@ -0,0 +1,138 @@
# 租户访客默认楼层策略 — 日志完善方案
**日期**: 2026-05-06
**方案**: 统一 `[POLICY]` 日志前缀,确保部署后可通过单次 grep 判定策略是否生效
---
## 日志格式约定
| 前缀 | 含义 | 级别 |
|------|------|------|
| `[POLICY]` | 策略入口被调用 | INFO |
| `[POLICY-HIT]` | 策略命中,返回 allow_zone_ids | INFO |
| `[POLICY-MISS]` | 策略未命中(无策略/未启用/allow为空) | DEBUG |
| `[POLICY-DETAIL]` | detail() 方法中的策略结果 | INFO |
| `[POLICY-LIST]` | listByPage() 方法中的策略结果 | INFO |
## grep 速查
```bash
# 查看所有策略调用
grep "\[POLICY\]" component-organization.info.log
# 只看策略命中
grep "\[POLICY-HIT\]" component-organization.info.log
# 统计调用次数
grep -c "\[POLICY\]" component-organization.info.log
```
## 修改清单
### 1. TenantVisitorFloorPolicyService.java — 3 处修改
**L68-74 (replacementZoneIdsIfPolicyActive — 多 orgIds 入口)**:
```java
public Optional<List<String>> replacementZoneIdsIfPolicyActive(List<String> orgIds) {
if (CollectionUtils.isEmpty(orgIds)) {
return Optional.empty();
}
log.info("[POLICY] entry orgIds={}", orgIds); // ← 新增
for (String id : orgIds) {
Optional<List<String>> zones = replacementZoneIdsIfPolicyActive(id);
if (zones.isPresent()) {
return zones;
}
}
log.debug("[POLICY-MISS] no enabled policy for any org in {}", orgIds); // ← 新增
return Optional.empty();
}
```
**L83-98 (replacementZoneIdsIfPolicyActive — 单 orgId 查询)**:
```java
public Optional<List<String>> replacementZoneIdsIfPolicyActive(String orgId) {
try {
Optional<TenantVisitorFloorPolicy> policy = findEnabledPolicyByOrgId(orgId);
if (!policy.isPresent()) {
log.debug("[POLICY-MISS] orgId={} no policy row", orgId); // ← 新增
return Optional.empty();
}
List<String> allow = parseAllowZoneIds(policy.get().getAllowZoneIds());
if (allow.isEmpty()) {
log.info("[POLICY-MISS] orgId={} allow_zone_ids empty", orgId); // ← 新增
return Optional.empty();
}
log.info("[POLICY-HIT] orgId={} policyId={} zones={} count={}", // ← 新增
orgId, policy.get().getId(), allow, allow.size());
return Optional.of(new ArrayList<>(allow));
} catch (Exception e) {
log.warn("[POLICY-ERR] orgId={} query failed, fallback: {}", // ← 修改
orgId, e.toString());
return Optional.empty();
}
}
```
**L39-57 (parseAllowZoneIds)**:
```java
public List<String> parseAllowZoneIds(String allowZoneIdsJson) {
if (StringUtils.isBlank(allowZoneIdsJson)) {
return Collections.emptyList();
}
try {
// ... 原有逻辑不变 ...
} catch (Exception e) {
log.warn("[POLICY-ERR] allow_zone_ids JSON invalid: {}", e.getMessage()); // ← 修改前缀
return Collections.emptyList();
}
}
```
### 2. ImgPersonServiceImpl.java — 2 处修改
**L322-334 (listByPage — isVisitor 场景)**:
```java
if (policyZones.isPresent()) {
log.info("[POLICY-LIST] hit personId={} orgIds={} zones={}", // ← 新增
imgStorePersonResult.getId(),
imgStorePersonResult.getOrganizationIds(),
policyZones.get());
List<AcsPassRuleImageResultDto> policyFloorInfo =
buildFloorInfoListFromOrderedZoneIds(businessId, policyZones.get());
// ... 原有逻辑不变 ...
```
**L643-651 (detail — 详情场景)**:
```java
Optional<List<String>> replacementFloors =
this.tenantVisitorFloorPolicyService.replacementZoneIdsIfPolicyActive(
result.getOrganizationIds());
if (replacementFloors.isPresent()) {
log.info("[POLICY-DETAIL] hit personId={} orgIds={} zones={}", // ← 新增
result.getId(),
result.getOrganizationIds(),
replacementFloors.get());
floorList = new ArrayList<>(replacementFloors.get());
// ... 原有逻辑不变 ...
```
## 预期日志输出示例
```
# 策略命中(detail 场景)
[POLICY] entry orgIds=[605560545117995008, 605560541473144832]
[POLICY-HIT] orgId=605560545117995008 policyId=gf_vstr_xxx zones=[zone_28f, zone_6f] count=2
[POLICY-DETAIL] hit personId=1072908835884208128 orgIds=[605560545117995008, 605560541473144832] zones=[zone_28f, zone_6f]
# 策略未命中
[POLICY] entry orgIds=[some_org_id]
[POLICY-MISS] orgId=some_org_id no policy row
[POLICY-MISS] no enabled policy for any org in [some_org_id]
# 策略命中(listByPage 场景)
[POLICY] entry orgIds=[605560545117995008]
[POLICY-HIT] orgId=605560545117995008 policyId=gf_vstr_xxx zones=[zone_28f, zone_6f] count=2
[POLICY-LIST] hit personId=xxx orgIds=[605560545117995008] zones=[zone_28f, zone_6f]
```
@@ -0,0 +1,559 @@
# 租户访客默认楼层策略 — 迁入组织组件(组织侧唯一实现,电梯侧移除)
**日期**2026-05-06
**状态**:实施前梳理 / 待评审
**核心原则**:策略逻辑**只在** `maven-ninca-common-component-organization` 实现;`maven-cw-elevator-application` **完全移除**策略相关代码。
**业务约定(楼层清单)**:凡 **调用方 / 前端 / BFF** 需消费 **「被访人可派梯 / 可邀约访问的楼层集合」**(`PersonResult.floorList` 语义),**必须**走 intelligent **`PersonService.detail``PersonResult.getFloorList()`**(服务端路由至组织 `ImgPersonServiceImpl#detail`)。**禁止**用 **`listByPage`** 或其它接口**顶替**该契约来充当邀约页或 UC-01 的楼层主数据源。**说明**:组织服务 **内部**仍会 **`ElevatorFeignClient.listByImageId`** 组装原始楼层,再写入 `floorList`——这是 **实现细节****不等于**调用方可绕过 `PersonService.detail` 直连上述内部调用。另见 **§2.3** 与 UC-02 边界。
**术语(强制)——「替代」与禁止「求交」**
| 用语 | 含义 |
|------|------|
| **替代(Replacement** | 租户启用访客楼层策略时,**`allow_zone_ids` 整表替换**写入组织 `PersonService.detail` 返回的 **`PersonResult.floorList`**(及展示用 `floorNames` 等一致处理)。**不得**再将被访人 `listByImageId` 原始结果与 `allow_zone_ids` 做集合 **交集(∩)** 作为规范语义。 |
| **禁止表述** | 在需求/产品/排障文档中,**禁止**将本策略称为「与 floorList 求交」「 candidate ∩ allow」;若需描述历史实现,须标明 **「历史·电梯侧过滤(已废弃)」**。 |
| **电梯 `addVisitor`** | **只透传** UC-01 的 `personResult.floorList` 与 UC-02 的 `param.floorIds`**不**再读 `tenant_visitor_floor_policy`、**不**做 ∩。 |
---
## 硬约束:对外接口不变
| 约束 | 说明 |
|------|------|
| **HTTP 路径与动词** | 不新增、不废弃、不更名组织/电梯现网已发布的 REST 路径;不调整鉴权与 Header 约定。 |
| **请求/响应契约** | `cwos-component-organization-interface`、intelligent `PersonService` / `PersonResult` 等已对外暴露的 DTO 与 Feign 方法签名保持兼容:**不增删改字段、不增删方法**。 |
| **允许变更范围** | **组织侧**:新建 `TenantVisitorFloorPolicyService`、修改 `ImgPersonServiceImpl#detail` 内部 floorList 组装逻辑。**电梯侧**:删除 `PersonRuleServiceImpl` 中的策略相关代码(阶段3),删除策略 DAO/Mapper/DTO。 |
| **禁止** | 不在 `cwos-component-organization-interface` 中新增任何类/方法/字段。不在电梯侧新增对组织的 Feign 调用。 |
| **floorList 唯一主路径** | 获取 **`PersonResult.floorList`****必须**调用 **`PersonService.detail`**(与 **`addVisitor` UC-01**、访客邀约初始化**同源**)。**不适用**于 **`addVisitor` UC-02 的楼层候选来源**(见 §2.1、§2.3)。禁止用分页接口替代 detail 来充当邀约/UC-01 的楼层主数据来源。 |
---
## 场景说明:访客邀请初始化、detail 与 listByPage
**规范表述**:**访客邀约 / 派梯(UC-01)所依据的 `floorList`,业务上只认 `PersonService.detail` 的返回**;组织侧在 `ImgPersonServiceImpl#detail` 内完成 `listByImageId` 与租户策略**替代**后写入同一字段,对外仍通过 **`PersonResult.floorList`** 消费。
本节约定**产品 / 前端 / BFF**与后端实现对齐用语;**不引入新接口**,楼层清单仍来自既有契约中的字段(如 `floorList``floorNames``floorInfoList` 等)。
### 1)访客邀请初始化页面需要「可访问楼层清单」
| 项 | 说明 |
|------|------|
| **业务诉求** | 访客邀约/登记页在提交前,需要展示 **被访人侧允许访客选择的可达楼层**(或默认勾选逻辑所依赖的楼层集合),以便用户勾选或与派梯入口对齐。 |
| **数据来源(规定主路径)** | **必须**通过 **`PersonService.detail`** 获取 **`PersonResult.floorList` / 相关展示字段****被访人 `personId` + `businessId`** → intelligent **`PersonService.detail`**Feign 不变)→ 组织 **`ImgPersonServiceImpl#detail`** 内聚 **`listByImageId` + 租户策略替代** 后写入 **`floorList`**(见 §1「改造后」与 §4)。**禁止**将 **`listByPage`** 作为邀约页 **`floorList` 的规范来源**。 |
| **与派梯一致** | 电梯 **`addVisitor` UC-01**(未传 `floorIds`)以同一 **`PersonResult.floorList`** 为候选楼层;邀约页若使用该清单,可与 UC-01 **同源**,减少「页面选的层 ≠ 后台派的层」。 |
| **非本路径** | 邀约页若**仅**调人员分页、不调详情,则可能拿到 **另一套** 楼层展示(含星河湾 40F/6F 等),与 detail **不一定一致**——见下文 **3** 与 §4.0。 |
### 2`detail` 流程的作用
| 项 | 说明 |
|------|------|
| **定位** | **单人维度的被访人详情**:组织侧 `ImgPersonServiceImpl#detail`(对外经 `/component/person/detail` 等**既有**入口,契约不变)。 |
| **与楼层相关输出** | 在 **`listByImageId` 成功**时组装 **`floorList`zoneId 列表)与 `floorNames`**;改造后在此链路插入 **租户访客策略替代**(命中则 **`floorList` 以策略 `allow_zone_ids` 为准**,见 §4.2)。 |
| **明确不包含** | **不包含**星河湾分页里的 **40F / 6F 默认覆盖**(现网即如此);邀约页若只依赖 detail,则 **不会**从该接口拿到 XHW 那套默认楼层。 |
| **典型调用方** | 访客邀请初始化、被访人卡片、电梯 **`addVisitor` 阶段 1** 拉 **`PersonResult`** 等——凡需要 **「这一位被访人当前可用的楼层清单」** 的场景,应以 **detail** 为主数据源(在无不新增接口前提下)。 |
### 3`listByPage` 流程的作用
| 项 | 说明 |
|------|------|
| **定位** | **人员列表分页**:组织侧 `ImgPersonServiceImpl#listByPage`,面向 **批量行** 展示;可选参数 **`isVisitor` 非空** 时进入访客列表增强分支(见 §3.2)。 |
| **与楼层相关输出** | 行为 **`listByImageId`** 填 **`floorInfoList`**,再结合 **`OrgFloorMapper`**、**`xhwId` / `xhwDefaultFloorId` / `xhwSixFloorId`** 等写入 **默认选中楼层、跨日标记** 等(星河湾 **40F / 6F** 出现在此分支,见 §4.0)。 |
| **与邀约初始化的关系** | 适用于 **访客名单列表、运营筛选** 等「一行一人摘要」场景;**不是**邀约页「为主访人拉可选楼层清单」的首选数据源——除非产品设计明确要求列表与邀约共用同一套展示逻辑,并接受与 **detail** 的差异或另行对齐(§7 测试项)。 |
| **改造后** | 策略命中时应在 **L331–332 插入点**优先替代并 **跳过**原星河湾块(§4.3),避免与租户策略双重主编。 |
**小结**:**访客邀请初始化与 UC-01 派梯,均以 `PersonService.detail` 返回的 `PersonResult.floorList` 为权威楼层清单**(组织侧在 `ImgPersonServiceImpl#detail` 内完成策略替代);**`listByPage(isVisitor)`** 仅服务访客名单列表与项目定制默认层,**不作为**邀约页 `floorList` 的主数据路径。详情与分页并存时的差异见 §4.0。
---
## 访客邀约:完整业务流程图与代码流程图(改造后目标)
以下图表与仓库约定一致:**主数据访客登记**可能在第三方/BFF;**电梯 `addVisitor`** 仅负责「已有访客人员 ID 后的派梯授权」;策略在**组织库**、**替代**语义写入 **`detail``floorList`**。
### A. 业务视角 — 端到端(访客邀约 + 可选派梯)
```mermaid
flowchart TB
subgraph invite["访客邀约 / 登记(主流程)"]
A1[打开访客邀约页] --> A2[选定被访人 hostPersonId]
A2 --> A3[PersonService.detail<br/>取 PersonResult.floorList]
A3 --> A4[渲染可选楼层 / 默认勾选逻辑]
A4 --> A5[填写访客信息、访期等]
A5 --> A6[提交邀约 — 访客档案落库]
end
subgraph elevator_domain["电梯域 — 派梯授权(可与邀约异步或分步)"]
B1[触发派梯授权] --> B2[POST /elevator/person/add/visitor]
B2 --> B3[依赖 PersonResult.floorList 或显式 floorIds]
B3 --> B4[写通行规则引用 / 图库绑定]
end
A3 -.->|唯一规范源| A3note["PersonService.detail<br/>PersonResult.floorList<br/>与 addVisitor UC-01 同源"]
A6 -.->|可选后续| B1
```
**说明**:邀约页 **A3** **必须**通过 **`PersonService.detail``PersonResult.floorList`** 拉楼层清单(组织侧 `ImgPersonServiceImpl#detail` 实现);**禁止**用 **`listByPage(isVisitor)`** 替代 **A3** 作为 **`floorList` 规范来源**(见场景说明 **3**)。
### B. 代码视角 — 邀约初始化:拉「可访问楼层清单」(**唯一规范:`PersonService.detail` → `floorList`**
```mermaid
sequenceDiagram
autonumber
participant FE as 前端 / BFF
participant PS as PersonService<br/>Intelligent Feign
participant OC as PersonController<br/>/component/person/detail
participant IM as ImgPersonServiceImpl#detail
participant EF as ElevatorFeignClient<br/>listByImageId
participant TP as TenantVisitorFloorPolicyService<br/>组织库
FE->>PS: detail(personId, businessId)
PS->>OC: HTTP POST(契约不变)
OC->>IM: detail(param, context)
IM->>IM: selectByPrimaryKey、getImgStorePersonResults
IM->>EF: listByImageId(AcsPassRuleImageForm)
EF-->>IM: List AcsPassRuleImageResultDto(原始通行楼层)
IM->>TP: isEnabled(organizationIds)
TP-->>IM: true / false
alt 策略启用
IM->>TP: getAllowZoneIds(organizationIds)
TP-->>IM: allow_zone_ids 列表
IM->>IM: floorList = 策略替代结果
else 策略未启用
IM->>IM: floorList = 遍历 images 的 zoneId(现网 L613-626 语义)
end
IM->>IM: setFloorList / setFloorNames
IM-->>OC: ImgStorePersonGetResult
OC-->>PS: CloudwalkResult
PS-->>FE: PersonResult / 映射后 floorList
```
**落点**:组织 **`cwos-component-organization-service`** · **`ImgPersonServiceImpl`**;行号以 §3.1 为准(插入点在 **`listByImageId` 成功块内**)。
### C. 代码视角 — 派梯授权:`addVisitor`(电梯,改造后)
```mermaid
flowchart TD
START([AcsPersonController<br/>POST /elevator/person/add/visitor]) --> P1[PersonRuleServiceImpl.addVisitor]
P1 --> D1[PersonService.detail<br/>PersonResult.floorList]
D1 --> D2{param.floorIds<br/>非空?}
D2 -->|UC-02 是| E1[effective = param.floorIds]
D2 -->|UC-01 否| E2[effective = personResult.floorList<br/>组织 detail 已含策略替代]
E1 --> V{effective<br/>为空?}
E2 --> V
V -->|是| FAIL[失败 76260531 等]
V -->|否| P2[param.setFloorIds effective]
P2 --> Z1[zoneService.page 首楼层]
Z1 --> Z2[deviceImageStoreDao<br/>imageStoreId]
Z2 --> R1[按楼层写 ImageRuleRef]
R1 --> B1[imageStorePersonService.batchBind<br/>访期]
B1 --> G1[updateGroupPersonRef]
G1 --> OK([返回成功])
```
**要点**:改造后 **无** `TenantVisitorFloorPolicyDao`、**无** `candidate ∩ allow`**UC-01** 完全信任 **组织侧写入的 `floorList`**
### D. 代码视角 — 访客名单分页:`listByPage``isVisitor` 非空)
```mermaid
flowchart TD
LP([listByPage]) --> Q[PageHelper + imgStorePersonMapper.gets]
Q --> ENRICH[getImgStorePersonResults<br/>组织/用户姓名等]
ENRICH --> IV{param.isVisitor<br/>非空?}
IV -->|否| OUT1([直接分页返回])
IV -->|是| LOOP[逐行:listByImageId]
LOOP --> POL{TenantVisitorFloorPolicyService<br/>isEnabled?}
POL -->|是| POLSET[替代 floorInfoList / 默认楼层<br/>跳过星河湾块]
POL -->|否| DF[setDefaultChooseFloor defaultFloor]
DF --> OF[OrgFloorMapper.listByOrgIds]
OF --> EMPTY{orgFloorList<br/>为空?}
EMPTY -->|是| AD[setIsAcrossDay=1<br/>无 40/6 覆盖]
EMPTY -->|否| XHW{xhwId in<br/>organizationIds?}
XHW -->|是| F40[40F 默认 + floorInfoList]
XHW -->|否| F6[6F 默认 + floorInfoList]
POLSET --> FILTER[过滤标签含访客等<br/>现网逻辑]
F40 --> FILTER
F6 --> FILTER
AD --> FILTER
FILTER --> OUT2([CloudwalkPageAble 返回])
```
**要点**:**邀约初始化不要依赖本分支**作为主楼层清单;本图仅供列表页与 §4 优先级对照。
---
## 1. 数据流 — 改造前 vs 改造后
### 改造前(历史·已废弃)
```
addVisitor(floorIds)
→ personService.detail → PersonResult.floorList (listByImageId)
→ if UC-02: candidate = floorIds
→ if UC-01: candidate = floorList
→ 【电梯侧查策略表】findPolicyByOrgIds
→ 【错误语义·已废弃】candidate 与 allow_zone_ids 做 ∩ 过滤
→ 派梯
```
### 改造后(当前规范)
```
【访客邀约页 / UC-01 共用】PersonService.detail → PersonResult.floorList
(组织 ImgPersonServiceImpl#detaillistByImageId 后,策略命中则以 allow_zone_ids **替代** floorList
addVisitor(floorIds)
→ personService.detail → PersonResult.floorList ← 与邀约页同一契约来源
→ if UC-02: effective = floorIds
→ if UC-01: effective = floorList
→ effective = 上式(电梯侧 **无** 策略表、**无** ∩)
→ 派梯
```
### 关键变化
| 步骤 | 改造前(历史) | 改造后(规范) |
|------|--------|--------|
| 策略权威 | 电梯库读表 + **∩ 收窄**(错误表述:「求交」) | **组织库 / 组织 detail**:策略命中则 **`floorList` = `allow_zone_ids`(仅替代)** |
| **`PersonService.detail` → floorList** | 主要为 `listByImageId` 原始楼层 | **策略命中时 = allow_zone_ids(替代)**;未命中 = 原始遍历结果 |
| **`addVisitor`(电梯)** | 查电梯库策略 + **∩** | **删除策略运算**:仅透传 detail / 请求 |
| **effectiveUC-01** | 曾再度与 allow **∩** | **effective = `personResult.floorList`**(组织已替代,电梯不二次运算) |
| **effectiveUC-02** | 曾与 allow **∩**(若走策略分支) | **effective = `param.getFloorIds`**(显式楼层;规范上不由电梯做 ∩) |
---
## 2. 业务语义
### 2.1 UC-01 与 UC-02:业务场景说明(电梯「访客派梯授权」接口)
以下针对 **`POST /elevator/person/add/visitor`**`PersonRuleServiceImpl#addVisitor`)中 **`floorIds` 是否由调用方传入** 的两种业务模式;与 **访客邀约页拉楼层清单**(依赖 **`PersonService.detail`**)的关系见 **§2.3**。
| 代号 | 接口条件(代码侧) | 业务含义 | 典型场景举例 |
|------|-------------------|----------|--------------|
| **UC-01** | 请求体 **未传** `floorIds`,或传 **空列表**(以最终实现判定为准) | **由系统依据被访人维度推导要开通的楼层**:调用方不显式指定「开哪几层」,派梯授权使用的楼层集合应与 **被访人详情中的可达楼层清单**一致(经租户策略在组织侧写入 **`PersonResult.floorList`**)。 | ① 登记完成后 **一键开通派梯**,前台未做逐层勾选;② BFF 只带 `personId`/`visitorId`/访期,**楼层完全跟被访人档案 + 租户策略**走;③ 与 **访客邀约初始化页**使用同一 **`PersonService.detail``floorList`** 对齐 UC-01,避免「页面以为的层」与「后台开通的层」不一致。 |
| **UC-02** | 请求体 **`floorIds` 非空** | **由调用方明确指定要开通的楼层(zoneId 列表)**:业务上多为用户或上游系统 **已选定具体楼层**,派梯接口按 **显式列表** 写入通行规则,而 **不以** `PersonResult.floorList` 作为开通列表来源。 | ① 接待岗在终端 **勾选 7F、8F** 后提交派梯;② 第三方访客系统 **合同只允许指定楼层**;③ 邀约页提交时 **把用户勾选的楼层原样** 传给派梯(此时开通列表以请求为准,**不等于**邀约页展示用的 **`detail.floorList` 必须相同**,取决于产品设计)。 |
**一句话对照**:**UC-01 =「开通哪些层」交给系统(跟被访人 detail + 策略后的 floorList****UC-02 =「开通哪些层」由调用方在请求里写死(floorIds)**。
**与邀约页的关系**:邀约页展示 **可选楼层****规定**走 **`PersonService.detail`**(§「业务约定」);用户若在邀约或后续页面 **勾选了具体楼层** 再派梯,对接侧通常走 **UC-02**;若 **未勾选**、由后台直接派梯,则多为 **UC-01**
---
### 2.2 唯一规范语义:替代(Replacement);禁止「求交」作为策略定义
| | 禁止(历史·电梯侧 ∩) | 唯一规范(组织 detail·替代) |
|------|------|------|
| 逻辑 | ~~`candidate` ∩ `allow_zone_ids`~~ **不得**再写进需求/验收的主路径 | 策略命中时 **`floorList` := `allow_zone_ids`**(整表替换,**非**与原楼层求交) |
| 实现位置 | ~~`PersonRuleServiceImpl` 阶段 3~~ **已移除** | `ImgPersonServiceImpl#detail`(待接入 `TenantVisitorFloorPolicyService` 时在此 **替代** |
| 策略命中时含义 | ~~「收窄候选」~~(易误解为 ∩) | **`PersonResult.floorList` 完全由策略列表定义**;未命中策略时才保留 `listByImageId` 遍历结果 |
**核心语义**:租户访客楼层策略 **只能是替代**,**不是**与被访人电梯原始授权楼层 **求交**
### 2.3 `addVisitor` 实现要点:UC-02 与「必须 detail」的边界(代码与契约)
| 路径 | 是否必须 `PersonService.detail` | 说明 |
|------|----------------------------------|------|
| **访客邀约页初始化 / UC-01 派梯** | **是** | 楼层权威清单 = **`PersonService.detail``floorList`**(§「业务约定」)。 |
| **`addVisitor` UC-02** | **仍调用** `personService.detail`(阶段 1 校验被访人存在等),但 **effective 楼层**仅取自 **`param.getFloorIds()`****不**采用 `personResult.getFloorList()` | 用于 BFF/调用方**已替用户选定楼层**的派梯;**不是**邀约页拉清单的主路径。 |
电梯侧 `addVisitor` 生效楼层计算(**无** `TenantVisitorFloorPolicyDao`、**无** ∩)如下:
```java
// 改造后 addVisitor:阶段 2
List<String> effective;
if (!CollectionUtils.isEmpty(param.getFloorIds())) {
effective = param.getFloorIds(); // UC-02 — 显式楼层
} else {
effective = personResult.getFloorList(); // UC-01 — 与邀约页同源,来自 detail
}
// 无 TenantVisitorFloorPolicyDaoeffective 直接用于后续派梯
```
**避免误读**:上文「UC-02 不经 detail 的 floorList」仅指 **候选生效楼层字段**不取自 `PersonResult.floorList`**阶段 1 的 `detail` 调用仍可能存在**(取被访人元数据)。若产品要求 **显式 floorIds 也必须被租户策略约束**,属**新需求**,与本篇「对外接口不变」前提冲突时需另案评审。
---
## 3. 改造后业务时序图(含代码行号对照)
### 3.1 组织侧 `detail` 内策略插入 + 电梯 `addVisitor` 消费(对照)
> 下图左侧为 **`addVisitor` 内触发 `detail`** 的上下文;**楼层写入**发生在组织 **`ImgPersonServiceImpl#detail`**(策略插入点见 §3.3)。
```
Elevator Intelligent Component-Org Component-Org
PersonRuleImpl PersonService ImgPersonServiceImpl TenantVisitorPolicyService
(after removal) (Feign, unchanged) (L569 detail方法) (新建)
│ addVisitor() │ │ │
│──────────────────────────>│ │ │
│ │ detail(param) │ │
│ │───────────────────>│ │
│ │ │ │
│ │ │ ① selectByPrimaryKey L577 │
│ │ │ ② getVehicleIds L598 │
│ │ │ │
│ │ │ ③ elevatorFeignClient │
│ │ │ .listByImageId() L611 │
│ │ │ ← images (原始通行楼层) │
│ │ │ │
│ │ │ ╔═══════════════════════╗ │
│ │ │ ║ ★ 插入点 (L612之后) ║ │
│ │ │ ╚═══════════════════════╝ │
│ │ │ │
│ │ │ isEnabled(orgIds) │
│ │ │ ─────────────────────────────>│
│ │ │ ← true / false │
│ │ │ │
│ │ │ if true: │
│ │ │ getAllowZoneIds(orgIds) │
│ │ │ ─────────────────────────────>│
│ │ │ ← [zone1, zone2, ...] │
│ │ │ floorList = 策略结果 │
│ │ │ │
│ │ │ if false: │
│ │ │ floorList = L613-626 │
│ │ │ (原始images遍历组装) │
│ │ │ │
│ │ │ ④ setFloorList L628-629 │
│ │ │ │
│ │ ← PersonResult │ │
│ │ .floorList │ │
│ │ (已含策略替代) │ │
│ │ │ │
│ ← PersonResult │ │ │
│ UC-02: effective=param.floorIds │ │
│ 否则: effective=personResult.floorList │ │
│ (组织 detail 已替代;电梯不 ∩ allow) │ │
│ 派梯 │ │
▼ ▼ ▼ ▼
```
### 3.2 listByPage() 中的插入点(isVisitor 场景,L319-358
```
ImgPersonServiceImpl#listByPage
├─ L330: setFloorInfoList(images.getData()) ← listByImageId 原始结果
│ ╔═══════════════════════════════════════╗
│ ║ ★ 插入点 (L331-332 之间) ║
│ ╚═══════════════════════════════════════╝
│ │
│ │ if tenantVisitorFloorPolicyService.isEnabled(orgIds):
│ │ floorInfoList = 策略 allow_zone_ids
│ │ setFloorInfoList(floorInfoList)
│ │ setDefaultChooseFloor(策略默认楼层)
│ │ continue ← 跳过 XHW 分支 (L332-357)
│ │
│ ▼ (策略未命中时,继续原有逻辑)
├─ L332: setDefaultChooseFloor(defaultFloor) ← 原逻辑
├─ L334: orgFloorMapper.listByOrgIds(orgIds) ← 原逻辑
├─ L340: if xhwId → setDefaultChooseFloor(40F) ← 星河湾分支
└─ L349: else → setDefaultChooseFloor(6F) ← 星河湾分支
```
### 3.3 代码插入点与行号对照
| 方法 | 插入位置(与 §3.1 文字一致) | 上下文 | 变量来源 |
|------|------------------------------|--------|---------|
| `detail()` | **`images.getCode()` 为成功码、`floorList` 组装循环之前**(文中曾写 L612–613 间,以当前 `ImgPersonServiceImpl` 为准) | `if (Objects.equals(images.getCode(), "00000000"))` 块内 | `result.getOrganizationIds()` |
| `listByPage()` | **`setFloorInfoList(images.getData())` 之后、`setDefaultChooseFloor` 之前**(约 L331–332) | 访客分支内逐行处理 | `imgStorePersonResult.getOrganizationIds()` |
### 3.4 策略 Service 接口定义
```java
// 新建:cn.cloudwalk.service.organization.service.visitorpolicy.TenantVisitorFloorPolicyService
public class TenantVisitorFloorPolicyService {
// 查询是否存在启用策略(任一 orgId 命中即返回 true)
public boolean isEnabled(List<String> orgIds);
// 返回解析后的 allow_zone_idsJSON Array → List<String>
public List<String> getAllowZoneIds(List<String> orgIds);
}
```
---
## 4. 与星河湾并存:适用范围、优先级与伪代码
### 4.0 现网代码事实(走查结论,避免误实现)
| 方法 | 星河湾 40F / 6F`xhwDefaultFloorId` / `xhwSixFloorId` | 租户访客策略(拟插入) |
|------|----------------|----------------|
| **`ImgPersonServiceImpl#detail`** | **未实现**:仅 `listByImageId``floorList` / `floorNames`(见 §3.1 | 仅在 **`floorList` 组装处**做 **P1 策略替代****不要**在本方法内照搬 `listByPage` 的 XHW 分支,除非产品明确要求「详情与访客分页默认完全一致」(属**行为变更**,需单独评审)。 |
| **`ImgPersonServiceImpl#listByPage`**`param.getIsVisitor()` 非空时) | **已实现**:在 `OrgFloorMapper.listByOrgIds` 非空且 `isAcrossDay=0` 时,按是否含 `xhwId` 覆盖 `defaultChooseFloor``floorInfoList`40F vs 6F)(见 §3.2 | 在 **L331332 之间**插入:若 **P1 策略命中**,则用策略结果替换 `floorInfoList` / 默认楼层并 **跳过** 原 XHW 块(L332–357);若未命中则保持现有星河湾逻辑。 |
**详情 vs 分页的一致性**:改造前已存在「**detail 无 XHW、分页访客分支有 XHW**」差异;若在 **detail** 仅加 **策略替代**、在 **listByPage****策略优先于 XHW**,可能出现「同一被访人在详情 `floorList` 与分页默认展示仍不完全一致」。若需对齐,应在产品层明确是否要给 **`detail` 增加与分页相同的默认楼层规则**(接口字段不变,仅内部赋值变化)。
### 4.1 优先级总表(与现网 XHW 不冲突的前提)
| 优先级 | 条件 | 行为 |
|--------|------|------|
| **P1** | 租户访客策略命中且启用 | **替代**:① **`PersonService.detail``floorList`** = **`allow_zone_ids`**;② **`listByPage` 访客行**上用于展示的 `floorInfoList`/默认层(见 §4.3)。**访客邀约页只吃 ①**,不吃 ②。 |
| **P2** | 未命中策略,且走 **`listByPage` 访客分支** 且满足现网 XHW 前置条件(含 `orgFloorList` 非空等) | 保持现有 **40F / 6F** 逻辑(`xhwId` vs `xhwSixFloorId`)。 |
| **P3** | 兜底 | **`listByImageId`** 原始结果;**detail** 路径下无 P2(因现网无 XHW)。 |
### 4.2 伪代码:`detail()` — 仅 P1 与 P3(不要写入 XHW else-if
```java
// ImgPersonServiceImpl#detail — listByImageId 已成功返回后、setFloorList 之前(参见 §3.1 插入点)
List<String> orgIds = result.getOrganizationIds();
if (tenantVisitorFloorPolicyService.isEnabled(orgIds)) {
// P1:策略替代(PersonResult / 映射链最终消费的 floorList 与此一致)
List<String> allow = tenantVisitorFloorPolicyService.getAllowZoneIds(orgIds);
floorList = allow; // 另需同步 floorNames 等与契约一致的展示字段,实现自行拆解 zoneId→名称若需要
} else {
// P3:与现网一致 — 保留 listByImageId 遍历结果(L613-626
// 此处不要添加 else if (xhwId) — 现网 detail 本无星河湾分支
}
result.setFloorList(floorList);
```
### 4.3 伪代码:`listByPage` 访客分支 — P1 跳过 XHWP2)
```java
// 在 setFloorInfoList(images.getData()) 之后、setDefaultChooseFloor 之前(§3.2 L331-332 间)
if (tenantVisitorFloorPolicyService.isEnabled(orgIds)) {
// P1:用策略替代楼层展示;跳过下方 OrgFloor / 星河湾 40F/6F
applyPolicyToFloorInfoListAndDefault(imgStorePersonResult, orgIds);
continue; // 或等价结构,避免进入 L332-357 原 XHW 逻辑
}
// 未命中策略:保持现网顺序 — L332 起 defaultFloor、OrgFloor、xhwId→40F / else→6F
```
---
## 5. 组织组件 — 新增/修改清单
### 5.1 数据层(`cwos-component-organization-data`
| 工作项 | 详情 |
|--------|------|
| DDL | 从 `releases/cw-elevator-application-V2.0.20.20260505/ddl/tenant_visitor_floor_policy.sql` 迁移到 `docs/sql/tenant_visitor_floor_policy.sql` |
| Entity | `cn.cloudwalk.data.organization.entity.TenantVisitorFloorPolicy` |
| Mapper | `cn.cloudwalk.data.organization.mapper.TenantVisitorFloorPolicyMapper.java` + XML |
| 数据迁移 SQL | 从电梯库 `cwo_elevator_db.tenant_visitor_floor_policy` → 组织库(一次性,含回滚) |
### 5.2 服务层(`cwos-component-organization-service`
| 工作项 | 详情 |
|--------|------|
| **新建** | `TenantVisitorFloorPolicyService` |
| 方法 | `boolean isEnabled(List<String> orgIds)` — 是否存在启用策略 |
| 方法 | `List<String> getAllowZoneIds(List<String> orgIds)` — 返回 allow_zone_ids(已解析 JSON |
| **修改** | `ImgPersonServiceImpl#detail` — floorList 组装处插入 **§4.2**P1/P3,无 XHW |
| **修改** | `ImgPersonServiceImpl` 中星河湾分支 — 策略命中时跳过 xhwDefaultFloorId/xhwSixFloorId 覆盖 |
### 5.3 接口/Web 层
| 模块 | 操作 |
|------|------|
| `cwos-component-organization-interface` | **零变更** |
| `cwos-component-organization-web` | 仅更新 `PersonController.java` 类注释 |
---
## 6. 电梯应用 — 完整删除清单
### 6.1 删除文件清单
| 文件 | 路径 |
|------|------|
| TenantVisitorFloorPolicyDao.java | `cw-elevator-application-data/.../person/dao/` |
| TenantVisitorFloorPolicyDaoImpl.java | `cw-elevator-application-data/.../person/impl/` |
| TenantVisitorFloorPolicyMapper.java | `cw-elevator-application-data/.../person/mapper/` |
| TenantVisitorFloorPolicyMapper.xml | `cw-elevator-application-data/src/main/resources/mapper/` |
| TenantVisitorFloorPolicyDto.java | `cw-elevator-application-data/.../person/dto/` |
| DDL 文件 | `releases/*/ddl/tenant_visitor_floor_policy*.sql`(保留历史参考或删除) |
### 6.2 修改代码清单
| 文件 | 行号 | 操作 |
|------|------|------|
| `PersonRuleServiceImpl.java` | L32-33 | 删除 import `TenantVisitorFloorPolicyDao` / `TenantVisitorFloorPolicyDto` |
| `PersonRuleServiceImpl.java` | L83 | 删除 `@Autowired TenantVisitorFloorPolicyDao` |
| `PersonRuleServiceImpl.java` | L211-230 | **删除整个阶段3**(查策略+求交逻辑) |
| `PersonRuleServiceImpl.java` | L232-238 | 修改阶段4`effective` 改为 `candidate` |
| `PersonRuleServiceImpl.java` | L297-353 | 删除 `findPolicyByOrgIds()``parseAllowZoneIds()` 私有方法 |
| `08-visitor-registration-and-elevator-auth.md` | — | 更新文档:"租户策略求交" → "组织侧策略替代" |
### 6.3 改造后 addVisitor 精简代码
```java
public CloudwalkResult<Boolean> addVisitor(AcsPersonAddVisitorParam param, CloudwalkCallContext context) {
// 阶段1:查询被访人(含组织信息 + 人行规楼层)
PersonDetailParam detailParam = new PersonDetailParam();
detailParam.setId(param.getPersonId());
detailParam.setBusinessId(context.getCompany().getCompanyId());
CloudwalkResult<PersonResult> detailResult = this.personService.detail(detailParam, context);
// ... 错误检查 ...
PersonResult personResult = (PersonResult) detailResult.getData();
// 阶段2:确定生效楼层(直接使用 candidate,不做交集)
List<String> effective;
if (!CollectionUtils.isEmpty(param.getFloorIds())) {
effective = param.getFloorIds(); // UC-02
} else {
effective = personResult.getFloorList(); // UC-01,组织侧已含策略
if (CollectionUtils.isEmpty(effective)) {
return CloudwalkResult.fail("76260531", getMessage("76260531"));
}
}
// 阶段3:空集校验 + 派梯
param.setFloorIds(effective);
// ... 后续派梯逻辑不变 ...
}
```
---
## 7. 测试清单
- [ ] **业务路径**:访客邀约 / 楼层初始化 **仅**通过 **`PersonService.detail``PersonResult.floorList`** 获取权威清单(未用分页或其它接口顶替)
- [ ] **有策略租户**`detail` 返回的 `floorList` = `allow_zone_ids`(纯替代,非交集)
- [ ] **有策略 + addVisitor**effective = floorList(不含交集过滤)
- [ ] **无策略 + 星河湾**:行为与现网 40F/6F 一致
- [ ] **有策略 + 星河湾同时配置**:策略优先,不触发 xhw 覆盖
- [ ] **无策略时 detail vs 分页**:确认是否接受「detail 仍无 XHW、分页访客分支仍有 40F/6F」的现网差异;若产品要求一致,需另立 story(见 §4.0)
- [ ] **UC-02(派梯接口)**:请求体传 `floorIds``effective` 以请求为准(与邀约页「必须 detail」并行不悖:邀约仍只认 detail;业务含义见 §2.1,边界见 §2.3)
- [ ] **数据迁移**:行数一致、org_id/business_id 正确
- [ ] **接口回归**:组织/电梯/智能组件对外 API 无路径/字段/方法变更
- [ ] **电梯回退**:若组织侧部署失败,电梯仍可回退到旧版(DDL 保留期间)
---
## 8. 实施步骤
| 步骤 | 内容 | 验证方式 |
|------|------|---------|
| 1 | 组织 data 模块:建表 DDL + Entity + Mapper | `mvn compile` data 模块通过 |
| 2 | 组织 service 模块:新建 TenantVisitorFloorPolicyService | 单元测试 |
| 3 | 组织 service 模块:修改 `ImgPersonServiceImpl#detail``listByPage` 访客分支(§4.2 / §4.3) | 集成测试 |
| 4 | 数据迁移:电梯库 → 组织库 | 行数对比 |
| 5 | 电梯侧:删除策略相关代码(§6.1 + §6.2) | `mvn compile` 通过 |
| 6 | 端到端:addVisitor + detail 行为验证 | API 对拍测试 |
| 7 | 发布:先发组织侧,观察后发电梯侧(兼容窗口) | 监控 |
---
## 9. 参考
- 电梯访客文档:`maven-cw-elevator-application/cw-elevator-application-service/docs/08-visitor-registration-and-elevator-auth.md`
- 数据模型:`docs/architecture/租户组织人员访客-数据模型与用例.md`
- 历史设计:`docs/business/租户访客默认楼层-数据库配置阶段技术设计.md`
- 当前策略代码:`PersonRuleServiceImpl.java` L211-230, L297-353
- 星河湾分支:`ImgPersonServiceImpl.java` L149-354
---
## 修订记录
| 版本 | 日期 | 说明 |
|------|------|------|
| 0.1 | 2026-05-06 | 初稿 |
| 0.2 | 2026-05-06 | 增加硬约束 |
| 0.3 | 2026-05-06 | **重构**:明确"组织侧唯一实现,电梯侧完全移除";增加数据流对比图、删除清单、伪代码 |
| 0.4 | 2026-05-06 | **增加**:业务时序图(含代码行号对照)、detail/listByPage 插入点、策略 Service 接口定义 |
| 0.5 | 2026-05-06 | **修订**:§4 拆分 detail(仅 P1/P3,不含 XHW)与 listByPageP1 跳过星河湾);补充现网 XHW 适用范围表;修正重复「## 4」章节编号(组织清单改为 §5,电梯 §6,顺延);标注 detail/分页一致性风险 |
| 0.6 | 2026-05-06 | **增加**:文首「场景说明」— 访客邀请初始化与楼层清单、`detail` / `listByPage` 职责划分及与 UC-01 对齐说明 |
| 0.7 | 2026-05-06 | **增加**:访客邀约端到端业务流图;代码侧 sequencedetail+策略)、flowchartaddVisitor 改造后、listByPage isVisitor);修正 §1 笔误「侧略」→「策略」 |
| 0.8 | 2026-05-06 | **明确**:业务楼层清单 **必须**走 **`PersonService.detail``PersonResult.floorList`**;硬约束与场景说明升级为「规定主路径」;流程图 A3/B 标题与 §1 数据流对齐 |
| 0.9 | 2026-05-06 | **冲突清理**:区分对外契约 vs 组织内 `listByImageId`;§1 关键变化表拆分 UC-01/UC-02;§2.2 与「必须 detail」边界表;§2.1 交集/替代表述与改造目标对齐;§4.1 P1 区分邀约只吃 detail;§3.1 标题与 §3.3 插入点表述统一;§7 UC-02 测试条注释 |
| 1.0 | 2026-05-06 | **增加**:§2.1 UC-01/UC-02 **业务场景说明**(非仅代码条件);原 §2.1/2.2 顺延为 §2.2/2.3;更新文首与 §7 对 §2 的引用 |
@@ -0,0 +1,252 @@
# 目录结构重组设计 — 星河湾星中星
**日期:** 2026-05-07
**状态:** 设计稿 v1
---
## 1. 背景与目标
星河湾星中星是 CloudWalk(云从科技)电梯/门禁/安防/人脸识别系统的单体仓库。当前顶层目录结构存在以下问题:
- **职责混淆:** `源码/` 中混合了 Maven 项目、运行时部署包、nginx 配置、反编译代码、frontend 运行时 + 备份
- **命名不一致:** 混用中文/英文、小写/下划线/连词符、`maven-` 前缀冗余、`01-` 数字前缀无意义
- **目录重复:** `源码/frontend/``星中心/frontend/` 内容高度重叠;`源码/cw-elevator-application-V1.0.0.20211103/``星中心/` 下同名
- **自嵌套:** `源码/源码/` 指向自身
- **备份混乱:** 15+ 个 `.bakYYYYMMDD` 目录与活跃目录混合,难以区分
**设计原则:**
1. **单一职责** — 每个顶层目录只放一种类型的内容
2. **零删除** — 所有历史/遗留文件集中移至 `archive/`,不做任何删除
3. **命名规范** — 小写 kebab-case、去除冗余前缀、统一版本/备份格式
4. **最小中断** — 保持开发/部署工作流不受影响
---
## 2. 命名规范
所有新路径遵循以下规则:
| 规则 | 旧示例 | 新示例 |
|------|--------|--------|
| 目录名统一小写+连词符 | `data_backup/` | `data-backups/` |
| 去除 `maven-` 前缀 | `maven-cw-elevator-application/` | `cw-elevator-application/` |
| 去除 `01-` / `_01-` 数字前缀 | `cwos_manager_01-cwos_manager/` | `cwos-manager/` |
| 版本号规范 | `V1.0.0.20211103` | `v1.0.0`(内部保留完整日期) |
| 备份标记规范 | `front_acs.bak20231018/` | → `archive/frontend-backups/`(集中存放) |
---
## 3. 顶层目录结构
```text
星河湾星中星/
├── source/ # 源码(仅活跃开发代码)
├── runtime/ # 运行时部署(生产/预发镜像)
├── packages/ # 部署压缩包(tar.gz
├── scripts/ # 统一脚本入口
├── docs/ # 文档中心
├── data-backups/ # 数据库备份
├── archive/ # 【新增】历史/遗留/参考内容
├── artifacts/ # 构建产物/证据
├── nginx/ # Nginx 配置
└── logs/ # 运行日志
```
### 3.1 映射关系
| 当前路径 | 新路径 | 类型 |
|---------|--------|------|
| `源码/` | → 拆分 | 源码、nginx、artifacts、反编译各自归位 |
| `星中心/` | `runtime/` | 运行时部署 |
| `部署包/` | `packages/` | 部署压缩包 |
| `data_backup/` | `data-backups/` | 数据库备份 |
| `反1/` | `archive/decompiled-sources/` | 归档 |
| `cn/` | `archive/miscellaneous/` | 归档 |
| `media/` | `archive/miscellaneous/` | 归档 |
| `源码/源码/` | `archive/miscellaneous/` | 归档 |
| — | `archive/frontend-backups/` | **新增**,收纳所有 `.bak` 前端备份 |
| `scripts/` (顶层) | `scripts/deploy/` | 合并到统一脚本目录 |
| `源码/scripts/` | `scripts/` (主目录) | 合入不同子目录 |
---
## 4. 各目录内部设计
### 4.1 `source/backend/` — 后端 Maven 项目
去除 `maven-` 前缀,保持原始目录内部结构不变:
| 原名 | 新名 |
|------|------|
| `maven-cloudwalk-cloud/` | `cloudwalk-cloud/` |
| `maven-cloudwalk-device-manager/` | `cloudwalk-device-manager/` |
| `maven-cloudwalk-device-sdk/` | `cloudwalk-device-sdk/` |
| `maven-cloudwalk-intelligent-davinci-manager/` | `intelligent-davinci-manager/` |
| `maven-cloudwalk-legacy-public/` | `cloudwalk-legacy-public/` |
| `maven-cw-elevator-application/` | `cw-elevator-application/` |
| `maven-cwos-common-aks/` | `cwos-common-aks/` |
| `maven-cwos-device-authentication/` | `cwos-device-authentication/` |
| `maven-cwos-resource/` | `cwos-resource/` |
| `maven-intelligent-cwoscomponent/` | `intelligent-cwoscomponent/` |
| `maven-ninca-common-component-organization/` | `ninca-common-component-organization/` |
| `maven-ninca-crk-from-lib/` | `ninca-crk-from-lib/` |
| `maven-ninca-qk-alarm/` | `ninca-qk-alarm/` |
**移出 `source/`:**
- `cw-elevator-application-V1.0.0.20211103/``runtime/elevator-v1/`
### 4.2 `source/frontend/` — 前端源码
| 原名 | 新名 |
|------|------|
| `frontend-source/projects/` | `projects/` (alarm-front, cwos-portal, elevator-front, front-acs) |
| `frontend-source/decompiled/` | `decompiled/` |
| `frontend-source/scripts/` | `scripts/` |
### 4.3 `runtime/` — 运行时部署
去除 `_01-` 数字前缀和冗余版本后缀,改用简洁的服务名:
| 原名 | 新名 |
|------|------|
| `cw-elevator-application-V1.0.0.20211103/` | `elevator-v1/` |
| `cwos_manager_01-cwos_manager/` | `cwos-manager/` |
| `cwos_system_api_01-cwos_system_api/` | `cwos-system-api/` |
| `ninca_crk_std_01-ninca_crk_std_backend/` | `ninca-crk-std/` |
| `ninca_qk_alarm_app_01-ninca_qk_alarm_app/` | `ninca-qk-alarm/` |
| `ninca-crk-std-backend-V2.9.1_20210630/` | `ninca-crk-std-lib/` |
**前端运行时合并(`runtime/frontend/`):**
-`源码/frontend/``星中心/frontend/` 中提取**非 `.bak`** 的活跃前端目录
- 重复的以前者(`源码/frontend/`)为准
- 所有 `.bak` 目录 → `archive/frontend-backups/`
### 4.4 `packages/` — 部署压缩包
保持现有结构,仅移除 `01-` 文件名前缀:
| 原名 | 新名 |
|------|------|
| `cwos_manager_01-cwos_manager.tar.gz` | `cwos-manager.tar.gz` |
| `ninca_common_component_organization_01-...` | `ninca-common-component-organization-...` |
| (同理应用于所有 13 个 tar.gz | |
**内部目录规范化:**
- `releases/` — 保留
- `components/` — 整理展开的组件目录
### 4.5 `scripts/` — 统一脚本目录
```text
scripts/
├── build/ # 构建/发布/格式化相关
│ ├── release-cw-elevator-application.sh
│ ├── format_maven_formatter_all.sh
│ ├── check_maven_formatter_validate.sh
│ ├── build_elevator.sh (new)
│ └── *.sh
├── deploy/ # 部署/启停相关
│ ├── start_ninca.sh (from top-level scripts/)
│ └── *.sh
├── test-env/ # 测试环境搭建(从 源码/scripts/test-env/ 整体迁移)
│ ├── docker-compose.infra.yml
│ ├── setup.sh
│ ├── start-all.sh / stop-all.sh
│ ├── health-check.sh
│ └── ...
├── tools/ # 分析/对拍/校验工具
│ ├── check_elevator_fatjar_lib_parity.sh
│ ├── compare_jar_to_sources.py
│ ├── decompile_ninca_crk_lib_modules.py
│ ├── run_full_elevator_api_suite.sh
│ ├── run_v1v2_parity_automated.sh
│ ├── verify_frontend_runtime.py
│ ├── verify_v1_v2_config_load_order.sh
│ └── ...
```
### 4.6 `archive/` — 历史/参考/遗留
```text
archive/
├── decompiled-sources/ # (from 反1/ — 22 个 .src.zip)
├── frontend-backups/ # (所有 .bak* 前端备份目录)
│ ├── front_acs.bak20231012/
│ ├── front_acs.bak20231018/
│ ├── ...
│ └── *.tar.gz (旧前端归档)
└── miscellaneous/ # (其他杂项)
├── cn/ # (from 顶层 cn/)
├── media/ # (from 顶层 media/)
├── source-self-ref/ # (from 源码/源码/ 自嵌套目录)
├── visitor-noauth-verify-v20260430.zip # (源码/ 根部的 zip)
└── elevator-app.log # (源码/ 根部的日志文件)
```
### 4.7 其他目录
| 当前路径 | 新路径 | 说明 |
|---------|--------|------|
| `源码/artifacts/` | `artifacts/` | 构建产物/证据(与源码分离) |
| `源码/nginx-r1.0425/` | `nginx/` | Nginx 配置(与源码分离) |
| `源码/docs/` | `docs/` | 文档中心(统一位置) |
| `源码/dev-support/` | `docs/dev-support/` | 开发支持文档 |
| `logs/` | `logs/` | 保持不变 |
| `源码/.sisyphus/` | `.sisyphus/` | 保持不变(在 source/ 内的工具配置) |
| `源码/.gitignore` | (保持) | |
| `源码/AGENTS.md` | (保持) | 更新路径引用 |
| `源码/.editorconfig` | (保持) | |
---
## 5. 影响与注意事项
### 5.1 路径依赖影响
以下内容可能引用了旧路径,重组后需更新:
1. **`源码/AGENTS.md`** — 文档中引用了顶层目录结构,需更新
2. **`scripts/test-env/` 下的脚本** — 可能引用了 `../maven-cw-elevator-application/` 等路径
3. **`源码/maven-cw-elevator-application/scripts/`** — 构建脚本中可能硬编码了路径
4. **`maven-cw-elevator-application/tools/`** — Python 测试脚本中的路径引用
5. **`source/frontend/scripts/`** — 前端构建工具的路径配置
6. **Docker Compose 文件**`scripts/test-env/docker-compose.infra.yml` 中的挂载卷路径
### 5.2 执行策略
1. 使用 `git mv` 执行移动(保留 git 历史)
2. 先移动、再更新引用、最后验证
3. 每个顶层目录分批执行,每批完成后运行验证
4. 备份文件不做任何修改,整体迁移
### 5.3 不处理的范围
以下内容保持原样,不做重组:
- `.git/` — git 仓库元数据
- `.gitignore` — 配置
- `源码/.sisyphus/` — Sisyphus AI 工具配置
- 各 Maven 项目的 `target/` 目录 — 构建产物
---
## 6. 执行计划(概要)
| 阶段 | 内容 | 预估操作数 |
|------|------|-----------|
| 1 | 创建 archive/ 及子目录 | ~10 `mkdir` |
| 2 | 迁移 反1/ → archive/decompiled-sources/ | 1 `git mv` |
| 3 | 迁移 cn/, media/ → archive/miscellaneous/ | 2 `git mv` |
| 4 | 迁移 源码/源码/ → archive/miscellaneous/ | 1 `git mv` |
| 5 | 迁移源码/frontend/ .bak 目录 → archive/frontend-backups/ | ~15 `git mv` |
| 6 | 创建 runtime/, 从 星中心/ 迁移并重命名 | ~8 `git mv` |
| 7 | 创建 source/backend/, 从 源码/ 迁移 Maven 项目并重命名 | ~14 `git mv` |
| 8 | 创建 source/frontend/, 从 源码/frontend-source/ 迁移 | 1 `git mv` |
| 9 | 迁移 源码/frontend/(非 .bak)→ runtime/frontend/ | ~15 `git mv` |
| 10 | 迁移 源码/nginx-r1.0425/ → nginx/ | 1 `git mv` |
| 11 | 迁移 源码/artifacts/ → artifacts/ | 1 `git mv` |
| 12 | 合并 scripts/ 目录 | ~5 `git mv` |
| 13 | 清理 源码/ 残余 | 验证 |
| 14 | 更新 AGENTS.md 中的路径引用 | 1 次编辑 |
| 15 | 更新 test-env 脚本中的路径引用 | 逐一检查 |
| 16 | final: 验证 + git status | 确认 |
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,18 @@
# V1/V2 加载顺序与最终清单摘要
## 加载顺序
- 优先级采用: external > jar(在未显式 `--spring.config.location` 的前提下)
- V1: 三个配置文件 external=Y, jar=Y
- V2.0.4: 三个配置文件 external=Y, jar=Y
## 关键结论
- V1 `spring.cloud.consul.discovery.enabled` = `false`
- V2 `spring.cloud.consul.discovery.enabled` = `true`
- V1 `spring.cloud.consul.host` = `10.128.161.95`
- V2 `spring.cloud.consul.host` = `10.0.22.102`
## 输出文件
- `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v1-effective-20260429-221913.json`
- `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v2-effective-20260429-221913.json`
- `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v1-v2-diff-20260429-221913.md`
- `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/load-order-summary-20260429-221913.md`
@@ -0,0 +1,15 @@
# 加载顺序复测(V2使用V1属性)
- 顺序: external > jar(未显式spring.config.location
- V1 discovery.enabled=false
- V2 discovery.enabled=false
- V1 consul.host=10.128.161.95
- V2 consul.host=371bfca4972c43d2aefcf302d0a4a277
- 差异键数量=11
## 文件
- /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v1-effective-20260429-224315.json
- /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v2-effective-v1props-20260429-224315.json
- /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v1-v2-v1props-diff-20260429-224315.md
- /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/load-order-summary-v1props-20260429-224315.md
@@ -0,0 +1,219 @@
{
"tag": "V1",
"base_dir": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/cw-elevator-application-V1.0.0.20211103",
"jar": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/cw-elevator-application-V1.0.0.20211103/cw-elevator-application-V1.0.0.20211103.jar",
"order_assumption": "external > jar (未显式spring.config.location时)",
"file_presence": {
"bootstrap.properties": {
"external": true,
"jar": true
},
"application.properties": {
"external": true,
"jar": true
},
"application-access-control.properties": {
"external": true,
"jar": true
}
},
"focus_keys": {
"spring.application.name": {
"value": "elevator-app",
"source": "external"
},
"spring.profiles.active": {
"value": "access-control",
"source": "external"
},
"spring.cloud.consul.host": {
"value": "10.128.161.95",
"source": "external"
},
"spring.cloud.consul.port": {
"value": "8500",
"source": "external"
},
"spring.cloud.consul.enabled": {
"value": "true",
"source": "external"
},
"spring.cloud.consul.discovery.enabled": {
"value": "false",
"source": "external"
},
"spring.cloud.consul.discovery.register": {
"value": "true",
"source": "external"
},
"spring.cloud.consul.config.enabled": {
"value": "<unset>",
"source": "unset"
},
"feign.cwos-portal.name": {
"value": "cwos-portal",
"source": "external"
},
"feign.ninca-common.name": {
"value": "ninca-common",
"source": "external"
},
"feign.component-organization.name": {
"value": "ninca-common-component-organization",
"source": "external"
},
"cwos-portal.ribbon.NIWSServerListClassName": {
"value": "<unset>",
"source": "unset"
},
"cwos-portal.ribbon.listOfServers": {
"value": "<unset>",
"source": "unset"
},
"ninca-common.ribbon.NIWSServerListClassName": {
"value": "<unset>",
"source": "unset"
},
"ninca-common.ribbon.listOfServers": {
"value": "<unset>",
"source": "unset"
}
},
"effective_all_keys": {
"spring.cloud.consul.discovery.enabled": "false",
"feign.ninca-common.name": "ninca-common",
"ninca.update.floor.pool.allowCoreThreadTimeOut": "true",
"sendRecord.token.appKey": "293e2d708f0143c2957b702cef44d951",
"ninca.update.floor.pool.corePoolSize": "5",
"cloudwalk.access-control.common.device-category-array[0]": "4",
"cloudwalk.access-control.common.device-category-array[5]": "11",
"feign.component-organization.name": "ninca-common-component-organization",
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds": "10000",
"spring.cloud.consul.discovery.instance-id": "${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port}",
"spring.redis.timeout": "0",
"spring.messages.basename": "access-control",
"spring.shardingsphere.datasource.ds0.type": "com.zaxxer.hikari.HikariDataSource",
"spring.cloud.consul.discovery.register": "true",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"cloudwalk.datafield.securityKey": "d4b2aabc97394a12a27fc3cca6cd9ba1",
"cloudwalk.access-control.common.publish-opendoor-service-code": "access-control",
"spring.shardingsphere.datasource.ds0.maximum-pool-size": "20",
"cloudwalk.serial.enable": "true",
"cloudwalk.access-control.common.device-category-array[1]": "5",
"spring.redis.host": "127.0.0.1",
"spring.shardingsphere.datasource.ds0.pool-name": "ds0-pool",
"person.name.space": "recordEvent",
"spring.profiles.active": "access-control",
"management.health.redis.enabled": "false",
"management.health.db.enabled": "false",
"cloudwalk.serial.serial-redis-key": "CLOUDWALK-ACS-SERIAL-KEY",
"spring.application.name": "elevator-app",
"dubbo.protocol.port": "16107",
"spring.shardingsphere.datasource.ds0.driver-class-name": "com.mysql.jdbc.Driver",
"spring.shardingsphere.sharding.binding-tables": "IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD",
"spring.cloud.consul.discovery.prefer-ip-address": "true",
"cloudwalk.event.bootstrap-servers": "10.128.161.95:9092",
"cloudwalk.access-control.common.face-compare-THRESHOLD": "80",
"spring.http.encoding.charset": "UTF-8",
"spring.shardingsphere.datasource.ds0.password": "123456",
"mybatis.mapper-locations": "classpath*:cn/cloudwalk/elevator/**/*.xml",
"ribbon.ReadTimeout": "10000",
"lockWatchdogTimeout": "21000",
"cloudwalk.elevator.common.relativePrefix": "/cwos-portal/portal/fileManager/imgByPath?path=",
"spring.shardingsphere.props.sql.show": "false",
"intelligent.lock.enable": "true",
"mybatis.config-location": "classpath:mapper/mybatis-config.xml",
"spring.redis.pool.max-idle": "1",
"spring.cloud.consul.host": "10.128.161.95",
"feign.ninca-crk-std.name": "ninca-crk-std",
"cloudwalk.access-control.common.face-capture-interval-milliseconds": "3000",
"spring.redis.pool.max-wait": "10",
"elevator.application.time": "600",
"dubbo.provider.version": "1.0",
"feign.hystrix.enable": "true",
"spring.shardingsphere.datasource.ds0.auto-commit": "true",
"cloudwalk.serial.serial-length": "8",
"spring.mvc.throw-exception-if-no-handler-found": "true",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class": "cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob",
"cloudwalk.access-control.common.device-category-array[2]": "7",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes": "ds0.IT_ACS_RECOG_RECORD_$->{2020..2022}",
"floor.building.id": "605560539791228928",
"spring.shardingsphere.datasource.ds0.jdbc-url": "jdbc:mysql://192.168.3.12:3307/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true",
"feign.mqtt.name": "cloudwalk-device-thirdparty",
"sendRecord.token.corpId": "53db867a8bb747a1bd04dd1afcad8ca6",
"spring.messages.encoding": "utf-8",
"cloudwalk.serial.serial-type": "redis",
"spring.shardingsphere.sharding.default-data-source-name": "ds0",
"cloudwalk.access-control.common.face-capture-time-expired-milliseconds": "300000",
"elevator.application.keyA": "5B7DEF88FF04",
"spring.http.encoding.force": "true",
"spring.redis.pool.max-active": "10",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority": "1",
"ninca.update.floor.pool.queueCapacity": "100000",
"ribbon.ConnectTimeout": "10000",
"cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD": "75",
"spring.http.multipart.max-request-size": "200MB",
"logging.config": "classpath:logs/logback.xml",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group": "ACCESS-CONTROL_GROUP",
"cloudwalk.datafield.encrypt": "AES",
"spring.http.multipart.max-file-size": "200MB",
"dubbo.registry.address": "zookeeper://10.128.161.95:2181",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"logging.path": "logs",
"server.port": "16112",
"cloudwalk.access-control.common.device-controller-array[0]": "mqtt",
"spring.cloud.consul.discovery.deregister": "false",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"cloudwalk.access-control.common.device-category-array[3]": "2",
"spring.shardingsphere.datasource.ds0.minimum-idle": "5",
"spring.shardingsphere.datasource.names": "ds0",
"sendRecord.token.appSecret": "5f6995009b864669b52041b8f5dc4625",
"logging.level.root": "info",
"intelligent.lock.config.default-wait-time": "10000",
"spring.cloud.consul.port": "8500",
"logging.file": "${spring.application.name}",
"ribbon.okhttp.enabled": "true",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression": "0 10 0 * * ?",
"feign.davinci-portal.name": "cwos-portal",
"sendRecord.boolean": "true",
"ninca-crk-std.ip": "10.128.161.95:16106",
"spring.mvc.locale": "zh_CN",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description": "AcsRecordStatisticsByDay job is starting.........",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"feign.resource.name": "cwos-portal",
"spring.redis.port": "6379",
"cloudwalk.datafield.enable": "true",
"logging.level.cn.cloudwalk": "info",
"cloudwalk.event.group-id": "cw-elevator-application-1",
"cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds": "600000",
"spring.shardingsphere.datasource.ds0.username": "root",
"cloudwalk.spring.cache.expires": "CACHE_NAME_APPLICATIONIDS#21600,ACS_DeviceTypesCache#7200,ACS_DeviceTypeFeaturesCache#7200,ACS_DeviceAttrsCache#7200,ACS_RecordStatisticsCache#90000,ACS_AreaTreeCache#60",
"spring.messages.always-use-message-format": "true",
"spring.redis.database": "5",
"spring.shardingsphere.datasource.ds0.max-lifetime": "1765000",
"cloudwalk.access-control.common.device-category-array[4]": "8",
"cloudwalk.access-control.common.publish-opendoor-switch": "false",
"feign.device.name": "cwos-portal",
"feign.cwos-portal.name": "cwos-portal",
"ninca.update.floor.pool.maxPoolSize": "5",
"spring.cloud.consul.enabled": "true",
"sendRecord.ip": "hrec.star-river.com:32165",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name": "AcsRecordStatisticsByDayJob",
"cloudwalk.event.handler-executor-config.core-pool-size": "10",
"elevator.application.key": "xinghewan",
"ninca.update.floor.pool.keepAliveSeconds": "150",
"spring.redis.pool.min-idle": "0",
"spring.cloud.consul.discovery.ip-address": "${spring.cloud.client.ipAddress}",
"feign.okhttp.enable": "true",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
"spring.shardingsphere.datasource.ds0.connection-timeout": "60000",
"cloudwalk.event.handler-executor-config.maximum-pool-size": "30",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
"feign.httpclient.enable": "false",
"spring.http.encoding.enabled": "true",
"ribbon.http.client.enabled": "false",
"spring.redis.password": "1qaz!QAZ",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes": "ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2022}",
"server.tomcat.uri-encoding": "UTF-8"
}
}
@@ -0,0 +1,195 @@
{
"tag": "V1",
"base_dir": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/cw-elevator-application-V1.0.0.20211103",
"jar": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/cw-elevator-application-V1.0.0.20211103/cw-elevator-application-V1.0.0.20211103.jar",
"order": "external>jar",
"file_presence": {
"bootstrap.properties": {
"external": true,
"jar": true
},
"application.properties": {
"external": true,
"jar": true
},
"application-access-control.properties": {
"external": true,
"jar": true
}
},
"focus_keys": {
"spring.cloud.consul.host": {
"value": "10.128.161.95",
"source": "external"
},
"spring.cloud.consul.port": {
"value": "8500",
"source": "external"
},
"spring.cloud.consul.discovery.enabled": {
"value": "false",
"source": "external"
},
"spring.cloud.consul.config.enabled": {
"value": "<unset>",
"source": "unset"
},
"feign.cwos-portal.name": {
"value": "cwos-portal",
"source": "external"
},
"feign.ninca-common.name": {
"value": "ninca-common",
"source": "external"
},
"feign.component-organization.name": {
"value": "ninca-common-component-organization",
"source": "external"
},
"cwos-portal.ribbon.NIWSServerListClassName": {
"value": "<unset>",
"source": "unset"
},
"cwos-portal.ribbon.listOfServers": {
"value": "<unset>",
"source": "unset"
}
},
"effective_all_keys": {
"logging.level.root": "info",
"logging.config": "classpath:logs/logback.xml",
"management.health.redis.enabled": "false",
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds": "10000",
"cloudwalk.event.handler-executor-config.core-pool-size": "10",
"spring.cloud.consul.discovery.instance-id": "${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port}",
"ninca.update.floor.pool.queueCapacity": "100000",
"person.name.space": "recordEvent",
"spring.redis.pool.max-active": "10",
"spring.cloud.consul.discovery.enabled": "false",
"sendRecord.token.appSecret": "5f6995009b864669b52041b8f5dc4625",
"spring.cloud.consul.enabled": "true",
"ninca.update.floor.pool.maxPoolSize": "5",
"cloudwalk.serial.serial-length": "8",
"server.port": "16112",
"spring.shardingsphere.datasource.names": "ds0",
"elevator.application.key": "xinghewan",
"spring.redis.password": "1qaz!QAZ",
"spring.mvc.throw-exception-if-no-handler-found": "true",
"logging.file": "${spring.application.name}",
"feign.component-organization.name": "ninca-common-component-organization",
"cloudwalk.spring.cache.expires": "CACHE_NAME_APPLICATIONIDS#21600,ACS_DeviceTypesCache#7200,ACS_DeviceTypeFeaturesCache#7200,ACS_DeviceAttrsCache#7200,ACS_RecordStatisticsCache#90000,ACS_AreaTreeCache#60",
"feign.mqtt.name": "cloudwalk-device-thirdparty",
"spring.shardingsphere.datasource.ds0.connection-timeout": "60000",
"ninca.update.floor.pool.keepAliveSeconds": "150",
"feign.cwos-portal.name": "cwos-portal",
"spring.shardingsphere.datasource.ds0.password": "123456",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"floor.building.id": "605560539791228928",
"spring.messages.basename": "access-control",
"spring.cloud.consul.port": "8500",
"ribbon.http.client.enabled": "false",
"sendRecord.ip": "hrec.star-river.com:32165",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression": "0 10 0 * * ?",
"sendRecord.token.corpId": "53db867a8bb747a1bd04dd1afcad8ca6",
"cloudwalk.serial.serial-redis-key": "CLOUDWALK-ACS-SERIAL-KEY",
"cloudwalk.datafield.enable": "true",
"elevator.application.time": "600",
"cloudwalk.access-control.common.device-category-array[5]": "11",
"spring.messages.always-use-message-format": "true",
"spring.mvc.locale": "zh_CN",
"feign.ninca-crk-std.name": "ninca-crk-std",
"sendRecord.token.appKey": "293e2d708f0143c2957b702cef44d951",
"ribbon.ConnectTimeout": "10000",
"spring.cloud.consul.discovery.deregister": "false",
"spring.redis.timeout": "0",
"spring.shardingsphere.sharding.default-data-source-name": "ds0",
"spring.redis.database": "5",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class": "cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description": "AcsRecordStatisticsByDay job is starting.........",
"logging.level.cn.cloudwalk": "info",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority": "1",
"spring.profiles.active": "access-control",
"spring.http.encoding.force": "true",
"spring.redis.pool.max-wait": "10",
"cloudwalk.access-control.common.device-controller-array[0]": "mqtt",
"cloudwalk.event.group-id": "cw-elevator-application-1",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"sendRecord.boolean": "true",
"logging.path": "logs",
"ribbon.okhttp.enabled": "true",
"spring.shardingsphere.datasource.ds0.username": "root",
"spring.redis.port": "6379",
"feign.hystrix.enable": "true",
"spring.http.multipart.max-request-size": "200MB",
"feign.device.name": "cwos-portal",
"elevator.application.keyA": "5B7DEF88FF04",
"cloudwalk.datafield.securityKey": "d4b2aabc97394a12a27fc3cca6cd9ba1",
"spring.cloud.consul.discovery.ip-address": "${spring.cloud.client.ipAddress}",
"cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD": "75",
"cloudwalk.access-control.common.face-compare-THRESHOLD": "80",
"cloudwalk.datafield.encrypt": "AES",
"management.health.db.enabled": "false",
"server.tomcat.uri-encoding": "UTF-8",
"spring.shardingsphere.datasource.ds0.max-lifetime": "1765000",
"mybatis.mapper-locations": "classpath*:cn/cloudwalk/elevator/**/*.xml",
"intelligent.lock.config.default-wait-time": "10000",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
"ninca.update.floor.pool.corePoolSize": "5",
"spring.http.multipart.max-file-size": "200MB",
"ribbon.ReadTimeout": "10000",
"cloudwalk.access-control.common.device-category-array[2]": "7",
"cloudwalk.access-control.common.publish-opendoor-switch": "false",
"dubbo.provider.version": "1.0",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes": "ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2022}",
"spring.cloud.consul.host": "10.128.161.95",
"cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds": "600000",
"cloudwalk.access-control.common.device-category-array[3]": "2",
"feign.davinci-portal.name": "cwos-portal",
"spring.shardingsphere.datasource.ds0.pool-name": "ds0-pool",
"cloudwalk.elevator.common.relativePrefix": "/cwos-portal/portal/fileManager/imgByPath?path=",
"spring.redis.host": "127.0.0.1",
"spring.shardingsphere.props.sql.show": "false",
"spring.shardingsphere.sharding.binding-tables": "IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"spring.shardingsphere.datasource.ds0.auto-commit": "true",
"spring.messages.encoding": "utf-8",
"spring.redis.pool.min-idle": "0",
"spring.shardingsphere.datasource.ds0.jdbc-url": "jdbc:mysql://192.168.3.12:3307/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true",
"spring.application.name": "elevator-app",
"cloudwalk.serial.serial-type": "redis",
"feign.okhttp.enable": "true",
"mybatis.config-location": "classpath:mapper/mybatis-config.xml",
"spring.redis.pool.max-idle": "1",
"cloudwalk.access-control.common.face-capture-interval-milliseconds": "3000",
"cloudwalk.serial.enable": "true",
"spring.cloud.consul.discovery.prefer-ip-address": "true",
"cloudwalk.access-control.common.face-capture-time-expired-milliseconds": "300000",
"dubbo.protocol.port": "16107",
"intelligent.lock.enable": "true",
"lockWatchdogTimeout": "21000",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes": "ds0.IT_ACS_RECOG_RECORD_$->{2020..2022}",
"ninca.update.floor.pool.allowCoreThreadTimeOut": "true",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group": "ACCESS-CONTROL_GROUP",
"spring.cloud.consul.discovery.register": "true",
"feign.httpclient.enable": "false",
"spring.shardingsphere.datasource.ds0.driver-class-name": "com.mysql.jdbc.Driver",
"spring.http.encoding.charset": "UTF-8",
"ninca-crk-std.ip": "10.128.161.95:16106",
"spring.http.encoding.enabled": "true",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"cloudwalk.event.handler-executor-config.maximum-pool-size": "30",
"spring.shardingsphere.datasource.ds0.minimum-idle": "5",
"spring.shardingsphere.datasource.ds0.maximum-pool-size": "20",
"cloudwalk.event.bootstrap-servers": "10.128.161.95:9092",
"spring.shardingsphere.datasource.ds0.type": "com.zaxxer.hikari.HikariDataSource",
"dubbo.registry.address": "zookeeper://10.128.161.95:2181",
"feign.ninca-common.name": "ninca-common",
"feign.resource.name": "cwos-portal",
"cloudwalk.access-control.common.device-category-array[4]": "8",
"cloudwalk.access-control.common.device-category-array[0]": "4",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name": "AcsRecordStatisticsByDayJob",
"cloudwalk.access-control.common.device-category-array[1]": "5",
"cloudwalk.access-control.common.publish-opendoor-service-code": "access-control"
}
}
@@ -0,0 +1,28 @@
# V1 vs V2.0.4 最终加载差异
- 生成时间: 2026-04-29T22:19:14.387292
- 加载顺序假设: external > jar (未显式spring.config.location时)
## 关键键差异
- `spring.cloud.consul.host`: V1=`10.128.161.95`(external) | V2=`10.0.22.102`(external)
- `spring.cloud.consul.discovery.enabled`: V1=`false`(external) | V2=`true`(external)
## 全量差异键统计
- 差异键数量: 12
## 前50个差异键
- `cloudwalk.event.bootstrap-servers`: V1=`10.128.161.95:9092` | V2=`371bfca4972c43d2aefcf302d0a4a277:9092,44700995ee904679a7ad5afddcf93bb5:9092,0837a70b5fab47569391828f5feb2561:9092`
- `dubbo.registry.address`: V1=`zookeeper://10.128.161.95:2181` | V2=`zookeeper://10.0.22.207:2181`
- `logging.path`: V1=`logs` | V2=`/data/cwos/cw-elevator-application-V1.0.0.20211103/logs`
- `ninca-crk-std.ip`: V1=`10.128.161.95:16106` | V2=`10.0.22.102:16106`
- `spring.cloud.consul.discovery.enabled`: V1=`false` | V2=`true`
- `spring.cloud.consul.host`: V1=`10.128.161.95` | V2=`10.0.22.102`
- `spring.redis.host`: V1=`127.0.0.1` | V2=`redis_01.redis_ip`
- `spring.shardingsphere.datasource.ds0.jdbc-url`: V1=`jdbc:mysql://192.168.3.12:3307/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true` | V2=`jdbc:mysql://mysql_01.mysql_ip:3306/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true`
- `spring.shardingsphere.datasource.ds0.password`: V1=`123456` | V2=`1qaz!QAZ`
- `spring.shardingsphere.datasource.ds0.username`: V1=`root` | V2=`cloudwalk`
- `spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes`: V1=`ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2022}` | V2=`ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030}`
- `spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes`: V1=`ds0.IT_ACS_RECOG_RECORD_$->{2020..2022}` | V2=`ds0.IT_ACS_RECOG_RECORD_$->{2020..2030}`
@@ -0,0 +1,27 @@
# V1 vs V2(使用V1属性打包) 差异
- 差异键数量: 11
## 关键键
- `spring.cloud.consul.host`: V1=`10.128.161.95`(external) | V2=`371bfca4972c43d2aefcf302d0a4a277`(external)
- `spring.cloud.consul.port`: V1=`8500`(external) | V2=`8500`(external)
- `spring.cloud.consul.discovery.enabled`: V1=`false`(external) | V2=`false`(external)
- `spring.cloud.consul.config.enabled`: V1=`<unset>`(unset) | V2=`<unset>`(unset)
- `feign.cwos-portal.name`: V1=`cwos-portal`(external) | V2=`cwos-portal`(external)
- `feign.ninca-common.name`: V1=`ninca-common`(external) | V2=`ninca-common`(external)
- `feign.component-organization.name`: V1=`ninca-common-component-organization`(external) | V2=`ninca-common-component-organization`(external)
- `cwos-portal.ribbon.NIWSServerListClassName`: V1=`<unset>`(unset) | V2=`<unset>`(unset)
- `cwos-portal.ribbon.listOfServers`: V1=`<unset>`(unset) | V2=`<unset>`(unset)
## 前50个全量差异
- `cloudwalk.event.bootstrap-servers`: V1=`10.128.161.95:9092` | V2=`371bfca4972c43d2aefcf302d0a4a277:9092,44700995ee904679a7ad5afddcf93bb5:9092,0837a70b5fab47569391828f5feb2561:9092`
- `dubbo.registry.address`: V1=`zookeeper://10.128.161.95:2181` | V2=`zookeeper://10.0.22.207:2181`
- `logging.path`: V1=`logs` | V2=`/data/cwos/cw-elevator-application-V1.0.0.20211103/logs`
- `ninca-crk-std.ip`: V1=`10.128.161.95:16106` | V2=`10.0.22.102:16106`
- `spring.cloud.consul.host`: V1=`10.128.161.95` | V2=`371bfca4972c43d2aefcf302d0a4a277`
- `spring.redis.host`: V1=`127.0.0.1` | V2=`redis_01.redis_ip`
- `spring.shardingsphere.datasource.ds0.jdbc-url`: V1=`jdbc:mysql://192.168.3.12:3307/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true` | V2=`jdbc:mysql://mysql_01.mysql_ip:3306/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true`
- `spring.shardingsphere.datasource.ds0.password`: V1=`123456` | V2=`1qaz!QAZ`
- `spring.shardingsphere.datasource.ds0.username`: V1=`root` | V2=`cloudwalk`
- `spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes`: V1=`ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2022}` | V2=`ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030}`
- `spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes`: V1=`ds0.IT_ACS_RECOG_RECORD_$->{2020..2022}` | V2=`ds0.IT_ACS_RECOG_RECORD_$->{2020..2030}`
@@ -0,0 +1,219 @@
{
"tag": "V2.0.4",
"base_dir": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/deploy/v2-maven",
"jar": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/releases/v2.0.4/cw-elevator-application-2.0.4.jar",
"order_assumption": "external > jar (未显式spring.config.location时)",
"file_presence": {
"bootstrap.properties": {
"external": true,
"jar": true
},
"application.properties": {
"external": true,
"jar": true
},
"application-access-control.properties": {
"external": true,
"jar": true
}
},
"focus_keys": {
"spring.application.name": {
"value": "elevator-app",
"source": "external"
},
"spring.profiles.active": {
"value": "access-control",
"source": "external"
},
"spring.cloud.consul.host": {
"value": "10.0.22.102",
"source": "external"
},
"spring.cloud.consul.port": {
"value": "8500",
"source": "external"
},
"spring.cloud.consul.enabled": {
"value": "true",
"source": "external"
},
"spring.cloud.consul.discovery.enabled": {
"value": "true",
"source": "external"
},
"spring.cloud.consul.discovery.register": {
"value": "true",
"source": "external"
},
"spring.cloud.consul.config.enabled": {
"value": "<unset>",
"source": "unset"
},
"feign.cwos-portal.name": {
"value": "cwos-portal",
"source": "external"
},
"feign.ninca-common.name": {
"value": "ninca-common",
"source": "external"
},
"feign.component-organization.name": {
"value": "ninca-common-component-organization",
"source": "external"
},
"cwos-portal.ribbon.NIWSServerListClassName": {
"value": "<unset>",
"source": "unset"
},
"cwos-portal.ribbon.listOfServers": {
"value": "<unset>",
"source": "unset"
},
"ninca-common.ribbon.NIWSServerListClassName": {
"value": "<unset>",
"source": "unset"
},
"ninca-common.ribbon.listOfServers": {
"value": "<unset>",
"source": "unset"
}
},
"effective_all_keys": {
"spring.cloud.consul.discovery.enabled": "true",
"feign.ninca-common.name": "ninca-common",
"ninca.update.floor.pool.allowCoreThreadTimeOut": "true",
"sendRecord.token.appKey": "293e2d708f0143c2957b702cef44d951",
"ninca.update.floor.pool.corePoolSize": "5",
"cloudwalk.access-control.common.device-category-array[0]": "4",
"cloudwalk.access-control.common.device-category-array[5]": "11",
"feign.component-organization.name": "ninca-common-component-organization",
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds": "10000",
"spring.cloud.consul.discovery.instance-id": "${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port}",
"spring.redis.timeout": "0",
"spring.messages.basename": "access-control",
"spring.shardingsphere.datasource.ds0.type": "com.zaxxer.hikari.HikariDataSource",
"spring.cloud.consul.discovery.register": "true",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"cloudwalk.datafield.securityKey": "d4b2aabc97394a12a27fc3cca6cd9ba1",
"cloudwalk.access-control.common.publish-opendoor-service-code": "access-control",
"spring.shardingsphere.datasource.ds0.maximum-pool-size": "20",
"cloudwalk.serial.enable": "true",
"cloudwalk.access-control.common.device-category-array[1]": "5",
"spring.redis.host": "redis_01.redis_ip",
"spring.shardingsphere.datasource.ds0.pool-name": "ds0-pool",
"person.name.space": "recordEvent",
"spring.profiles.active": "access-control",
"management.health.redis.enabled": "false",
"management.health.db.enabled": "false",
"cloudwalk.serial.serial-redis-key": "CLOUDWALK-ACS-SERIAL-KEY",
"spring.application.name": "elevator-app",
"dubbo.protocol.port": "16107",
"spring.shardingsphere.datasource.ds0.driver-class-name": "com.mysql.jdbc.Driver",
"spring.shardingsphere.sharding.binding-tables": "IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD",
"spring.cloud.consul.discovery.prefer-ip-address": "true",
"cloudwalk.event.bootstrap-servers": "371bfca4972c43d2aefcf302d0a4a277:9092,44700995ee904679a7ad5afddcf93bb5:9092,0837a70b5fab47569391828f5feb2561:9092",
"cloudwalk.access-control.common.face-compare-THRESHOLD": "80",
"spring.http.encoding.charset": "UTF-8",
"spring.shardingsphere.datasource.ds0.password": "1qaz!QAZ",
"mybatis.mapper-locations": "classpath*:cn/cloudwalk/elevator/**/*.xml",
"ribbon.ReadTimeout": "10000",
"lockWatchdogTimeout": "21000",
"cloudwalk.elevator.common.relativePrefix": "/cwos-portal/portal/fileManager/imgByPath?path=",
"spring.shardingsphere.props.sql.show": "false",
"intelligent.lock.enable": "true",
"mybatis.config-location": "classpath:mapper/mybatis-config.xml",
"spring.redis.pool.max-idle": "1",
"spring.cloud.consul.host": "10.0.22.102",
"feign.ninca-crk-std.name": "ninca-crk-std",
"cloudwalk.access-control.common.face-capture-interval-milliseconds": "3000",
"spring.redis.pool.max-wait": "10",
"elevator.application.time": "600",
"dubbo.provider.version": "1.0",
"feign.hystrix.enable": "true",
"spring.shardingsphere.datasource.ds0.auto-commit": "true",
"cloudwalk.serial.serial-length": "8",
"spring.mvc.throw-exception-if-no-handler-found": "true",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class": "cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob",
"cloudwalk.access-control.common.device-category-array[2]": "7",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes": "ds0.IT_ACS_RECOG_RECORD_$->{2020..2030}",
"floor.building.id": "605560539791228928",
"spring.shardingsphere.datasource.ds0.jdbc-url": "jdbc:mysql://mysql_01.mysql_ip:3306/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true",
"feign.mqtt.name": "cloudwalk-device-thirdparty",
"sendRecord.token.corpId": "53db867a8bb747a1bd04dd1afcad8ca6",
"spring.messages.encoding": "utf-8",
"cloudwalk.serial.serial-type": "redis",
"spring.shardingsphere.sharding.default-data-source-name": "ds0",
"cloudwalk.access-control.common.face-capture-time-expired-milliseconds": "300000",
"elevator.application.keyA": "5B7DEF88FF04",
"spring.http.encoding.force": "true",
"spring.redis.pool.max-active": "10",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority": "1",
"ninca.update.floor.pool.queueCapacity": "100000",
"ribbon.ConnectTimeout": "10000",
"cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD": "75",
"spring.http.multipart.max-request-size": "200MB",
"logging.config": "classpath:logs/logback.xml",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group": "ACCESS-CONTROL_GROUP",
"cloudwalk.datafield.encrypt": "AES",
"spring.http.multipart.max-file-size": "200MB",
"dubbo.registry.address": "zookeeper://10.0.22.207:2181",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"logging.path": "/data/cwos/cw-elevator-application-V1.0.0.20211103/logs",
"server.port": "16112",
"cloudwalk.access-control.common.device-controller-array[0]": "mqtt",
"spring.cloud.consul.discovery.deregister": "false",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"cloudwalk.access-control.common.device-category-array[3]": "2",
"spring.shardingsphere.datasource.ds0.minimum-idle": "5",
"spring.shardingsphere.datasource.names": "ds0",
"sendRecord.token.appSecret": "5f6995009b864669b52041b8f5dc4625",
"logging.level.root": "info",
"intelligent.lock.config.default-wait-time": "10000",
"spring.cloud.consul.port": "8500",
"logging.file": "${spring.application.name}",
"ribbon.okhttp.enabled": "true",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression": "0 10 0 * * ?",
"feign.davinci-portal.name": "cwos-portal",
"sendRecord.boolean": "true",
"ninca-crk-std.ip": "10.0.22.102:16106",
"spring.mvc.locale": "zh_CN",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description": "AcsRecordStatisticsByDay job is starting.........",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"feign.resource.name": "cwos-portal",
"spring.redis.port": "6379",
"cloudwalk.datafield.enable": "true",
"logging.level.cn.cloudwalk": "info",
"cloudwalk.event.group-id": "cw-elevator-application-1",
"cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds": "600000",
"spring.shardingsphere.datasource.ds0.username": "cloudwalk",
"cloudwalk.spring.cache.expires": "CACHE_NAME_APPLICATIONIDS#21600,ACS_DeviceTypesCache#7200,ACS_DeviceTypeFeaturesCache#7200,ACS_DeviceAttrsCache#7200,ACS_RecordStatisticsCache#90000,ACS_AreaTreeCache#60",
"spring.messages.always-use-message-format": "true",
"spring.redis.database": "5",
"spring.shardingsphere.datasource.ds0.max-lifetime": "1765000",
"cloudwalk.access-control.common.device-category-array[4]": "8",
"cloudwalk.access-control.common.publish-opendoor-switch": "false",
"feign.device.name": "cwos-portal",
"feign.cwos-portal.name": "cwos-portal",
"ninca.update.floor.pool.maxPoolSize": "5",
"spring.cloud.consul.enabled": "true",
"sendRecord.ip": "hrec.star-river.com:32165",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name": "AcsRecordStatisticsByDayJob",
"cloudwalk.event.handler-executor-config.core-pool-size": "10",
"elevator.application.key": "xinghewan",
"ninca.update.floor.pool.keepAliveSeconds": "150",
"spring.redis.pool.min-idle": "0",
"spring.cloud.consul.discovery.ip-address": "${spring.cloud.client.ipAddress}",
"feign.okhttp.enable": "true",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
"spring.shardingsphere.datasource.ds0.connection-timeout": "60000",
"cloudwalk.event.handler-executor-config.maximum-pool-size": "30",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
"feign.httpclient.enable": "false",
"spring.http.encoding.enabled": "true",
"ribbon.http.client.enabled": "false",
"spring.redis.password": "1qaz!QAZ",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes": "ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030}",
"server.tomcat.uri-encoding": "UTF-8"
}
}
@@ -0,0 +1,195 @@
{
"tag": "V2.0.4-with-V1-props",
"base_dir": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/deploy/v2-maven",
"jar": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/releases/v2.0.4/cw-elevator-application-2.0.4.jar",
"order": "external>jar",
"file_presence": {
"bootstrap.properties": {
"external": true,
"jar": true
},
"application.properties": {
"external": true,
"jar": true
},
"application-access-control.properties": {
"external": true,
"jar": true
}
},
"focus_keys": {
"spring.cloud.consul.host": {
"value": "371bfca4972c43d2aefcf302d0a4a277",
"source": "external"
},
"spring.cloud.consul.port": {
"value": "8500",
"source": "external"
},
"spring.cloud.consul.discovery.enabled": {
"value": "false",
"source": "external"
},
"spring.cloud.consul.config.enabled": {
"value": "<unset>",
"source": "unset"
},
"feign.cwos-portal.name": {
"value": "cwos-portal",
"source": "external"
},
"feign.ninca-common.name": {
"value": "ninca-common",
"source": "external"
},
"feign.component-organization.name": {
"value": "ninca-common-component-organization",
"source": "external"
},
"cwos-portal.ribbon.NIWSServerListClassName": {
"value": "<unset>",
"source": "unset"
},
"cwos-portal.ribbon.listOfServers": {
"value": "<unset>",
"source": "unset"
}
},
"effective_all_keys": {
"logging.level.root": "info",
"logging.config": "classpath:logs/logback.xml",
"management.health.redis.enabled": "false",
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds": "10000",
"cloudwalk.event.handler-executor-config.core-pool-size": "10",
"spring.cloud.consul.discovery.instance-id": "${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port}",
"ninca.update.floor.pool.queueCapacity": "100000",
"person.name.space": "recordEvent",
"spring.redis.pool.max-active": "10",
"spring.cloud.consul.discovery.enabled": "false",
"sendRecord.token.appSecret": "5f6995009b864669b52041b8f5dc4625",
"spring.cloud.consul.enabled": "true",
"ninca.update.floor.pool.maxPoolSize": "5",
"cloudwalk.serial.serial-length": "8",
"server.port": "16112",
"spring.shardingsphere.datasource.names": "ds0",
"spring.redis.password": "1qaz!QAZ",
"elevator.application.key": "xinghewan",
"spring.mvc.throw-exception-if-no-handler-found": "true",
"logging.file": "${spring.application.name}",
"feign.component-organization.name": "ninca-common-component-organization",
"cloudwalk.spring.cache.expires": "CACHE_NAME_APPLICATIONIDS#21600,ACS_DeviceTypesCache#7200,ACS_DeviceTypeFeaturesCache#7200,ACS_DeviceAttrsCache#7200,ACS_RecordStatisticsCache#90000,ACS_AreaTreeCache#60",
"feign.mqtt.name": "cloudwalk-device-thirdparty",
"spring.shardingsphere.datasource.ds0.connection-timeout": "60000",
"ninca.update.floor.pool.keepAliveSeconds": "150",
"feign.cwos-portal.name": "cwos-portal",
"spring.shardingsphere.datasource.ds0.password": "1qaz!QAZ",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"floor.building.id": "605560539791228928",
"spring.messages.basename": "access-control",
"spring.cloud.consul.port": "8500",
"ribbon.http.client.enabled": "false",
"sendRecord.ip": "hrec.star-river.com:32165",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression": "0 10 0 * * ?",
"sendRecord.token.corpId": "53db867a8bb747a1bd04dd1afcad8ca6",
"cloudwalk.serial.serial-redis-key": "CLOUDWALK-ACS-SERIAL-KEY",
"cloudwalk.datafield.enable": "true",
"elevator.application.time": "600",
"cloudwalk.access-control.common.device-category-array[5]": "11",
"spring.messages.always-use-message-format": "true",
"spring.mvc.locale": "zh_CN",
"feign.ninca-crk-std.name": "ninca-crk-std",
"sendRecord.token.appKey": "293e2d708f0143c2957b702cef44d951",
"ribbon.ConnectTimeout": "10000",
"spring.cloud.consul.discovery.deregister": "false",
"spring.redis.timeout": "0",
"spring.shardingsphere.sharding.default-data-source-name": "ds0",
"spring.redis.database": "5",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class": "cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description": "AcsRecordStatisticsByDay job is starting.........",
"logging.level.cn.cloudwalk": "info",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority": "1",
"spring.profiles.active": "access-control",
"spring.http.encoding.force": "true",
"spring.redis.pool.max-wait": "10",
"cloudwalk.access-control.common.device-controller-array[0]": "mqtt",
"cloudwalk.event.group-id": "cw-elevator-application-1",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"sendRecord.boolean": "true",
"logging.path": "/data/cwos/cw-elevator-application-V1.0.0.20211103/logs",
"ribbon.okhttp.enabled": "true",
"spring.shardingsphere.datasource.ds0.username": "cloudwalk",
"spring.redis.port": "6379",
"feign.hystrix.enable": "true",
"spring.http.multipart.max-request-size": "200MB",
"feign.device.name": "cwos-portal",
"elevator.application.keyA": "5B7DEF88FF04",
"cloudwalk.datafield.securityKey": "d4b2aabc97394a12a27fc3cca6cd9ba1",
"spring.cloud.consul.discovery.ip-address": "${spring.cloud.client.ipAddress}",
"cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD": "75",
"cloudwalk.access-control.common.face-compare-THRESHOLD": "80",
"cloudwalk.datafield.encrypt": "AES",
"management.health.db.enabled": "false",
"server.tomcat.uri-encoding": "UTF-8",
"spring.shardingsphere.datasource.ds0.max-lifetime": "1765000",
"mybatis.mapper-locations": "classpath*:cn/cloudwalk/elevator/**/*.xml",
"intelligent.lock.config.default-wait-time": "10000",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
"ninca.update.floor.pool.corePoolSize": "5",
"spring.http.multipart.max-file-size": "200MB",
"ribbon.ReadTimeout": "10000",
"cloudwalk.access-control.common.device-category-array[2]": "7",
"cloudwalk.access-control.common.publish-opendoor-switch": "false",
"dubbo.provider.version": "1.0",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes": "ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030}",
"spring.cloud.consul.host": "371bfca4972c43d2aefcf302d0a4a277",
"cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds": "600000",
"cloudwalk.access-control.common.device-category-array[3]": "2",
"feign.davinci-portal.name": "cwos-portal",
"spring.shardingsphere.datasource.ds0.pool-name": "ds0-pool",
"cloudwalk.elevator.common.relativePrefix": "/cwos-portal/portal/fileManager/imgByPath?path=",
"spring.redis.host": "redis_01.redis_ip",
"spring.shardingsphere.props.sql.show": "false",
"spring.shardingsphere.sharding.binding-tables": "IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"spring.shardingsphere.datasource.ds0.auto-commit": "true",
"spring.messages.encoding": "utf-8",
"spring.redis.pool.min-idle": "0",
"spring.shardingsphere.datasource.ds0.jdbc-url": "jdbc:mysql://mysql_01.mysql_ip:3306/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true",
"spring.application.name": "elevator-app",
"cloudwalk.serial.serial-type": "redis",
"feign.okhttp.enable": "true",
"mybatis.config-location": "classpath:mapper/mybatis-config.xml",
"spring.redis.pool.max-idle": "1",
"cloudwalk.access-control.common.face-capture-interval-milliseconds": "3000",
"cloudwalk.serial.enable": "true",
"spring.cloud.consul.discovery.prefer-ip-address": "true",
"cloudwalk.access-control.common.face-capture-time-expired-milliseconds": "300000",
"dubbo.protocol.port": "16107",
"intelligent.lock.enable": "true",
"lockWatchdogTimeout": "21000",
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes": "ds0.IT_ACS_RECOG_RECORD_$->{2020..2030}",
"ninca.update.floor.pool.allowCoreThreadTimeOut": "true",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group": "ACCESS-CONTROL_GROUP",
"spring.cloud.consul.discovery.register": "true",
"feign.httpclient.enable": "false",
"spring.shardingsphere.datasource.ds0.driver-class-name": "com.mysql.jdbc.Driver",
"spring.http.encoding.charset": "UTF-8",
"ninca-crk-std.ip": "10.0.22.102:16106",
"spring.http.encoding.enabled": "true",
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
"cloudwalk.event.handler-executor-config.maximum-pool-size": "30",
"spring.shardingsphere.datasource.ds0.minimum-idle": "5",
"spring.shardingsphere.datasource.ds0.maximum-pool-size": "20",
"cloudwalk.event.bootstrap-servers": "371bfca4972c43d2aefcf302d0a4a277:9092,44700995ee904679a7ad5afddcf93bb5:9092,0837a70b5fab47569391828f5feb2561:9092",
"spring.shardingsphere.datasource.ds0.type": "com.zaxxer.hikari.HikariDataSource",
"dubbo.registry.address": "zookeeper://10.0.22.207:2181",
"feign.ninca-common.name": "ninca-common",
"feign.resource.name": "cwos-portal",
"cloudwalk.access-control.common.device-category-array[4]": "8",
"cloudwalk.access-control.common.device-category-array[0]": "4",
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name": "AcsRecordStatisticsByDayJob",
"cloudwalk.access-control.common.device-category-array[1]": "5",
"cloudwalk.access-control.common.publish-opendoor-service-code": "access-control"
}
}
@@ -0,0 +1,109 @@
# Consul 可访问且「有清单」仍拿不到 IP/端口 — 走查结果(证据执行)
**证据根**[`maven-cw-elevator-application/logs/evidence/`](../../maven-cw-elevator-application/logs/evidence/)
**主日志**[`elevator-app.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app.log)
**配置探针**[`elevator-app-probe.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app-probe.log)
**Consul 快照(示例)**[`elevator-evidence-20260430-113912/consul-health-ninca-common-component-organization.json`](../../maven-cw-elevator-application/logs/evidence/elevator-evidence-20260430-113912/consul-health-ninca-common-component-organization.json)
本文对应走查计划的四项核对:**客户端名**、**Ribbon 初始化时序**、**ConsulServerList vs ConfigurationBased**、**bootstrap 多源合并**。结论与 [`elevator-evidence-v1-v2-diff-20260430.md`](elevator-evidence-v1-v2-diff-20260430.md) §6–§10、[`elevator-service-instance-missing-investigation.md`](elevator-service-instance-missing-investigation.md) 一致并细化到可 grep 的行级证据。
### 本服务是否注册到 Consul、与探针日志
- **拉不到上游 IP** 常见原因是 **Ribbon 客户端名 / listOfServers / 时序**(见下文),**不等价于**本机未注册;但仍应单独核实 **本进程** 在 Consul 的登记名是否与 `spring.application.name` 一致、健康是否 **passing**
- 诊断探针 **默认始终运行**(无 `elevator.*.probe` 开关);Consul HTTP 首次延迟见源码 [`ElevatorProbeConstants`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ElevatorProbeConstants.java)。[`ConsulUpstreamHealthProbeRunner`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ConsulUpstreamHealthProbeRunner.java) 会请求本服务 **`/v1/health/service/<spring.application.name>`**`passing=true` 与全量各一遍,并 **逐实例** DEBUG)、上游同名列表,以及 **`/v1/agent/self`**。
- [`RibbonLoadBalancerProbeRunner`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/RibbonLoadBalancerProbeRunner.java) 在同一延迟窗口输出各 client 的 **`ServerList` 实现类**、`ILoadBalancer`、**`DiscoveryClient.getInstances`**(本服务 + `ElevatorUpstreamServiceNames`)明细。
- [`logback.xml`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/resources/logs/logback.xml) 将 **`org.springframework.cloud.consul`**、**`com.netflix.loadbalancer`**、**`org.springframework.cloud.client.discovery`** 与 **`cn.cloudwalk.elevator.debug`** 均按 **DEBUG** **双写**到 **`${logging.file}-probe.log`**(与自建 `consulProbe` / `ribbonProbe` / `discoveryProbe` 及框架行对照)。
---
## 1. 报错栈中的 Ribbon client 名 vs Consul 注册名
**核对方法**:在出错 JVM 日志中搜索 **`Load balancer does not have available server for client:`** 或 **`for client:`**,将后缀字符串与 Consul UI / `/v1/health/service/<name>`**Service** 名 **逐字**比对(含 `ninca-common-` 前缀)。
### 本仓库证据包结论
| 项目 | 结论 |
|------|------|
| `for client:` 在本份 `elevator-app.log` 中 | **仅出现** `ninca-crk-std`(大量重复),**未出现** `component-organization` |
| Feign 逻辑名 `component-organization` | `feign.component-organization.name=ninca-common-component-organization`(探针:`file:``classpath:` 均为该值) |
| Ribbon 实际客户端名 | `Client: ninca-common-component-organization``ConsulServerList{serviceId='ninca-common-component-organization'}` |
| Consul | `ninca-common-component-organization` 健康快照为 **3** 个 passing 实例,与日志中三台 `:17016` 一致 |
**与人对齐时的表述**:若微信群截图写 **`for client: component-organization`**,而本电梯进程配置将 Feign **解析服务名**设为 **`ninca-common-component-organization`**,则二者 **不是** 同一 Ribbon client;对方环境若在 **`component-organization`** 名下查实例会得到 **0 台**,即使 Consul 里注册的是 **`ninca-common-component-organization`**。结论:**先看报错里的精确 client 字符串**,再对 Consul 注册名。
---
## 2. DynamicServerListLoadBalancer 初始化与 `Servers=[]` 时间序
**核对方法**:对关心的 client 搜索 **`DynamicServerListLoadBalancer for client <name> initialized`**,并向上查看同一 client 的 **`current list of Servers=[...]`**;若在列表仍为空窗口内发生首次 Feign 调用,会抛 **no available server**
### `ninca-common-component-organization`Consul 路径)
| 时间(日志) | 事件 |
|--------------|------|
| `11:16:33.087` | `Client: ninca-common-component-organization`,首次 `current list of Servers=[]``ServerList:null` |
| `11:16:33.097` | `DynamicServerListLoadBalancer for client ninca-common-component-organization initialized`,已为 **3 台** `:17016``ConsulServerList{serviceId='ninca-common-component-organization'}` |
**10ms** 内由空列表变为三台;若首次 RPC 落在此窗口仍可能失败(计划中的「首轮请求早于填充」风险)。
### `ninca-crk-std`ConfigurationBased 路径)
| 时间(日志) | 事件 |
|--------------|------|
| `11:16:34.109` | `Client: ninca-crk-std``Servers=[]``ServerList:null` |
| `11:16:34.111` | `DynamicServerListLoadBalancer for client ninca-crk-std initialized`**仍为** `Servers=[]``ServerList:ConfigurationBasedServerList` |
| `11:16:34.346` 起 | 连续 **`no available server for client: ninca-crk-std`** |
本证据包中 **no-server 全部归因于 `ninca-crk-std`**,且发生在 **`ninca-common-component-organization` 已填充三台之后**,说明主因不是「Consul 查错 organization 名」,而是 **`ninca-crk-std` 的静态 Ribbon 列表未配置**(见下节)。
同一全量日志内 **第二次启动**(约 `11:43`)后 `ninca-crk-std` 可出现非空列表,详见 [`elevator-evidence-v1-v2-diff-20260430.md`](elevator-evidence-v1-v2-diff-20260430.md) §6.2。
---
## 3. ConsulServerList 与 ConfigurationBasedServerList`ninca-crk-std` 与 `listOfServers` / `ip`
| 客户端 | ServerList 实现 | 列表来源 |
|--------|-----------------|----------|
| `ninca-common-component-organization` | `ConsulServerList` | Consul `serviceId=ninca-common-component-organization` |
| `ninca-crk-std` | `ConfigurationBasedServerList` | Ribbon 属性(如 `ninca-crk-std.ribbon.listOfServers`),**不**自动使用 `ninca-crk-std.ip` |
代码侧:[`NincaCrkStdRibbonConfiguration`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java) 为 `ninca-crk-std` 固定注册 `ConfigurationBasedServerList`
**探针(`elevator-app-probe.log`):**
- `ninca-crk-std.ribbon.listOfServers value=null`
- `ninca-crk-std.ip=10.0.22.102:16106``file:` / `classpath:` 一致)
因此即 Consul 上 `ninca-crk-std` **passing=3**Ribbon 仍可能 **`Servers=[]`**,与 Consul 是否正常无关,除非另行配置 **`ribbon.listOfServers`** 或改变 ServerList 策略。部署模板对照:V1 legacy 含显式 `ninca-crk-std.ribbon.listOfServers` 段;V2 模板以 `ninca-crk-std.ip` 为主,见 [`deploy/v1-legacy/application.properties`](../../maven-cw-elevator-application/deploy/v1-legacy/application.properties) 与 [`deploy/v2-maven/application.properties`](../../maven-cw-elevator-application/deploy/v2-maven/application.properties)。
---
## 4. `file:./bootstrap` 与 `classpath:/bootstrap` 对 Consul 的合并结果
**来源**[`elevator-app-probe.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app-probe.log) 中 `ConfigSourceProbeRunner` 行。
| 键 | Environment 合并结果 | `file:./bootstrap.properties` | `classpath:/bootstrap.properties` |
|----|------------------------|--------------------------------|-------------------------------------|
| `spring.cloud.consul.host` | `10.0.22.102` | `10.0.22.102` | 主机名(与磁盘不一致) |
| `spring.cloud.consul.discovery.enabled` | `true` | `true` | `false` |
**走查要点**:以 **`spring.application.*` 合并后的 `value=`** 为准核对「进程连的 Consul」是否与运维在浏览器里看的地址一致;磁盘与 jar 内嵌 bootstrap **并存**时,以最终 Environment 为准(本样本下 host 为 **10.0.22.102**、发现 **启用**)。证据目录内亦有 [`bootstrap.properties`](../../maven-cw-elevator-application/logs/evidence/elevator-evidence-20260430-113912/bootstrap.properties) 快照可与现场比对。
---
## 5. 建议的可复现 grep(本地)
```bash
# 锁定所有「for client:」后的客户端名(去重)
grep -E 'for client:' maven-cw-elevator-application/logs/evidence/elevator-app.log | sed -n 's/.*for client: \([^ ]*\).*/\1/p' | sort -u
# 各客户端初始化与非空列表
grep 'DynamicServerListLoadBalancer for client' maven-cw-elevator-application/logs/evidence/elevator-app.log
# 区分 Consul 与配置型列表
grep -E 'ConsulServerList|ConfigurationBasedServerList' maven-cw-elevator-application/logs/evidence/elevator-app.log
```
---
**延伸阅读**[`elevator-v1-v2-init-timing-config-audit.md`](elevator-v1-v2-init-timing-config-audit.md)(初始化顺序与探针)、[`elevator-evidence-v1-v2-diff-20260430.md`](elevator-evidence-v1-v2-diff-20260430.md) §9`listOfServers` vs `ninca-crk-std.ip`)。
@@ -0,0 +1,46 @@
# 从 multiset 差值中扣减「仅 V1 基准包多出」的条目(每行一条坐标或 unresolved:文件名,末尾可选次数,默认 1)。
# 产品线模块保留 2.0-SNAPSHOT,不自降级为 1.0-SNAPSHOT。
cn.cloudwalk.elevator:cw-elevator-application-common:1.0-SNAPSHOT 1
cn.cloudwalk.elevator:cw-elevator-application-data:1.0-SNAPSHOT 1
cn.cloudwalk.elevator:cw-elevator-application-service:1.0-SNAPSHOT 1
cn.cloudwalk.elevator:cw-elevator-application-web:1.0-SNAPSHOT 1
# V1 运行包误入的 Maven/Mojo 构建泄漏(V2 故意不打入)
org.apache.maven.wagon:wagon-provider-api:1.0-beta-2 1
org.apache.maven:maven-artifact-manager:2.0.5 1
org.apache.maven:maven-artifact:2.0.5 1
org.apache.maven:maven-model:2.0.5 1
org.apache.maven:maven-plugin-api:2.0.5 1
org.apache.maven:maven-profile:2.0.5 1
org.apache.maven:maven-project:2.0.5 1
org.apache.maven:maven-repository-metadata:2.0.5 1
org.apache.maven:maven-settings:2.0.5 1
org.codehaus.plexus:plexus-container-default:1.0-alpha-9 1
org.codehaus.plexus:plexus-utils:1.1 1
org.jfrog.jade.plugins.common:jade-plugin-common:1.3.8 1
org.jfrog.maven.annomojo:maven-plugin-anno:1.4.1 1
org.reflections:reflections-maven:0.9.9-RC2 1
# 私服父 POM 不可解析,运行时亦不强制依赖
org.springside:springside-core:4.2.3-GA 1
# V1 嵌套 jar 无 pom.properties,脚本记为 unresolved;与 V2 侧解析坐标不对等时放行
unresolved:annotations-2.0.0.jar 1
unresolved:ant-1.6.5.jar 1
unresolved:ant-apache-bsf-1.9.4.jar 1
unresolved:ant-jakarta-oro-1.6.1.jar 1
unresolved:ant-nodeps-1.8.1.jar 1
unresolved:asm-5.0.3.jar 1
unresolved:asm-analysis-5.0.3.jar 1
unresolved:asm-tree-5.0.3.jar 1
unresolved:asm-util-5.0.3.jar 1
unresolved:bsf-2.4.0.jar 1
unresolved:classworlds-1.1-alpha-2.jar 1
unresolved:feign-core-8.18.0.jar 1
unresolved:feign-okhttp-8.18.0.jar 1
unresolved:hamcrest-core-1.3.jar 1
unresolved:jdom-1.1.2.jar 1
unresolved:junit-4.12.jar 1
unresolved:lombok-1.16.18.jar 1
unresolved:parboiled-core-1.1.7.jar 1
unresolved:parboiled-java-1.1.7.jar 1
unresolved:pegdown-1.6.0.jar 1
unresolved:xpp3-1.1.3.4-RC8.jar 1
unresolved:xstream-1.1.3.jar 1
@@ -0,0 +1,15 @@
# 从 multiset 差值中扣减「仅当前构建多出」的条目。
cn.cloudwalk.elevator:cw-elevator-application-common:2.0-SNAPSHOT 1
cn.cloudwalk.elevator:cw-elevator-application-data:2.0-SNAPSHOT 1
cn.cloudwalk.elevator:cw-elevator-application-service:2.0-SNAPSHOT 1
cn.cloudwalk.elevator:cw-elevator-application-web:2.0-SNAPSHOT 1
com.google.code.findbugs:jsr305:3.0.2 1
io.github.openfeign:feign-okhttp:9.5.0 1
javax.annotation:javax.annotation-api:1.3.2 1
net.bytebuddy:byte-buddy-dep:1.9.6 1
org.hibernate.validator:hibernate-validator:6.0.22.Final 1
org.jctools:jctools-core:2.1.1 1
unresolved:annotations-2.0.1.jar 1
unresolved:asm-7.3.1.jar 1
unresolved:asm-commons-7.0.jar 1
unresolved:lombok-1.16.22.jar 1
@@ -0,0 +1,869 @@
# cw-elevator-application V1 fat-jar 与 V2 fat-jar 依赖差异核对
**生成方式**:脚本 `scripts/generate_v1_v2_elevator_dependency_diff.py`(可重复执行覆盖本文件)。
## 样本路径
- **V1**`cw-elevator-application-V1.0.0.20211103/cw-elevator-application-V1.0.0.20211103.jar`
- **V2**`maven-cw-elevator-application/cw-elevator-application-starter/target/cw-elevator-application-2.0.0.jar`
| 指标 | V1 | V2 |
|------|----|----|
| 嵌套 jar 条目数(lib / BOOT-INF/lib | 269 | 242 |
| 解析出唯一坐标 `groupId:artifactId:version` 数 | 269 | 242 |
| 同名 GA、两侧均有解析且 version 集合不一致(§2.2.1)条数 | — | **4** |
| 与 Maven `dependency:list`runtime)条目数 | — | 242 |
---
## 1. Maven 方式(仅 V2 reactor
`maven-cw-elevator-application` 下执行:`mvn -pl cw-elevator-application-starter -am dependency:list -DincludeScope=runtime -Dsort=true -DoutputFile=target/v2-maven-deps.txt``-am` 时每个子模块写各自的 `target/`**§1.1 使用 starter 模块文件**`cw-elevator-application-starter/target/v2-maven-deps.txt`
**说明**:历史 **V1 运行包** 当前仓库无对应 **1.0** 聚合工程可一键 `dependency:list`V1 的 Maven 坐标视图见 **§2 二进制嵌套 JAR 的 pom.properties**。
### 1.1 V2 `dependency:list` 全量(runtime
| # | groupId | artifactId | version | scope |
|---|---------|--------------|---------|-------|
| 1 | `ch.qos.logback` | `logback-classic` | `1.1.11` | `compile` |
| 2 | `ch.qos.logback` | `logback-core` | `1.1.11` | `compile` |
| 3 | `cn.cloudwalk` | `cloudwalk-device-sdk-protocol-entity` | `2.2.0` | `compile` |
| 4 | `cn.cloudwalk` | `cwos-java-sdk-resource` | `1.0.0-SNAPSHOT` | `compile` |
| 5 | `cn.cloudwalk` | `cwos-portal-interface` | `1.0.0-SNAPSHOT` | `compile` |
| 6 | `cn.cloudwalk.cloud` | `cloudwalk-common-event` | `3.7.2-Brussels-SRX` | `compile` |
| 7 | `cn.cloudwalk.cloud` | `cloudwalk-common-result` | `3.7.2-Brussels-SRX` | `compile` |
| 8 | `cn.cloudwalk.cloud` | `cloudwalk-common-serial` | `3.7.2-Brussels-SRX` | `compile` |
| 9 | `cn.cloudwalk.cloud` | `cloudwalk-common-service` | `3.7.2-Brussels-SRX` | `compile` |
| 10 | `cn.cloudwalk.cloud` | `cloudwalk-common-web` | `3.7.2-Brussels-SRX` | `compile` |
| 11 | `cn.cloudwalk.cloud` | `cloudwalk-device-manager-common` | `2.0.2` | `compile` |
| 12 | `cn.cloudwalk.cloud` | `cloudwalk-device-manager-interface` | `2.0.2` | `compile` |
| 13 | `cn.cloudwalk.cloud` | `cwos-common-aks-interface` | `1.0.0-SNAPSHOT` | `compile` |
| 14 | `cn.cloudwalk.cloud` | `cwos-component-resource-data` | `1.0.0-SNAPSHOT` | `compile` |
| 15 | `cn.cloudwalk.cloud` | `cwos-component-resource-interface` | `1.0.0-SNAPSHOT` | `compile` |
| 16 | `cn.cloudwalk.cloud` | `cwos-device-authentication-interface` | `1.0.0-SNAPSHOT` | `compile` |
| 17 | `cn.cloudwalk.cloud` | `cwos-sdk-event` | `1.5.0-SNAPSHOT` | `compile` |
| 18 | `cn.cloudwalk.elevator` | `cw-elevator-application-common` | `2.0-SNAPSHOT` | `compile` |
| 19 | `cn.cloudwalk.elevator` | `cw-elevator-application-data` | `2.0-SNAPSHOT` | `compile` |
| 20 | `cn.cloudwalk.elevator` | `cw-elevator-application-service` | `2.0-SNAPSHOT` | `compile` |
| 21 | `cn.cloudwalk.elevator` | `cw-elevator-application-web` | `2.0-SNAPSHOT` | `compile` |
| 22 | `cn.cloudwalk.intelligent` | `cloudwalk-intelligent-component-lock` | `1.1.1-SNAPSHOT` | `compile` |
| 23 | `cn.cloudwalk.intelligent` | `davinci-manager-common` | `1.1.7-SNAPSHOT` | `compile` |
| 24 | `cn.cloudwalk.intelligent` | `davinci-manager-storage` | `1.1.7-SNAPSHOT` | `compile` |
| 25 | `cn.cloudwalk.intelligent` | `intelligent-cwoscomponent-interface` | `2.9.2-xinghewan` | `compile` |
| 26 | `cn.cloudwalk.intelligent` | `intelligent-cwoscomponent-rest` | `2.9.2-xinghewan` | `compile` |
| 27 | `com.alibaba` | `fastjson` | `1.2.73` | `compile` |
| 28 | `com.aliyun` | `aliyun-java-sdk-core` | `3.2.8` | `compile` |
| 29 | `com.aliyun` | `aliyun-java-sdk-dysmsapi` | `1.1.0` | `compile` |
| 30 | `com.ecwid.consul` | `consul-api` | `1.3.0` | `compile` |
| 31 | `com.fasterxml` | `classmate` | `1.3.4` | `compile` |
| 32 | `com.fasterxml.jackson.core` | `jackson-annotations` | `2.11.2` | `compile` |
| 33 | `com.fasterxml.jackson.core` | `jackson-core` | `2.11.2` | `compile` |
| 34 | `com.fasterxml.jackson.core` | `jackson-databind` | `2.11.2` | `compile` |
| 35 | `com.fasterxml.jackson.dataformat` | `jackson-dataformat-yaml` | `2.11.2` | `compile` |
| 36 | `com.fasterxml.jackson.datatype` | `jackson-datatype-jsr310` | `2.11.2` | `compile` |
| 37 | `com.fasterxml.jackson.module` | `jackson-module-afterburner` | `2.11.2` | `compile` |
| 38 | `com.github.jsqlparser` | `jsqlparser` | `1.2` | `compile` |
| 39 | `com.github.luben` | `zstd-jni` | `1.4.0-1` | `compile` |
| 40 | `com.github.pagehelper` | `pagehelper` | `5.1.2` | `compile` |
| 41 | `com.github.pagehelper` | `pagehelper-spring-boot-autoconfigure` | `1.2.5` | `compile` |
| 42 | `com.github.virtuald` | `curvesapi` | `1.04` | `compile` |
| 43 | `com.google.code.findbugs` | `annotations` | `2.0.1` | `compile` |
| 44 | `com.google.code.findbugs` | `jsr305` | `3.0.2` | `compile` |
| 45 | `com.google.code.gson` | `gson` | `2.8.5` | `compile` |
| 46 | `com.google.guava` | `guava` | `20.0` | `compile` |
| 47 | `com.google.zxing` | `core` | `3.3.3` | `compile` |
| 48 | `com.netflix.archaius` | `archaius-core` | `0.6.6` | `compile` |
| 49 | `com.netflix.hystrix` | `hystrix-core` | `1.5.12` | `compile` |
| 50 | `com.netflix.hystrix` | `hystrix-javanica` | `1.5.12` | `compile` |
| 51 | `com.netflix.hystrix` | `hystrix-metrics-event-stream` | `1.5.12` | `compile` |
| 52 | `com.netflix.hystrix` | `hystrix-serialization` | `1.5.12` | `runtime` |
| 53 | `com.netflix.netflix-commons` | `netflix-commons-util` | `0.1.1` | `runtime` |
| 54 | `com.netflix.netflix-commons` | `netflix-statistics` | `0.1.1` | `runtime` |
| 55 | `com.netflix.ribbon` | `ribbon` | `2.2.5` | `compile` |
| 56 | `com.netflix.ribbon` | `ribbon-core` | `2.2.5` | `compile` |
| 57 | `com.netflix.ribbon` | `ribbon-httpclient` | `2.2.5` | `compile` |
| 58 | `com.netflix.ribbon` | `ribbon-loadbalancer` | `2.2.5` | `compile` |
| 59 | `com.netflix.ribbon` | `ribbon-transport` | `2.2.5` | `runtime` |
| 60 | `com.netflix.servo` | `servo-core` | `0.10.1` | `runtime` |
| 61 | `com.netflix.servo` | `servo-internal` | `0.10.1` | `runtime` |
| 62 | `com.squareup.okhttp3` | `okhttp` | `3.2.0` | `compile` |
| 63 | `com.squareup.okio` | `okio` | `1.6.0` | `compile` |
| 64 | `com.sun.jersey` | `jersey-client` | `1.19.1` | `runtime` |
| 65 | `com.sun.jersey` | `jersey-core` | `1.19.1` | `runtime` |
| 66 | `com.sun.jersey.contribs` | `jersey-apache-client4` | `1.19.1` | `runtime` |
| 67 | `com.zaxxer` | `HikariCP` | `2.5.1` | `compile` |
| 68 | `commons-codec` | `commons-codec` | `1.10` | `compile` |
| 69 | `commons-collections` | `commons-collections` | `3.2.2` | `runtime` |
| 70 | `commons-configuration` | `commons-configuration` | `1.8` | `compile` |
| 71 | `commons-fileupload` | `commons-fileupload` | `1.3.1` | `compile` |
| 72 | `commons-io` | `commons-io` | `2.5` | `compile` |
| 73 | `commons-lang` | `commons-lang` | `2.6` | `compile` |
| 74 | `commons-logging` | `commons-logging` | `1.2` | `compile` |
| 75 | `de.ruedigermoeller` | `fst` | `2.56` | `compile` |
| 76 | `dom4j` | `dom4j` | `1.6.1` | `compile` |
| 77 | `io.github.openfeign` | `feign-core` | `9.5.0` | `compile` |
| 78 | `io.github.openfeign` | `feign-hystrix` | `9.5.0` | `compile` |
| 79 | `io.github.openfeign` | `feign-okhttp` | `9.5.0` | `compile` |
| 80 | `io.github.openfeign` | `feign-slf4j` | `9.5.0` | `compile` |
| 81 | `io.github.openfeign.form` | `feign-form` | `3.0.3` | `compile` |
| 82 | `io.github.openfeign.form` | `feign-form-spring` | `3.0.3` | `compile` |
| 83 | `io.netty` | `netty-buffer` | `4.1.33.Final` | `compile` |
| 84 | `io.netty` | `netty-codec` | `4.1.33.Final` | `compile` |
| 85 | `io.netty` | `netty-codec-dns` | `4.1.33.Final` | `compile` |
| 86 | `io.netty` | `netty-common` | `4.1.33.Final` | `compile` |
| 87 | `io.netty` | `netty-handler` | `4.1.33.Final` | `compile` |
| 88 | `io.netty` | `netty-resolver` | `4.1.33.Final` | `compile` |
| 89 | `io.netty` | `netty-resolver-dns` | `4.1.33.Final` | `compile` |
| 90 | `io.netty` | `netty-transport` | `4.1.33.Final` | `compile` |
| 91 | `io.projectreactor` | `reactor-core` | `2.0.8.RELEASE` | `compile` |
| 92 | `io.projectreactor` | `reactor-stream` | `2.0.8.RELEASE` | `compile` |
| 93 | `io.reactivex` | `rxjava` | `1.2.0` | `compile` |
| 94 | `io.reactivex` | `rxnetty` | `0.4.9` | `runtime` |
| 95 | `io.reactivex` | `rxnetty-contexts` | `0.4.9` | `runtime` |
| 96 | `io.reactivex` | `rxnetty-servo` | `0.4.9` | `runtime` |
| 97 | `io.reactivex.rxjava2` | `rxjava` | `2.1.13` | `compile` |
| 98 | `javax.activation` | `activation` | `1.1` | `compile` |
| 99 | `javax.annotation` | `javax.annotation-api` | `1.3.2` | `compile` |
| 100 | `javax.cache` | `cache-api` | `1.0.0` | `compile` |
| 101 | `javax.inject` | `javax.inject` | `1` | `runtime` |
| 102 | `javax.mail` | `mail` | `1.4.4` | `compile` |
| 103 | `javax.validation` | `validation-api` | `1.1.0.Final` | `compile` |
| 104 | `javax.ws.rs` | `jsr311-api` | `1.1.1` | `runtime` |
| 105 | `joda-time` | `joda-time` | `2.9.9` | `compile` |
| 106 | `mysql` | `mysql-connector-java` | `5.1.47` | `compile` |
| 107 | `net.bytebuddy` | `byte-buddy` | `1.9.6` | `compile` |
| 108 | `net.bytebuddy` | `byte-buddy-dep` | `1.9.6` | `compile` |
| 109 | `net.coobird` | `thumbnailator` | `0.4.8` | `compile` |
| 110 | `net.lingala.zip4j` | `zip4j` | `2.6.2` | `compile` |
| 111 | `net.sf.ehcache` | `ehcache` | `2.10.5` | `compile` |
| 112 | `net.sf.opencsv` | `opencsv` | `2.3` | `compile` |
| 113 | `org.antlr` | `antlr4-runtime` | `4.7.2` | `compile` |
| 114 | `org.apache.ant` | `ant` | `1.9.6` | `compile` |
| 115 | `org.apache.ant` | `ant-launcher` | `1.9.6` | `compile` |
| 116 | `org.apache.commons` | `commons-collections4` | `4.1` | `compile` |
| 117 | `org.apache.commons` | `commons-compress` | `1.9` | `compile` |
| 118 | `org.apache.commons` | `commons-lang3` | `3.5` | `compile` |
| 119 | `org.apache.commons` | `commons-pool2` | `2.4.3` | `compile` |
| 120 | `org.apache.httpcomponents` | `httpclient` | `4.5.6` | `compile` |
| 121 | `org.apache.httpcomponents` | `httpcore` | `4.4.10` | `compile` |
| 122 | `org.apache.kafka` | `kafka-clients` | `2.3.0` | `compile` |
| 123 | `org.apache.poi` | `poi` | `3.15` | `compile` |
| 124 | `org.apache.poi` | `poi-ooxml` | `3.15` | `compile` |
| 125 | `org.apache.poi` | `poi-ooxml-schemas` | `3.15` | `compile` |
| 126 | `org.apache.shardingsphere` | `encrypt-core-merge` | `4.0.0` | `compile` |
| 127 | `org.apache.shardingsphere` | `encrypt-core-rewrite` | `4.0.0` | `compile` |
| 128 | `org.apache.shardingsphere` | `sharding-core-api` | `4.0.0` | `compile` |
| 129 | `org.apache.shardingsphere` | `sharding-core-common` | `4.0.0` | `compile` |
| 130 | `org.apache.shardingsphere` | `sharding-core-entry` | `4.0.0` | `compile` |
| 131 | `org.apache.shardingsphere` | `sharding-core-execute` | `4.0.0` | `compile` |
| 132 | `org.apache.shardingsphere` | `sharding-core-merge` | `4.0.0` | `compile` |
| 133 | `org.apache.shardingsphere` | `sharding-core-rewrite` | `4.0.0` | `compile` |
| 134 | `org.apache.shardingsphere` | `sharding-core-route` | `4.0.0` | `compile` |
| 135 | `org.apache.shardingsphere` | `sharding-jdbc-core` | `4.0.0` | `compile` |
| 136 | `org.apache.shardingsphere` | `sharding-jdbc-spring-boot-starter` | `4.0.0` | `compile` |
| 137 | `org.apache.shardingsphere` | `sharding-spring-boot-util` | `4.0.0` | `compile` |
| 138 | `org.apache.shardingsphere` | `sharding-transaction-core` | `4.0.0` | `compile` |
| 139 | `org.apache.shardingsphere` | `shardingsphere-execute` | `4.0.0` | `compile` |
| 140 | `org.apache.shardingsphere` | `shardingsphere-merge` | `4.0.0` | `compile` |
| 141 | `org.apache.shardingsphere` | `shardingsphere-rewrite-engine` | `4.0.0` | `compile` |
| 142 | `org.apache.shardingsphere` | `shardingsphere-spi` | `4.0.0` | `compile` |
| 143 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-engine` | `4.0.0` | `compile` |
| 144 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-mysql` | `4.0.0` | `compile` |
| 145 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-oracle` | `4.0.0` | `compile` |
| 146 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-postgresql` | `4.0.0` | `compile` |
| 147 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-relation` | `4.0.0` | `compile` |
| 148 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-spi` | `4.0.0` | `compile` |
| 149 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-sql92` | `4.0.0` | `compile` |
| 150 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-sqlserver` | `4.0.0` | `compile` |
| 151 | `org.apache.tomcat` | `tomcat-annotations-api` | `8.5.34` | `compile` |
| 152 | `org.apache.tomcat` | `tomcat-jdbc` | `8.5.34` | `compile` |
| 153 | `org.apache.tomcat` | `tomcat-juli` | `8.5.34` | `compile` |
| 154 | `org.apache.tomcat.embed` | `tomcat-embed-core` | `8.5.34` | `compile` |
| 155 | `org.apache.tomcat.embed` | `tomcat-embed-el` | `8.5.34` | `compile` |
| 156 | `org.apache.tomcat.embed` | `tomcat-embed-websocket` | `8.5.34` | `compile` |
| 157 | `org.apache.xmlbeans` | `xmlbeans` | `2.6.0` | `compile` |
| 158 | `org.aspectj` | `aspectjweaver` | `1.8.13` | `compile` |
| 159 | `org.bouncycastle` | `bcpkix-jdk15on` | `1.55` | `compile` |
| 160 | `org.bouncycastle` | `bcprov-jdk15on` | `1.55` | `compile` |
| 161 | `org.codehaus.groovy` | `groovy` | `indy` | `2.4.5` |
| 162 | `org.freemarker` | `freemarker` | `2.3.28` | `compile` |
| 163 | `org.hdrhistogram` | `HdrHistogram` | `2.1.9` | `compile` |
| 164 | `org.hibernate` | `hibernate-validator` | `5.3.6.Final` | `compile` |
| 165 | `org.hibernate.validator` | `hibernate-validator` | `6.0.22.Final` | `compile` |
| 166 | `org.javassist` | `javassist` | `3.21.0-GA` | `compile` |
| 167 | `org.jboss.logging` | `jboss-logging` | `3.3.2.Final` | `compile` |
| 168 | `org.jctools` | `jctools-core` | `2.1.1` | `compile` |
| 169 | `org.jodd` | `jodd-bean` | `3.7.1` | `compile` |
| 170 | `org.jodd` | `jodd-core` | `3.7.1` | `compile` |
| 171 | `org.jsoup` | `jsoup` | `1.9.2` | `compile` |
| 172 | `org.jvnet` | `animal-sniffer-annotation` | `1.0` | `compile` |
| 173 | `org.lz4` | `lz4-java` | `1.6.0` | `compile` |
| 174 | `org.mybatis` | `mybatis` | `3.4.6` | `compile` |
| 175 | `org.mybatis` | `mybatis-spring` | `1.3.2` | `compile` |
| 176 | `org.mybatis.spring.boot` | `mybatis-spring-boot-autoconfigure` | `1.3.1` | `compile` |
| 177 | `org.mybatis.spring.boot` | `mybatis-spring-boot-starter` | `1.3.1` | `compile` |
| 178 | `org.objenesis` | `objenesis` | `2.1` | `compile` |
| 179 | `org.ow2.asm` | `asm` | `7.3.1` | `compile` |
| 180 | `org.ow2.asm` | `asm-commons` | `7.0` | `compile` |
| 181 | `org.projectlombok` | `lombok` | `1.16.22` | `compile` |
| 182 | `org.reactivestreams` | `reactive-streams` | `1.0.2` | `compile` |
| 183 | `org.redisson` | `redisson` | `2.15.2` | `compile` |
| 184 | `org.redisson` | `redisson-spring-boot-starter` | `2.15.2` | `compile` |
| 185 | `org.redisson` | `redisson-spring-data-18` | `2.15.2` | `compile` |
| 186 | `org.reflections` | `reflections` | `0.9.9-RC2` | `compile` |
| 187 | `org.slf4j` | `jcl-over-slf4j` | `1.7.25` | `compile` |
| 188 | `org.slf4j` | `jul-to-slf4j` | `1.7.25` | `compile` |
| 189 | `org.slf4j` | `log4j-over-slf4j` | `1.7.25` | `compile` |
| 190 | `org.slf4j` | `slf4j-api` | `1.7.25` | `compile` |
| 191 | `org.springframework` | `spring-aop` | `4.3.29.RELEASE` | `compile` |
| 192 | `org.springframework` | `spring-aspects` | `4.3.29.RELEASE` | `compile` |
| 193 | `org.springframework` | `spring-beans` | `4.3.29.RELEASE` | `compile` |
| 194 | `org.springframework` | `spring-context` | `4.3.29.RELEASE` | `compile` |
| 195 | `org.springframework` | `spring-context-support` | `4.3.29.RELEASE` | `compile` |
| 196 | `org.springframework` | `spring-core` | `4.3.29.RELEASE` | `compile` |
| 197 | `org.springframework` | `spring-expression` | `4.3.29.RELEASE` | `compile` |
| 198 | `org.springframework` | `spring-jdbc` | `4.3.29.RELEASE` | `compile` |
| 199 | `org.springframework` | `spring-oxm` | `4.3.29.RELEASE` | `compile` |
| 200 | `org.springframework` | `spring-tx` | `4.3.29.RELEASE` | `compile` |
| 201 | `org.springframework` | `spring-web` | `4.3.29.RELEASE` | `compile` |
| 202 | `org.springframework` | `spring-webmvc` | `4.3.29.RELEASE` | `compile` |
| 203 | `org.springframework.boot` | `spring-boot` | `1.5.17.RELEASE` | `compile` |
| 204 | `org.springframework.boot` | `spring-boot-actuator` | `1.5.17.RELEASE` | `compile` |
| 205 | `org.springframework.boot` | `spring-boot-autoconfigure` | `1.5.17.RELEASE` | `compile` |
| 206 | `org.springframework.boot` | `spring-boot-starter` | `1.5.17.RELEASE` | `compile` |
| 207 | `org.springframework.boot` | `spring-boot-starter-actuator` | `1.5.17.RELEASE` | `compile` |
| 208 | `org.springframework.boot` | `spring-boot-starter-aop` | `1.5.17.RELEASE` | `compile` |
| 209 | `org.springframework.boot` | `spring-boot-starter-cache` | `1.5.17.RELEASE` | `compile` |
| 210 | `org.springframework.boot` | `spring-boot-starter-data-redis` | `1.5.17.RELEASE` | `compile` |
| 211 | `org.springframework.boot` | `spring-boot-starter-freemarker` | `1.5.17.RELEASE` | `compile` |
| 212 | `org.springframework.boot` | `spring-boot-starter-jdbc` | `1.5.17.RELEASE` | `compile` |
| 213 | `org.springframework.boot` | `spring-boot-starter-logging` | `1.5.17.RELEASE` | `compile` |
| 214 | `org.springframework.boot` | `spring-boot-starter-tomcat` | `1.5.17.RELEASE` | `compile` |
| 215 | `org.springframework.boot` | `spring-boot-starter-web` | `1.5.17.RELEASE` | `compile` |
| 216 | `org.springframework.cloud` | `spring-cloud-commons` | `1.3.5.RELEASE` | `compile` |
| 217 | `org.springframework.cloud` | `spring-cloud-consul-core` | `1.3.5.RELEASE` | `compile` |
| 218 | `org.springframework.cloud` | `spring-cloud-consul-discovery` | `1.3.5.RELEASE` | `compile` |
| 219 | `org.springframework.cloud` | `spring-cloud-context` | `1.3.5.RELEASE` | `compile` |
| 220 | `org.springframework.cloud` | `spring-cloud-netflix-core` | `1.4.6.RELEASE` | `compile` |
| 221 | `org.springframework.cloud` | `spring-cloud-netflix-hystrix-dashboard` | `1.4.6.RELEASE` | `compile` |
| 222 | `org.springframework.cloud` | `spring-cloud-starter` | `1.3.5.RELEASE` | `compile` |
| 223 | `org.springframework.cloud` | `spring-cloud-starter-consul` | `1.3.5.RELEASE` | `compile` |
| 224 | `org.springframework.cloud` | `spring-cloud-starter-consul-discovery` | `1.3.5.RELEASE` | `compile` |
| 225 | `org.springframework.cloud` | `spring-cloud-starter-netflix-archaius` | `1.4.6.RELEASE` | `compile` |
| 226 | `org.springframework.cloud` | `spring-cloud-starter-netflix-hystrix` | `1.4.6.RELEASE` | `compile` |
| 227 | `org.springframework.cloud` | `spring-cloud-starter-netflix-hystrix-dashboard` | `1.4.6.RELEASE` | `compile` |
| 228 | `org.springframework.cloud` | `spring-cloud-starter-netflix-ribbon` | `1.4.6.RELEASE` | `compile` |
| 229 | `org.springframework.cloud` | `spring-cloud-starter-openfeign` | `1.4.6.RELEASE` | `compile` |
| 230 | `org.springframework.cloud` | `spring-cloud-starter-ribbon` | `1.4.6.RELEASE` | `compile` |
| 231 | `org.springframework.data` | `spring-data-commons` | `1.13.16.RELEASE` | `compile` |
| 232 | `org.springframework.data` | `spring-data-keyvalue` | `1.2.16.RELEASE` | `compile` |
| 233 | `org.springframework.data` | `spring-data-redis` | `1.8.16.RELEASE` | `compile` |
| 234 | `org.springframework.security` | `spring-security-crypto` | `4.2.9.RELEASE` | `compile` |
| 235 | `org.springframework.security` | `spring-security-rsa` | `1.0.3.RELEASE` | `compile` |
| 236 | `org.webjars` | `d3js` | `3.4.11` | `compile` |
| 237 | `org.webjars` | `jquery` | `2.1.1` | `compile` |
| 238 | `org.xerial.snappy` | `snappy-java` | `1.1.7.3` | `compile` |
| 239 | `org.yaml` | `snakeyaml` | `1.17` | `compile` |
| 240 | `redis.clients` | `jedis` | `2.9.0` | `compile` |
| 241 | `stax` | `stax-api` | `1.0.1` | `compile` |
| 242 | `xml-apis` | `xml-apis` | `1.4.01` | `compile` |
---
## 2. 二进制方式(嵌套 JAR + pom.properties
- **V1**`lib/*.jar`
- **V2**:自动检测为 `lib/*.jar`(与 spring-boot-maven-plugin 1.3.x + Boot 1.5 一致时为 `lib/`)。
对每个嵌套 jar 读取 `META-INF/maven/**/pom.properties` 得到 `groupId:artifactId:version`;无法读取时记为 `?:?:?`(多为无 Maven 元数据的第三方包)。
### 2.1 仅在 V1 出现的坐标(相对 V2 二进制集合)
**共 41 项**
| groupId:artifactId:version | V1 嵌套路径 |
|------------------------------|-------------|
| `cn.cloudwalk.elevator:cw-elevator-application-common:1.0-SNAPSHOT` | `lib/cw-elevator-application-common-1.0-SNAPSHOT.jar` |
| `cn.cloudwalk.elevator:cw-elevator-application-data:1.0-SNAPSHOT` | `lib/cw-elevator-application-data-1.0-SNAPSHOT.jar` |
| `cn.cloudwalk.elevator:cw-elevator-application-service:1.0-SNAPSHOT` | `lib/cw-elevator-application-service-1.0-SNAPSHOT.jar` |
| `cn.cloudwalk.elevator:cw-elevator-application-web:1.0-SNAPSHOT` | `lib/cw-elevator-application-web-1.0-SNAPSHOT.jar` |
| `org.apache.maven.wagon:wagon-provider-api:1.0-beta-2` | `lib/wagon-provider-api-1.0-beta-2.jar` |
| `org.apache.maven:maven-artifact-manager:2.0.5` | `lib/maven-artifact-manager-2.0.5.jar` |
| `org.apache.maven:maven-artifact:2.0.5` | `lib/maven-artifact-2.0.5.jar` |
| `org.apache.maven:maven-model:2.0.5` | `lib/maven-model-2.0.5.jar` |
| `org.apache.maven:maven-plugin-api:2.0.5` | `lib/maven-plugin-api-2.0.5.jar` |
| `org.apache.maven:maven-profile:2.0.5` | `lib/maven-profile-2.0.5.jar` |
| `org.apache.maven:maven-project:2.0.5` | `lib/maven-project-2.0.5.jar` |
| `org.apache.maven:maven-repository-metadata:2.0.5` | `lib/maven-repository-metadata-2.0.5.jar` |
| `org.apache.maven:maven-settings:2.0.5` | `lib/maven-settings-2.0.5.jar` |
| `org.codehaus.plexus:plexus-container-default:1.0-alpha-9` | `lib/plexus-container-default-1.0-alpha-9.jar` |
| `org.codehaus.plexus:plexus-utils:1.1` | `lib/plexus-utils-1.1.jar` |
| `org.jfrog.jade.plugins.common:jade-plugin-common:1.3.8` | `lib/jade-plugin-common-1.3.8.jar` |
| `org.jfrog.maven.annomojo:maven-plugin-anno:1.4.1` | `lib/maven-plugin-anno-1.4.1.jar` |
| `org.reflections:reflections-maven:0.9.9-RC2` | `lib/reflections-maven-0.9.9-RC2.jar` |
| `org.springside:springside-core:4.2.3-GA` | `lib/springside-core-4.2.3-GA.jar` |
| `unresolved:annotations-2.0.0.jar` | `lib/annotations-2.0.0.jar` |
| `unresolved:ant-1.6.5.jar` | `lib/ant-1.6.5.jar` |
| `unresolved:ant-apache-bsf-1.9.4.jar` | `lib/ant-apache-bsf-1.9.4.jar` |
| `unresolved:ant-jakarta-oro-1.6.1.jar` | `lib/ant-jakarta-oro-1.6.1.jar` |
| `unresolved:ant-nodeps-1.8.1.jar` | `lib/ant-nodeps-1.8.1.jar` |
| `unresolved:asm-5.0.3.jar` | `lib/asm-5.0.3.jar` |
| `unresolved:asm-analysis-5.0.3.jar` | `lib/asm-analysis-5.0.3.jar` |
| `unresolved:asm-tree-5.0.3.jar` | `lib/asm-tree-5.0.3.jar` |
| `unresolved:asm-util-5.0.3.jar` | `lib/asm-util-5.0.3.jar` |
| `unresolved:bsf-2.4.0.jar` | `lib/bsf-2.4.0.jar` |
| `unresolved:classworlds-1.1-alpha-2.jar` | `lib/classworlds-1.1-alpha-2.jar` |
| `unresolved:feign-core-8.18.0.jar` | `lib/feign-core-8.18.0.jar` |
| `unresolved:feign-okhttp-8.18.0.jar` | `lib/feign-okhttp-8.18.0.jar` |
| `unresolved:hamcrest-core-1.3.jar` | `lib/hamcrest-core-1.3.jar` |
| `unresolved:jdom-1.1.2.jar` | `lib/jdom-1.1.2.jar` |
| `unresolved:junit-4.12.jar` | `lib/junit-4.12.jar` |
| `unresolved:lombok-1.16.18.jar` | `lib/lombok-1.16.18.jar` |
| `unresolved:parboiled-core-1.1.7.jar` | `lib/parboiled-core-1.1.7.jar` |
| `unresolved:parboiled-java-1.1.7.jar` | `lib/parboiled-java-1.1.7.jar` |
| `unresolved:pegdown-1.6.0.jar` | `lib/pegdown-1.6.0.jar` |
| `unresolved:xpp3-1.1.3.4-RC8.jar` | `lib/xpp3-1.1.3.4-RC8.jar` |
| `unresolved:xstream-1.1.3.jar` | `lib/xstream-1.1.3.jar` |
### 2.2 仅在 V2 出现的坐标(相对 V1 二进制集合)
**共 14 项**
| groupId:artifactId:version | V2 嵌套路径 |
|------------------------------|-------------|
| `cn.cloudwalk.elevator:cw-elevator-application-common:2.0-SNAPSHOT` | `lib/cw-elevator-application-common-2.0-SNAPSHOT.jar` |
| `cn.cloudwalk.elevator:cw-elevator-application-data:2.0-SNAPSHOT` | `lib/cw-elevator-application-data-2.0-SNAPSHOT.jar` |
| `cn.cloudwalk.elevator:cw-elevator-application-service:2.0-SNAPSHOT` | `lib/cw-elevator-application-service-2.0-SNAPSHOT.jar` |
| `cn.cloudwalk.elevator:cw-elevator-application-web:2.0-SNAPSHOT` | `lib/cw-elevator-application-web-2.0-SNAPSHOT.jar` |
| `com.google.code.findbugs:jsr305:3.0.2` | `lib/jsr305-3.0.2.jar` |
| `io.github.openfeign:feign-okhttp:9.5.0` | `lib/feign-okhttp-9.5.0.jar` |
| `javax.annotation:javax.annotation-api:1.3.2` | `lib/javax.annotation-api-1.3.2.jar` |
| `net.bytebuddy:byte-buddy-dep:1.9.6` | `lib/byte-buddy-dep-1.9.6.jar` |
| `org.hibernate.validator:hibernate-validator:6.0.22.Final` | `lib/hibernate-validator-6.0.22.Final.jar` |
| `org.jctools:jctools-core:2.1.1` | `lib/jctools-core-2.1.1.jar` |
| `unresolved:annotations-2.0.1.jar` | `lib/annotations-2.0.1.jar` |
| `unresolved:asm-7.3.1.jar` | `lib/asm-7.3.1.jar` |
| `unresolved:asm-commons-7.0.jar` | `lib/asm-commons-7.0.jar` |
| `unresolved:lombok-1.16.22.jar` | `lib/lombok-1.16.22.jar` |
### 2.2.1 同名构件(groupId:artifactId)在 V1 与 V2 中的版本集合差异
由嵌套 jar 的 `pom.properties` 聚合:若同一 **GA** 在 V1、V2 中均能解析出版本,且 **version 集合不同**,则单独列出(与 §2.1 / §2.2 中分列的 `g:a:v` 键互为补充)。**不含**仅一侧出现的 GA。
**共 4 项**
| groupId:artifactId | V1 version(s) | V2 version(s) |
|--------------------|---------------|---------------|
| `cn.cloudwalk.elevator:cw-elevator-application-common` | `1.0-SNAPSHOT` | `2.0-SNAPSHOT` |
| `cn.cloudwalk.elevator:cw-elevator-application-data` | `1.0-SNAPSHOT` | `2.0-SNAPSHOT` |
| `cn.cloudwalk.elevator:cw-elevator-application-service` | `1.0-SNAPSHOT` | `2.0-SNAPSHOT` |
| `cn.cloudwalk.elevator:cw-elevator-application-web` | `1.0-SNAPSHOT` | `2.0-SNAPSHOT` |
### 2.3 两边均存在且坐标一致的依赖
**共 228 项**(名称版本完全一致)。
<details>
<summary>展开长表</summary>
| groupId:artifactId:version |
|------------------------------|
| `ch.qos.logback:logback-classic:1.1.11` |
| `ch.qos.logback:logback-core:1.1.11` |
| `cn.cloudwalk.cloud:cloudwalk-common-event:3.7.2-Brussels-SRX` |
| `cn.cloudwalk.cloud:cloudwalk-common-result:3.7.2-Brussels-SRX` |
| `cn.cloudwalk.cloud:cloudwalk-common-serial:3.7.2-Brussels-SRX` |
| `cn.cloudwalk.cloud:cloudwalk-common-service:3.7.2-Brussels-SRX` |
| `cn.cloudwalk.cloud:cloudwalk-common-web:3.7.2-Brussels-SRX` |
| `cn.cloudwalk.cloud:cloudwalk-device-manager-common:2.0.2` |
| `cn.cloudwalk.cloud:cloudwalk-device-manager-interface:2.0.2` |
| `cn.cloudwalk.cloud:cwos-common-aks-interface:1.0.0-SNAPSHOT` |
| `cn.cloudwalk.cloud:cwos-component-resource-data:1.0.0-SNAPSHOT` |
| `cn.cloudwalk.cloud:cwos-component-resource-interface:1.0.0-SNAPSHOT` |
| `cn.cloudwalk.cloud:cwos-device-authentication-interface:1.0.0-SNAPSHOT` |
| `cn.cloudwalk.cloud:cwos-sdk-event:1.5.0-SNAPSHOT` |
| `cn.cloudwalk.intelligent:cloudwalk-intelligent-component-lock:1.1.1-SNAPSHOT` |
| `cn.cloudwalk.intelligent:davinci-manager-common:1.1.7-SNAPSHOT` |
| `cn.cloudwalk.intelligent:davinci-manager-storage:1.1.7-SNAPSHOT` |
| `cn.cloudwalk.intelligent:intelligent-cwoscomponent-interface:2.9.2-xinghewan` |
| `cn.cloudwalk.intelligent:intelligent-cwoscomponent-rest:2.9.2-xinghewan` |
| `cn.cloudwalk:cloudwalk-device-sdk-protocol-entity:2.2.0` |
| `cn.cloudwalk:cwos-java-sdk-resource:1.0.0-SNAPSHOT` |
| `cn.cloudwalk:cwos-portal-interface:1.0.0-SNAPSHOT` |
| `com.alibaba:fastjson:1.2.73` |
| `com.aliyun:aliyun-java-sdk-core:3.2.8` |
| `com.aliyun:aliyun-java-sdk-dysmsapi:1.1.0` |
| `com.fasterxml.jackson.core:jackson-annotations:2.11.2` |
| `com.fasterxml.jackson.core:jackson-core:2.11.2` |
| `com.fasterxml.jackson.core:jackson-databind:2.11.2` |
| `com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.2` |
| `com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.2` |
| `com.fasterxml.jackson.module:jackson-module-afterburner:2.11.2` |
| `com.fasterxml:classmate:1.3.4` |
| `com.github.jsqlparser:jsqlparser:1.2` |
| `com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5` |
| `com.github.pagehelper:pagehelper:5.1.2` |
| `com.github.virtuald:curvesapi:1.04` |
| `com.google.code.gson:gson:2.8.5` |
| `com.google.guava:guava:20.0` |
| `com.google.zxing:core:3.3.3` |
| `com.squareup.okhttp3:okhttp:3.2.0` |
| `com.squareup.okio:okio:1.6.0` |
| `com.sun.jersey.contribs:jersey-apache-client4:1.19.1` |
| `com.sun.jersey:jersey-client:1.19.1` |
| `com.sun.jersey:jersey-core:1.19.1` |
| `com.zaxxer:HikariCP:2.5.1` |
| `commons-codec:commons-codec:1.10` |
| `commons-collections:commons-collections:3.2.2` |
| `commons-configuration:commons-configuration:1.8` |
| `commons-fileupload:commons-fileupload:1.3.1` |
| `commons-io:commons-io:2.5` |
| `commons-lang:commons-lang:2.6` |
| `commons-logging:commons-logging:1.2` |
| `de.ruedigermoeller:fst:2.56` |
| `io.github.openfeign.form:feign-form-spring:3.0.3` |
| `io.github.openfeign.form:feign-form:3.0.3` |
| `io.github.openfeign:feign-core:9.5.0` |
| `io.github.openfeign:feign-hystrix:9.5.0` |
| `io.github.openfeign:feign-slf4j:9.5.0` |
| `io.netty:netty-buffer:4.1.33.Final` |
| `io.netty:netty-codec-dns:4.1.33.Final` |
| `io.netty:netty-codec:4.1.33.Final` |
| `io.netty:netty-common:4.1.33.Final` |
| `io.netty:netty-handler:4.1.33.Final` |
| `io.netty:netty-resolver-dns:4.1.33.Final` |
| `io.netty:netty-resolver:4.1.33.Final` |
| `io.netty:netty-transport:4.1.33.Final` |
| `javax.cache:cache-api:1.0.0` |
| `javax.mail:mail:1.4.4` |
| `javax.validation:validation-api:1.1.0.Final` |
| `javax.ws.rs:jsr311-api:1.1.1` |
| `joda-time:joda-time:2.9.9` |
| `net.bytebuddy:byte-buddy:1.9.6` |
| `net.coobird:thumbnailator:0.4.8` |
| `net.lingala.zip4j:zip4j:2.6.2` |
| `net.sf.ehcache:ehcache:2.10.5` |
| `net.sf.opencsv:opencsv:2.3` |
| `org.antlr:antlr4-runtime:4.7.2` |
| `org.apache.commons:commons-collections4:4.1` |
| `org.apache.commons:commons-compress:1.9` |
| `org.apache.commons:commons-lang3:3.5` |
| `org.apache.commons:commons-pool2:2.4.3` |
| `org.apache.httpcomponents:httpclient:4.5.6` |
| `org.apache.httpcomponents:httpcore:4.4.10` |
| `org.apache.shardingsphere:encrypt-core-merge:4.0.0` |
| `org.apache.shardingsphere:encrypt-core-rewrite:4.0.0` |
| `org.apache.shardingsphere:sharding-core-api:4.0.0` |
| `org.apache.shardingsphere:sharding-core-common:4.0.0` |
| `org.apache.shardingsphere:sharding-core-entry:4.0.0` |
| `org.apache.shardingsphere:sharding-core-execute:4.0.0` |
| `org.apache.shardingsphere:sharding-core-merge:4.0.0` |
| `org.apache.shardingsphere:sharding-core-rewrite:4.0.0` |
| `org.apache.shardingsphere:sharding-core-route:4.0.0` |
| `org.apache.shardingsphere:sharding-jdbc-core:4.0.0` |
| `org.apache.shardingsphere:sharding-jdbc-spring-boot-starter:4.0.0` |
| `org.apache.shardingsphere:sharding-spring-boot-util:4.0.0` |
| `org.apache.shardingsphere:sharding-transaction-core:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-execute:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-merge:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-rewrite-engine:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-spi:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-sql-parser-engine:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-sql-parser-mysql:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-sql-parser-oracle:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-sql-parser-postgresql:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-sql-parser-relation:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-sql-parser-spi:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-sql-parser-sql92:4.0.0` |
| `org.apache.shardingsphere:shardingsphere-sql-parser-sqlserver:4.0.0` |
| `org.hdrhistogram:HdrHistogram:2.1.9` |
| `org.hibernate:hibernate-validator:5.3.6.Final` |
| `org.javassist:javassist:3.21.0-GA` |
| `org.jboss.logging:jboss-logging:3.3.2.Final` |
| `org.jsoup:jsoup:1.9.2` |
| `org.jvnet:animal-sniffer-annotation:1.0` |
| `org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.1` |
| `org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1` |
| `org.mybatis:mybatis-spring:1.3.2` |
| `org.mybatis:mybatis:3.4.6` |
| `org.redisson:redisson-spring-boot-starter:2.15.2` |
| `org.redisson:redisson-spring-data-18:2.15.2` |
| `org.redisson:redisson:2.15.2` |
| `org.reflections:reflections:0.9.9-RC2` |
| `org.slf4j:jcl-over-slf4j:1.7.25` |
| `org.slf4j:jul-to-slf4j:1.7.25` |
| `org.slf4j:log4j-over-slf4j:1.7.25` |
| `org.slf4j:slf4j-api:1.7.25` |
| `org.springframework.boot:spring-boot-actuator:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-autoconfigure:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter-actuator:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter-aop:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter-cache:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter-data-redis:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter-freemarker:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter-jdbc:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter-logging:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter-tomcat:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter-web:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot-starter:1.5.17.RELEASE` |
| `org.springframework.boot:spring-boot:1.5.17.RELEASE` |
| `org.springframework.cloud:spring-cloud-commons:1.3.5.RELEASE` |
| `org.springframework.cloud:spring-cloud-consul-core:1.3.5.RELEASE` |
| `org.springframework.cloud:spring-cloud-consul-discovery:1.3.5.RELEASE` |
| `org.springframework.cloud:spring-cloud-context:1.3.5.RELEASE` |
| `org.springframework.cloud:spring-cloud-netflix-core:1.4.6.RELEASE` |
| `org.springframework.cloud:spring-cloud-netflix-hystrix-dashboard:1.4.6.RELEASE` |
| `org.springframework.cloud:spring-cloud-starter-consul-discovery:1.3.5.RELEASE` |
| `org.springframework.cloud:spring-cloud-starter-consul:1.3.5.RELEASE` |
| `org.springframework.cloud:spring-cloud-starter-netflix-archaius:1.4.6.RELEASE` |
| `org.springframework.cloud:spring-cloud-starter-netflix-hystrix-dashboard:1.4.6.RELEASE` |
| `org.springframework.cloud:spring-cloud-starter-netflix-hystrix:1.4.6.RELEASE` |
| `org.springframework.cloud:spring-cloud-starter-netflix-ribbon:1.4.6.RELEASE` |
| `org.springframework.cloud:spring-cloud-starter-openfeign:1.4.6.RELEASE` |
| `org.springframework.cloud:spring-cloud-starter-ribbon:1.4.6.RELEASE` |
| `org.springframework.cloud:spring-cloud-starter:1.3.5.RELEASE` |
| `org.springframework.data:spring-data-commons:1.13.16.RELEASE` |
| `org.springframework.data:spring-data-keyvalue:1.2.16.RELEASE` |
| `org.springframework.data:spring-data-redis:1.8.16.RELEASE` |
| `org.springframework.security:spring-security-rsa:1.0.3.BUILD-SNAPSHOT` |
| `org.webjars:d3js:3.4.11` |
| `org.webjars:jquery:2.1.1` |
| `org.yaml:snakeyaml:1.17` |
| `redis.clients:jedis:2.9.0` |
| `unresolved:activation-1.1.jar` |
| `unresolved:ant-1.9.6.jar` |
| `unresolved:ant-launcher-1.9.6.jar` |
| `unresolved:archaius-core-0.6.6.jar` |
| `unresolved:aspectjweaver-1.8.13.jar` |
| `unresolved:bcpkix-jdk15on-1.55.jar` |
| `unresolved:bcprov-jdk15on-1.55.jar` |
| `unresolved:consul-api-1.3.0.jar` |
| `unresolved:dom4j-1.6.1.jar` |
| `unresolved:freemarker-2.3.28.jar` |
| `unresolved:groovy-2.4.5-indy.jar` |
| `unresolved:hystrix-core-1.5.12.jar` |
| `unresolved:hystrix-javanica-1.5.12.jar` |
| `unresolved:hystrix-metrics-event-stream-1.5.12.jar` |
| `unresolved:hystrix-serialization-1.5.12.jar` |
| `unresolved:javax.inject-1.jar` |
| `unresolved:jodd-bean-3.7.1.jar` |
| `unresolved:jodd-core-3.7.1.jar` |
| `unresolved:kafka-clients-2.3.0.jar` |
| `unresolved:lz4-java-1.6.0.jar` |
| `unresolved:mysql-connector-java-5.1.47.jar` |
| `unresolved:netflix-commons-util-0.1.1.jar` |
| `unresolved:netflix-statistics-0.1.1.jar` |
| `unresolved:objenesis-2.1.jar` |
| `unresolved:poi-3.15.jar` |
| `unresolved:poi-ooxml-3.15.jar` |
| `unresolved:poi-ooxml-schemas-3.15.jar` |
| `unresolved:reactive-streams-1.0.2.jar` |
| `unresolved:reactor-core-2.0.8.RELEASE.jar` |
| `unresolved:reactor-stream-2.0.8.RELEASE.jar` |
| `unresolved:ribbon-2.2.5.jar` |
| `unresolved:ribbon-core-2.2.5.jar` |
| `unresolved:ribbon-httpclient-2.2.5.jar` |
| `unresolved:ribbon-loadbalancer-2.2.5.jar` |
| `unresolved:ribbon-transport-2.2.5.jar` |
| `unresolved:rxjava-1.2.0.jar` |
| `unresolved:rxjava-2.1.13.jar` |
| `unresolved:rxnetty-0.4.9.jar` |
| `unresolved:rxnetty-contexts-0.4.9.jar` |
| `unresolved:rxnetty-servo-0.4.9.jar` |
| `unresolved:servo-core-0.10.1.jar` |
| `unresolved:servo-internal-0.10.1.jar` |
| `unresolved:snappy-java-1.1.7.3.jar` |
| `unresolved:spring-aop-4.3.29.RELEASE.jar` |
| `unresolved:spring-aspects-4.3.29.RELEASE.jar` |
| `unresolved:spring-beans-4.3.29.RELEASE.jar` |
| `unresolved:spring-context-4.3.29.RELEASE.jar` |
| `unresolved:spring-context-support-4.3.29.RELEASE.jar` |
| `unresolved:spring-core-4.3.29.RELEASE.jar` |
| `unresolved:spring-expression-4.3.29.RELEASE.jar` |
| `unresolved:spring-jdbc-4.3.29.RELEASE.jar` |
| `unresolved:spring-oxm-4.3.29.RELEASE.jar` |
| `unresolved:spring-security-crypto-4.2.9.RELEASE.jar` |
| `unresolved:spring-tx-4.3.29.RELEASE.jar` |
| `unresolved:spring-web-4.3.29.RELEASE.jar` |
| `unresolved:spring-webmvc-4.3.29.RELEASE.jar` |
| `unresolved:stax-api-1.0.1.jar` |
| `unresolved:tomcat-annotations-api-8.5.34.jar` |
| `unresolved:tomcat-embed-core-8.5.34.jar` |
| `unresolved:tomcat-embed-el-8.5.34.jar` |
| `unresolved:tomcat-embed-websocket-8.5.34.jar` |
| `unresolved:tomcat-jdbc-8.5.34.jar` |
| `unresolved:tomcat-juli-8.5.34.jar` |
| `unresolved:xml-apis-1.4.01.jar` |
| `unresolved:xmlbeans-2.6.0.jar` |
| `unresolved:zstd-jni-1.4.0-1.jar` |
</details>
### 2.4 V2 二进制坐标 vs Maven dependency:list
- **版本字符串不一致**:例如 reactor 在 `dependency:list` 中为 **`2.0-SNAPSHOT`**,而 fat-jar 内嵌模块 **`cw-elevator-application-*-2.0.6.jar`** 的 `pom.properties`**`2.0.6`**,字符串比对会视为「仅一侧存在」,属**同名构件不同表述**,非缺失依赖。
- **在 dependency:list 中但不在嵌套 jar 元数据中的**:多为 **仅存在于解析树、与本模块 jar 文件命名不一致**,需对照 §1 表格。
- **未解析 `unresolved:*`**:见 §3,此类条目不参与坐标相等判断。
- **仅在 Maven listruntime**71 项
|坐标|
|----|
| `com.ecwid.consul:consul-api:1.3.0` |
| `com.github.luben:zstd-jni:1.4.0-1` |
| `com.google.code.findbugs:annotations:2.0.1` |
| `com.netflix.archaius:archaius-core:0.6.6` |
| `com.netflix.hystrix:hystrix-core:1.5.12` |
| `com.netflix.hystrix:hystrix-javanica:1.5.12` |
| `com.netflix.hystrix:hystrix-metrics-event-stream:1.5.12` |
| `com.netflix.hystrix:hystrix-serialization:1.5.12` |
| `com.netflix.netflix-commons:netflix-commons-util:0.1.1` |
| `com.netflix.netflix-commons:netflix-statistics:0.1.1` |
| `com.netflix.ribbon:ribbon-core:2.2.5` |
| `com.netflix.ribbon:ribbon-httpclient:2.2.5` |
| `com.netflix.ribbon:ribbon-loadbalancer:2.2.5` |
| `com.netflix.ribbon:ribbon-transport:2.2.5` |
| `com.netflix.ribbon:ribbon:2.2.5` |
| `com.netflix.servo:servo-core:0.10.1` |
| `com.netflix.servo:servo-internal:0.10.1` |
| `dom4j:dom4j:1.6.1` |
| `io.projectreactor:reactor-core:2.0.8.RELEASE` |
| `io.projectreactor:reactor-stream:2.0.8.RELEASE` |
| `io.reactivex.rxjava2:rxjava:2.1.13` |
| `io.reactivex:rxjava:1.2.0` |
| `io.reactivex:rxnetty-contexts:0.4.9` |
| `io.reactivex:rxnetty-servo:0.4.9` |
| `io.reactivex:rxnetty:0.4.9` |
| `javax.activation:activation:1.1` |
| `javax.inject:javax.inject:1` |
| `mysql:mysql-connector-java:5.1.47` |
| `org.apache.ant:ant-launcher:1.9.6` |
| `org.apache.ant:ant:1.9.6` |
| `org.apache.kafka:kafka-clients:2.3.0` |
| `org.apache.poi:poi-ooxml-schemas:3.15` |
| `org.apache.poi:poi-ooxml:3.15` |
| `org.apache.poi:poi:3.15` |
| `org.apache.tomcat.embed:tomcat-embed-core:8.5.34` |
| `org.apache.tomcat.embed:tomcat-embed-el:8.5.34` |
| `org.apache.tomcat.embed:tomcat-embed-websocket:8.5.34` |
| `org.apache.tomcat:tomcat-annotations-api:8.5.34` |
| `org.apache.tomcat:tomcat-jdbc:8.5.34` |
| `org.apache.tomcat:tomcat-juli:8.5.34` |
| `org.apache.xmlbeans:xmlbeans:2.6.0` |
| `org.aspectj:aspectjweaver:1.8.13` |
| `org.bouncycastle:bcpkix-jdk15on:1.55` |
| `org.bouncycastle:bcprov-jdk15on:1.55` |
| `org.codehaus.groovy:groovy:indy` |
| `org.freemarker:freemarker:2.3.28` |
| `org.jodd:jodd-bean:3.7.1` |
| `org.jodd:jodd-core:3.7.1` |
| `org.lz4:lz4-java:1.6.0` |
| `org.objenesis:objenesis:2.1` |
| `org.ow2.asm:asm-commons:7.0` |
| `org.ow2.asm:asm:7.3.1` |
| `org.projectlombok:lombok:1.16.22` |
| `org.reactivestreams:reactive-streams:1.0.2` |
| `org.springframework.security:spring-security-crypto:4.2.9.RELEASE` |
| `org.springframework.security:spring-security-rsa:1.0.3.RELEASE` |
| `org.springframework:spring-aop:4.3.29.RELEASE` |
| `org.springframework:spring-aspects:4.3.29.RELEASE` |
| `org.springframework:spring-beans:4.3.29.RELEASE` |
| `org.springframework:spring-context-support:4.3.29.RELEASE` |
| `org.springframework:spring-context:4.3.29.RELEASE` |
| `org.springframework:spring-core:4.3.29.RELEASE` |
| `org.springframework:spring-expression:4.3.29.RELEASE` |
| `org.springframework:spring-jdbc:4.3.29.RELEASE` |
| `org.springframework:spring-oxm:4.3.29.RELEASE` |
| `org.springframework:spring-tx:4.3.29.RELEASE` |
| `org.springframework:spring-web:4.3.29.RELEASE` |
| `org.springframework:spring-webmvc:4.3.29.RELEASE` |
| `org.xerial.snappy:snappy-java:1.1.7.3` |
| `stax:stax-api:1.0.1` |
| `xml-apis:xml-apis:1.4.01` |
- **仅在二进制坐标集合**:71 项
|坐标|
|----|
| `org.springframework.security:spring-security-rsa:1.0.3.BUILD-SNAPSHOT` |
| `unresolved:activation-1.1.jar` |
| `unresolved:annotations-2.0.1.jar` |
| `unresolved:ant-1.9.6.jar` |
| `unresolved:ant-launcher-1.9.6.jar` |
| `unresolved:archaius-core-0.6.6.jar` |
| `unresolved:asm-7.3.1.jar` |
| `unresolved:asm-commons-7.0.jar` |
| `unresolved:aspectjweaver-1.8.13.jar` |
| `unresolved:bcpkix-jdk15on-1.55.jar` |
| `unresolved:bcprov-jdk15on-1.55.jar` |
| `unresolved:consul-api-1.3.0.jar` |
| `unresolved:dom4j-1.6.1.jar` |
| `unresolved:freemarker-2.3.28.jar` |
| `unresolved:groovy-2.4.5-indy.jar` |
| `unresolved:hystrix-core-1.5.12.jar` |
| `unresolved:hystrix-javanica-1.5.12.jar` |
| `unresolved:hystrix-metrics-event-stream-1.5.12.jar` |
| `unresolved:hystrix-serialization-1.5.12.jar` |
| `unresolved:javax.inject-1.jar` |
| `unresolved:jodd-bean-3.7.1.jar` |
| `unresolved:jodd-core-3.7.1.jar` |
| `unresolved:kafka-clients-2.3.0.jar` |
| `unresolved:lombok-1.16.22.jar` |
| `unresolved:lz4-java-1.6.0.jar` |
| `unresolved:mysql-connector-java-5.1.47.jar` |
| `unresolved:netflix-commons-util-0.1.1.jar` |
| `unresolved:netflix-statistics-0.1.1.jar` |
| `unresolved:objenesis-2.1.jar` |
| `unresolved:poi-3.15.jar` |
| `unresolved:poi-ooxml-3.15.jar` |
| `unresolved:poi-ooxml-schemas-3.15.jar` |
| `unresolved:reactive-streams-1.0.2.jar` |
| `unresolved:reactor-core-2.0.8.RELEASE.jar` |
| `unresolved:reactor-stream-2.0.8.RELEASE.jar` |
| `unresolved:ribbon-2.2.5.jar` |
| `unresolved:ribbon-core-2.2.5.jar` |
| `unresolved:ribbon-httpclient-2.2.5.jar` |
| `unresolved:ribbon-loadbalancer-2.2.5.jar` |
| `unresolved:ribbon-transport-2.2.5.jar` |
| `unresolved:rxjava-1.2.0.jar` |
| `unresolved:rxjava-2.1.13.jar` |
| `unresolved:rxnetty-0.4.9.jar` |
| `unresolved:rxnetty-contexts-0.4.9.jar` |
| `unresolved:rxnetty-servo-0.4.9.jar` |
| `unresolved:servo-core-0.10.1.jar` |
| `unresolved:servo-internal-0.10.1.jar` |
| `unresolved:snappy-java-1.1.7.3.jar` |
| `unresolved:spring-aop-4.3.29.RELEASE.jar` |
| `unresolved:spring-aspects-4.3.29.RELEASE.jar` |
| `unresolved:spring-beans-4.3.29.RELEASE.jar` |
| `unresolved:spring-context-4.3.29.RELEASE.jar` |
| `unresolved:spring-context-support-4.3.29.RELEASE.jar` |
| `unresolved:spring-core-4.3.29.RELEASE.jar` |
| `unresolved:spring-expression-4.3.29.RELEASE.jar` |
| `unresolved:spring-jdbc-4.3.29.RELEASE.jar` |
| `unresolved:spring-oxm-4.3.29.RELEASE.jar` |
| `unresolved:spring-security-crypto-4.2.9.RELEASE.jar` |
| `unresolved:spring-tx-4.3.29.RELEASE.jar` |
| `unresolved:spring-web-4.3.29.RELEASE.jar` |
| `unresolved:spring-webmvc-4.3.29.RELEASE.jar` |
| `unresolved:stax-api-1.0.1.jar` |
| `unresolved:tomcat-annotations-api-8.5.34.jar` |
| `unresolved:tomcat-embed-core-8.5.34.jar` |
| `unresolved:tomcat-embed-el-8.5.34.jar` |
| `unresolved:tomcat-embed-websocket-8.5.34.jar` |
| `unresolved:tomcat-jdbc-8.5.34.jar` |
| `unresolved:tomcat-juli-8.5.34.jar` |
| `unresolved:xml-apis-1.4.01.jar` |
| `unresolved:xmlbeans-2.6.0.jar` |
| `unresolved:zstd-jni-1.4.0-1.jar` |
---
## 3. 无法解析 pom.properties 的嵌套 JAR(仅列文件名)
- **V1** 未解析条目:**88**
- `activation-1.1.jar`
- `annotations-2.0.0.jar`
- `ant-1.6.5.jar`
- `ant-1.9.6.jar`
- `ant-apache-bsf-1.9.4.jar`
- `ant-jakarta-oro-1.6.1.jar`
- `ant-launcher-1.9.6.jar`
- `ant-nodeps-1.8.1.jar`
- `archaius-core-0.6.6.jar`
- `asm-5.0.3.jar`
- `asm-analysis-5.0.3.jar`
- `asm-tree-5.0.3.jar`
- `asm-util-5.0.3.jar`
- `aspectjweaver-1.8.13.jar`
- `bcpkix-jdk15on-1.55.jar`
- `bcprov-jdk15on-1.55.jar`
- `bsf-2.4.0.jar`
- `classworlds-1.1-alpha-2.jar`
- `consul-api-1.3.0.jar`
- `dom4j-1.6.1.jar`
- `feign-core-8.18.0.jar`
- `feign-okhttp-8.18.0.jar`
- `freemarker-2.3.28.jar`
- `groovy-2.4.5-indy.jar`
- `hamcrest-core-1.3.jar`
- `hystrix-core-1.5.12.jar`
- `hystrix-javanica-1.5.12.jar`
- `hystrix-metrics-event-stream-1.5.12.jar`
- `hystrix-serialization-1.5.12.jar`
- `javax.inject-1.jar`
- `jdom-1.1.2.jar`
- `jodd-bean-3.7.1.jar`
- `jodd-core-3.7.1.jar`
- `junit-4.12.jar`
- `kafka-clients-2.3.0.jar`
- `lombok-1.16.18.jar`
- `lz4-java-1.6.0.jar`
- `mysql-connector-java-5.1.47.jar`
- `netflix-commons-util-0.1.1.jar`
- `netflix-statistics-0.1.1.jar`
- `objenesis-2.1.jar`
- `parboiled-core-1.1.7.jar`
- `parboiled-java-1.1.7.jar`
- `pegdown-1.6.0.jar`
- `poi-3.15.jar`
- `poi-ooxml-3.15.jar`
- `poi-ooxml-schemas-3.15.jar`
- `reactive-streams-1.0.2.jar`
- `reactor-core-2.0.8.RELEASE.jar`
- `reactor-stream-2.0.8.RELEASE.jar`
- … 省略 38 条
- **V2** 未解析条目:**70**
- `activation-1.1.jar`
- `annotations-2.0.1.jar`
- `ant-1.9.6.jar`
- `ant-launcher-1.9.6.jar`
- `archaius-core-0.6.6.jar`
- `asm-7.3.1.jar`
- `asm-commons-7.0.jar`
- `aspectjweaver-1.8.13.jar`
- `bcpkix-jdk15on-1.55.jar`
- `bcprov-jdk15on-1.55.jar`
- `consul-api-1.3.0.jar`
- `dom4j-1.6.1.jar`
- `freemarker-2.3.28.jar`
- `groovy-2.4.5-indy.jar`
- `hystrix-core-1.5.12.jar`
- `hystrix-javanica-1.5.12.jar`
- `hystrix-metrics-event-stream-1.5.12.jar`
- `hystrix-serialization-1.5.12.jar`
- `javax.inject-1.jar`
- `jodd-bean-3.7.1.jar`
- `jodd-core-3.7.1.jar`
- `kafka-clients-2.3.0.jar`
- `lombok-1.16.22.jar`
- `lz4-java-1.6.0.jar`
- `mysql-connector-java-5.1.47.jar`
- `netflix-commons-util-0.1.1.jar`
- `netflix-statistics-0.1.1.jar`
- `objenesis-2.1.jar`
- `poi-3.15.jar`
- `poi-ooxml-3.15.jar`
- `poi-ooxml-schemas-3.15.jar`
- `reactive-streams-1.0.2.jar`
- `reactor-core-2.0.8.RELEASE.jar`
- `reactor-stream-2.0.8.RELEASE.jar`
- `ribbon-2.2.5.jar`
- `ribbon-core-2.2.5.jar`
- `ribbon-httpclient-2.2.5.jar`
- `ribbon-loadbalancer-2.2.5.jar`
- `ribbon-transport-2.2.5.jar`
- `rxjava-1.2.0.jar`
- `rxjava-2.1.13.jar`
- `rxnetty-0.4.9.jar`
- `rxnetty-contexts-0.4.9.jar`
- `rxnetty-servo-0.4.9.jar`
- `servo-core-0.10.1.jar`
- `servo-internal-0.10.1.jar`
- `snappy-java-1.1.7.3.jar`
- `spring-aop-4.3.29.RELEASE.jar`
- `spring-aspects-4.3.29.RELEASE.jar`
- `spring-beans-4.3.29.RELEASE.jar`
- … 省略 20 条
@@ -0,0 +1,217 @@
# 电梯生产证据包差异分析(2026-04-30)
**证据根目录**(仓库内):[`maven-cw-elevator-application/logs/evidence/`](../../maven-cw-elevator-application/logs/evidence/)
本文基于 `collect_elevator_runtime_evidence.sh` 现场采集产出的三份时间戳目录,对**制品真实版本**、**本地配置**、**Consul 健康实例**、**日志关键行**与 **jcmd** 作对比。与历史排查主线的关系见 [`elevator-service-instance-missing-investigation.md`](elevator-service-instance-missing-investigation.md)。
---
## 1. 三份目录与「版本指纹」
| 目录 | 采集时间(`collected-at.txt` | `jar-path.txt` 展示名 | `jar.sha256.txt` | `jar-tf.txt` 内模块版本(lib | 说明 |
|------|-------------------------------|------------------------|------------------|--------------------------------|------|
| `elevator-evidence-20260430-112820` | 2026-04-30T11:28:20+0800 | `.../cw-elevator-application-V1.0.0.20211103.jar` | `8da5978a7b34...90544908` | **无**(当次未成功生成 `jar-tf` | 与 113912 **同一 JAR 字节**(见 sha256 |
| `elevator-evidence-20260430-113912` | 2026-04-30T11:39:12+0800 | 同上 | **同上** | 含 `cw-elevator-application-*-**2.0.7**.jar` | 可确认 fat-jar 内为 **Maven 2.0.7 发布结构** |
| `elevator-evidence-20260430-114350` | 2026-04-30T11:43:50+0800 | 同上 | `c087067de3f6...8942054`**不同** | 含 `cw-elevator-application-*-**1.0-SNAPSHOT**.jar` | **第三套制品**:与 113912 非同一文件;内嵌为 **SNAPSHOT 构件** |
**核心结论(勿仅看文件路径名)**
- 三份 `jar-path.txt` 的**文件名**均为历史目录 `cw-elevator-application-V1.0.0.20211103.jar`,但 **112820/113912 与 114350 的 sha256 不同**,说明现场曾**替换过**该路径上的 JAR 或 114350 采自**另一时刻/已换包**。
- **112820 与 113912** 的 sha256 **一致**,不是「V1 代码 vs V2 代码」的两套包,而是**同一物理 JAR 的两次采集**;区别仅在于 113912 多出了 `jar-tf.txt` / `java-version.txt` 等,用于认定模块版本为 **2.0.7**
- **114350** 代表另一制品:**内嵌 1.0-SNAPSHOT**,不得与「正式发布 2.0.7」混为一谈。
**JDK**113912、114350 的 `java-version.txt` 均为 **OpenJDK 1.8.0_41**(路径脚本写死 `/data/cwos/java`)。
---
## 2. 主轴对比:112820 ↔ 113912(同一 JAR、两轮采集)
| 维度 | 112820 | 113912 | 结论 |
|------|--------|--------|------|
| 磁盘 `application.properties` | 内容一致 | 一致 | `diff` **无差异** |
| 磁盘 `bootstrap.properties` | 一致 | 一致 | **无差异** |
| `proc-cmdline.txt` | `java -jar ... cw-elevator-application-V1.0.0.20211103.jar`(含 JDWP | **相同** | **无差异** |
| Consul `/v1/health/service/...?passing=true` | 各服务 **passing 数组长度均为 3** | **相同** | **无差异** |
| `elevator-app.log.keylines.txt` | 与 113912 同一时期的日志摘录 | 内容一致(同一日志切片) | **无实质环境差异** |
**小结**:此轴不宜表述为「V1 与 V2 运行态对比」,应表述为 **同一 2.0.7 制品(sha256 一致)在短时间内的两次证据归档**,第二次补充了 `jar tf` 与 JDK 版本文件。
---
## 3. 主轴对比:113912 ↔ 114350(两套不同 JAR
| 维度 | 113912 | 114350 | 结论 |
|------|--------|--------|------|
| `jar.sha256.txt` | `8da5978a...` | `c087067d...` | **不同文件** |
| fat-jar 内 `lib/cw-elevator-application-*.jar` | `*-2.0.7.jar` | `*-1.0-SNAPSHOT.jar` | **版本线不同** |
| 解压 `jar-application.properties.txt`BOOT-INF 内嵌默认) | `logging.level.*=debug``logging.path=/data/cwos/cw-elevator-application-V1.0.0.20211103/logs` | `logging.level.*=info``logging.path=logs` | **打包内嵌默认配置不同**(与磁盘目录 `application.properties` 可能再叠加覆盖) |
| 磁盘 `application.properties`(采集快照) | 需与 114350 目录单独比对 | | 以各目录下同名文件为准 |
**部署含义**
- **114350** 更符合「本地 Maven reactor **SNAPSHOT** 打出 fat-jar」的内嵌特征(`1.0-SNAPSHOT` + 内嵌 properties 为相对 `logs`)。
- **113912** 更符合「**发布流程 2.0.7**」打入的内嵌与 lib 版本。
若现场长期沿用目录名 `cw-elevator-application-V1.0.0.20211103` 仅替换 JAR,会出现「路径像 V1、内容实为 2.0.7 或 SNAPSHOT」——**必须以 sha256 + `jar tf` 为准**。
---
## 4. jcmd
三份目录的 `jcmd-system-properties.txt` 均为 **Attach 失败**`AttachNotSupportedException: Unable to open socket file`),无法对比进程内最终 system properties。后续现场需满足 JVM attach 条件后再采一次(或使用启动参数导出),否则 Ribbon/Feign 运行态只能依赖日志与磁盘配置。
---
## 5. 日志与 Ribbon 行为(三份 keylines 共性)
**112820 / 113912**`elevator-app.log.keylines.txt` 中可见一致现象(与 [`elevator-service-instance-missing-investigation.md`](elevator-service-instance-missing-investigation.md) 一致):
- **Consul 注册**`elevator-app` 成功注册(带 HTTP health)。
- **配置探针**:磁盘 `./bootstrap.properties``spring.cloud.consul.discovery.enabled=true`classpath 内嵌为 **false**(多源并存)。
- **`ninca-crk-std`**`DynamicServerListLoadBalancer` 使用 **`ConfigurationBasedServerList`**,但 **current list of Servers=[]**,随后出现 **`Load balancer does not have available server for client: ninca-crk-std`**。
- **其他客户端**(如 `cwos-portal``ninca-common`)日志中可见 Consul 解析出的 **3 台**实例。
**差异排查方向**(非本次证据目录两两 diff,而是现象归因):重点核对 **`ninca-crk-std` 的 Ribbon 静态列表 / `NincaCrkStdRibbonConfiguration` 生效路径**与 Consul 列表是否交替覆盖,详见上述 investigation 文档。
**114350**`elevator-app.log.keylines.txt` 与 113912 **文件不完全相同**`diff` 有差异),如需逐行对比可在本地对两份 keylines 执行 `diff -u`
---
## 6. `logs/evidence/elevator-app.log` 全量日志专项排查
**逐项走查(客户端名 / 时序 / Consul vs ConfigurationBased / bootstrap**:见 [`consul-ribbon-no-server-walkthrough.md`](consul-ribbon-no-server-walkthrough.md)。
针对 [`maven-cw-elevator-application/logs/evidence/elevator-app.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app.log) 进行额外统计与时间线复盘:
### 6.1 关键信号统计
- `Load balancer does not have available server for client: ninca-crk-std`**290** 次
- `ConfigurationBasedServerList`**1** 次
- `ConsulServerList`**7** 次
- 探针启动信号(`CONFIG SOURCE PROBE START` / `RIBBON...PROBE` / `CONSUL...PROBE` / `ELEVATOR DIAGNOSTIC PROBES`):仅 **2** 条(其中可见的为 `CONFIG SOURCE PROBE START`
### 6.2 时间线(同一日志内存在两次启动)
1. **第一次启动窗口(11:16**
- `11:16:24` Tomcat 启动、Consul 注册;
- `11:16:24` ConfigSourceProbeRunner 打印:`ninca-crk-std.ribbon.listOfServers value=null``ninca-crk-std.ip=10.0.22.102:16106`
- `11:16:34` `ninca-crk-std` 初始化为 `ConfigurationBasedServerList`,但 `current list of Servers=[]`
- 随后大量出现 `Load balancer does not have available server for client: ninca-crk-std`
2. **第二次启动窗口(11:43**
- `11:43:24` 再次出现 Tomcat 启动与 Consul 注册(说明同一日志内发生过重启);
- `11:43:35` `ninca-crk-std` 初始化时已是 `current list of Servers=[...:16106 x3]`
- 第二次窗口未见与第一次同规模的“空列表 + 连续 no available server”模式。
### 6.3 结合证据包的解释
- `112820` / `113912` 与第一次窗口行为一致,暴露出 `ninca-crk-std` 在该时段未拿到可用服务列表;
- `114350` 对应另一制品(`1.0-SNAPSHOT`)后,日志中出现 `ninca-crk-std` 能初始化出 3 台服务的信号;
- 因三份 Consul 健康快照均显示 `ninca-crk-std` passing=3,可初步排除「Consul 没有实例」这一外因,更可能是客户端侧配置/初始化时序/构件差异导致。
---
## 7. Consul 健康快照
三份目录中下列服务的 **passing 实例数(JSON 数组长度)一致**:均为 **3**`elevator-app``cwos-portal``ninca-common``ninca-common-component-organization``ninca-crk-std``cloudwalk-device-thirdparty`)。
说明:**本次采集窗口内** Consul 侧上游实例数量**未**成为三份包之间的差异变量;与 JVM 内 Ribbon 列表为空等问题需从 **客户端配置与负载均衡初始化顺序** 侧继续查。
---
## 8. 建议的后续动作
1. **命名归档**:在证据目录或工单中显式标注 **JAR sha256****`jar tf``cw-elevator-application-*` 版本**,避免「V1 目录名」误导。
2. **修复 jcmd 采集**:解决 attach 权限 / JVM 参数后重采,补齐 **进程内** `ribbon.*` / `feign.*`
3. **`ninca-crk-std`**:按 investigation 文档与 **下节第 1 条** 优先验证 `ribbon.listOfServers``ninca-crk-std.ip` 的关系。
---
## 9. 综合证据 + 日志 + 多进程后的「下一步方向」
### 9.1 已对齐的事实(减少走弯路)
| 来源 | 结论 |
|------|------|
| 三份 `consul-health-*.json` | 各上游(含 `ninca-crk-std`**passing 均为 3** |
| `ps-ef.txt`(随证据采集) | 各业务为**独立 Java 进程**;`ninca-crk-std` 在目标环境以**单独进程**形式存在(与电梯进程不同) |
| `proc-cmdline.txt` | 电梯进程为 `java -jar`,工作目录下 **`cw-elevator-application-V1.0.0.20211103.jar`**(文件名可与真实字节不一致,须看 sha256) |
| `elevator-app.log` | **同一日志两次启动**:首次 **11:16** `ninca-crk-std` 负载均衡 **Servers=[]**;重启后 **11:43** 同客户端出现 **3 台 :16106**,说明问题偏 **客户端 Ribbon 配置/初始化时序**,而非「现场没有 `ninca-crk-std` 进程」 |
### 9.2 优先验证:Ribbon 静态列表键 ≠ 业务 `ninca-crk-std.ip`
证据包内 **`application.properties`**(及仓库 [`deploy/v2-maven/application.properties`](../../maven-cw-elevator-application/deploy/v2-maven/application.properties))仅有:
- `ninca-crk-std.ip=10.0.22.102:16106`(供业务代码等使用)
而探针行显示:
- `ninca-crk-std.ribbon.listOfServers value=null`
电梯侧对 `ninca-crk-std` 使用 [`NincaCrkStdRibbonConfiguration`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java),其 `ConfigurationBasedServerList` **从 Ribbon 标准配置**(如 `ninca-crk-std.ribbon.listOfServers`)取服务器列表;**与 `ninca-crk-std.ip` 无自动绑定**`ninca-crk-std.ip` 在业务类中如 `AcsElevatorRecordServiceImpl``@Value` 使用)。
对照 [`deploy/v1-legacy/application.properties`](../../maven-cw-elevator-application/deploy/v1-legacy/application.properties) 中显式:
- `ninca-crk-std.ribbon.NIWSServerListClassName=...`
- `ninca-crk-std.ribbon.listOfServers=...`
**建议下一步(配置侧,变更须评审与灰度)**
1. 在**现场**与 **v2 部署模板**中显式增加与现场一致的 **`ninca-crk-std.ribbon.listOfServers`**(可填与日志中负载均衡最终一致的 **三台主机:16106**,或与 Consul 解析一致的主机名列表),使 **首次启动**即不为空;并与 `ninca-crk-std.ip` 的业务语义对齐(同一可达入口集合)。
2. 重启后对照日志:首次出现 `DynamicServerListLoadBalancer for client ninca-crk-std initialized`**`current list of Servers`** 是否直接非空。
### 9.3 观测与采集强化(不改业务契约前提下)
1. **对照 Ribbon / Consul 探针**(当前代码库默认**始终**运行;延迟见 `ElevatorProbeConstants`):在 `*-probe.log` 中查 **ribbonProbe instance**、**consulProbe instance** 行,与 JVM 及 Consul API 对照(见 [`scripts/collect_elevator_runtime_evidence.sh`](../../scripts/collect_elevator_runtime_evidence.sh))。
2. **修复 jcmd Attach**:解决 `jcmd-system-properties.txt` 中的 `AttachNotSupportedException` 后重采,便于核对 **进程内最终** `ribbon.*` / `feign.*`(与磁盘 properties 是否一致)。
### 9.4 仍建议对照的仓库文档
- [`elevator-service-instance-missing-investigation.md`](elevator-service-instance-missing-investigation.md)Ribbon 双路径(Consul vs ConfigurationBased)与现象描述。
- 若调整 `listOfServers`,需在变更说明中记录 **与对外 HTTP/Feign 契约不变**(仅内部路由与配置)。
---
## 10. `elevator-app-probe.log` 同步分析(仓库内样本)
**文件**[`maven-cw-elevator-application/logs/evidence/elevator-app-probe.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app-probe.log)(与主日志同一次启动窗口 **2026-04-30 11:16:24**,仅含 `cn.cloudwalk.elevator.debug` 包输出。)
### 10.1 探针开关(首行汇总)
本证据文件采自 **2026-04-30** 进程;当时摘要行仍描述 **config / ribbon / consul** 三开关。当前仓库实现为:**三类探针默认全开**,调度仅改源码 [`ElevatorProbeConstants`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ElevatorProbeConstants.java)**不再**使用 `elevator.*.probe.enabled`
- **`configProbe=true`**`ConfigSourceProbeRunner` 已执行(本文件主体)。
- **`ribbonProbe=false`**:当时未启用 Ribbon 探针属性,故本文件中**无** `ribbonProbe instance` 等行(非当前代码行为)。
- **`consulProbe=false`**:当时未启用 Consul HTTP 探针,故本文件中**无** `consulProbe instance` 等行(非当前代码行为)。
新版进程应在延迟(Consul 约 20s、Ribbon 约 22s)后于 `*-probe.log` 中出现 **consulProbe** / **ribbonProbe** 明细;与 `elevator-app.log` 中 Netflix Ribbon 行交叉验证时**无需**再开属性开关。
### 10.2 配置源冲突(与主日志 / keylines 一致)
| 键 | 合并后 `getProperty` | 并存来源 |
|----|----------------------|----------|
| `spring.cloud.consul.host` | `10.0.22.102` | 磁盘 `file:./bootstrap`**IP**`classpath:/bootstrap`**主机名** |
| `spring.cloud.consul.discovery.enabled` | `true` | 磁盘为 **true**classpath 为 **false**(最终以 Environment 合并结果为准,探针 `value=`**true** |
### 10.3 Ribbon 相关键在 Environment 中的显式值
- `*.ribbon.NIWSServerListClassName`**均为 `null`**(探针未解析到属性文件中的覆盖字符串)。
- `*.ribbon.listOfServers`**均为 `null`**。
- `ninca-crk-std.ip`**`10.0.22.102:16106`**`file:``classpath:` 一致)。
与 [`NincaCrkStdRibbonConfiguration`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java) + 主日志中 **`ConfigurationBasedServerList` 且 Servers=[]** 的现象一并阅读:**Environment 层未出现 `ninca-crk-std.ribbon.listOfServers`**,与「仅靠业务键 `ninca-crk-std.ip`」并存。
### 10.4 小结
| 项目 | 结论 |
|------|------|
| 本文件作用 | 专用 **`elevator-app-probe.log`**,避免在主日志中筛选探针类 |
| 本次样本覆盖范围 | **仅 ConfigSource**(当时未开 Ribbon/Consul 探针);新版本默认可见全量探针 |
| 与排查关系 | 历史样本解释「旧证据缺 Ribbon/Consul 行」;现行构建以 `ElevatorProbeConstants` 为准,深层 Ribbon 行为仍可对照 **`elevator-app.log`** 中 `DynamicServerListLoadBalancer` |
---
**延伸(不改现场属性文件的审核备忘)**[`elevator-v1-v2-init-timing-config-audit.md`](elevator-v1-v2-init-timing-config-audit.md)(初始化时序、探针顺序、jcmd attach、V1/V2 模板对照)。
---
**文档生成说明**:基于仓库内已检入的 `logs/evidence` 快照文件;若现场重新采集,请更新本文件名中的日期或新增一篇并列保留历史结论。

Some files were not shown because too many files have changed in this diff Show More