mirror of
https://github.com/hpd840321/starRiverProperty.git
synced 2026-06-09 08:20:31 +08:00
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:
@@ -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=false(bootstrap.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.SR3(V1 使用的版本)中,当 `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
|
||||
```
|
||||
|
||||
V2(Spring 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 参数)
|
||||
|
||||
---
|
||||
|
||||
*本文档为代码走查与配置分析生成,需结合生产环境运行时证据进一步排查。*
|
||||
+137
@@ -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)` §4(DIFFERENT 分类说明)
|
||||
@@ -0,0 +1,163 @@
|
||||
# 组织组件:全量 Java(src/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_DEPLOY(18)** 全部为仓库侧新增能力(租户访客策略、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_JAVAP(18):仓库有、现场包无 —— 处置
|
||||
|
||||
**结论:** 现场运行的是 **旧世代制品**;下列类型已在仓库 **新增或拆分**,需 **升版部署** 后才能与线上一致(或在线上删除引用——不推荐)。
|
||||
|
||||
|
||||
| # | 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` |
|
||||
| 7–18 | 各类 `*FeignClientFallback` / `EnterpriseFeignClientFallback` / `PineappleEngineClientFallBack` 等 | `service/.../feign/*.java`、`corp/feign/*.java` |
|
||||
|
||||
|
||||
**解决方案:**
|
||||
|
||||
1. **数据库:** 已若有租户访客策略表结构,保证 **现场 MySQL 与迁移脚本** 与文档一致。
|
||||
2. **发布:** 使用本仓库 `**mvn package` 产出的 Fat JAR** 替换现场;配置中打开/对齐 **Redis Lua、线程池、Feign** 相关项。
|
||||
3. **验证:** 租户访客相关 API + 图库同步 + Feign 降级路径 **集成测试**。
|
||||
|
||||
---
|
||||
|
||||
## 4. DIFFERENT(18):签名不一致 —— 分类与处置
|
||||
|
||||
### 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. IDENTICAL(569)
|
||||
|
||||
约占 `**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 error,cause:
|
||||
```
|
||||
|
||||
**源码位置**: `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_JAVAP(18)** 应在 **现场进程 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` DIFFERENT(22)**:多为仓库 **超前演进**;若发布新版本即以仓库为准,需在 **预发做接口对拍**。
|
||||
- `**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 楼层名
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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 求交)
|
||||
|
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
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 3(JSON 缓存), 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 组织节点 ID(cw_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 数据迁移
|
||||
-- 前提:DDL(Task 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 个 Phase:Phase0 健康检查 → 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 V2,Feign 路由到 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_id;cw_is_person.ID ↔ image_rule_ref.person_id(通过 API 字段 personId);cw_is_person.ID → cw_is_person_organization_ref.PERSON_ID → cw_is_organization.ID;cw_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_resource:27 个 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 粒度修复设计
|
||||
|
||||
**文档性质**:技术设计说明(方案 A:org_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_1403,T3 后恢复 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
|
||||
|
||||
// === 阶段3:ALWAYS 查策略 ===
|
||||
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]
|
||||
```
|
||||
+559
@@ -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#detail:listByImageId 后,策略命中则以 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 / 请求 |
|
||||
| **effective:UC-01** | 曾再度与 allow **∩** | **effective = `personResult.floorList`**(组织已替代,电梯不二次运算) |
|
||||
| **effective:UC-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
|
||||
}
|
||||
// 无 TenantVisitorFloorPolicyDao;effective 直接用于后续派梯
|
||||
```
|
||||
|
||||
**避免误读**:上文「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_ids(JSON 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) | 在 **L331–332 之间**插入:若 **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 跳过 XHW(P2)
|
||||
|
||||
```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)与 listByPage(P1 跳过星河湾);补充现网 XHW 适用范围表;修正重复「## 4」章节编号(组织清单改为 §5,电梯 §6,顺延);标注 detail/分页一致性风险 |
|
||||
| 0.6 | 2026-05-06 | **增加**:文首「场景说明」— 访客邀请初始化与楼层清单、`detail` / `listByPage` 职责划分及与 UC-01 对齐说明 |
|
||||
| 0.7 | 2026-05-06 | **增加**:访客邀约端到端业务流图;代码侧 sequence(detail+策略)、flowchart(addVisitor 改造后、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 | 确认 |
|
||||
Reference in New Issue
Block a user