mirror of
https://github.com/hpd840321/starRiverProperty.git
synced 2026-06-17 20:30:29 +08:00
feat: add service config templates and extraction script
Former-commit-id: 1de24b7eb79676d1aba9d799a58c5a753290cf52
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
# 租户 / 组织 / 人员 / 访客 — 数据模型、表关系与用例
|
||||
|
||||
**文档性质**:架构梳理(电梯仓 + 组织组件约定)。
|
||||
**校验状态**:已使用 [`tools/visitor_floor_verification/.env.visitor_verify`](../../maven-cw-elevator-application/tools/visitor_floor_verification/.env.visitor_verify) 所列主机(本地开发库)执行 **`INFORMATION_SCHEMA` + 抽样查询**,纪要见 **§6.1**(日期 **2026-04-30**)。其它环境仍以现场库为准。
|
||||
|
||||
**关联精读**:[访客注册与派梯楼层 — 业务流程](../testing/visitor-registration-business-flow.md)、[租户访客默认楼层隔离边界](../testing/tenant-visitor-default-floor-isolation.md)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 术语与请求上下文
|
||||
|
||||
| 术语 | 含义 | 典型落点 |
|
||||
|------|------|----------|
|
||||
| **租户 / 机构 ID** | 多租户数据隔离边界 | HTTP Header **`businessid`** → `FeignThreadLocalUtil` → `CloudwalkCallContext.company.companyId` |
|
||||
| **`business_id`(库列)** | 与上下文 **`businessid`** 相同的字符串 | 组织库 `cw_is_organization.BUSINESS_ID`、`cw_is_person.BUSINESS_ID`;电梯库 `tenant_visitor_floor_policy.business_id`、`image_rule_ref.business_id` |
|
||||
| **组织节点 ID** | 机构树上一节点(公司、部门等) | `cw_is_organization.ID`;父子关系 **`PARENT_ID` → `ID`** |
|
||||
| **人员主键 `personId`** | API / 组件语境的人员 ID | 对应组织库 **`cw_is_person.ID`**(导出 CSV 列名为 **`ID`**) |
|
||||
| **被访人** | 接待访客的员工 | `add/visitor` 请求体字段 **`personId`**(勿与访客混淆) |
|
||||
| **访客** | 访客档案 | 请求体 **`visitorId`**;派梯写库时 **`image_rule_ref.person_id` = 访客 ID** |
|
||||
|
||||
**关键辨析**
|
||||
|
||||
- **`business_id` 不是 `cw_is_organization` 的主键**。组织节点主键为 **`ID`**;**`BUSINESS_ID`** 是在**同一租户下多行组织节点上重复出现**的作用域字段。
|
||||
- 跨库之间**不存在**数据库级外键;一致性依赖 **`business_id`** 与 **`cw_is_person.ID`**(API 字段 `personId`)。关联表 **`cw_is_person_organization_ref.PERSON_ID`** 存储的也是该 **`ID`**。
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据库边界(两库)
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph orgLib [component_organization]
|
||||
O[cw_is_organization]
|
||||
P[cw_is_person]
|
||||
R[cw_is_person_organization_ref]
|
||||
L[cw_is_person_label_ref]
|
||||
LB[cw_is_label]
|
||||
end
|
||||
subgraph elevLib [cw_elevator_application]
|
||||
POL[tenant_visitor_floor_policy]
|
||||
IRR[image_rule_ref]
|
||||
end
|
||||
O -->|"树 PARENT_ID"| O
|
||||
R -->|"ORG_ID"| O
|
||||
R -->|"PERSON_ID"| P
|
||||
L -->|"PERSON_ID"| P
|
||||
L -->|"LABEL_ID"| LB
|
||||
POL -.->|"business_id 对齐 BUSINESS_ID"| P
|
||||
IRR -.->|"business_id"| P
|
||||
IRR -.->|"person_id 常为访客"| P
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 逻辑 ER(组织库)
|
||||
|
||||
组织侧表无权威 DDL 收于本仓库;下列字段来自导出脚本、测试文档与 [`export_catalog.py`](../../maven-cw-elevator-application/tools/visitor_floor_verification/scripts/export_catalog.py) 中的 SQL 用法。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
cw_is_organization {
|
||||
string ID PK "组织节点"
|
||||
string PARENT_ID FK "父节点 ID 可空"
|
||||
string BUSINESS_ID "租户范围重复列"
|
||||
string NAME "节点名称"
|
||||
}
|
||||
cw_is_person {
|
||||
string ID PK "人员主键 API personId"
|
||||
string BUSINESS_ID "租户"
|
||||
string NAME "姓名"
|
||||
int IS_DEL "是否删除"
|
||||
}
|
||||
cw_is_person_organization_ref {
|
||||
string PERSON_ID FK "人员"
|
||||
string ORG_ID FK "组织节点"
|
||||
}
|
||||
cw_is_organization ||--o{ cw_is_organization : "parent_child"
|
||||
cw_is_person ||--o{ cw_is_person_organization_ref : "membership"
|
||||
cw_is_organization ||--o{ cw_is_person_organization_ref : "org_node"
|
||||
```
|
||||
|
||||
**`cw_is_person` 列名与访客判定**
|
||||
|
||||
- 仓库内导出示例 [docs/testing/_cw_is_person__202604302030.csv](../testing/_cw_is_person__202604302030.csv) 表头为 **`ID`**, **`BUSINESS_ID`**, **`IS_DEL`** 等,与 **2026-04-30 开发库**一致。
|
||||
- 开发库 **`cw_is_person` 不存在**列:`person_id`、`deleted`、`labels`、`business_name`、`organization_name`。访客标签通过 **`cw_is_person_label_ref`**(`PERSON_ID`、`LABEL_ID`)关联 **`cw_is_label`**(含 `BUSINESS_ID`、`NAME`);示例租户下 **`NAME='访客'`** 对应 **`LABEL_ID=ed2dbab6d6234a7287106b80857c819e`**。
|
||||
|
||||
---
|
||||
|
||||
## 4. 逻辑 ER(电梯库)
|
||||
|
||||
依据 [`tenant_visitor_floor_policy.sql`](../../maven-cw-elevator-application/releases/v2.0.0/ddl/tenant_visitor_floor_policy.sql) 与 [`ImageRuleRefMapper.xml`](../../maven-cw-elevator-application/cw-elevator-application-data/src/main/java/cn/cloudwalk/elevator/record/mapper/ImageRuleRefMapper.xml)。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
tenant_visitor_floor_policy {
|
||||
string id PK
|
||||
string business_id "租户 UK 组成部分"
|
||||
string policy_type "如 INTERSECT_ALLOWLIST"
|
||||
text allow_zone_ids "JSON zoneId 数组"
|
||||
string building_id "预留楼栋维度可空"
|
||||
int enabled
|
||||
bigint policy_version
|
||||
}
|
||||
image_rule_ref {
|
||||
string id PK
|
||||
string business_id
|
||||
string zone_id "楼层区域"
|
||||
string zone_name
|
||||
string parent_rule "父规则"
|
||||
string person_id "访客开通场景为访客"
|
||||
int person_delete
|
||||
string include_labels
|
||||
string include_organizations
|
||||
int is_default
|
||||
}
|
||||
```
|
||||
|
||||
**访客默认楼层策略语义(UC-01,未传 `floorIds`)**
|
||||
|
||||
- 启用且 **`allow_zone_ids` 非空**时:生效楼层为 **`PersonResult.floorList` ∩ `allow_zone_ids`**(保持 `floorList` 顺序)。
|
||||
- 详见 [`PersonRuleServiceImpl#addVisitor`](../../maven-cw-elevator-application/cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/person/impl/PersonRuleServiceImpl.java) 与 [租户访客默认楼层-数据库配置阶段技术设计](../business/租户访客默认楼层-数据库配置阶段技术设计.md)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 角色与派梯用例(电梯侧)
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
actor Caller as Caller_BFF
|
||||
participant API as AcsPersonController
|
||||
participant PR as PersonRuleServiceImpl
|
||||
participant Org as PersonService_detail
|
||||
participant Pol as TenantVisitorFloorPolicyDao
|
||||
participant IRR as ImageRuleRefDao
|
||||
participant Img as ImageStorePersonService
|
||||
|
||||
Caller -->|"POST_add_visitor"| API --> PR
|
||||
PR -->|"floorIds_empty"| Org
|
||||
PR --> Pol
|
||||
PR --> IRR
|
||||
PR --> Img
|
||||
```
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
subgraph UC01 [UC01不传floorIds]
|
||||
U1[add_visitor]
|
||||
U2[detail_host_floorList]
|
||||
U3[optional_policy_intersect]
|
||||
U4[write_image_rule_ref_visitor]
|
||||
U5[batchBind_visitor]
|
||||
U1 --> U2 --> U3 --> U4 --> U5
|
||||
end
|
||||
subgraph UC02 [UC02显式floorIds]
|
||||
V1[add_visitor]
|
||||
V2[skip_detail_and_policy]
|
||||
V3[write_rules_bind]
|
||||
V1 --> V2 --> V3
|
||||
end
|
||||
subgraph UCRead [回读验收]
|
||||
R1[passRule_image_personId_visitor]
|
||||
end
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 附录:现场核对 SQL 与纪要
|
||||
|
||||
### 6.1 开发库核对纪要(2026-04-30)
|
||||
|
||||
以下为使用 **`maven-cw-elevator-application/tools/visitor_floor_verification/.env.visitor_verify`**(主机、端口、账号由本地填写,**勿将密钥写入 Git**)连接所得摘要:
|
||||
|
||||
| 项目 | 结果 |
|
||||
|------|------|
|
||||
| 根机构 **`BUSINESS_ID=2524639890ba4f2cba9ba1a4eeaa4015`** | 节点 **`NAME=星河湾中心`**,`ID=d656e3ab3f61440bb7b9bc23b76834b9`,**与 `BUSINESS_ID` 字符串不相等** |
|
||||
| `cw_is_person` | 主键列 **`ID`**;删除 **`IS_DEL`**;**无** `person_id`、`deleted`、`labels`、`business_name`、`organization_name` |
|
||||
| `cw_is_organization` | 含 **`ID`、`PARENT_ID`、`BUSINESS_ID`、`NAME`、`IS_DEL`** 等(大量 `EXT*`) |
|
||||
| `cw_is_person_organization_ref` | **`ID`、`PERSON_ID`、`ORG_ID`** 及审计列 |
|
||||
| `cw_is_person_label_ref` / `cw_is_label` | 用于人员标签;访客标签 **`NAME='访客'`** 对应 **`LABEL_ID=ed2dbab6d6234a7287106b80857c819e`**(该租户) |
|
||||
| `information_schema.TABLE_CONSTRAINTS` | 上述组织表 **仅有 `PRIMARY KEY` / `UNIQUE`**,**未声明 FOREIGN KEY** |
|
||||
| `cw-elevator-application.tenant_visitor_floor_policy` | 列与仓库 DDL 一致;示例租户 **`enabled=1`**,`allow_zone_ids` 含 **`605560545117995008`** |
|
||||
|
||||
### 6.2 INFORMATION_SCHEMA 模板(任意环境)
|
||||
|
||||
```sql
|
||||
-- 组织库:核心表列一览
|
||||
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
|
||||
FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = 'component-organization'
|
||||
AND TABLE_NAME IN (
|
||||
'cw_is_organization',
|
||||
'cw_is_person',
|
||||
'cw_is_person_organization_ref',
|
||||
'cw_is_person_label_ref',
|
||||
'cw_is_label'
|
||||
)
|
||||
ORDER BY TABLE_NAME, ORDINAL_POSITION;
|
||||
|
||||
-- 根节点与 BUSINESS_ID 是否相等(现场逐项核对)
|
||||
SELECT ID, PARENT_ID, BUSINESS_ID, NAME
|
||||
FROM cw_is_organization
|
||||
WHERE BUSINESS_ID = '2524639890ba4f2cba9ba1a4eeaa4015'
|
||||
ORDER BY ID
|
||||
LIMIT 20;
|
||||
|
||||
-- 电梯库:策略表列
|
||||
SELECT COLUMN_NAME, DATA_TYPE
|
||||
FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = 'cw-elevator-application'
|
||||
AND TABLE_NAME IN ('tenant_visitor_floor_policy', 'image_rule_ref')
|
||||
ORDER BY TABLE_NAME, ORDINAL_POSITION;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 文档索引(与本模型一致)
|
||||
|
||||
| 文档 | 用途 |
|
||||
|------|------|
|
||||
| [visitor-registration-business-flow.md](../testing/visitor-registration-business-flow.md) | 被访人 / 访客 / 楼层源码链路 |
|
||||
| [visitor-registration-floor-validation.md](../testing/visitor-registration-floor-validation.md) | 测试矩阵与现场组织示例 |
|
||||
| [tenant-visitor-default-floor-isolation.md](../testing/tenant-visitor-default-floor-isolation.md) | `business_id` 粒度与隔离边界 |
|
||||
| [租户访客默认楼层-数据库配置阶段技术设计.md](../business/租户访客默认楼层-数据库配置阶段技术设计.md) | 求交语义与阶段范围 |
|
||||
@@ -0,0 +1,75 @@
|
||||
# cw-elevator-application v2.0.0 SQL与代码一致性审核记录
|
||||
|
||||
**审核目标**:确认发布规范涉及 SQL 脚本与当前代码逻辑一致,满足实施交付依据留档要求。
|
||||
**审核范围**:`tenant_visitor_floor_policy` 建表脚本、初始化脚本、访客派梯策略读取与求交流程。
|
||||
**审核时间**:`2026-04-29`
|
||||
**审核人**:`____________`
|
||||
|
||||
---
|
||||
|
||||
## 1. 审核过程
|
||||
|
||||
1. 审阅 SQL 脚本:
|
||||
- `docs/sql/tenant_visitor_floor_policy.sql`
|
||||
- `docs/sql/tenant_visitor_floor_policy_init_guangfa_fund.sql`
|
||||
2. 审阅代码路径:
|
||||
- `cw-elevator-application-service/.../PersonRuleServiceImpl#addVisitor`
|
||||
- `cw-elevator-application-data/.../TenantVisitorFloorPolicyMapper.xml`
|
||||
- `cw-elevator-application-data/.../TenantVisitorFloorPolicyDto`
|
||||
3. 做场景对照:
|
||||
- UC-01:调用方未传 `floorIds`
|
||||
- UC-02:调用方已传 `floorIds`
|
||||
- 策略缺失/无效 JSON/交集为空等异常分支
|
||||
4. 形成一致性结论与风险提示,并纳入发布包。
|
||||
|
||||
---
|
||||
|
||||
## 2. 审核依据与结果
|
||||
|
||||
| 检查项 | SQL 依据 | 代码依据 | 结论 |
|
||||
|------|----------|----------|------|
|
||||
| 策略表字段是否齐全(business_id/policy_type/allow_zone_ids/building_id/enabled/policy_version) | `tenant_visitor_floor_policy.sql` DDL 定义上述字段 | Mapper 查询并映射到 DTO 同名语义字段 | 一致 |
|
||||
| 代码是否只读取“启用+租户默认+INTERSECT_ALLOWLIST”策略 | 初始化脚本使用 `policy_type='INTERSECT_ALLOWLIST'`、`building_id=NULL`、`enabled=1` | Mapper `WHERE enabled=1 AND policy_type='INTERSECT_ALLOWLIST' AND (building_id IS NULL OR building_id='')` | 一致 |
|
||||
| allow_zone_ids 的数据格式是否匹配代码解析方式 | SQL 注释与初始化脚本均为 JSON 数组字符串(如 `["605560545117995008"]`) | `parseAllowZoneIds` 使用 `JSON.parseArray(..., String.class)` 解析 | 一致 |
|
||||
| 未传 floorIds 时是否执行“被访人楼层 ∩ 策略楼层” | 策略表提供 allowlist 数据来源 | `addVisitor` 在 `!callerProvidedFloors` 分支求交 | 一致 |
|
||||
| 交集为空是否按规范失败 | 初始化脚本可构造交集为空场景 | `intersected.isEmpty()` 返回 `76260532` | 一致 |
|
||||
| 已传 floorIds 是否跳过策略表 | SQL 与此分支无冲突 | `callerProvidedFloors=true` 时不进入策略读取分支 | 一致 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 关键证据(摘录)
|
||||
|
||||
- 代码读取策略(启用、类型、租户默认)来自 `TenantVisitorFloorPolicyMapper.xml`。
|
||||
- 代码在 `PersonRuleServiceImpl#addVisitor` 中:
|
||||
- `!callerProvidedFloors` 才读取被访人楼层与租户策略;
|
||||
- `allow_zone_ids` 解析成功且非空才参与求交;
|
||||
- 求交为空返回 `76260532`;
|
||||
- 调用方已传楼层时不走策略求交流程。
|
||||
- 初始化脚本 `tenant_visitor_floor_policy_init_guangfa_fund.sql` 的字段取值与上述查询条件完全兼容。
|
||||
|
||||
---
|
||||
|
||||
## 4. 审核结论
|
||||
|
||||
**结论:通过。**
|
||||
发布规范涉及的 SQL 脚本内容与当前代码逻辑一致,满足 v2.0.0 发布包“数据库脚本 + 功能升级说明 + 实施交付依据”要求。
|
||||
|
||||
---
|
||||
|
||||
## 5. 风险提示与建议
|
||||
|
||||
1. **唯一性治理风险(中)**
|
||||
DDL 使用 `UNIQUE KEY (business_id, building_id)`,在 MySQL 下 `building_id=NULL` 可能存在多行;当前代码通过 `ORDER BY updated_at DESC, policy_version DESC LIMIT 1` 取最新一条,不阻断功能,但建议运维侧增加“每租户默认策略唯一”巡检。
|
||||
2. **配置数据质量风险(中)**
|
||||
`allow_zone_ids` 必须是电梯域 `zone_id` 字符串数组,若误填其它系统 UUID 会导致策略不生效或交集为空。
|
||||
|
||||
---
|
||||
|
||||
## 6. 签字确认
|
||||
|
||||
| 角色 | 姓名 | 日期 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 审核人 | `____________` | `____` | `____` |
|
||||
| 实施负责人 | `____________` | `____` | `____` |
|
||||
| 甲方确认(可选) | `____________` | `____` | `____` |
|
||||
|
||||
+5
-2
@@ -7,7 +7,10 @@
|
||||
**对甲交付(业务表述与排期)**:
|
||||
|
||||
- [甲方版本升级说明](./cw-elevator-application-v2.0.0-甲方版本升级说明.md)
|
||||
- [升级计划(含夜间 · 周二/周三窗口)](./cw-elevator-application-v2.0.0-升级计划.md)
|
||||
- [升级计划(含夜间 · 周二/周三窗口)](./cw-elevator-application-v2.0.0-升级计划.md)
|
||||
- [实施交付清单(实施方内部与对甲交付核对)](./cw-elevator-application-v2.0.0-实施交付清单.md)
|
||||
- [实施验收记录模板(上线当晚记录)](./cw-elevator-application-v2.0.0-实施验收记录模板.md)
|
||||
- [SQL与代码一致性审核记录(发布规范走查依据)](./cw-elevator-application-v2.0.0-SQL与代码一致性审核记录.md)
|
||||
|
||||
---
|
||||
|
||||
@@ -20,7 +23,7 @@ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
|
||||
./scripts/release-cw-elevator-application.sh
|
||||
```
|
||||
|
||||
输出:`**maven-cw-elevator-application/releases/v2.0.0/**`,含 `jar`、`ddl/`、`版本升级说明书.md`、`甲方版本升级说明.md`、`升级计划.md`、`发布说明.md`、`BUILD_MANIFEST.txt`。
|
||||
输出:`**maven-cw-elevator-application/releases/v2.0.0/**`,含 `jar`、`ddl/`(建表与初始化脚本)、`config/`(生产基线属性文件)、`版本升级说明书.md`、`甲方版本升级说明.md`、`升级计划.md`、`实施交付清单.md`、`实施验收记录模板.md`、`SQL与代码一致性审核记录.md`、`发布说明.md`、`BUILD_MANIFEST.txt`。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
# cw-elevator-application v2.0.0 实施交付清单
|
||||
|
||||
**用途**:用于正式发布交付前后的材料核对,满足“发布包 + 数据库脚本 + 升级说明 + 实施验收记录”闭环。
|
||||
|
||||
---
|
||||
|
||||
## 1. 发布包文件清单
|
||||
|
||||
- [ ] `cw-elevator-application-2.0.0.jar`
|
||||
- [ ] `ddl/tenant_visitor_floor_policy.sql`(建表脚本)
|
||||
- [ ] `ddl/tenant_visitor_floor_policy_init_guangfa_fund.sql`(广发基金初始化示例/可直接执行)
|
||||
- [ ] `版本升级说明书.md`(技术实施口径)
|
||||
- [ ] `甲方版本升级说明.md`(业务口径)
|
||||
- [ ] `升级计划.md`(实施窗口与回滚安排)
|
||||
- [ ] `实施验收记录模板.md`(上线当晚记录)
|
||||
- [ ] `BUILD_MANIFEST.txt`(构建时间、分支、提交号)
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据库变更交付项
|
||||
|
||||
- [ ] DBA 已确认目标库与执行窗口
|
||||
- [ ] 已备份目标库(全库/指定库按现场规范)
|
||||
- [ ] 已执行 `tenant_visitor_floor_policy.sql`
|
||||
- [ ] 已执行或评审 `tenant_visitor_floor_policy_init_guangfa_fund.sql`
|
||||
- [ ] 已确认 `allow_zone_ids` 使用的是电梯库 `zone_id`(非其它系统 UUID)
|
||||
- [ ] 已留存 SQL 执行记录(执行人、时间、结果)
|
||||
|
||||
---
|
||||
|
||||
## 3. 应用部署交付项
|
||||
|
||||
- [ ] 上线前已保存旧版 JAR 回滚包
|
||||
- [ ] 已按窗口替换为 `cw-elevator-application-2.0.0.jar`
|
||||
- [ ] 应用启动日志无严重报错
|
||||
- [ ] 关键接口健康检查通过(含 `add/visitor` 主链路)
|
||||
- [ ] 监控观察窗口内无持续异常
|
||||
|
||||
---
|
||||
|
||||
## 4. 验收交付项
|
||||
|
||||
- [ ] UC-01:未传 `floorIds` 且策略启用时,楼层为 `floorList ∩ allow_zone_ids`
|
||||
- [ ] UC-01:无交集时返回 `76260532`
|
||||
- [ ] UC-02:显式传 `floorIds` 时不受策略表影响
|
||||
- [ ] 未启用策略租户行为与升级前一致
|
||||
- [ ] 已按《实施验收记录模板》完成签字/邮件留档
|
||||
|
||||
---
|
||||
|
||||
## 5. 交付确认信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 实施项目 | cw-elevator-application v2.0.0 |
|
||||
| 实施日期 | `____年____月____日` |
|
||||
| 甲方确认人 | `____________` |
|
||||
| 乙方实施人 | `____________` |
|
||||
| 文档留存路径 | `____________` |
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# cw-elevator-application v2.0.0 实施验收记录模板
|
||||
|
||||
**用途**:实施当晚记录数据库执行、应用部署、业务验收和回滚判定,作为交付归档依据。
|
||||
|
||||
---
|
||||
|
||||
## 1. 基本信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 项目名称 | 智慧电梯 / 访客派梯系统 |
|
||||
| 发布版本 | v2.0.0 |
|
||||
| 实施日期 | `____年____月____日` |
|
||||
| 实施时段 | `____:____` - `____:____` |
|
||||
| 环境 | 生产 / 预生产(圈选) |
|
||||
| 实施负责人 | `____________` |
|
||||
| 甲方联系人 | `____________` |
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据库执行记录
|
||||
|
||||
| 序号 | 脚本 | 执行时间 | 执行人 | 结果 | 备注 |
|
||||
|------|------|----------|--------|------|------|
|
||||
| 1 | tenant_visitor_floor_policy.sql | `____` | `____` | 成功/失败 | `____` |
|
||||
| 2 | tenant_visitor_floor_policy_init_guangfa_fund.sql | `____` | `____` | 成功/失败 | `____` |
|
||||
|
||||
**异常记录**:`______________________________________________`
|
||||
|
||||
---
|
||||
|
||||
## 3. 应用发布记录
|
||||
|
||||
| 项目 | 记录 |
|
||||
|------|------|
|
||||
| 上线前版本 | `____________` |
|
||||
| 上线后版本 | `cw-elevator-application-2.0.0.jar` |
|
||||
| 启停方式 | `____________` |
|
||||
| 服务恢复时间 | `____________` |
|
||||
| 日志健康检查 | 通过 / 不通过 |
|
||||
| 监控观察结论 | 正常 / 异常(说明) |
|
||||
|
||||
---
|
||||
|
||||
## 4. 验收结果记录
|
||||
|
||||
| 用例 | 期望 | 实际 | 结论 |
|
||||
|------|------|------|------|
|
||||
| UC-01(未传 floorIds,策略启用) | floorList 与 allow_zone_ids 求交 | `____` | 通过/不通过 |
|
||||
| UC-01(交集为空) | 返回 `76260532` | `____` | 通过/不通过 |
|
||||
| UC-02(显式传 floorIds) | 不受策略表影响 | `____` | 通过/不通过 |
|
||||
| 无策略租户回归 | 行为与升级前一致 | `____` | 通过/不通过 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 回滚判定
|
||||
|
||||
- [ ] 无需回滚,发布成功
|
||||
- [ ] 需要回滚应用(原因:`________________`)
|
||||
- [ ] 需要回滚数据/策略(原因:`________________`)
|
||||
|
||||
回滚执行记录(如发生):`______________________________________________`
|
||||
|
||||
---
|
||||
|
||||
## 6. 签字确认
|
||||
|
||||
| 角色 | 姓名 | 日期 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 甲方确认 | `____________` | `____` | `____` |
|
||||
| 乙方实施 | `____________` | `____` | `____` |
|
||||
| 乙方复核 | `____________` | `____` | `____` |
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
# cw-elevator-application v2.0.6 SQL与代码一致性审核记录
|
||||
|
||||
**审核目标**:确认发布规范涉及 SQL 脚本与当前代码逻辑一致,满足实施交付依据留档要求。
|
||||
**审核范围**:`tenant_visitor_floor_policy` 建表脚本、初始化脚本、访客派梯策略读取与求交流程。
|
||||
**审核时间**:`2026-04-29`
|
||||
**审核人**:`____________`
|
||||
|
||||
---
|
||||
|
||||
## 1. 审核过程
|
||||
|
||||
1. 审阅 SQL 脚本:
|
||||
- `docs/sql/tenant_visitor_floor_policy.sql`
|
||||
- `docs/sql/tenant_visitor_floor_policy_init_guangfa_fund.sql`
|
||||
2. 审阅代码路径:
|
||||
- `cw-elevator-application-service/.../PersonRuleServiceImpl#addVisitor`
|
||||
- `cw-elevator-application-data/.../TenantVisitorFloorPolicyMapper.xml`
|
||||
- `cw-elevator-application-data/.../TenantVisitorFloorPolicyDto`
|
||||
3. 做场景对照:
|
||||
- UC-01:调用方未传 `floorIds`
|
||||
- UC-02:调用方已传 `floorIds`
|
||||
- 策略缺失/无效 JSON/交集为空等异常分支
|
||||
4. 形成一致性结论与风险提示,并纳入发布包。
|
||||
|
||||
---
|
||||
|
||||
## 2. 审核依据与结果
|
||||
|
||||
| 检查项 | SQL 依据 | 代码依据 | 结论 |
|
||||
|------|----------|----------|------|
|
||||
| 策略表字段是否齐全(business_id/policy_type/allow_zone_ids/building_id/enabled/policy_version) | `tenant_visitor_floor_policy.sql` DDL 定义上述字段 | Mapper 查询并映射到 DTO 同名语义字段 | 一致 |
|
||||
| 代码是否只读取“启用+租户默认+INTERSECT_ALLOWLIST”策略 | 初始化脚本使用 `policy_type='INTERSECT_ALLOWLIST'`、`building_id=NULL`、`enabled=1` | Mapper `WHERE enabled=1 AND policy_type='INTERSECT_ALLOWLIST' AND (building_id IS NULL OR building_id='')` | 一致 |
|
||||
| allow_zone_ids 的数据格式是否匹配代码解析方式 | SQL 注释与初始化脚本均为 JSON 数组字符串(如 `["605560545117995008"]`) | `parseAllowZoneIds` 使用 `JSON.parseArray(..., String.class)` 解析 | 一致 |
|
||||
| 未传 floorIds 时是否执行“被访人楼层 ∩ 策略楼层” | 策略表提供 allowlist 数据来源 | `addVisitor` 在 `!callerProvidedFloors` 分支求交 | 一致 |
|
||||
| 交集为空是否按规范失败 | 初始化脚本可构造交集为空场景 | `intersected.isEmpty()` 返回 `76260532` | 一致 |
|
||||
| 已传 floorIds 是否跳过策略表 | SQL 与此分支无冲突 | `callerProvidedFloors=true` 时不进入策略读取分支 | 一致 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 关键证据(摘录)
|
||||
|
||||
- 代码读取策略(启用、类型、租户默认)来自 `TenantVisitorFloorPolicyMapper.xml`。
|
||||
- 代码在 `PersonRuleServiceImpl#addVisitor` 中:
|
||||
- `!callerProvidedFloors` 才读取被访人楼层与租户策略;
|
||||
- `allow_zone_ids` 解析成功且非空才参与求交;
|
||||
- 求交为空返回 `76260532`;
|
||||
- 调用方已传楼层时不走策略求交流程。
|
||||
- 初始化脚本 `tenant_visitor_floor_policy_init_guangfa_fund.sql` 的字段取值与上述查询条件完全兼容。
|
||||
|
||||
---
|
||||
|
||||
## 4. 审核结论
|
||||
|
||||
**结论:通过。**
|
||||
发布规范涉及的 SQL 脚本内容与当前代码逻辑一致,满足 v2.0.6 发布包“数据库脚本 + 功能升级说明 + 实施交付依据”要求。
|
||||
|
||||
---
|
||||
|
||||
## 5. 风险提示与建议
|
||||
|
||||
1. **唯一性治理风险(中)**
|
||||
DDL 使用 `UNIQUE KEY (business_id, building_id)`,在 MySQL 下 `building_id=NULL` 可能存在多行;当前代码通过 `ORDER BY updated_at DESC, policy_version DESC LIMIT 1` 取最新一条,不阻断功能,但建议运维侧增加“每租户默认策略唯一”巡检。
|
||||
2. **配置数据质量风险(中)**
|
||||
`allow_zone_ids` 必须是电梯域 `zone_id` 字符串数组,若误填其它系统 UUID 会导致策略不生效或交集为空。
|
||||
|
||||
---
|
||||
|
||||
## 6. 签字确认
|
||||
|
||||
| 角色 | 姓名 | 日期 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 审核人 | `____________` | `____` | `____` |
|
||||
| 实施负责人 | `____________` | `____` | `____` |
|
||||
| 甲方确认(可选) | `____________` | `____` | `____` |
|
||||
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
# cw-elevator-application v2.0.6 升级计划
|
||||
|
||||
**项目名称**(可填):智慧电梯 / 访客派梯系统升级
|
||||
**版本**:v2.0.6
|
||||
**计划性质**:执行级排期草案,**具体日期、起止时刻以与甲方书面/邮件确认为准**。
|
||||
|
||||
---
|
||||
|
||||
## 1. 升级目标
|
||||
|
||||
完成电梯派梯应用 **v2.0.6** 上线,启用**租户访客固定访问楼层**能力所需的应用与数据库对象;按业务需要为指定租户配置策略并完成验收。
|
||||
|
||||
---
|
||||
|
||||
## 2. 计划时间窗口(夜间 · 暂定周二、周三)
|
||||
|
||||
| 窗口 | 意向安排 | 建议内容(可合并或调整) |
|
||||
|------|-----------|----------------------------|
|
||||
| **第一次:周二晚间** | 夜间低峰段,具体 **HH:MM–HH:MM** 待定 | 环境检查、数据库备份、执行 **DDL**(新建策略表)、(可选)预发布验证、必要时准备回滚包与检查单 |
|
||||
| **第二次:周三晚间** | 夜间低峰段,具体 **HH:MM–HH:MM** 待定 | 部署新版本 **JAR**、滚动/重启应用、按需 **INSERT** 租户策略数据、业务联调与验收、监控与值守 |
|
||||
|
||||
**说明**:
|
||||
|
||||
- 若贵方现场要求**一个晚上完成全部步骤**,可将 DDL 与部署**合并在同一晚间窗口**执行,本表仅体现「周二、周三两晚」的**当前意向拆分**,最终以确认单为准。
|
||||
- 两次窗口建议**间隔至少数小时至一个工作日**,便于第一次变更后观察库表与低风险项;若合并为单次窗口,须在计划单中注明**连续操作顺序与回滚点**。
|
||||
|
||||
**待确认栏**(实施时填写):
|
||||
|
||||
- 周二实施日期:`____年____月____日`,时段: `____ : ____` – `____ : ____`
|
||||
- 周三实施日期:`____年____月____日`,时段: `____ : ____` – `____ : ____`
|
||||
- 甲方现场联系人: `____________` 乙方/实施负责人: `____________`
|
||||
|
||||
---
|
||||
|
||||
## 3. 影响范围与沟通
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 影响系统 | 电梯派梯相关应用(`cw-elevator-application`)及同一业务库。 |
|
||||
| 用户感知 | 应用重启期间可能出现短时派梯接口失败;策略误配可能导致部分访客路径失败,需按验收清单核对。 |
|
||||
| 通知范围 | 建议提前通知:物业/客服、前台与访客登记、安保与梯控相关值班(按项目实际 roster 确定)。 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 前置条件(升级前)
|
||||
|
||||
- [ ] 已与甲方确认 **周二 / 周三** 夜间窗口。
|
||||
- [ ] 取得 **v2.0.6** 发布包(含 `jar`、`ddl/tenant_visitor_floor_policy.sql`、说明书)。
|
||||
- [ ] 目标环境 **JDK 版本**符合实施方要求(与构建说明一致,一般为 JDK 8)。
|
||||
- [ ] 数据库已做**备份**(全库或按运维规范),并可从发布包定位 DDL。
|
||||
- [ ] 明确需启用「固定访客楼层」的租户列表及**允许区域**配置(若不启用,可跳过策略数据录入,行为与升级前一致)。
|
||||
- [ ] 回滚包:保留**当前线上 JAR** 备份与回滚步骤(见下文)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 实施步骤(建议顺序)
|
||||
|
||||
### 5.1 周二晚间(或首个窗口)
|
||||
|
||||
1. 备份数据库。
|
||||
2. 执行 `tenant_visitor_floor_policy.sql`(`CREATE TABLE IF NOT EXISTS`,可重复执行需与 DBA 确认)。
|
||||
3. (可选)在测试/预发环境先执行一遍并验证。
|
||||
4. 记录执行人、时间与结果。
|
||||
|
||||
### 5.2 周三晚间(或第二个窗口 / 同晚续作)
|
||||
|
||||
1. 停止或滚动发布应用(按现网规范)。
|
||||
2. 替换为 `cw-elevator-application-2.0.6.jar` 并启动。
|
||||
3. 按业务需求对需启用的租户执行策略 **INSERT**(`enabled=1`、`allow_zone_ids` 等为合法 JSON 等,字段级以技术说明书为准)。
|
||||
4. 抽样验证:未传显式楼层时的访客派梯、租户策略开/关、与组织楼层无交集时的失败提示等。
|
||||
5. 观察监控与日志,**值守**至约定结束时间。
|
||||
|
||||
*若合并为单次窗口:按「备份 → DDL → 部署 JAR → 策略数据 → 验收」顺序连续执行,并预留回滚决策时间。*
|
||||
|
||||
---
|
||||
|
||||
## 6. 验收要点(摘要)
|
||||
|
||||
- 未配置或未启用策略时:与升级前行为一致。
|
||||
- 已启用策略且业务走「未显式指定楼层」路径:访客可去楼层为**组织允许**与**租户允许**的**交集**。
|
||||
- 交集为空时:接口返回预期业务错误(技术码见实施方说明书)。
|
||||
- 第三方已显式传入楼层的路径:不因本策略表改变原逻辑。
|
||||
|
||||
---
|
||||
|
||||
## 7. 回滚预案
|
||||
|
||||
| 场景 | 建议动作 |
|
||||
|------|-----------|
|
||||
| 应用异常 | 回退至上一版本 JAR;数据库新表若已存在且旧应用不读该表,通常可继续服务;与实施方确认。 |
|
||||
| 策略配置错误 | 优先**停用或修正策略行**,避免大规模回滚应用。 |
|
||||
| 必须撤表 | 仅在评估无依赖后由 DBA 执行删表;**高风险**,需书面确认。 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 交付物核对
|
||||
|
||||
- [ ] `cw-elevator-application-2.0.6.jar`
|
||||
- [ ] `ddl/tenant_visitor_floor_policy.sql`
|
||||
- [ ] 《版本升级说明书》(实施/技术)
|
||||
- [ ] 本《甲方版本升级说明》(如已作为对甲交付)
|
||||
- [ ] 本《升级计划》(双方确认签字/邮件留档)
|
||||
|
||||
---
|
||||
|
||||
**文档状态**:草案;**时间点为暂定周二、周三晚间**,正式实施前请更新「待确认栏」并留存确认记录。
|
||||
@@ -0,0 +1,32 @@
|
||||
# cw-elevator-application v2.0.6 发布索引
|
||||
|
||||
本版本**功能升级说明**已单独成文,**仅覆盖「租户访客固定访问楼层」**及配套数据库 DDL,见:
|
||||
|
||||
**[cw-elevator-application-v2.0.6-版本升级说明书](./cw-elevator-application-v2.0.6-版本升级说明书.md)**
|
||||
|
||||
**对甲交付(业务表述与排期)**:
|
||||
|
||||
- [甲方版本升级说明](./cw-elevator-application-v2.0.6-甲方版本升级说明.md)
|
||||
- [升级计划(含夜间 · 周二/周三窗口)](./cw-elevator-application-v2.0.6-升级计划.md)
|
||||
- [实施交付清单(实施方内部与对甲交付核对)](./cw-elevator-application-v2.0.6-实施交付清单.md)
|
||||
- [实施验收记录模板(上线当晚记录)](./cw-elevator-application-v2.0.6-实施验收记录模板.md)
|
||||
- [SQL与代码一致性审核记录(发布规范走查依据)](./cw-elevator-application-v2.0.6-SQL与代码一致性审核记录.md)
|
||||
|
||||
---
|
||||
|
||||
## 一键构建与发布目录
|
||||
|
||||
在仓库根目录、**JDK 8** 下执行:
|
||||
|
||||
```bash
|
||||
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
|
||||
./scripts/release-cw-elevator-application.sh 2.0.6
|
||||
```
|
||||
|
||||
输出:**`maven-cw-elevator-application/releases/cw-elevator-application-V2.0.6.<YYYYMMDD>/`**(目录名含构建日期,与 `cw-elevator-application-V1.0.0.20211103` 命名风格一致;可用环境变量 **`RELEASE_DATE_LABEL`** 指定日期),含 `cw-elevator-application-2.0.6.jar`、`ddl/`、发布根目录下的 `bootstrap.properties` / `application*.properties`(与星中心/V1 同层摆放,**无额外 `config/` 子目录**)、`start.sh` / `stop.sh` / `cw-elevator-application.service`(路径占位符需现场替换)、`run.sh`、`common-java.sh`、**`collect_elevator_runtime_evidence.sh`**(根目录,现场只读证据采集)、`版本升级说明书.md`、甲方与实施类 Markdown、`BUILD_MANIFEST.txt`;默认另生成 **`releases/cw-elevator-application-V2.0.6.<YYYYMMDD>.zip`**(设 `RELEASE_MAKE_ZIP=0` 可跳过)。
|
||||
|
||||
---
|
||||
|
||||
## Git 与大文件
|
||||
|
||||
`maven-cw-elevator-application/.gitignore` 忽略 `**releases/**/*.jar**`;**DDL 与说明书**可提交;可执行 JAR 请通过制品库或制品服务器分发。
|
||||
@@ -0,0 +1,60 @@
|
||||
# cw-elevator-application v2.0.6 实施交付清单
|
||||
|
||||
**用途**:用于正式发布交付前后的材料核对,满足“发布包 + 数据库脚本 + 升级说明 + 实施验收记录”闭环。
|
||||
|
||||
---
|
||||
|
||||
## 1. 发布包文件清单
|
||||
|
||||
- [ ] `cw-elevator-application-2.0.6.jar`
|
||||
- [ ] `ddl/tenant_visitor_floor_policy.sql`(建表脚本)
|
||||
- [ ] `ddl/tenant_visitor_floor_policy_init_guangfa_fund.sql`(广发基金初始化示例/可直接执行)
|
||||
- [ ] `版本升级说明书.md`(技术实施口径)
|
||||
- [ ] `甲方版本升级说明.md`(业务口径)
|
||||
- [ ] `升级计划.md`(实施窗口与回滚安排)
|
||||
- [ ] `实施验收记录模板.md`(上线当晚记录)
|
||||
- [ ] `BUILD_MANIFEST.txt`(构建时间、分支、提交号)
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据库变更交付项
|
||||
|
||||
- [ ] DBA 已确认目标库与执行窗口
|
||||
- [ ] 已备份目标库(全库/指定库按现场规范)
|
||||
- [ ] 已执行 `tenant_visitor_floor_policy.sql`
|
||||
- [ ] 已执行或评审 `tenant_visitor_floor_policy_init_guangfa_fund.sql`
|
||||
- [ ] 已确认 `allow_zone_ids` 使用的是电梯库 `zone_id`(非其它系统 UUID)
|
||||
- [ ] 已留存 SQL 执行记录(执行人、时间、结果)
|
||||
|
||||
---
|
||||
|
||||
## 3. 应用部署交付项
|
||||
|
||||
- [ ] 上线前已保存旧版 JAR 回滚包
|
||||
- [ ] 已按窗口替换为 `cw-elevator-application-2.0.6.jar`
|
||||
- [ ] 应用启动日志无严重报错
|
||||
- [ ] 关键接口健康检查通过(含 `add/visitor` 主链路)
|
||||
- [ ] 监控观察窗口内无持续异常
|
||||
|
||||
---
|
||||
|
||||
## 4. 验收交付项
|
||||
|
||||
- [ ] UC-01:未传 `floorIds` 且策略启用时,楼层为 `floorList ∩ allow_zone_ids`
|
||||
- [ ] UC-01:无交集时返回 `76260532`
|
||||
- [ ] UC-02:显式传 `floorIds` 时不受策略表影响
|
||||
- [ ] 未启用策略租户行为与升级前一致
|
||||
- [ ] 已按《实施验收记录模板》完成签字/邮件留档
|
||||
|
||||
---
|
||||
|
||||
## 5. 交付确认信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 实施项目 | cw-elevator-application v2.0.6 |
|
||||
| 实施日期 | `____年____月____日` |
|
||||
| 甲方确认人 | `____________` |
|
||||
| 乙方实施人 | `____________` |
|
||||
| 文档留存路径 | `____________` |
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# cw-elevator-application v2.0.6 实施验收记录模板
|
||||
|
||||
**用途**:实施当晚记录数据库执行、应用部署、业务验收和回滚判定,作为交付归档依据。
|
||||
|
||||
---
|
||||
|
||||
## 1. 基本信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 项目名称 | 智慧电梯 / 访客派梯系统 |
|
||||
| 发布版本 | v2.0.6 |
|
||||
| 实施日期 | `____年____月____日` |
|
||||
| 实施时段 | `____:____` - `____:____` |
|
||||
| 环境 | 生产 / 预生产(圈选) |
|
||||
| 实施负责人 | `____________` |
|
||||
| 甲方联系人 | `____________` |
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据库执行记录
|
||||
|
||||
| 序号 | 脚本 | 执行时间 | 执行人 | 结果 | 备注 |
|
||||
|------|------|----------|--------|------|------|
|
||||
| 1 | tenant_visitor_floor_policy.sql | `____` | `____` | 成功/失败 | `____` |
|
||||
| 2 | tenant_visitor_floor_policy_init_guangfa_fund.sql | `____` | `____` | 成功/失败 | `____` |
|
||||
|
||||
**异常记录**:`______________________________________________`
|
||||
|
||||
---
|
||||
|
||||
## 3. 应用发布记录
|
||||
|
||||
| 项目 | 记录 |
|
||||
|------|------|
|
||||
| 上线前版本 | `____________` |
|
||||
| 上线后版本 | `cw-elevator-application-2.0.6.jar` |
|
||||
| 启停方式 | `____________` |
|
||||
| 服务恢复时间 | `____________` |
|
||||
| 日志健康检查 | 通过 / 不通过 |
|
||||
| 监控观察结论 | 正常 / 异常(说明) |
|
||||
|
||||
---
|
||||
|
||||
## 4. 验收结果记录
|
||||
|
||||
| 用例 | 期望 | 实际 | 结论 |
|
||||
|------|------|------|------|
|
||||
| UC-01(未传 floorIds,策略启用) | floorList 与 allow_zone_ids 求交 | `____` | 通过/不通过 |
|
||||
| UC-01(交集为空) | 返回 `76260532` | `____` | 通过/不通过 |
|
||||
| UC-02(显式传 floorIds) | 不受策略表影响 | `____` | 通过/不通过 |
|
||||
| 无策略租户回归 | 行为与升级前一致 | `____` | 通过/不通过 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 回滚判定
|
||||
|
||||
- [ ] 无需回滚,发布成功
|
||||
- [ ] 需要回滚应用(原因:`________________`)
|
||||
- [ ] 需要回滚数据/策略(原因:`________________`)
|
||||
|
||||
回滚执行记录(如发生):`______________________________________________`
|
||||
|
||||
---
|
||||
|
||||
## 6. 签字确认
|
||||
|
||||
| 角色 | 姓名 | 日期 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 甲方确认 | `____________` | `____` | `____` |
|
||||
| 乙方实施 | `____________` | `____` | `____` |
|
||||
| 乙方复核 | `____________` | `____` | `____` |
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
# cw-elevator-application v2.0.6 版本升级说明书
|
||||
|
||||
**适用范围**:本说明**仅**描述 **v2.0.6** 中与 **租户访客固定访问楼层**(租户级允许区域与组织 `floorList` 求交)相关的升级内容,不含其它性能优化或通用发布项。
|
||||
|
||||
**应用制品**:`cw-elevator-application-2.0.6.jar`(Spring Boot 可执行 fat JAR)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 功能概述
|
||||
|
||||
在 **访客派梯** 接口 **`add/visitor`**(实现类 `PersonRuleServiceImpl#addVisitor`)中,当调用方 **未传入非空 `floorIds`**(业务流程 **UC-01**:按被访人组织侧楼层推导)时:
|
||||
|
||||
1. 服务仍先通过 **`person/detail`** 取得被访人 **`floorList`**(与升级前一致)。
|
||||
2. **新增**:若数据库中存在**启用**的租户策略行,且 **`allow_zone_ids`** 解析为非空 JSON 数组,则最终生效楼层为
|
||||
**`effectiveFloors = floorList ∩ allow_zone_ids`**(顺序保持 **`floorList`** 原有顺序)。
|
||||
3. 若交集 **为空**,接口返回失败码 **`76260532`**(不允许静默放宽到其它楼层)。
|
||||
4. 若无策略表、无启用行、`allow_zone_ids` 为空或 JSON 无效:行为与升级前一致,使用 **`floorList` 全集**。
|
||||
|
||||
当调用方 **已传入非空 `floorIds`**(**UC-02**,第三方显式指定楼层)时:**不读取**策略表,**不对入参求交**,与升级前一致。
|
||||
|
||||
> **产品表述**:「固定访问楼层」在本阶段由租户管理员通过 **`allow_zone_ids`** 声明**允许开放给访客派梯的区域(zoneId)集合**;在 UC-01 路径下与组织返回的 **`floorList`** 取交集,从而将访客权限**收敛**到既有「被访人可去楼层」与「租户允许楼层」的双重约束内。
|
||||
|
||||
---
|
||||
|
||||
## 2. 涉及的数据库变更
|
||||
|
||||
### 2.1 变更类型
|
||||
|
||||
| 类型 | 对象 |
|
||||
|------|------|
|
||||
| **新增表** | `tenant_visitor_floor_policy` |
|
||||
|
||||
**执行库**:与电梯应用 **同一数据源**(MySQL/InnoDB,与现有派梯业务库一致)。
|
||||
|
||||
### 2.2 表用途(摘要)
|
||||
|
||||
| 字段 | 含义 |
|
||||
|------|------|
|
||||
| `business_id` | 租户/机构 ID |
|
||||
| `policy_type` | 本阶段固定 **`INTERSECT_ALLOWLIST`** |
|
||||
| `allow_zone_ids` | **TEXT**,存 **JSON 数组**字符串,元素为允许访客派梯的 **zoneId** |
|
||||
| `building_id` | 租户级默认策略填 **NULL**(预留楼栋维) |
|
||||
| `enabled` | **1** 启用 / **0** 停用 |
|
||||
| `policy_version` | 配置版本号(审计) |
|
||||
|
||||
唯一约束 **`uk_biz_building (business_id, building_id)`**:同一租户、租户级策略(`building_id` 为空)**建议仅维护一行**,避免多行时查询仅命中「最新一条」与运维预期不符。
|
||||
|
||||
### 2.3 DDL 脚本位置
|
||||
|
||||
| 用途 | 仓库内路径 |
|
||||
|------|------------|
|
||||
| **权威 DDL** | `docs/sql/tenant_visitor_floor_policy.sql` |
|
||||
|
||||
**发布包内副本**:随 v2.0.6 发布目录一并下发,路径为 **`ddl/tenant_visitor_floor_policy.sql`**(与根目录 JAR 同级下的 `ddl` 子目录)。
|
||||
|
||||
脚本内容为 **`CREATE TABLE IF NOT EXISTS`**,在未建表环境可重复执行;**不含**业务数据 `INSERT`,上线需按租户配置自行 **`INSERT`** 策略行。
|
||||
|
||||
### 2.4 上线执行顺序(建议)
|
||||
|
||||
1. **备份**当前电梯应用库(至少包含待变更库的全库或相关表备份策略)。
|
||||
2. 在目标库执行 **`ddl/tenant_visitor_floor_policy.sql`**(或直接使用仓库 `docs/sql` 下同源文件)。
|
||||
3. 对需启用策略的租户 **`INSERT`** 一行(示例字段:`business_id`、`policy_type='INTERSECT_ALLOWLIST'`、`allow_zone_ids` 为合法 JSON 数组、`enabled=1`、`building_id` 为 **NULL**)。
|
||||
4. 部署 **`cw-elevator-application-2.0.6.jar`** 并滚动重启应用。
|
||||
5. 按 §4 做 **UC-01 / UC-02** 验收。
|
||||
|
||||
### 2.5 回滚说明
|
||||
|
||||
- **仅回滚应用**:还原旧版本 JAR 后,若库中**已存在**策略行且仍为 **enabled=1**,旧版本应用**通常不读取**该表,行为与历史一致;表结构可保留。
|
||||
- **回滚数据库**:若需删除表(谨慎),在确认无其它依赖后执行 **`DROP TABLE tenant_visitor_floor_policy`**;请在变更窗口与 DBA 确认。
|
||||
|
||||
---
|
||||
|
||||
## 3. 行为与错误码(验收)
|
||||
|
||||
| 场景 | `floorIds` | 策略库 | 期望 |
|
||||
|------|------------|--------|------|
|
||||
| UC-01 基线 | 空/未传 | 无启用行或 allow 空/无效 | 使用组织 **`floorList` 全集**(与升级前一致) |
|
||||
| UC-01 + 固定楼层 | 空/未传 | 有启用行且 allow 非空 | **`floorList ∩ allow`**(保序) |
|
||||
| 无交集 | 空/未传 | allow 与 `floorList` 无交集 | **`76260532`** |
|
||||
| 被访人无楼层 | 空/未传 | 任意 | **`76260531`** |
|
||||
| UC-02 | **非空** | 任意 | **不读策略表**,按请求楼层处理 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 发布包目录结构(v2.0.6)
|
||||
|
||||
执行仓库根目录 **`./scripts/release-cw-elevator-application.sh 2.0.6`** 后,输出目录为(名称含构建日期 `<YYYYMMDD>`,与历史运行包 **`cw-elevator-application-V1.0.0.20211103`** 同构;可用环境变量 **`RELEASE_DATE_LABEL`** 固定日期):
|
||||
|
||||
**`maven-cw-elevator-application/releases/cw-elevator-application-V2.0.6.<YYYYMMDD>/`**
|
||||
|
||||
| 文件/目录 | 说明 |
|
||||
|-----------|------|
|
||||
| `cw-elevator-application-2.0.6.jar` | 可执行应用 |
|
||||
| `bootstrap.properties`、`application*.properties` | 与 JAR 同层(**不**再使用 `config/` 子目录重复存放) |
|
||||
| `ddl/tenant_visitor_floor_policy.sql` | 与本功能相关的 **唯一 DDL**(与 `docs/sql` 同源) |
|
||||
| `版本升级说明书.md` | 本文件副本(便于随包交付) |
|
||||
| `BUILD_MANIFEST.txt` | 构建时间、JDK、`git` 修订号 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 参考文档(仓库内)
|
||||
|
||||
| 文档 | 路径 |
|
||||
|------|------|
|
||||
| 数据库阶段变更记录 | `docs/business/租户访客默认楼层-数据库阶段变更记录.md` |
|
||||
| 数据库配置阶段技术设计 | `docs/business/租户访客默认楼层-数据库配置阶段技术设计.md` |
|
||||
| 技术产品方案 | `docs/business/租户访客默认楼层技术产品方案.md` |
|
||||
| 访客注册与派梯楼层走查 | `docs/business/访客注册与派梯楼层业务流程走查.md` |
|
||||
|
||||
---
|
||||
|
||||
**文档版本**:与制品 **`cw-elevator-application-2.0.6`** 对齐;若仅升级文档而不改代码,请以 **`BUILD_MANIFEST.txt`** 中构建时间为准。
|
||||
@@ -0,0 +1,34 @@
|
||||
# 电梯派梯应用 v2.0.6 — 版本升级说明(广发基金)
|
||||
|
||||
**制品**:`cw-elevator-application-2.0.6.jar`。技术细节、验收码与脚本位置见同目录《版本升级说明书》。
|
||||
|
||||
---
|
||||
|
||||
## 本次升级做什么
|
||||
|
||||
针对**广发基金**租户:访客走常见派梯路径(接口**未单独传楼层**)时,系统在「被访人所在单位给的可去楼层」基础上,再按**广发基金侧配置的允许区域**做一次收紧,两边**都满足**的楼层才能派梯。这样可以把访客权限收在比如固定接待层,而员工本人仍可按组织权限去多层办公。
|
||||
|
||||
广发基金若**未配置或未启用**该策略,行为与现在一致。
|
||||
|
||||
---
|
||||
|
||||
## 上线要动什么
|
||||
|
||||
- 换新版应用包。
|
||||
- 库里**多一张策略表**(脚本在发布包 `ddl/` 下);表里为广发基金写入**一行**启用策略即可,允许区域(如接待层对应的 zone)由业务与实施定稿。
|
||||
|
||||
其它租户不配策略则**不受影响**。
|
||||
|
||||
---
|
||||
|
||||
## 对您这边的影响
|
||||
|
||||
- **时间**:安排在**夜间**,具体周二/周三窗口见《升级计划》。
|
||||
- **中断**:重启应用时派梯接口可能**短暂**不可用,一般会控制在很短时间。
|
||||
- **配合**:指定一个对接人;确认广发基金侧要开放的**访客可达区域/楼层**(与前台、接待流程对齐);上线后若有异常派梯请及时反馈。
|
||||
|
||||
---
|
||||
|
||||
## 出问题怎么办
|
||||
|
||||
应用可先退回上一版包;策略数据可单独改/停,不一定整库回滚。细则见《升级计划》。
|
||||
@@ -0,0 +1,75 @@
|
||||
# cw-elevator-application v2.0.7 SQL与代码一致性审核记录
|
||||
|
||||
**审核目标**:确认发布规范涉及 SQL 脚本与当前代码逻辑一致,满足实施交付依据留档要求。
|
||||
**审核范围**:`tenant_visitor_floor_policy` 建表脚本、初始化脚本、访客派梯策略读取与求交流程。
|
||||
**审核时间**:`2026-04-29`
|
||||
**审核人**:`____________`
|
||||
|
||||
---
|
||||
|
||||
## 1. 审核过程
|
||||
|
||||
1. 审阅 SQL 脚本:
|
||||
- `docs/sql/tenant_visitor_floor_policy.sql`
|
||||
- `docs/sql/tenant_visitor_floor_policy_init_guangfa_fund.sql`
|
||||
2. 审阅代码路径:
|
||||
- `cw-elevator-application-service/.../PersonRuleServiceImpl#addVisitor`
|
||||
- `cw-elevator-application-data/.../TenantVisitorFloorPolicyMapper.xml`
|
||||
- `cw-elevator-application-data/.../TenantVisitorFloorPolicyDto`
|
||||
3. 做场景对照:
|
||||
- UC-01:调用方未传 `floorIds`
|
||||
- UC-02:调用方已传 `floorIds`
|
||||
- 策略缺失/无效 JSON/交集为空等异常分支
|
||||
4. 形成一致性结论与风险提示,并纳入发布包。
|
||||
|
||||
---
|
||||
|
||||
## 2. 审核依据与结果
|
||||
|
||||
| 检查项 | SQL 依据 | 代码依据 | 结论 |
|
||||
|------|----------|----------|------|
|
||||
| 策略表字段是否齐全(business_id/policy_type/allow_zone_ids/building_id/enabled/policy_version) | `tenant_visitor_floor_policy.sql` DDL 定义上述字段 | Mapper 查询并映射到 DTO 同名语义字段 | 一致 |
|
||||
| 代码是否只读取“启用+租户默认+INTERSECT_ALLOWLIST”策略 | 初始化脚本使用 `policy_type='INTERSECT_ALLOWLIST'`、`building_id=NULL`、`enabled=1` | Mapper `WHERE enabled=1 AND policy_type='INTERSECT_ALLOWLIST' AND (building_id IS NULL OR building_id='')` | 一致 |
|
||||
| allow_zone_ids 的数据格式是否匹配代码解析方式 | SQL 注释与初始化脚本均为 JSON 数组字符串(如 `["605560545117995008"]`) | `parseAllowZoneIds` 使用 `JSON.parseArray(..., String.class)` 解析 | 一致 |
|
||||
| 未传 floorIds 时是否执行“被访人楼层 ∩ 策略楼层” | 策略表提供 allowlist 数据来源 | `addVisitor` 在 `!callerProvidedFloors` 分支求交 | 一致 |
|
||||
| 交集为空是否按规范失败 | 初始化脚本可构造交集为空场景 | `intersected.isEmpty()` 返回 `76260532` | 一致 |
|
||||
| 已传 floorIds 是否跳过策略表 | SQL 与此分支无冲突 | `callerProvidedFloors=true` 时不进入策略读取分支 | 一致 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 关键证据(摘录)
|
||||
|
||||
- 代码读取策略(启用、类型、租户默认)来自 `TenantVisitorFloorPolicyMapper.xml`。
|
||||
- 代码在 `PersonRuleServiceImpl#addVisitor` 中:
|
||||
- `!callerProvidedFloors` 才读取被访人楼层与租户策略;
|
||||
- `allow_zone_ids` 解析成功且非空才参与求交;
|
||||
- 求交为空返回 `76260532`;
|
||||
- 调用方已传楼层时不走策略求交流程。
|
||||
- 初始化脚本 `tenant_visitor_floor_policy_init_guangfa_fund.sql` 的字段取值与上述查询条件完全兼容。
|
||||
|
||||
---
|
||||
|
||||
## 4. 审核结论
|
||||
|
||||
**结论:通过。**
|
||||
发布规范涉及的 SQL 脚本内容与当前代码逻辑一致,满足 v2.0.7 发布包“数据库脚本 + 功能升级说明 + 实施交付依据”要求。
|
||||
|
||||
---
|
||||
|
||||
## 5. 风险提示与建议
|
||||
|
||||
1. **唯一性治理风险(中)**
|
||||
DDL 使用 `UNIQUE KEY (business_id, building_id)`,在 MySQL 下 `building_id=NULL` 可能存在多行;当前代码通过 `ORDER BY updated_at DESC, policy_version DESC LIMIT 1` 取最新一条,不阻断功能,但建议运维侧增加“每租户默认策略唯一”巡检。
|
||||
2. **配置数据质量风险(中)**
|
||||
`allow_zone_ids` 必须是电梯域 `zone_id` 字符串数组,若误填其它系统 UUID 会导致策略不生效或交集为空。
|
||||
|
||||
---
|
||||
|
||||
## 6. 签字确认
|
||||
|
||||
| 角色 | 姓名 | 日期 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 审核人 | `____________` | `____` | `____` |
|
||||
| 实施负责人 | `____________` | `____` | `____` |
|
||||
| 甲方确认(可选) | `____________` | `____` | `____` |
|
||||
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
# cw-elevator-application v2.0.7 升级计划
|
||||
|
||||
**项目名称**(可填):智慧电梯 / 访客派梯系统升级
|
||||
**版本**:v2.0.7
|
||||
**计划性质**:执行级排期草案,**具体日期、起止时刻以与甲方书面/邮件确认为准**。
|
||||
|
||||
---
|
||||
|
||||
## 1. 升级目标
|
||||
|
||||
完成电梯派梯应用 **v2.0.7** 上线,启用**租户访客固定访问楼层**能力所需的应用与数据库对象;按业务需要为指定租户配置策略并完成验收。
|
||||
|
||||
---
|
||||
|
||||
## 2. 计划时间窗口(夜间 · 暂定周二、周三)
|
||||
|
||||
| 窗口 | 意向安排 | 建议内容(可合并或调整) |
|
||||
|------|-----------|----------------------------|
|
||||
| **第一次:周二晚间** | 夜间低峰段,具体 **HH:MM–HH:MM** 待定 | 环境检查、数据库备份、执行 **DDL**(新建策略表)、(可选)预发布验证、必要时准备回滚包与检查单 |
|
||||
| **第二次:周三晚间** | 夜间低峰段,具体 **HH:MM–HH:MM** 待定 | 部署新版本 **JAR**、滚动/重启应用、按需 **INSERT** 租户策略数据、业务联调与验收、监控与值守 |
|
||||
|
||||
**说明**:
|
||||
|
||||
- 若贵方现场要求**一个晚上完成全部步骤**,可将 DDL 与部署**合并在同一晚间窗口**执行,本表仅体现「周二、周三两晚」的**当前意向拆分**,最终以确认单为准。
|
||||
- 两次窗口建议**间隔至少数小时至一个工作日**,便于第一次变更后观察库表与低风险项;若合并为单次窗口,须在计划单中注明**连续操作顺序与回滚点**。
|
||||
|
||||
**待确认栏**(实施时填写):
|
||||
|
||||
- 周二实施日期:`____年____月____日`,时段: `____ : ____` – `____ : ____`
|
||||
- 周三实施日期:`____年____月____日`,时段: `____ : ____` – `____ : ____`
|
||||
- 甲方现场联系人: `____________` 乙方/实施负责人: `____________`
|
||||
|
||||
---
|
||||
|
||||
## 3. 影响范围与沟通
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 影响系统 | 电梯派梯相关应用(`cw-elevator-application`)及同一业务库。 |
|
||||
| 用户感知 | 应用重启期间可能出现短时派梯接口失败;策略误配可能导致部分访客路径失败,需按验收清单核对。 |
|
||||
| 通知范围 | 建议提前通知:物业/客服、前台与访客登记、安保与梯控相关值班(按项目实际 roster 确定)。 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 前置条件(升级前)
|
||||
|
||||
- [ ] 已与甲方确认 **周二 / 周三** 夜间窗口。
|
||||
- [ ] 取得 **v2.0.7** 发布包(含 `jar`、`ddl/tenant_visitor_floor_policy.sql`、说明书)。
|
||||
- [ ] 目标环境 **JDK 版本**符合实施方要求(与构建说明一致,一般为 JDK 8)。
|
||||
- [ ] 数据库已做**备份**(全库或按运维规范),并可从发布包定位 DDL。
|
||||
- [ ] 明确需启用「固定访客楼层」的租户列表及**允许区域**配置(若不启用,可跳过策略数据录入,行为与升级前一致)。
|
||||
- [ ] 回滚包:保留**当前线上 JAR** 备份与回滚步骤(见下文)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 实施步骤(建议顺序)
|
||||
|
||||
### 5.1 周二晚间(或首个窗口)
|
||||
|
||||
1. 备份数据库。
|
||||
2. 执行 `tenant_visitor_floor_policy.sql`(`CREATE TABLE IF NOT EXISTS`,可重复执行需与 DBA 确认)。
|
||||
3. (可选)在测试/预发环境先执行一遍并验证。
|
||||
4. 记录执行人、时间与结果。
|
||||
|
||||
### 5.2 周三晚间(或第二个窗口 / 同晚续作)
|
||||
|
||||
1. 停止或滚动发布应用(按现网规范)。
|
||||
2. 替换为 `cw-elevator-application-2.0.7.jar` 并启动。
|
||||
3. 按业务需求对需启用的租户执行策略 **INSERT**(`enabled=1`、`allow_zone_ids` 等为合法 JSON 等,字段级以技术说明书为准)。
|
||||
4. 抽样验证:未传显式楼层时的访客派梯、租户策略开/关、与组织楼层无交集时的失败提示等。
|
||||
5. 观察监控与日志,**值守**至约定结束时间。
|
||||
|
||||
*若合并为单次窗口:按「备份 → DDL → 部署 JAR → 策略数据 → 验收」顺序连续执行,并预留回滚决策时间。*
|
||||
|
||||
---
|
||||
|
||||
## 6. 验收要点(摘要)
|
||||
|
||||
- 未配置或未启用策略时:与升级前行为一致。
|
||||
- 已启用策略且业务走「未显式指定楼层」路径:访客可去楼层为**组织允许**与**租户允许**的**交集**。
|
||||
- 交集为空时:接口返回预期业务错误(技术码见实施方说明书)。
|
||||
- 第三方已显式传入楼层的路径:不因本策略表改变原逻辑。
|
||||
|
||||
---
|
||||
|
||||
## 7. 回滚预案
|
||||
|
||||
| 场景 | 建议动作 |
|
||||
|------|-----------|
|
||||
| 应用异常 | 回退至上一版本 JAR;数据库新表若已存在且旧应用不读该表,通常可继续服务;与实施方确认。 |
|
||||
| 策略配置错误 | 优先**停用或修正策略行**,避免大规模回滚应用。 |
|
||||
| 必须撤表 | 仅在评估无依赖后由 DBA 执行删表;**高风险**,需书面确认。 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 交付物核对
|
||||
|
||||
- [ ] `cw-elevator-application-2.0.7.jar`
|
||||
- [ ] `ddl/tenant_visitor_floor_policy.sql`
|
||||
- [ ] 《版本升级说明书》(实施/技术)
|
||||
- [ ] 本《甲方版本升级说明》(如已作为对甲交付)
|
||||
- [ ] 本《升级计划》(双方确认签字/邮件留档)
|
||||
|
||||
---
|
||||
|
||||
**文档状态**:草案;**时间点为暂定周二、周三晚间**,正式实施前请更新「待确认栏」并留存确认记录。
|
||||
@@ -0,0 +1,32 @@
|
||||
# cw-elevator-application v2.0.7 发布索引
|
||||
|
||||
本版本**功能升级说明**已单独成文,**仅覆盖「租户访客固定访问楼层」**及配套数据库 DDL,见:
|
||||
|
||||
**[cw-elevator-application-v2.0.7-版本升级说明书](./cw-elevator-application-v2.0.7-版本升级说明书.md)**
|
||||
|
||||
**对甲交付(业务表述与排期)**:
|
||||
|
||||
- [甲方版本升级说明](./cw-elevator-application-v2.0.7-甲方版本升级说明.md)
|
||||
- [升级计划(含夜间 · 周二/周三窗口)](./cw-elevator-application-v2.0.7-升级计划.md)
|
||||
- [实施交付清单(实施方内部与对甲交付核对)](./cw-elevator-application-v2.0.7-实施交付清单.md)
|
||||
- [实施验收记录模板(上线当晚记录)](./cw-elevator-application-v2.0.7-实施验收记录模板.md)
|
||||
- [SQL与代码一致性审核记录(发布规范走查依据)](./cw-elevator-application-v2.0.7-SQL与代码一致性审核记录.md)
|
||||
|
||||
---
|
||||
|
||||
## 一键构建与发布目录
|
||||
|
||||
在仓库根目录、**JDK 8** 下执行:
|
||||
|
||||
```bash
|
||||
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
|
||||
./scripts/release-cw-elevator-application.sh 2.0.7
|
||||
```
|
||||
|
||||
输出:**`maven-cw-elevator-application/releases/cw-elevator-application-V2.0.7.<YYYYMMDD>/`**(目录名含构建日期,与 `cw-elevator-application-V1.0.0.20211103` 命名风格一致;可用环境变量 **`RELEASE_DATE_LABEL`** 指定日期),含 `cw-elevator-application-2.0.7.jar`、`ddl/`、发布根目录下的 `bootstrap.properties` / `application*.properties`(与星中心/V1 同层摆放,**无额外 `config/` 子目录**)、`start.sh` / `stop.sh` / `cw-elevator-application.service`(路径占位符需现场替换)、`run.sh`、`common-java.sh`、**`collect_elevator_runtime_evidence.sh`**(根目录,现场只读证据采集)、`版本升级说明书.md`、甲方与实施类 Markdown、`BUILD_MANIFEST.txt`;默认另生成 **`releases/cw-elevator-application-V2.0.7.<YYYYMMDD>.zip`**(设 `RELEASE_MAKE_ZIP=0` 可跳过)。
|
||||
|
||||
---
|
||||
|
||||
## Git 与大文件
|
||||
|
||||
`maven-cw-elevator-application/.gitignore` 忽略 `**releases/**/*.jar**`;**DDL 与说明书**可提交;可执行 JAR 请通过制品库或制品服务器分发。
|
||||
@@ -0,0 +1,60 @@
|
||||
# cw-elevator-application v2.0.7 实施交付清单
|
||||
|
||||
**用途**:用于正式发布交付前后的材料核对,满足“发布包 + 数据库脚本 + 升级说明 + 实施验收记录”闭环。
|
||||
|
||||
---
|
||||
|
||||
## 1. 发布包文件清单
|
||||
|
||||
- [ ] `cw-elevator-application-2.0.7.jar`
|
||||
- [ ] `ddl/tenant_visitor_floor_policy.sql`(建表脚本)
|
||||
- [ ] `ddl/tenant_visitor_floor_policy_init_guangfa_fund.sql`(广发基金初始化示例/可直接执行)
|
||||
- [ ] `版本升级说明书.md`(技术实施口径)
|
||||
- [ ] `甲方版本升级说明.md`(业务口径)
|
||||
- [ ] `升级计划.md`(实施窗口与回滚安排)
|
||||
- [ ] `实施验收记录模板.md`(上线当晚记录)
|
||||
- [ ] `BUILD_MANIFEST.txt`(构建时间、分支、提交号)
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据库变更交付项
|
||||
|
||||
- [ ] DBA 已确认目标库与执行窗口
|
||||
- [ ] 已备份目标库(全库/指定库按现场规范)
|
||||
- [ ] 已执行 `tenant_visitor_floor_policy.sql`
|
||||
- [ ] 已执行或评审 `tenant_visitor_floor_policy_init_guangfa_fund.sql`
|
||||
- [ ] 已确认 `allow_zone_ids` 使用的是电梯库 `zone_id`(非其它系统 UUID)
|
||||
- [ ] 已留存 SQL 执行记录(执行人、时间、结果)
|
||||
|
||||
---
|
||||
|
||||
## 3. 应用部署交付项
|
||||
|
||||
- [ ] 上线前已保存旧版 JAR 回滚包
|
||||
- [ ] 已按窗口替换为 `cw-elevator-application-2.0.7.jar`
|
||||
- [ ] 应用启动日志无严重报错
|
||||
- [ ] 关键接口健康检查通过(含 `add/visitor` 主链路)
|
||||
- [ ] 监控观察窗口内无持续异常
|
||||
|
||||
---
|
||||
|
||||
## 4. 验收交付项
|
||||
|
||||
- [ ] UC-01:未传 `floorIds` 且策略启用时,楼层为 `floorList ∩ allow_zone_ids`
|
||||
- [ ] UC-01:无交集时返回 `76260532`
|
||||
- [ ] UC-02:显式传 `floorIds` 时不受策略表影响
|
||||
- [ ] 未启用策略租户行为与升级前一致
|
||||
- [ ] 已按《实施验收记录模板》完成签字/邮件留档
|
||||
|
||||
---
|
||||
|
||||
## 5. 交付确认信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 实施项目 | cw-elevator-application v2.0.7 |
|
||||
| 实施日期 | `____年____月____日` |
|
||||
| 甲方确认人 | `____________` |
|
||||
| 乙方实施人 | `____________` |
|
||||
| 文档留存路径 | `____________` |
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# cw-elevator-application v2.0.7 实施验收记录模板
|
||||
|
||||
**用途**:实施当晚记录数据库执行、应用部署、业务验收和回滚判定,作为交付归档依据。
|
||||
|
||||
---
|
||||
|
||||
## 1. 基本信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 项目名称 | 智慧电梯 / 访客派梯系统 |
|
||||
| 发布版本 | v2.0.7 |
|
||||
| 实施日期 | `____年____月____日` |
|
||||
| 实施时段 | `____:____` - `____:____` |
|
||||
| 环境 | 生产 / 预生产(圈选) |
|
||||
| 实施负责人 | `____________` |
|
||||
| 甲方联系人 | `____________` |
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据库执行记录
|
||||
|
||||
| 序号 | 脚本 | 执行时间 | 执行人 | 结果 | 备注 |
|
||||
|------|------|----------|--------|------|------|
|
||||
| 1 | tenant_visitor_floor_policy.sql | `____` | `____` | 成功/失败 | `____` |
|
||||
| 2 | tenant_visitor_floor_policy_init_guangfa_fund.sql | `____` | `____` | 成功/失败 | `____` |
|
||||
|
||||
**异常记录**:`______________________________________________`
|
||||
|
||||
---
|
||||
|
||||
## 3. 应用发布记录
|
||||
|
||||
| 项目 | 记录 |
|
||||
|------|------|
|
||||
| 上线前版本 | `____________` |
|
||||
| 上线后版本 | `cw-elevator-application-2.0.7.jar` |
|
||||
| 启停方式 | `____________` |
|
||||
| 服务恢复时间 | `____________` |
|
||||
| 日志健康检查 | 通过 / 不通过 |
|
||||
| 监控观察结论 | 正常 / 异常(说明) |
|
||||
|
||||
---
|
||||
|
||||
## 4. 验收结果记录
|
||||
|
||||
| 用例 | 期望 | 实际 | 结论 |
|
||||
|------|------|------|------|
|
||||
| UC-01(未传 floorIds,策略启用) | floorList 与 allow_zone_ids 求交 | `____` | 通过/不通过 |
|
||||
| UC-01(交集为空) | 返回 `76260532` | `____` | 通过/不通过 |
|
||||
| UC-02(显式传 floorIds) | 不受策略表影响 | `____` | 通过/不通过 |
|
||||
| 无策略租户回归 | 行为与升级前一致 | `____` | 通过/不通过 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 回滚判定
|
||||
|
||||
- [ ] 无需回滚,发布成功
|
||||
- [ ] 需要回滚应用(原因:`________________`)
|
||||
- [ ] 需要回滚数据/策略(原因:`________________`)
|
||||
|
||||
回滚执行记录(如发生):`______________________________________________`
|
||||
|
||||
---
|
||||
|
||||
## 6. 签字确认
|
||||
|
||||
| 角色 | 姓名 | 日期 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 甲方确认 | `____________` | `____` | `____` |
|
||||
| 乙方实施 | `____________` | `____` | `____` |
|
||||
| 乙方复核 | `____________` | `____` | `____` |
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
# cw-elevator-application v2.0.7 版本升级说明书
|
||||
|
||||
**适用范围**:本说明**仅**描述 **v2.0.7** 中与 **租户访客固定访问楼层**(租户级允许区域与组织 `floorList` 求交)相关的升级内容,不含其它性能优化或通用发布项。
|
||||
|
||||
**应用制品**:`cw-elevator-application-2.0.7.jar`(Spring Boot 可执行 fat JAR)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 功能概述
|
||||
|
||||
在 **访客派梯** 接口 **`add/visitor`**(实现类 `PersonRuleServiceImpl#addVisitor`)中,当调用方 **未传入非空 `floorIds`**(业务流程 **UC-01**:按被访人组织侧楼层推导)时:
|
||||
|
||||
1. 服务仍先通过 **`person/detail`** 取得被访人 **`floorList`**(与升级前一致)。
|
||||
2. **新增**:若数据库中存在**启用**的租户策略行,且 **`allow_zone_ids`** 解析为非空 JSON 数组,则最终生效楼层为
|
||||
**`effectiveFloors = floorList ∩ allow_zone_ids`**(顺序保持 **`floorList`** 原有顺序)。
|
||||
3. 若交集 **为空**,接口返回失败码 **`76260532`**(不允许静默放宽到其它楼层)。
|
||||
4. 若无策略表、无启用行、`allow_zone_ids` 为空或 JSON 无效:行为与升级前一致,使用 **`floorList` 全集**。
|
||||
|
||||
当调用方 **已传入非空 `floorIds`**(**UC-02**,第三方显式指定楼层)时:**不读取**策略表,**不对入参求交**,与升级前一致。
|
||||
|
||||
> **产品表述**:「固定访问楼层」在本阶段由租户管理员通过 **`allow_zone_ids`** 声明**允许开放给访客派梯的区域(zoneId)集合**;在 UC-01 路径下与组织返回的 **`floorList`** 取交集,从而将访客权限**收敛**到既有「被访人可去楼层」与「租户允许楼层」的双重约束内。
|
||||
|
||||
---
|
||||
|
||||
## 2. 涉及的数据库变更
|
||||
|
||||
### 2.1 变更类型
|
||||
|
||||
| 类型 | 对象 |
|
||||
|------|------|
|
||||
| **新增表** | `tenant_visitor_floor_policy` |
|
||||
|
||||
**执行库**:与电梯应用 **同一数据源**(MySQL/InnoDB,与现有派梯业务库一致)。
|
||||
|
||||
### 2.2 表用途(摘要)
|
||||
|
||||
| 字段 | 含义 |
|
||||
|------|------|
|
||||
| `business_id` | 租户/机构 ID |
|
||||
| `policy_type` | 本阶段固定 **`INTERSECT_ALLOWLIST`** |
|
||||
| `allow_zone_ids` | **TEXT**,存 **JSON 数组**字符串,元素为允许访客派梯的 **zoneId** |
|
||||
| `building_id` | 租户级默认策略填 **NULL**(预留楼栋维) |
|
||||
| `enabled` | **1** 启用 / **0** 停用 |
|
||||
| `policy_version` | 配置版本号(审计) |
|
||||
|
||||
唯一约束 **`uk_biz_building (business_id, building_id)`**:同一租户、租户级策略(`building_id` 为空)**建议仅维护一行**,避免多行时查询仅命中「最新一条」与运维预期不符。
|
||||
|
||||
### 2.3 DDL 脚本位置
|
||||
|
||||
| 用途 | 仓库内路径 |
|
||||
|------|------------|
|
||||
| **权威 DDL** | `docs/sql/tenant_visitor_floor_policy.sql` |
|
||||
|
||||
**发布包内副本**:随 v2.0.7 发布目录一并下发,路径为 **`ddl/tenant_visitor_floor_policy.sql`**(与根目录 JAR 同级下的 `ddl` 子目录)。
|
||||
|
||||
脚本内容为 **`CREATE TABLE IF NOT EXISTS`**,在未建表环境可重复执行;**不含**业务数据 `INSERT`,上线需按租户配置自行 **`INSERT`** 策略行。
|
||||
|
||||
### 2.4 上线执行顺序(建议)
|
||||
|
||||
1. **备份**当前电梯应用库(至少包含待变更库的全库或相关表备份策略)。
|
||||
2. 在目标库执行 **`ddl/tenant_visitor_floor_policy.sql`**(或直接使用仓库 `docs/sql` 下同源文件)。
|
||||
3. 对需启用策略的租户 **`INSERT`** 一行(示例字段:`business_id`、`policy_type='INTERSECT_ALLOWLIST'`、`allow_zone_ids` 为合法 JSON 数组、`enabled=1`、`building_id` 为 **NULL**)。
|
||||
4. 部署 **`cw-elevator-application-2.0.7.jar`** 并滚动重启应用。
|
||||
5. 按 §4 做 **UC-01 / UC-02** 验收。
|
||||
|
||||
### 2.5 回滚说明
|
||||
|
||||
- **仅回滚应用**:还原旧版本 JAR 后,若库中**已存在**策略行且仍为 **enabled=1**,旧版本应用**通常不读取**该表,行为与历史一致;表结构可保留。
|
||||
- **回滚数据库**:若需删除表(谨慎),在确认无其它依赖后执行 **`DROP TABLE tenant_visitor_floor_policy`**;请在变更窗口与 DBA 确认。
|
||||
|
||||
---
|
||||
|
||||
## 3. 行为与错误码(验收)
|
||||
|
||||
| 场景 | `floorIds` | 策略库 | 期望 |
|
||||
|------|------------|--------|------|
|
||||
| UC-01 基线 | 空/未传 | 无启用行或 allow 空/无效 | 使用组织 **`floorList` 全集**(与升级前一致) |
|
||||
| UC-01 + 固定楼层 | 空/未传 | 有启用行且 allow 非空 | **`floorList ∩ allow`**(保序) |
|
||||
| 无交集 | 空/未传 | allow 与 `floorList` 无交集 | **`76260532`** |
|
||||
| 被访人无楼层 | 空/未传 | 任意 | **`76260531`** |
|
||||
| UC-02 | **非空** | 任意 | **不读策略表**,按请求楼层处理 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 发布包目录结构(v2.0.7)
|
||||
|
||||
执行仓库根目录 **`./scripts/release-cw-elevator-application.sh 2.0.7`** 后,输出目录为(名称含构建日期 `<YYYYMMDD>`,与历史运行包 **`cw-elevator-application-V1.0.0.20211103`** 同构;可用环境变量 **`RELEASE_DATE_LABEL`** 固定日期):
|
||||
|
||||
**`maven-cw-elevator-application/releases/cw-elevator-application-V2.0.7.<YYYYMMDD>/`**
|
||||
|
||||
| 文件/目录 | 说明 |
|
||||
|-----------|------|
|
||||
| `cw-elevator-application-2.0.7.jar` | 可执行应用 |
|
||||
| `bootstrap.properties`、`application*.properties` | 与 JAR 同层(**不**再使用 `config/` 子目录重复存放) |
|
||||
| `ddl/tenant_visitor_floor_policy.sql` | 与本功能相关的 **唯一 DDL**(与 `docs/sql` 同源) |
|
||||
| `版本升级说明书.md` | 本文件副本(便于随包交付) |
|
||||
| `BUILD_MANIFEST.txt` | 构建时间、JDK、`git` 修订号 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 参考文档(仓库内)
|
||||
|
||||
| 文档 | 路径 |
|
||||
|------|------|
|
||||
| 数据库阶段变更记录 | `docs/business/租户访客默认楼层-数据库阶段变更记录.md` |
|
||||
| 数据库配置阶段技术设计 | `docs/business/租户访客默认楼层-数据库配置阶段技术设计.md` |
|
||||
| 技术产品方案 | `docs/business/租户访客默认楼层技术产品方案.md` |
|
||||
| 访客注册与派梯楼层走查 | `docs/business/访客注册与派梯楼层业务流程走查.md` |
|
||||
|
||||
---
|
||||
|
||||
**文档版本**:与制品 **`cw-elevator-application-2.0.7`** 对齐;若仅升级文档而不改代码,请以 **`BUILD_MANIFEST.txt`** 中构建时间为准。
|
||||
@@ -0,0 +1,34 @@
|
||||
# 电梯派梯应用 v2.0.7 — 版本升级说明(广发基金)
|
||||
|
||||
**制品**:`cw-elevator-application-2.0.7.jar`。技术细节、验收码与脚本位置见同目录《版本升级说明书》。
|
||||
|
||||
---
|
||||
|
||||
## 本次升级做什么
|
||||
|
||||
针对**广发基金**租户:访客走常见派梯路径(接口**未单独传楼层**)时,系统在「被访人所在单位给的可去楼层」基础上,再按**广发基金侧配置的允许区域**做一次收紧,两边**都满足**的楼层才能派梯。这样可以把访客权限收在比如固定接待层,而员工本人仍可按组织权限去多层办公。
|
||||
|
||||
广发基金若**未配置或未启用**该策略,行为与现在一致。
|
||||
|
||||
---
|
||||
|
||||
## 上线要动什么
|
||||
|
||||
- 换新版应用包。
|
||||
- 库里**多一张策略表**(脚本在发布包 `ddl/` 下);表里为广发基金写入**一行**启用策略即可,允许区域(如接待层对应的 zone)由业务与实施定稿。
|
||||
|
||||
其它租户不配策略则**不受影响**。
|
||||
|
||||
---
|
||||
|
||||
## 对您这边的影响
|
||||
|
||||
- **时间**:安排在**夜间**,具体周二/周三窗口见《升级计划》。
|
||||
- **中断**:重启应用时派梯接口可能**短暂**不可用,一般会控制在很短时间。
|
||||
- **配合**:指定一个对接人;确认广发基金侧要开放的**访客可达区域/楼层**(与前台、接待流程对齐);上线后若有异常派梯请及时反馈。
|
||||
|
||||
---
|
||||
|
||||
## 出问题怎么办
|
||||
|
||||
应用可先退回上一版包;策略数据可单独改/停,不一定整库回滚。细则见《升级计划》。
|
||||
@@ -9,6 +9,7 @@
|
||||
| 版本 | v0.1 草案(数据库阶段) |
|
||||
| 适用工程 | `maven-cw-elevator-application`(电梯应用库;落库表位于**电梯库**或与电梯同数据源的业务库,以现网数据源划分为准) |
|
||||
| 读者 | 后端开发、DBA、集成测试、运维 |
|
||||
| **模型索引** | [租户组织人员访客-数据模型与用例](../architecture/租户组织人员访客-数据模型与用例.md)(仓库级 ER、`business_id` 与组织主键辨析) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
-- 广发基金租户:访客默认楼层策略初始化(电梯库 cw-elevator-application)
|
||||
--
|
||||
-- 请先执行同目录 tenant_visitor_floor_policy.sql 建表(或 releases/v2.0.0/ddl 同源 DDL)。
|
||||
--
|
||||
-- 字段说明:allow_zone_ids 为 JSON 数组字符串,元素须与组织/派梯侧 floorList、image_rule_ref 使用的
|
||||
-- zone_id(电梯库 snowflake 形态)一致,勿使用 cw_is_area 的 UUID。
|
||||
--
|
||||
-- 数据来源(现场查询 192.168.3.12:3307,截至脚本编写日):
|
||||
-- business_id:component-organization.cw_is_organization
|
||||
-- NAME='[28-38F]广发基金管理有限公司' -> BUSINESS_ID = 2524639890ba4f2cba9ba1a4eeaa4015
|
||||
-- 28F zone_id:cw-elevator-application.code_elevator_area / image_rule_ref
|
||||
-- zone_id = 605560545117995008(zone_name=28F,code=0x1C)
|
||||
--
|
||||
-- 重复执行:依赖主键 id 固定,使用 ON DUPLICATE KEY UPDATE 刷新策略字段。
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
INSERT INTO tenant_visitor_floor_policy (
|
||||
id,
|
||||
business_id,
|
||||
policy_type,
|
||||
allow_zone_ids,
|
||||
building_id,
|
||||
enabled,
|
||||
policy_version,
|
||||
remark,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
'gf_vstr_policy_guangfa_fund_001x',
|
||||
'2524639890ba4f2cba9ba1a4eeaa4015',
|
||||
'INTERSECT_ALLOWLIST',
|
||||
'["605560545117995008"]',
|
||||
NULL,
|
||||
1,
|
||||
1,
|
||||
'广发基金:访客与 floorList 求交后仅保留 allowlist(默认仅 28F zone)。业务配置见产品方案。',
|
||||
UNIX_TIMESTAMP(NOW()) * 1000,
|
||||
UNIX_TIMESTAMP(NOW()) * 1000
|
||||
)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
policy_type = VALUES(policy_type),
|
||||
allow_zone_ids = VALUES(allow_zone_ids),
|
||||
enabled = VALUES(enabled),
|
||||
policy_version = policy_version + 1,
|
||||
remark = VALUES(remark),
|
||||
updated_at = VALUES(updated_at);
|
||||
@@ -0,0 +1,31 @@
|
||||
-- 租户访客楼层策略:business_id → org_id 数据迁移
|
||||
-- 前提:DDL(tenant_visitor_floor_policy_v2.sql)已执行
|
||||
-- 执行方式:人工确认 org_id 对应关系后逐行执行
|
||||
|
||||
-- 1. 列出所有公司级组织节点(在 component-organization 库执行,供确认)
|
||||
-- SELECT o.ID, o.NAME, o.PARENT_ID
|
||||
-- FROM `component-organization`.cw_is_organization o
|
||||
-- WHERE o.BUSINESS_ID = '2524639890ba4f2cba9ba1a4eeaa4015'
|
||||
-- AND o.IS_DEL = 0
|
||||
-- ORDER BY o.NAME;
|
||||
|
||||
USE cw-elevator-application;
|
||||
|
||||
-- 2. 为现有策略行填入 org_id(示例:广发基金)
|
||||
-- 请先确认 NAME 匹配正确,再执行
|
||||
-- UPDATE tenant_visitor_floor_policy
|
||||
-- SET org_id = '<广发基金的 org_id>',
|
||||
-- business_id = NULL
|
||||
-- WHERE id = 'gf_vstr_policy_guangfa_fund_001x';
|
||||
|
||||
-- 3. 为其他公司新增策略行(模板)
|
||||
-- INSERT INTO tenant_visitor_floor_policy
|
||||
-- (id, org_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, remark, created_at, updated_at)
|
||||
-- VALUES
|
||||
-- (REPLACE(UUID(),'-',''), '<公司 org_id>', 'INTERSECT_ALLOWLIST',
|
||||
-- '["<zone_id>"]', NULL, 1, 1, '', UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000);
|
||||
|
||||
-- 4. 验证迁移结果
|
||||
SELECT id, org_id, business_id, policy_type, allow_zone_ids, enabled
|
||||
FROM tenant_visitor_floor_policy
|
||||
ORDER BY org_id;
|
||||
@@ -0,0 +1,26 @@
|
||||
-- 租户访客楼层策略:org_id 粒度修复
|
||||
-- 执行顺序:先 DDL → 数据迁移 → 发应用包
|
||||
-- 回滚:DROP INDEX uk_org_building, DROP COLUMN org_id, ADD UNIQUE KEY uk_biz_building (business_id, building_id)
|
||||
|
||||
USE `cw-elevator-application`;
|
||||
|
||||
-- 1. 新增 org_id 列
|
||||
ALTER TABLE tenant_visitor_floor_policy
|
||||
ADD COLUMN org_id VARCHAR(32) NULL COMMENT '组织节点ID(cw_is_organization.ID)'
|
||||
AFTER business_id;
|
||||
|
||||
-- 2. 替换唯一约束(business_id → org_id)
|
||||
ALTER TABLE tenant_visitor_floor_policy
|
||||
DROP INDEX uk_biz_building,
|
||||
ADD UNIQUE KEY uk_org_building (org_id, building_id);
|
||||
|
||||
-- 3. 标记 business_id 为废弃
|
||||
ALTER TABLE tenant_visitor_floor_policy
|
||||
MODIFY COLUMN business_id VARCHAR(64) NULL COMMENT 'DEPRECATED: 已废弃,以 org_id 为准';
|
||||
|
||||
-- 验证
|
||||
SELECT COLUMN_NAME, COLUMN_KEY, COLUMN_COMMENT
|
||||
FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = 'cw-elevator-application'
|
||||
AND TABLE_NAME = 'tenant_visitor_floor_policy'
|
||||
ORDER BY ORDINAL_POSITION;
|
||||
@@ -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
|
||||
|
@@ -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,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 已构建:`cw-elevator-application-2.0.9.jar`
|
||||
- 配置文件:`/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/cw-elevator-application-starter/target/cw-elevator-application-2.0.9.jar \
|
||||
--spring.config.location=file:/tmp/v2-redis-fix.properties
|
||||
```
|
||||
|
||||
等待约 **35 秒**,看到 `Started ElevatorApplication` 后验证:
|
||||
|
||||
```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,87 @@
|
||||
# 电梯应用 — 服务发现架构设计
|
||||
|
||||
**日期**:2026-05-01
|
||||
**版本**:V2(与 V1 生产对齐)
|
||||
**状态**:已实施
|
||||
|
||||
## 1. 核心决策
|
||||
|
||||
电梯应用(cw-elevator-application)的三个上游 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
|
||||
│ │
|
||||
├── ZoneFeignClient → ninca-common ──────────────────┘
|
||||
├── PersonRecordEventHandler → ninca-common-component-organization ─┘
|
||||
└── ElevatorRecordSendTask → ninca-crk-std ────────────────────┘
|
||||
```
|
||||
|
||||
**启动类**:`ElevatorApplication.java` — 无 `@RibbonClients` 注解,Ribbon 走默认 `DiscoveryClient` 模式。
|
||||
|
||||
## 3. 配置清单
|
||||
|
||||
### bootstrap.properties(生产)
|
||||
|
||||
```properties
|
||||
server.port=16112
|
||||
spring.application.name=elevator-app
|
||||
spring.profiles.active=access-control
|
||||
|
||||
# Consul — 仅注册自身,不作为发现客户端
|
||||
spring.cloud.consul.host=371bfca4972c43d2aefcf302d0a4a277
|
||||
spring.cloud.consul.port=8500
|
||||
spring.cloud.consul.discovery.enabled=false
|
||||
|
||||
# Dubbo/ZooKeeper — 服务发现
|
||||
dubbo.registry.address=zookeeper://10.0.22.207:2181
|
||||
dubbo.protocol.port=16107
|
||||
dubbo.provider.version=1.0
|
||||
```
|
||||
|
||||
### 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
|
||||
```
|
||||
|
||||
> 以上均为 Feign 路由名称,不需 `ribbon.listOfServers` 或 `NIWSServerListClassName`。
|
||||
|
||||
## 4. V1 vs V2 对比
|
||||
|
||||
| | V1 生产 | V2(修复前) | V2(修复后) |
|
||||
|------|---------|------------|------------|
|
||||
| ninca-crk-std | Dubbo | ConfigurationBasedServerList(空→报错) | Dubbo |
|
||||
| ninca-common-component-organization | Dubbo | ConfigurationBasedServerList(空→报错) | Dubbo |
|
||||
| ninca-common | Dubbo | ConfigurationBasedServerList(空→报错) | Dubbo |
|
||||
| @RibbonClients | 无 | 3 个 | **无** |
|
||||
| RibbonConfiguration 类 | 无 | 3 个 | **无** |
|
||||
|
||||
## 5. 删除清单
|
||||
|
||||
| 文件 | 操作 |
|
||||
|------|------|
|
||||
| `NincaCrkStdRibbonConfiguration.java` | 删除 |
|
||||
| `OrgServiceRibbonConfiguration.java` | 删除 |
|
||||
| `CommonServiceRibbonConfiguration.java` | 删除 |
|
||||
| `ElevatorApplication.java` 中 `@RibbonClients` 块 | 删除 |
|
||||
|
||||
## 6. 运维说明
|
||||
|
||||
- 若生产 ZooKeeper (`10.0.22.207:2181`) 不可达,三个 Feign 调用将报 `Load balancer does not have available server`——此为基础设施问题,非代码缺陷。
|
||||
- `deploy/v2-maven/application.properties` 中无需添加 `*.ribbon.listOfServers`。
|
||||
- 本地测试时可通过 `ninca-common-component-organization.ribbon.listOfServers=127.0.0.1:18082` 覆盖 DiscoveryClient 指向桩服务(需同时设置 `NIWSServerListClassName` 全局限定或通过 `@RibbonClient` 仅在测试 Profile 启用)。
|
||||
@@ -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, 有策略 | floorList ∩ allow |
|
||||
| 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` — 功能验证脚本
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,18 @@
|
||||
# V1/V2 加载顺序与最终清单摘要
|
||||
|
||||
## 加载顺序
|
||||
- 优先级采用: external > jar(在未显式 `--spring.config.location` 的前提下)
|
||||
- V1: 三个配置文件 external=Y, jar=Y
|
||||
- V2.0.4: 三个配置文件 external=Y, jar=Y
|
||||
|
||||
## 关键结论
|
||||
- V1 `spring.cloud.consul.discovery.enabled` = `false`
|
||||
- V2 `spring.cloud.consul.discovery.enabled` = `true`
|
||||
- V1 `spring.cloud.consul.host` = `10.128.161.95`
|
||||
- V2 `spring.cloud.consul.host` = `10.0.22.102`
|
||||
|
||||
## 输出文件
|
||||
- `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v1-effective-20260429-221913.json`
|
||||
- `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v2-effective-20260429-221913.json`
|
||||
- `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v1-v2-diff-20260429-221913.md`
|
||||
- `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/load-order-summary-20260429-221913.md`
|
||||
@@ -0,0 +1,15 @@
|
||||
# 加载顺序复测(V2使用V1属性)
|
||||
|
||||
- 顺序: external > jar(未显式spring.config.location)
|
||||
- V1 discovery.enabled=false
|
||||
- V2 discovery.enabled=false
|
||||
- V1 consul.host=10.128.161.95
|
||||
- V2 consul.host=371bfca4972c43d2aefcf302d0a4a277
|
||||
- 差异键数量=11
|
||||
|
||||
## 文件
|
||||
|
||||
- /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v1-effective-20260429-224315.json
|
||||
- /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v2-effective-v1props-20260429-224315.json
|
||||
- /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/v1-v2-v1props-diff-20260429-224315.md
|
||||
- /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/docs/testing/config-load-compare/load-order-summary-v1props-20260429-224315.md
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"tag": "V1",
|
||||
"base_dir": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/cw-elevator-application-V1.0.0.20211103",
|
||||
"jar": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/cw-elevator-application-V1.0.0.20211103/cw-elevator-application-V1.0.0.20211103.jar",
|
||||
"order_assumption": "external > jar (未显式spring.config.location时)",
|
||||
"file_presence": {
|
||||
"bootstrap.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
},
|
||||
"application.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
},
|
||||
"application-access-control.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
}
|
||||
},
|
||||
"focus_keys": {
|
||||
"spring.application.name": {
|
||||
"value": "elevator-app",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.profiles.active": {
|
||||
"value": "access-control",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.host": {
|
||||
"value": "10.128.161.95",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.port": {
|
||||
"value": "8500",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.enabled": {
|
||||
"value": "true",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.discovery.enabled": {
|
||||
"value": "false",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.discovery.register": {
|
||||
"value": "true",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.config.enabled": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"feign.cwos-portal.name": {
|
||||
"value": "cwos-portal",
|
||||
"source": "external"
|
||||
},
|
||||
"feign.ninca-common.name": {
|
||||
"value": "ninca-common",
|
||||
"source": "external"
|
||||
},
|
||||
"feign.component-organization.name": {
|
||||
"value": "ninca-common-component-organization",
|
||||
"source": "external"
|
||||
},
|
||||
"cwos-portal.ribbon.NIWSServerListClassName": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"cwos-portal.ribbon.listOfServers": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"ninca-common.ribbon.NIWSServerListClassName": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"ninca-common.ribbon.listOfServers": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
}
|
||||
},
|
||||
"effective_all_keys": {
|
||||
"spring.cloud.consul.discovery.enabled": "false",
|
||||
"feign.ninca-common.name": "ninca-common",
|
||||
"ninca.update.floor.pool.allowCoreThreadTimeOut": "true",
|
||||
"sendRecord.token.appKey": "293e2d708f0143c2957b702cef44d951",
|
||||
"ninca.update.floor.pool.corePoolSize": "5",
|
||||
"cloudwalk.access-control.common.device-category-array[0]": "4",
|
||||
"cloudwalk.access-control.common.device-category-array[5]": "11",
|
||||
"feign.component-organization.name": "ninca-common-component-organization",
|
||||
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds": "10000",
|
||||
"spring.cloud.consul.discovery.instance-id": "${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port}",
|
||||
"spring.redis.timeout": "0",
|
||||
"spring.messages.basename": "access-control",
|
||||
"spring.shardingsphere.datasource.ds0.type": "com.zaxxer.hikari.HikariDataSource",
|
||||
"spring.cloud.consul.discovery.register": "true",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"cloudwalk.datafield.securityKey": "d4b2aabc97394a12a27fc3cca6cd9ba1",
|
||||
"cloudwalk.access-control.common.publish-opendoor-service-code": "access-control",
|
||||
"spring.shardingsphere.datasource.ds0.maximum-pool-size": "20",
|
||||
"cloudwalk.serial.enable": "true",
|
||||
"cloudwalk.access-control.common.device-category-array[1]": "5",
|
||||
"spring.redis.host": "127.0.0.1",
|
||||
"spring.shardingsphere.datasource.ds0.pool-name": "ds0-pool",
|
||||
"person.name.space": "recordEvent",
|
||||
"spring.profiles.active": "access-control",
|
||||
"management.health.redis.enabled": "false",
|
||||
"management.health.db.enabled": "false",
|
||||
"cloudwalk.serial.serial-redis-key": "CLOUDWALK-ACS-SERIAL-KEY",
|
||||
"spring.application.name": "elevator-app",
|
||||
"dubbo.protocol.port": "16107",
|
||||
"spring.shardingsphere.datasource.ds0.driver-class-name": "com.mysql.jdbc.Driver",
|
||||
"spring.shardingsphere.sharding.binding-tables": "IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD",
|
||||
"spring.cloud.consul.discovery.prefer-ip-address": "true",
|
||||
"cloudwalk.event.bootstrap-servers": "10.128.161.95:9092",
|
||||
"cloudwalk.access-control.common.face-compare-THRESHOLD": "80",
|
||||
"spring.http.encoding.charset": "UTF-8",
|
||||
"spring.shardingsphere.datasource.ds0.password": "123456",
|
||||
"mybatis.mapper-locations": "classpath*:cn/cloudwalk/elevator/**/*.xml",
|
||||
"ribbon.ReadTimeout": "10000",
|
||||
"lockWatchdogTimeout": "21000",
|
||||
"cloudwalk.elevator.common.relativePrefix": "/cwos-portal/portal/fileManager/imgByPath?path=",
|
||||
"spring.shardingsphere.props.sql.show": "false",
|
||||
"intelligent.lock.enable": "true",
|
||||
"mybatis.config-location": "classpath:mapper/mybatis-config.xml",
|
||||
"spring.redis.pool.max-idle": "1",
|
||||
"spring.cloud.consul.host": "10.128.161.95",
|
||||
"feign.ninca-crk-std.name": "ninca-crk-std",
|
||||
"cloudwalk.access-control.common.face-capture-interval-milliseconds": "3000",
|
||||
"spring.redis.pool.max-wait": "10",
|
||||
"elevator.application.time": "600",
|
||||
"dubbo.provider.version": "1.0",
|
||||
"feign.hystrix.enable": "true",
|
||||
"spring.shardingsphere.datasource.ds0.auto-commit": "true",
|
||||
"cloudwalk.serial.serial-length": "8",
|
||||
"spring.mvc.throw-exception-if-no-handler-found": "true",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class": "cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob",
|
||||
"cloudwalk.access-control.common.device-category-array[2]": "7",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes": "ds0.IT_ACS_RECOG_RECORD_$->{2020..2022}",
|
||||
"floor.building.id": "605560539791228928",
|
||||
"spring.shardingsphere.datasource.ds0.jdbc-url": "jdbc:mysql://192.168.3.12:3307/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true",
|
||||
"feign.mqtt.name": "cloudwalk-device-thirdparty",
|
||||
"sendRecord.token.corpId": "53db867a8bb747a1bd04dd1afcad8ca6",
|
||||
"spring.messages.encoding": "utf-8",
|
||||
"cloudwalk.serial.serial-type": "redis",
|
||||
"spring.shardingsphere.sharding.default-data-source-name": "ds0",
|
||||
"cloudwalk.access-control.common.face-capture-time-expired-milliseconds": "300000",
|
||||
"elevator.application.keyA": "5B7DEF88FF04",
|
||||
"spring.http.encoding.force": "true",
|
||||
"spring.redis.pool.max-active": "10",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority": "1",
|
||||
"ninca.update.floor.pool.queueCapacity": "100000",
|
||||
"ribbon.ConnectTimeout": "10000",
|
||||
"cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD": "75",
|
||||
"spring.http.multipart.max-request-size": "200MB",
|
||||
"logging.config": "classpath:logs/logback.xml",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group": "ACCESS-CONTROL_GROUP",
|
||||
"cloudwalk.datafield.encrypt": "AES",
|
||||
"spring.http.multipart.max-file-size": "200MB",
|
||||
"dubbo.registry.address": "zookeeper://10.128.161.95:2181",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"logging.path": "logs",
|
||||
"server.port": "16112",
|
||||
"cloudwalk.access-control.common.device-controller-array[0]": "mqtt",
|
||||
"spring.cloud.consul.discovery.deregister": "false",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"cloudwalk.access-control.common.device-category-array[3]": "2",
|
||||
"spring.shardingsphere.datasource.ds0.minimum-idle": "5",
|
||||
"spring.shardingsphere.datasource.names": "ds0",
|
||||
"sendRecord.token.appSecret": "5f6995009b864669b52041b8f5dc4625",
|
||||
"logging.level.root": "info",
|
||||
"intelligent.lock.config.default-wait-time": "10000",
|
||||
"spring.cloud.consul.port": "8500",
|
||||
"logging.file": "${spring.application.name}",
|
||||
"ribbon.okhttp.enabled": "true",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression": "0 10 0 * * ?",
|
||||
"feign.davinci-portal.name": "cwos-portal",
|
||||
"sendRecord.boolean": "true",
|
||||
"ninca-crk-std.ip": "10.128.161.95:16106",
|
||||
"spring.mvc.locale": "zh_CN",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description": "AcsRecordStatisticsByDay job is starting.........",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"feign.resource.name": "cwos-portal",
|
||||
"spring.redis.port": "6379",
|
||||
"cloudwalk.datafield.enable": "true",
|
||||
"logging.level.cn.cloudwalk": "info",
|
||||
"cloudwalk.event.group-id": "cw-elevator-application-1",
|
||||
"cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds": "600000",
|
||||
"spring.shardingsphere.datasource.ds0.username": "root",
|
||||
"cloudwalk.spring.cache.expires": "CACHE_NAME_APPLICATIONIDS#21600,ACS_DeviceTypesCache#7200,ACS_DeviceTypeFeaturesCache#7200,ACS_DeviceAttrsCache#7200,ACS_RecordStatisticsCache#90000,ACS_AreaTreeCache#60",
|
||||
"spring.messages.always-use-message-format": "true",
|
||||
"spring.redis.database": "5",
|
||||
"spring.shardingsphere.datasource.ds0.max-lifetime": "1765000",
|
||||
"cloudwalk.access-control.common.device-category-array[4]": "8",
|
||||
"cloudwalk.access-control.common.publish-opendoor-switch": "false",
|
||||
"feign.device.name": "cwos-portal",
|
||||
"feign.cwos-portal.name": "cwos-portal",
|
||||
"ninca.update.floor.pool.maxPoolSize": "5",
|
||||
"spring.cloud.consul.enabled": "true",
|
||||
"sendRecord.ip": "hrec.star-river.com:32165",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name": "AcsRecordStatisticsByDayJob",
|
||||
"cloudwalk.event.handler-executor-config.core-pool-size": "10",
|
||||
"elevator.application.key": "xinghewan",
|
||||
"ninca.update.floor.pool.keepAliveSeconds": "150",
|
||||
"spring.redis.pool.min-idle": "0",
|
||||
"spring.cloud.consul.discovery.ip-address": "${spring.cloud.client.ipAddress}",
|
||||
"feign.okhttp.enable": "true",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
|
||||
"spring.shardingsphere.datasource.ds0.connection-timeout": "60000",
|
||||
"cloudwalk.event.handler-executor-config.maximum-pool-size": "30",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
|
||||
"feign.httpclient.enable": "false",
|
||||
"spring.http.encoding.enabled": "true",
|
||||
"ribbon.http.client.enabled": "false",
|
||||
"spring.redis.password": "1qaz!QAZ",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes": "ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2022}",
|
||||
"server.tomcat.uri-encoding": "UTF-8"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
{
|
||||
"tag": "V1",
|
||||
"base_dir": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/cw-elevator-application-V1.0.0.20211103",
|
||||
"jar": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/cw-elevator-application-V1.0.0.20211103/cw-elevator-application-V1.0.0.20211103.jar",
|
||||
"order": "external>jar",
|
||||
"file_presence": {
|
||||
"bootstrap.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
},
|
||||
"application.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
},
|
||||
"application-access-control.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
}
|
||||
},
|
||||
"focus_keys": {
|
||||
"spring.cloud.consul.host": {
|
||||
"value": "10.128.161.95",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.port": {
|
||||
"value": "8500",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.discovery.enabled": {
|
||||
"value": "false",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.config.enabled": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"feign.cwos-portal.name": {
|
||||
"value": "cwos-portal",
|
||||
"source": "external"
|
||||
},
|
||||
"feign.ninca-common.name": {
|
||||
"value": "ninca-common",
|
||||
"source": "external"
|
||||
},
|
||||
"feign.component-organization.name": {
|
||||
"value": "ninca-common-component-organization",
|
||||
"source": "external"
|
||||
},
|
||||
"cwos-portal.ribbon.NIWSServerListClassName": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"cwos-portal.ribbon.listOfServers": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
}
|
||||
},
|
||||
"effective_all_keys": {
|
||||
"logging.level.root": "info",
|
||||
"logging.config": "classpath:logs/logback.xml",
|
||||
"management.health.redis.enabled": "false",
|
||||
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds": "10000",
|
||||
"cloudwalk.event.handler-executor-config.core-pool-size": "10",
|
||||
"spring.cloud.consul.discovery.instance-id": "${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port}",
|
||||
"ninca.update.floor.pool.queueCapacity": "100000",
|
||||
"person.name.space": "recordEvent",
|
||||
"spring.redis.pool.max-active": "10",
|
||||
"spring.cloud.consul.discovery.enabled": "false",
|
||||
"sendRecord.token.appSecret": "5f6995009b864669b52041b8f5dc4625",
|
||||
"spring.cloud.consul.enabled": "true",
|
||||
"ninca.update.floor.pool.maxPoolSize": "5",
|
||||
"cloudwalk.serial.serial-length": "8",
|
||||
"server.port": "16112",
|
||||
"spring.shardingsphere.datasource.names": "ds0",
|
||||
"elevator.application.key": "xinghewan",
|
||||
"spring.redis.password": "1qaz!QAZ",
|
||||
"spring.mvc.throw-exception-if-no-handler-found": "true",
|
||||
"logging.file": "${spring.application.name}",
|
||||
"feign.component-organization.name": "ninca-common-component-organization",
|
||||
"cloudwalk.spring.cache.expires": "CACHE_NAME_APPLICATIONIDS#21600,ACS_DeviceTypesCache#7200,ACS_DeviceTypeFeaturesCache#7200,ACS_DeviceAttrsCache#7200,ACS_RecordStatisticsCache#90000,ACS_AreaTreeCache#60",
|
||||
"feign.mqtt.name": "cloudwalk-device-thirdparty",
|
||||
"spring.shardingsphere.datasource.ds0.connection-timeout": "60000",
|
||||
"ninca.update.floor.pool.keepAliveSeconds": "150",
|
||||
"feign.cwos-portal.name": "cwos-portal",
|
||||
"spring.shardingsphere.datasource.ds0.password": "123456",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"floor.building.id": "605560539791228928",
|
||||
"spring.messages.basename": "access-control",
|
||||
"spring.cloud.consul.port": "8500",
|
||||
"ribbon.http.client.enabled": "false",
|
||||
"sendRecord.ip": "hrec.star-river.com:32165",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression": "0 10 0 * * ?",
|
||||
"sendRecord.token.corpId": "53db867a8bb747a1bd04dd1afcad8ca6",
|
||||
"cloudwalk.serial.serial-redis-key": "CLOUDWALK-ACS-SERIAL-KEY",
|
||||
"cloudwalk.datafield.enable": "true",
|
||||
"elevator.application.time": "600",
|
||||
"cloudwalk.access-control.common.device-category-array[5]": "11",
|
||||
"spring.messages.always-use-message-format": "true",
|
||||
"spring.mvc.locale": "zh_CN",
|
||||
"feign.ninca-crk-std.name": "ninca-crk-std",
|
||||
"sendRecord.token.appKey": "293e2d708f0143c2957b702cef44d951",
|
||||
"ribbon.ConnectTimeout": "10000",
|
||||
"spring.cloud.consul.discovery.deregister": "false",
|
||||
"spring.redis.timeout": "0",
|
||||
"spring.shardingsphere.sharding.default-data-source-name": "ds0",
|
||||
"spring.redis.database": "5",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class": "cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description": "AcsRecordStatisticsByDay job is starting.........",
|
||||
"logging.level.cn.cloudwalk": "info",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority": "1",
|
||||
"spring.profiles.active": "access-control",
|
||||
"spring.http.encoding.force": "true",
|
||||
"spring.redis.pool.max-wait": "10",
|
||||
"cloudwalk.access-control.common.device-controller-array[0]": "mqtt",
|
||||
"cloudwalk.event.group-id": "cw-elevator-application-1",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"sendRecord.boolean": "true",
|
||||
"logging.path": "logs",
|
||||
"ribbon.okhttp.enabled": "true",
|
||||
"spring.shardingsphere.datasource.ds0.username": "root",
|
||||
"spring.redis.port": "6379",
|
||||
"feign.hystrix.enable": "true",
|
||||
"spring.http.multipart.max-request-size": "200MB",
|
||||
"feign.device.name": "cwos-portal",
|
||||
"elevator.application.keyA": "5B7DEF88FF04",
|
||||
"cloudwalk.datafield.securityKey": "d4b2aabc97394a12a27fc3cca6cd9ba1",
|
||||
"spring.cloud.consul.discovery.ip-address": "${spring.cloud.client.ipAddress}",
|
||||
"cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD": "75",
|
||||
"cloudwalk.access-control.common.face-compare-THRESHOLD": "80",
|
||||
"cloudwalk.datafield.encrypt": "AES",
|
||||
"management.health.db.enabled": "false",
|
||||
"server.tomcat.uri-encoding": "UTF-8",
|
||||
"spring.shardingsphere.datasource.ds0.max-lifetime": "1765000",
|
||||
"mybatis.mapper-locations": "classpath*:cn/cloudwalk/elevator/**/*.xml",
|
||||
"intelligent.lock.config.default-wait-time": "10000",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
|
||||
"ninca.update.floor.pool.corePoolSize": "5",
|
||||
"spring.http.multipart.max-file-size": "200MB",
|
||||
"ribbon.ReadTimeout": "10000",
|
||||
"cloudwalk.access-control.common.device-category-array[2]": "7",
|
||||
"cloudwalk.access-control.common.publish-opendoor-switch": "false",
|
||||
"dubbo.provider.version": "1.0",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes": "ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2022}",
|
||||
"spring.cloud.consul.host": "10.128.161.95",
|
||||
"cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds": "600000",
|
||||
"cloudwalk.access-control.common.device-category-array[3]": "2",
|
||||
"feign.davinci-portal.name": "cwos-portal",
|
||||
"spring.shardingsphere.datasource.ds0.pool-name": "ds0-pool",
|
||||
"cloudwalk.elevator.common.relativePrefix": "/cwos-portal/portal/fileManager/imgByPath?path=",
|
||||
"spring.redis.host": "127.0.0.1",
|
||||
"spring.shardingsphere.props.sql.show": "false",
|
||||
"spring.shardingsphere.sharding.binding-tables": "IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"spring.shardingsphere.datasource.ds0.auto-commit": "true",
|
||||
"spring.messages.encoding": "utf-8",
|
||||
"spring.redis.pool.min-idle": "0",
|
||||
"spring.shardingsphere.datasource.ds0.jdbc-url": "jdbc:mysql://192.168.3.12:3307/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true",
|
||||
"spring.application.name": "elevator-app",
|
||||
"cloudwalk.serial.serial-type": "redis",
|
||||
"feign.okhttp.enable": "true",
|
||||
"mybatis.config-location": "classpath:mapper/mybatis-config.xml",
|
||||
"spring.redis.pool.max-idle": "1",
|
||||
"cloudwalk.access-control.common.face-capture-interval-milliseconds": "3000",
|
||||
"cloudwalk.serial.enable": "true",
|
||||
"spring.cloud.consul.discovery.prefer-ip-address": "true",
|
||||
"cloudwalk.access-control.common.face-capture-time-expired-milliseconds": "300000",
|
||||
"dubbo.protocol.port": "16107",
|
||||
"intelligent.lock.enable": "true",
|
||||
"lockWatchdogTimeout": "21000",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes": "ds0.IT_ACS_RECOG_RECORD_$->{2020..2022}",
|
||||
"ninca.update.floor.pool.allowCoreThreadTimeOut": "true",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group": "ACCESS-CONTROL_GROUP",
|
||||
"spring.cloud.consul.discovery.register": "true",
|
||||
"feign.httpclient.enable": "false",
|
||||
"spring.shardingsphere.datasource.ds0.driver-class-name": "com.mysql.jdbc.Driver",
|
||||
"spring.http.encoding.charset": "UTF-8",
|
||||
"ninca-crk-std.ip": "10.128.161.95:16106",
|
||||
"spring.http.encoding.enabled": "true",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"cloudwalk.event.handler-executor-config.maximum-pool-size": "30",
|
||||
"spring.shardingsphere.datasource.ds0.minimum-idle": "5",
|
||||
"spring.shardingsphere.datasource.ds0.maximum-pool-size": "20",
|
||||
"cloudwalk.event.bootstrap-servers": "10.128.161.95:9092",
|
||||
"spring.shardingsphere.datasource.ds0.type": "com.zaxxer.hikari.HikariDataSource",
|
||||
"dubbo.registry.address": "zookeeper://10.128.161.95:2181",
|
||||
"feign.ninca-common.name": "ninca-common",
|
||||
"feign.resource.name": "cwos-portal",
|
||||
"cloudwalk.access-control.common.device-category-array[4]": "8",
|
||||
"cloudwalk.access-control.common.device-category-array[0]": "4",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name": "AcsRecordStatisticsByDayJob",
|
||||
"cloudwalk.access-control.common.device-category-array[1]": "5",
|
||||
"cloudwalk.access-control.common.publish-opendoor-service-code": "access-control"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
# V1 vs V2.0.4 最终加载差异
|
||||
|
||||
- 生成时间: 2026-04-29T22:19:14.387292
|
||||
- 加载顺序假设: external > jar (未显式spring.config.location时)
|
||||
|
||||
## 关键键差异
|
||||
|
||||
- `spring.cloud.consul.host`: V1=`10.128.161.95`(external) | V2=`10.0.22.102`(external)
|
||||
- `spring.cloud.consul.discovery.enabled`: V1=`false`(external) | V2=`true`(external)
|
||||
|
||||
## 全量差异键统计
|
||||
|
||||
- 差异键数量: 12
|
||||
|
||||
## 前50个差异键
|
||||
|
||||
- `cloudwalk.event.bootstrap-servers`: V1=`10.128.161.95:9092` | V2=`371bfca4972c43d2aefcf302d0a4a277:9092,44700995ee904679a7ad5afddcf93bb5:9092,0837a70b5fab47569391828f5feb2561:9092`
|
||||
- `dubbo.registry.address`: V1=`zookeeper://10.128.161.95:2181` | V2=`zookeeper://10.0.22.207:2181`
|
||||
- `logging.path`: V1=`logs` | V2=`/data/cwos/cw-elevator-application-V1.0.0.20211103/logs`
|
||||
- `ninca-crk-std.ip`: V1=`10.128.161.95:16106` | V2=`10.0.22.102:16106`
|
||||
- `spring.cloud.consul.discovery.enabled`: V1=`false` | V2=`true`
|
||||
- `spring.cloud.consul.host`: V1=`10.128.161.95` | V2=`10.0.22.102`
|
||||
- `spring.redis.host`: V1=`127.0.0.1` | V2=`redis_01.redis_ip`
|
||||
- `spring.shardingsphere.datasource.ds0.jdbc-url`: V1=`jdbc:mysql://192.168.3.12:3307/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true` | V2=`jdbc:mysql://mysql_01.mysql_ip:3306/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true`
|
||||
- `spring.shardingsphere.datasource.ds0.password`: V1=`123456` | V2=`1qaz!QAZ`
|
||||
- `spring.shardingsphere.datasource.ds0.username`: V1=`root` | V2=`cloudwalk`
|
||||
- `spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes`: V1=`ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2022}` | V2=`ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030}`
|
||||
- `spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes`: V1=`ds0.IT_ACS_RECOG_RECORD_$->{2020..2022}` | V2=`ds0.IT_ACS_RECOG_RECORD_$->{2020..2030}`
|
||||
@@ -0,0 +1,27 @@
|
||||
# V1 vs V2(使用V1属性打包) 差异
|
||||
|
||||
- 差异键数量: 11
|
||||
|
||||
## 关键键
|
||||
- `spring.cloud.consul.host`: V1=`10.128.161.95`(external) | V2=`371bfca4972c43d2aefcf302d0a4a277`(external)
|
||||
- `spring.cloud.consul.port`: V1=`8500`(external) | V2=`8500`(external)
|
||||
- `spring.cloud.consul.discovery.enabled`: V1=`false`(external) | V2=`false`(external)
|
||||
- `spring.cloud.consul.config.enabled`: V1=`<unset>`(unset) | V2=`<unset>`(unset)
|
||||
- `feign.cwos-portal.name`: V1=`cwos-portal`(external) | V2=`cwos-portal`(external)
|
||||
- `feign.ninca-common.name`: V1=`ninca-common`(external) | V2=`ninca-common`(external)
|
||||
- `feign.component-organization.name`: V1=`ninca-common-component-organization`(external) | V2=`ninca-common-component-organization`(external)
|
||||
- `cwos-portal.ribbon.NIWSServerListClassName`: V1=`<unset>`(unset) | V2=`<unset>`(unset)
|
||||
- `cwos-portal.ribbon.listOfServers`: V1=`<unset>`(unset) | V2=`<unset>`(unset)
|
||||
|
||||
## 前50个全量差异
|
||||
- `cloudwalk.event.bootstrap-servers`: V1=`10.128.161.95:9092` | V2=`371bfca4972c43d2aefcf302d0a4a277:9092,44700995ee904679a7ad5afddcf93bb5:9092,0837a70b5fab47569391828f5feb2561:9092`
|
||||
- `dubbo.registry.address`: V1=`zookeeper://10.128.161.95:2181` | V2=`zookeeper://10.0.22.207:2181`
|
||||
- `logging.path`: V1=`logs` | V2=`/data/cwos/cw-elevator-application-V1.0.0.20211103/logs`
|
||||
- `ninca-crk-std.ip`: V1=`10.128.161.95:16106` | V2=`10.0.22.102:16106`
|
||||
- `spring.cloud.consul.host`: V1=`10.128.161.95` | V2=`371bfca4972c43d2aefcf302d0a4a277`
|
||||
- `spring.redis.host`: V1=`127.0.0.1` | V2=`redis_01.redis_ip`
|
||||
- `spring.shardingsphere.datasource.ds0.jdbc-url`: V1=`jdbc:mysql://192.168.3.12:3307/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true` | V2=`jdbc:mysql://mysql_01.mysql_ip:3306/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true`
|
||||
- `spring.shardingsphere.datasource.ds0.password`: V1=`123456` | V2=`1qaz!QAZ`
|
||||
- `spring.shardingsphere.datasource.ds0.username`: V1=`root` | V2=`cloudwalk`
|
||||
- `spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes`: V1=`ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2022}` | V2=`ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030}`
|
||||
- `spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes`: V1=`ds0.IT_ACS_RECOG_RECORD_$->{2020..2022}` | V2=`ds0.IT_ACS_RECOG_RECORD_$->{2020..2030}`
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"tag": "V2.0.4",
|
||||
"base_dir": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/deploy/v2-maven",
|
||||
"jar": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/releases/v2.0.4/cw-elevator-application-2.0.4.jar",
|
||||
"order_assumption": "external > jar (未显式spring.config.location时)",
|
||||
"file_presence": {
|
||||
"bootstrap.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
},
|
||||
"application.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
},
|
||||
"application-access-control.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
}
|
||||
},
|
||||
"focus_keys": {
|
||||
"spring.application.name": {
|
||||
"value": "elevator-app",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.profiles.active": {
|
||||
"value": "access-control",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.host": {
|
||||
"value": "10.0.22.102",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.port": {
|
||||
"value": "8500",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.enabled": {
|
||||
"value": "true",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.discovery.enabled": {
|
||||
"value": "true",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.discovery.register": {
|
||||
"value": "true",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.config.enabled": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"feign.cwos-portal.name": {
|
||||
"value": "cwos-portal",
|
||||
"source": "external"
|
||||
},
|
||||
"feign.ninca-common.name": {
|
||||
"value": "ninca-common",
|
||||
"source": "external"
|
||||
},
|
||||
"feign.component-organization.name": {
|
||||
"value": "ninca-common-component-organization",
|
||||
"source": "external"
|
||||
},
|
||||
"cwos-portal.ribbon.NIWSServerListClassName": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"cwos-portal.ribbon.listOfServers": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"ninca-common.ribbon.NIWSServerListClassName": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"ninca-common.ribbon.listOfServers": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
}
|
||||
},
|
||||
"effective_all_keys": {
|
||||
"spring.cloud.consul.discovery.enabled": "true",
|
||||
"feign.ninca-common.name": "ninca-common",
|
||||
"ninca.update.floor.pool.allowCoreThreadTimeOut": "true",
|
||||
"sendRecord.token.appKey": "293e2d708f0143c2957b702cef44d951",
|
||||
"ninca.update.floor.pool.corePoolSize": "5",
|
||||
"cloudwalk.access-control.common.device-category-array[0]": "4",
|
||||
"cloudwalk.access-control.common.device-category-array[5]": "11",
|
||||
"feign.component-organization.name": "ninca-common-component-organization",
|
||||
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds": "10000",
|
||||
"spring.cloud.consul.discovery.instance-id": "${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port}",
|
||||
"spring.redis.timeout": "0",
|
||||
"spring.messages.basename": "access-control",
|
||||
"spring.shardingsphere.datasource.ds0.type": "com.zaxxer.hikari.HikariDataSource",
|
||||
"spring.cloud.consul.discovery.register": "true",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"cloudwalk.datafield.securityKey": "d4b2aabc97394a12a27fc3cca6cd9ba1",
|
||||
"cloudwalk.access-control.common.publish-opendoor-service-code": "access-control",
|
||||
"spring.shardingsphere.datasource.ds0.maximum-pool-size": "20",
|
||||
"cloudwalk.serial.enable": "true",
|
||||
"cloudwalk.access-control.common.device-category-array[1]": "5",
|
||||
"spring.redis.host": "redis_01.redis_ip",
|
||||
"spring.shardingsphere.datasource.ds0.pool-name": "ds0-pool",
|
||||
"person.name.space": "recordEvent",
|
||||
"spring.profiles.active": "access-control",
|
||||
"management.health.redis.enabled": "false",
|
||||
"management.health.db.enabled": "false",
|
||||
"cloudwalk.serial.serial-redis-key": "CLOUDWALK-ACS-SERIAL-KEY",
|
||||
"spring.application.name": "elevator-app",
|
||||
"dubbo.protocol.port": "16107",
|
||||
"spring.shardingsphere.datasource.ds0.driver-class-name": "com.mysql.jdbc.Driver",
|
||||
"spring.shardingsphere.sharding.binding-tables": "IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD",
|
||||
"spring.cloud.consul.discovery.prefer-ip-address": "true",
|
||||
"cloudwalk.event.bootstrap-servers": "371bfca4972c43d2aefcf302d0a4a277:9092,44700995ee904679a7ad5afddcf93bb5:9092,0837a70b5fab47569391828f5feb2561:9092",
|
||||
"cloudwalk.access-control.common.face-compare-THRESHOLD": "80",
|
||||
"spring.http.encoding.charset": "UTF-8",
|
||||
"spring.shardingsphere.datasource.ds0.password": "1qaz!QAZ",
|
||||
"mybatis.mapper-locations": "classpath*:cn/cloudwalk/elevator/**/*.xml",
|
||||
"ribbon.ReadTimeout": "10000",
|
||||
"lockWatchdogTimeout": "21000",
|
||||
"cloudwalk.elevator.common.relativePrefix": "/cwos-portal/portal/fileManager/imgByPath?path=",
|
||||
"spring.shardingsphere.props.sql.show": "false",
|
||||
"intelligent.lock.enable": "true",
|
||||
"mybatis.config-location": "classpath:mapper/mybatis-config.xml",
|
||||
"spring.redis.pool.max-idle": "1",
|
||||
"spring.cloud.consul.host": "10.0.22.102",
|
||||
"feign.ninca-crk-std.name": "ninca-crk-std",
|
||||
"cloudwalk.access-control.common.face-capture-interval-milliseconds": "3000",
|
||||
"spring.redis.pool.max-wait": "10",
|
||||
"elevator.application.time": "600",
|
||||
"dubbo.provider.version": "1.0",
|
||||
"feign.hystrix.enable": "true",
|
||||
"spring.shardingsphere.datasource.ds0.auto-commit": "true",
|
||||
"cloudwalk.serial.serial-length": "8",
|
||||
"spring.mvc.throw-exception-if-no-handler-found": "true",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class": "cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob",
|
||||
"cloudwalk.access-control.common.device-category-array[2]": "7",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes": "ds0.IT_ACS_RECOG_RECORD_$->{2020..2030}",
|
||||
"floor.building.id": "605560539791228928",
|
||||
"spring.shardingsphere.datasource.ds0.jdbc-url": "jdbc:mysql://mysql_01.mysql_ip:3306/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true",
|
||||
"feign.mqtt.name": "cloudwalk-device-thirdparty",
|
||||
"sendRecord.token.corpId": "53db867a8bb747a1bd04dd1afcad8ca6",
|
||||
"spring.messages.encoding": "utf-8",
|
||||
"cloudwalk.serial.serial-type": "redis",
|
||||
"spring.shardingsphere.sharding.default-data-source-name": "ds0",
|
||||
"cloudwalk.access-control.common.face-capture-time-expired-milliseconds": "300000",
|
||||
"elevator.application.keyA": "5B7DEF88FF04",
|
||||
"spring.http.encoding.force": "true",
|
||||
"spring.redis.pool.max-active": "10",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority": "1",
|
||||
"ninca.update.floor.pool.queueCapacity": "100000",
|
||||
"ribbon.ConnectTimeout": "10000",
|
||||
"cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD": "75",
|
||||
"spring.http.multipart.max-request-size": "200MB",
|
||||
"logging.config": "classpath:logs/logback.xml",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group": "ACCESS-CONTROL_GROUP",
|
||||
"cloudwalk.datafield.encrypt": "AES",
|
||||
"spring.http.multipart.max-file-size": "200MB",
|
||||
"dubbo.registry.address": "zookeeper://10.0.22.207:2181",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"logging.path": "/data/cwos/cw-elevator-application-V1.0.0.20211103/logs",
|
||||
"server.port": "16112",
|
||||
"cloudwalk.access-control.common.device-controller-array[0]": "mqtt",
|
||||
"spring.cloud.consul.discovery.deregister": "false",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"cloudwalk.access-control.common.device-category-array[3]": "2",
|
||||
"spring.shardingsphere.datasource.ds0.minimum-idle": "5",
|
||||
"spring.shardingsphere.datasource.names": "ds0",
|
||||
"sendRecord.token.appSecret": "5f6995009b864669b52041b8f5dc4625",
|
||||
"logging.level.root": "info",
|
||||
"intelligent.lock.config.default-wait-time": "10000",
|
||||
"spring.cloud.consul.port": "8500",
|
||||
"logging.file": "${spring.application.name}",
|
||||
"ribbon.okhttp.enabled": "true",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression": "0 10 0 * * ?",
|
||||
"feign.davinci-portal.name": "cwos-portal",
|
||||
"sendRecord.boolean": "true",
|
||||
"ninca-crk-std.ip": "10.0.22.102:16106",
|
||||
"spring.mvc.locale": "zh_CN",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description": "AcsRecordStatisticsByDay job is starting.........",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"feign.resource.name": "cwos-portal",
|
||||
"spring.redis.port": "6379",
|
||||
"cloudwalk.datafield.enable": "true",
|
||||
"logging.level.cn.cloudwalk": "info",
|
||||
"cloudwalk.event.group-id": "cw-elevator-application-1",
|
||||
"cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds": "600000",
|
||||
"spring.shardingsphere.datasource.ds0.username": "cloudwalk",
|
||||
"cloudwalk.spring.cache.expires": "CACHE_NAME_APPLICATIONIDS#21600,ACS_DeviceTypesCache#7200,ACS_DeviceTypeFeaturesCache#7200,ACS_DeviceAttrsCache#7200,ACS_RecordStatisticsCache#90000,ACS_AreaTreeCache#60",
|
||||
"spring.messages.always-use-message-format": "true",
|
||||
"spring.redis.database": "5",
|
||||
"spring.shardingsphere.datasource.ds0.max-lifetime": "1765000",
|
||||
"cloudwalk.access-control.common.device-category-array[4]": "8",
|
||||
"cloudwalk.access-control.common.publish-opendoor-switch": "false",
|
||||
"feign.device.name": "cwos-portal",
|
||||
"feign.cwos-portal.name": "cwos-portal",
|
||||
"ninca.update.floor.pool.maxPoolSize": "5",
|
||||
"spring.cloud.consul.enabled": "true",
|
||||
"sendRecord.ip": "hrec.star-river.com:32165",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name": "AcsRecordStatisticsByDayJob",
|
||||
"cloudwalk.event.handler-executor-config.core-pool-size": "10",
|
||||
"elevator.application.key": "xinghewan",
|
||||
"ninca.update.floor.pool.keepAliveSeconds": "150",
|
||||
"spring.redis.pool.min-idle": "0",
|
||||
"spring.cloud.consul.discovery.ip-address": "${spring.cloud.client.ipAddress}",
|
||||
"feign.okhttp.enable": "true",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
|
||||
"spring.shardingsphere.datasource.ds0.connection-timeout": "60000",
|
||||
"cloudwalk.event.handler-executor-config.maximum-pool-size": "30",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
|
||||
"feign.httpclient.enable": "false",
|
||||
"spring.http.encoding.enabled": "true",
|
||||
"ribbon.http.client.enabled": "false",
|
||||
"spring.redis.password": "1qaz!QAZ",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes": "ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030}",
|
||||
"server.tomcat.uri-encoding": "UTF-8"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
{
|
||||
"tag": "V2.0.4-with-V1-props",
|
||||
"base_dir": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/deploy/v2-maven",
|
||||
"jar": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/releases/v2.0.4/cw-elevator-application-2.0.4.jar",
|
||||
"order": "external>jar",
|
||||
"file_presence": {
|
||||
"bootstrap.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
},
|
||||
"application.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
},
|
||||
"application-access-control.properties": {
|
||||
"external": true,
|
||||
"jar": true
|
||||
}
|
||||
},
|
||||
"focus_keys": {
|
||||
"spring.cloud.consul.host": {
|
||||
"value": "371bfca4972c43d2aefcf302d0a4a277",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.port": {
|
||||
"value": "8500",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.discovery.enabled": {
|
||||
"value": "false",
|
||||
"source": "external"
|
||||
},
|
||||
"spring.cloud.consul.config.enabled": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"feign.cwos-portal.name": {
|
||||
"value": "cwos-portal",
|
||||
"source": "external"
|
||||
},
|
||||
"feign.ninca-common.name": {
|
||||
"value": "ninca-common",
|
||||
"source": "external"
|
||||
},
|
||||
"feign.component-organization.name": {
|
||||
"value": "ninca-common-component-organization",
|
||||
"source": "external"
|
||||
},
|
||||
"cwos-portal.ribbon.NIWSServerListClassName": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
},
|
||||
"cwos-portal.ribbon.listOfServers": {
|
||||
"value": "<unset>",
|
||||
"source": "unset"
|
||||
}
|
||||
},
|
||||
"effective_all_keys": {
|
||||
"logging.level.root": "info",
|
||||
"logging.config": "classpath:logs/logback.xml",
|
||||
"management.health.redis.enabled": "false",
|
||||
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds": "10000",
|
||||
"cloudwalk.event.handler-executor-config.core-pool-size": "10",
|
||||
"spring.cloud.consul.discovery.instance-id": "${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port}",
|
||||
"ninca.update.floor.pool.queueCapacity": "100000",
|
||||
"person.name.space": "recordEvent",
|
||||
"spring.redis.pool.max-active": "10",
|
||||
"spring.cloud.consul.discovery.enabled": "false",
|
||||
"sendRecord.token.appSecret": "5f6995009b864669b52041b8f5dc4625",
|
||||
"spring.cloud.consul.enabled": "true",
|
||||
"ninca.update.floor.pool.maxPoolSize": "5",
|
||||
"cloudwalk.serial.serial-length": "8",
|
||||
"server.port": "16112",
|
||||
"spring.shardingsphere.datasource.names": "ds0",
|
||||
"spring.redis.password": "1qaz!QAZ",
|
||||
"elevator.application.key": "xinghewan",
|
||||
"spring.mvc.throw-exception-if-no-handler-found": "true",
|
||||
"logging.file": "${spring.application.name}",
|
||||
"feign.component-organization.name": "ninca-common-component-organization",
|
||||
"cloudwalk.spring.cache.expires": "CACHE_NAME_APPLICATIONIDS#21600,ACS_DeviceTypesCache#7200,ACS_DeviceTypeFeaturesCache#7200,ACS_DeviceAttrsCache#7200,ACS_RecordStatisticsCache#90000,ACS_AreaTreeCache#60",
|
||||
"feign.mqtt.name": "cloudwalk-device-thirdparty",
|
||||
"spring.shardingsphere.datasource.ds0.connection-timeout": "60000",
|
||||
"ninca.update.floor.pool.keepAliveSeconds": "150",
|
||||
"feign.cwos-portal.name": "cwos-portal",
|
||||
"spring.shardingsphere.datasource.ds0.password": "1qaz!QAZ",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"floor.building.id": "605560539791228928",
|
||||
"spring.messages.basename": "access-control",
|
||||
"spring.cloud.consul.port": "8500",
|
||||
"ribbon.http.client.enabled": "false",
|
||||
"sendRecord.ip": "hrec.star-river.com:32165",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression": "0 10 0 * * ?",
|
||||
"sendRecord.token.corpId": "53db867a8bb747a1bd04dd1afcad8ca6",
|
||||
"cloudwalk.serial.serial-redis-key": "CLOUDWALK-ACS-SERIAL-KEY",
|
||||
"cloudwalk.datafield.enable": "true",
|
||||
"elevator.application.time": "600",
|
||||
"cloudwalk.access-control.common.device-category-array[5]": "11",
|
||||
"spring.messages.always-use-message-format": "true",
|
||||
"spring.mvc.locale": "zh_CN",
|
||||
"feign.ninca-crk-std.name": "ninca-crk-std",
|
||||
"sendRecord.token.appKey": "293e2d708f0143c2957b702cef44d951",
|
||||
"ribbon.ConnectTimeout": "10000",
|
||||
"spring.cloud.consul.discovery.deregister": "false",
|
||||
"spring.redis.timeout": "0",
|
||||
"spring.shardingsphere.sharding.default-data-source-name": "ds0",
|
||||
"spring.redis.database": "5",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class": "cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description": "AcsRecordStatisticsByDay job is starting.........",
|
||||
"logging.level.cn.cloudwalk": "info",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority": "1",
|
||||
"spring.profiles.active": "access-control",
|
||||
"spring.http.encoding.force": "true",
|
||||
"spring.redis.pool.max-wait": "10",
|
||||
"cloudwalk.access-control.common.device-controller-array[0]": "mqtt",
|
||||
"cloudwalk.event.group-id": "cw-elevator-application-1",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"sendRecord.boolean": "true",
|
||||
"logging.path": "/data/cwos/cw-elevator-application-V1.0.0.20211103/logs",
|
||||
"ribbon.okhttp.enabled": "true",
|
||||
"spring.shardingsphere.datasource.ds0.username": "cloudwalk",
|
||||
"spring.redis.port": "6379",
|
||||
"feign.hystrix.enable": "true",
|
||||
"spring.http.multipart.max-request-size": "200MB",
|
||||
"feign.device.name": "cwos-portal",
|
||||
"elevator.application.keyA": "5B7DEF88FF04",
|
||||
"cloudwalk.datafield.securityKey": "d4b2aabc97394a12a27fc3cca6cd9ba1",
|
||||
"spring.cloud.consul.discovery.ip-address": "${spring.cloud.client.ipAddress}",
|
||||
"cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD": "75",
|
||||
"cloudwalk.access-control.common.face-compare-THRESHOLD": "80",
|
||||
"cloudwalk.datafield.encrypt": "AES",
|
||||
"management.health.db.enabled": "false",
|
||||
"server.tomcat.uri-encoding": "UTF-8",
|
||||
"spring.shardingsphere.datasource.ds0.max-lifetime": "1765000",
|
||||
"mybatis.mapper-locations": "classpath*:cn/cloudwalk/elevator/**/*.xml",
|
||||
"intelligent.lock.config.default-wait-time": "10000",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column": "RECOGNITION_TIME",
|
||||
"ninca.update.floor.pool.corePoolSize": "5",
|
||||
"spring.http.multipart.max-file-size": "200MB",
|
||||
"ribbon.ReadTimeout": "10000",
|
||||
"cloudwalk.access-control.common.device-category-array[2]": "7",
|
||||
"cloudwalk.access-control.common.publish-opendoor-switch": "false",
|
||||
"dubbo.provider.version": "1.0",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes": "ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030}",
|
||||
"spring.cloud.consul.host": "371bfca4972c43d2aefcf302d0a4a277",
|
||||
"cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds": "600000",
|
||||
"cloudwalk.access-control.common.device-category-array[3]": "2",
|
||||
"feign.davinci-portal.name": "cwos-portal",
|
||||
"spring.shardingsphere.datasource.ds0.pool-name": "ds0-pool",
|
||||
"cloudwalk.elevator.common.relativePrefix": "/cwos-portal/portal/fileManager/imgByPath?path=",
|
||||
"spring.redis.host": "redis_01.redis_ip",
|
||||
"spring.shardingsphere.props.sql.show": "false",
|
||||
"spring.shardingsphere.sharding.binding-tables": "IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"spring.shardingsphere.datasource.ds0.auto-commit": "true",
|
||||
"spring.messages.encoding": "utf-8",
|
||||
"spring.redis.pool.min-idle": "0",
|
||||
"spring.shardingsphere.datasource.ds0.jdbc-url": "jdbc:mysql://mysql_01.mysql_ip:3306/cw-elevator-application?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true",
|
||||
"spring.application.name": "elevator-app",
|
||||
"cloudwalk.serial.serial-type": "redis",
|
||||
"feign.okhttp.enable": "true",
|
||||
"mybatis.config-location": "classpath:mapper/mybatis-config.xml",
|
||||
"spring.redis.pool.max-idle": "1",
|
||||
"cloudwalk.access-control.common.face-capture-interval-milliseconds": "3000",
|
||||
"cloudwalk.serial.enable": "true",
|
||||
"spring.cloud.consul.discovery.prefer-ip-address": "true",
|
||||
"cloudwalk.access-control.common.face-capture-time-expired-milliseconds": "300000",
|
||||
"dubbo.protocol.port": "16107",
|
||||
"intelligent.lock.enable": "true",
|
||||
"lockWatchdogTimeout": "21000",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes": "ds0.IT_ACS_RECOG_RECORD_$->{2020..2030}",
|
||||
"ninca.update.floor.pool.allowCoreThreadTimeOut": "true",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group": "ACCESS-CONTROL_GROUP",
|
||||
"spring.cloud.consul.discovery.register": "true",
|
||||
"feign.httpclient.enable": "false",
|
||||
"spring.shardingsphere.datasource.ds0.driver-class-name": "com.mysql.jdbc.Driver",
|
||||
"spring.http.encoding.charset": "UTF-8",
|
||||
"ninca-crk-std.ip": "10.0.22.102:16106",
|
||||
"spring.http.encoding.enabled": "true",
|
||||
"spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name": "cn.cloudwalk.elevator.YearlyShardingAlgorithm",
|
||||
"cloudwalk.event.handler-executor-config.maximum-pool-size": "30",
|
||||
"spring.shardingsphere.datasource.ds0.minimum-idle": "5",
|
||||
"spring.shardingsphere.datasource.ds0.maximum-pool-size": "20",
|
||||
"cloudwalk.event.bootstrap-servers": "371bfca4972c43d2aefcf302d0a4a277:9092,44700995ee904679a7ad5afddcf93bb5:9092,0837a70b5fab47569391828f5feb2561:9092",
|
||||
"spring.shardingsphere.datasource.ds0.type": "com.zaxxer.hikari.HikariDataSource",
|
||||
"dubbo.registry.address": "zookeeper://10.0.22.207:2181",
|
||||
"feign.ninca-common.name": "ninca-common",
|
||||
"feign.resource.name": "cwos-portal",
|
||||
"cloudwalk.access-control.common.device-category-array[4]": "8",
|
||||
"cloudwalk.access-control.common.device-category-array[0]": "4",
|
||||
"cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name": "AcsRecordStatisticsByDayJob",
|
||||
"cloudwalk.access-control.common.device-category-array[1]": "5",
|
||||
"cloudwalk.access-control.common.publish-opendoor-service-code": "access-control"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
# Consul 可访问且「有清单」仍拿不到 IP/端口 — 走查结果(证据执行)
|
||||
|
||||
**证据根**:[`maven-cw-elevator-application/logs/evidence/`](../../maven-cw-elevator-application/logs/evidence/)
|
||||
**主日志**:[`elevator-app.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app.log)
|
||||
**配置探针**:[`elevator-app-probe.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app-probe.log)
|
||||
**Consul 快照(示例)**:[`elevator-evidence-20260430-113912/consul-health-ninca-common-component-organization.json`](../../maven-cw-elevator-application/logs/evidence/elevator-evidence-20260430-113912/consul-health-ninca-common-component-organization.json)
|
||||
|
||||
本文对应走查计划的四项核对:**客户端名**、**Ribbon 初始化时序**、**ConsulServerList vs ConfigurationBased**、**bootstrap 多源合并**。结论与 [`elevator-evidence-v1-v2-diff-20260430.md`](elevator-evidence-v1-v2-diff-20260430.md) §6–§10、[`elevator-service-instance-missing-investigation.md`](elevator-service-instance-missing-investigation.md) 一致并细化到可 grep 的行级证据。
|
||||
|
||||
### 本服务是否注册到 Consul、与探针日志
|
||||
|
||||
- **拉不到上游 IP** 常见原因是 **Ribbon 客户端名 / listOfServers / 时序**(见下文),**不等价于**本机未注册;但仍应单独核实 **本进程** 在 Consul 的登记名是否与 `spring.application.name` 一致、健康是否 **passing**。
|
||||
- 诊断探针 **默认始终运行**(无 `elevator.*.probe` 开关);Consul HTTP 首次延迟见源码 [`ElevatorProbeConstants`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ElevatorProbeConstants.java)。[`ConsulUpstreamHealthProbeRunner`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ConsulUpstreamHealthProbeRunner.java) 会请求本服务 **`/v1/health/service/<spring.application.name>`**(`passing=true` 与全量各一遍,并 **逐实例** DEBUG)、上游同名列表,以及 **`/v1/agent/self`**。
|
||||
- [`RibbonLoadBalancerProbeRunner`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/RibbonLoadBalancerProbeRunner.java) 在同一延迟窗口输出各 client 的 **`ServerList` 实现类**、`ILoadBalancer`、**`DiscoveryClient.getInstances`**(本服务 + `ElevatorUpstreamServiceNames`)明细。
|
||||
- [`logback.xml`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/resources/logs/logback.xml) 将 **`org.springframework.cloud.consul`**、**`com.netflix.loadbalancer`**、**`org.springframework.cloud.client.discovery`** 与 **`cn.cloudwalk.elevator.debug`** 均按 **DEBUG** **双写**到 **`${logging.file}-probe.log`**(与自建 `consulProbe` / `ribbonProbe` / `discoveryProbe` 及框架行对照)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 报错栈中的 Ribbon client 名 vs Consul 注册名
|
||||
|
||||
**核对方法**:在出错 JVM 日志中搜索 **`Load balancer does not have available server for client:`** 或 **`for client:`**,将后缀字符串与 Consul UI / `/v1/health/service/<name>` 的 **Service** 名 **逐字**比对(含 `ninca-common-` 前缀)。
|
||||
|
||||
### 本仓库证据包结论
|
||||
|
||||
| 项目 | 结论 |
|
||||
|------|------|
|
||||
| `for client:` 在本份 `elevator-app.log` 中 | **仅出现** `ninca-crk-std`(大量重复),**未出现** `component-organization` |
|
||||
| Feign 逻辑名 `component-organization` | `feign.component-organization.name=ninca-common-component-organization`(探针:`file:` 与 `classpath:` 均为该值) |
|
||||
| Ribbon 实际客户端名 | `Client: ninca-common-component-organization`,`ConsulServerList{serviceId='ninca-common-component-organization'}` |
|
||||
| Consul | `ninca-common-component-organization` 健康快照为 **3** 个 passing 实例,与日志中三台 `:17016` 一致 |
|
||||
|
||||
**与人对齐时的表述**:若微信群截图写 **`for client: component-organization`**,而本电梯进程配置将 Feign **解析服务名**设为 **`ninca-common-component-organization`**,则二者 **不是** 同一 Ribbon client;对方环境若在 **`component-organization`** 名下查实例会得到 **0 台**,即使 Consul 里注册的是 **`ninca-common-component-organization`**。结论:**先看报错里的精确 client 字符串**,再对 Consul 注册名。
|
||||
|
||||
---
|
||||
|
||||
## 2. DynamicServerListLoadBalancer 初始化与 `Servers=[]` 时间序
|
||||
|
||||
**核对方法**:对关心的 client 搜索 **`DynamicServerListLoadBalancer for client <name> initialized`**,并向上查看同一 client 的 **`current list of Servers=[...]`**;若在列表仍为空窗口内发生首次 Feign 调用,会抛 **no available server**。
|
||||
|
||||
### `ninca-common-component-organization`(Consul 路径)
|
||||
|
||||
| 时间(日志) | 事件 |
|
||||
|--------------|------|
|
||||
| `11:16:33.087` | `Client: ninca-common-component-organization`,首次 `current list of Servers=[]`,`ServerList:null` |
|
||||
| `11:16:33.097` | `DynamicServerListLoadBalancer for client ninca-common-component-organization initialized`,已为 **3 台** `:17016`,`ConsulServerList{serviceId='ninca-common-component-organization'}` |
|
||||
|
||||
约 **10ms** 内由空列表变为三台;若首次 RPC 落在此窗口仍可能失败(计划中的「首轮请求早于填充」风险)。
|
||||
|
||||
### `ninca-crk-std`(ConfigurationBased 路径)
|
||||
|
||||
| 时间(日志) | 事件 |
|
||||
|--------------|------|
|
||||
| `11:16:34.109` | `Client: ninca-crk-std`,`Servers=[]`,`ServerList:null` |
|
||||
| `11:16:34.111` | `DynamicServerListLoadBalancer for client ninca-crk-std initialized`,**仍为** `Servers=[]`,`ServerList:ConfigurationBasedServerList` |
|
||||
| `11:16:34.346` 起 | 连续 **`no available server for client: ninca-crk-std`** |
|
||||
|
||||
本证据包中 **no-server 全部归因于 `ninca-crk-std`**,且发生在 **`ninca-common-component-organization` 已填充三台之后**,说明主因不是「Consul 查错 organization 名」,而是 **`ninca-crk-std` 的静态 Ribbon 列表未配置**(见下节)。
|
||||
|
||||
同一全量日志内 **第二次启动**(约 `11:43`)后 `ninca-crk-std` 可出现非空列表,详见 [`elevator-evidence-v1-v2-diff-20260430.md`](elevator-evidence-v1-v2-diff-20260430.md) §6.2。
|
||||
|
||||
---
|
||||
|
||||
## 3. ConsulServerList 与 ConfigurationBasedServerList;`ninca-crk-std` 与 `listOfServers` / `ip`
|
||||
|
||||
| 客户端 | ServerList 实现 | 列表来源 |
|
||||
|--------|-----------------|----------|
|
||||
| `ninca-common-component-organization` | `ConsulServerList` | Consul `serviceId=ninca-common-component-organization` |
|
||||
| `ninca-crk-std` | `ConfigurationBasedServerList` | Ribbon 属性(如 `ninca-crk-std.ribbon.listOfServers`),**不**自动使用 `ninca-crk-std.ip` |
|
||||
|
||||
代码侧:[`NincaCrkStdRibbonConfiguration`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java) 为 `ninca-crk-std` 固定注册 `ConfigurationBasedServerList`。
|
||||
|
||||
**探针(`elevator-app-probe.log`):**
|
||||
|
||||
- `ninca-crk-std.ribbon.listOfServers value=null`
|
||||
- `ninca-crk-std.ip=10.0.22.102:16106`(`file:` / `classpath:` 一致)
|
||||
|
||||
因此即 Consul 上 `ninca-crk-std` **passing=3**,Ribbon 仍可能 **`Servers=[]`**,与 Consul 是否正常无关,除非另行配置 **`ribbon.listOfServers`** 或改变 ServerList 策略。部署模板对照:V1 legacy 含显式 `ninca-crk-std.ribbon.listOfServers` 段;V2 模板以 `ninca-crk-std.ip` 为主,见 [`deploy/v1-legacy/application.properties`](../../maven-cw-elevator-application/deploy/v1-legacy/application.properties) 与 [`deploy/v2-maven/application.properties`](../../maven-cw-elevator-application/deploy/v2-maven/application.properties)。
|
||||
|
||||
---
|
||||
|
||||
## 4. `file:./bootstrap` 与 `classpath:/bootstrap` 对 Consul 的合并结果
|
||||
|
||||
**来源**:[`elevator-app-probe.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app-probe.log) 中 `ConfigSourceProbeRunner` 行。
|
||||
|
||||
| 键 | Environment 合并结果 | `file:./bootstrap.properties` | `classpath:/bootstrap.properties` |
|
||||
|----|------------------------|--------------------------------|-------------------------------------|
|
||||
| `spring.cloud.consul.host` | `10.0.22.102` | `10.0.22.102` | 主机名(与磁盘不一致) |
|
||||
| `spring.cloud.consul.discovery.enabled` | `true` | `true` | `false` |
|
||||
|
||||
**走查要点**:以 **`spring.application.*` 合并后的 `value=`** 为准核对「进程连的 Consul」是否与运维在浏览器里看的地址一致;磁盘与 jar 内嵌 bootstrap **并存**时,以最终 Environment 为准(本样本下 host 为 **10.0.22.102**、发现 **启用**)。证据目录内亦有 [`bootstrap.properties`](../../maven-cw-elevator-application/logs/evidence/elevator-evidence-20260430-113912/bootstrap.properties) 快照可与现场比对。
|
||||
|
||||
---
|
||||
|
||||
## 5. 建议的可复现 grep(本地)
|
||||
|
||||
```bash
|
||||
# 锁定所有「for client:」后的客户端名(去重)
|
||||
grep -E 'for client:' maven-cw-elevator-application/logs/evidence/elevator-app.log | sed -n 's/.*for client: \([^ ]*\).*/\1/p' | sort -u
|
||||
|
||||
# 各客户端初始化与非空列表
|
||||
grep 'DynamicServerListLoadBalancer for client' maven-cw-elevator-application/logs/evidence/elevator-app.log
|
||||
|
||||
# 区分 Consul 与配置型列表
|
||||
grep -E 'ConsulServerList|ConfigurationBasedServerList' maven-cw-elevator-application/logs/evidence/elevator-app.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**延伸阅读**:[`elevator-v1-v2-init-timing-config-audit.md`](elevator-v1-v2-init-timing-config-audit.md)(初始化顺序与探针)、[`elevator-evidence-v1-v2-diff-20260430.md`](elevator-evidence-v1-v2-diff-20260430.md) §9(`listOfServers` vs `ninca-crk-std.ip`)。
|
||||
@@ -0,0 +1,46 @@
|
||||
# 从 multiset 差值中扣减「仅 V1 基准包多出」的条目(每行一条坐标或 unresolved:文件名,末尾可选次数,默认 1)。
|
||||
# 产品线模块保留 2.0-SNAPSHOT,不自降级为 1.0-SNAPSHOT。
|
||||
cn.cloudwalk.elevator:cw-elevator-application-common:1.0-SNAPSHOT 1
|
||||
cn.cloudwalk.elevator:cw-elevator-application-data:1.0-SNAPSHOT 1
|
||||
cn.cloudwalk.elevator:cw-elevator-application-service:1.0-SNAPSHOT 1
|
||||
cn.cloudwalk.elevator:cw-elevator-application-web:1.0-SNAPSHOT 1
|
||||
# V1 运行包误入的 Maven/Mojo 构建泄漏(V2 故意不打入)
|
||||
org.apache.maven.wagon:wagon-provider-api:1.0-beta-2 1
|
||||
org.apache.maven:maven-artifact-manager:2.0.5 1
|
||||
org.apache.maven:maven-artifact:2.0.5 1
|
||||
org.apache.maven:maven-model:2.0.5 1
|
||||
org.apache.maven:maven-plugin-api:2.0.5 1
|
||||
org.apache.maven:maven-profile:2.0.5 1
|
||||
org.apache.maven:maven-project:2.0.5 1
|
||||
org.apache.maven:maven-repository-metadata:2.0.5 1
|
||||
org.apache.maven:maven-settings:2.0.5 1
|
||||
org.codehaus.plexus:plexus-container-default:1.0-alpha-9 1
|
||||
org.codehaus.plexus:plexus-utils:1.1 1
|
||||
org.jfrog.jade.plugins.common:jade-plugin-common:1.3.8 1
|
||||
org.jfrog.maven.annomojo:maven-plugin-anno:1.4.1 1
|
||||
org.reflections:reflections-maven:0.9.9-RC2 1
|
||||
# 私服父 POM 不可解析,运行时亦不强制依赖
|
||||
org.springside:springside-core:4.2.3-GA 1
|
||||
# V1 嵌套 jar 无 pom.properties,脚本记为 unresolved;与 V2 侧解析坐标不对等时放行
|
||||
unresolved:annotations-2.0.0.jar 1
|
||||
unresolved:ant-1.6.5.jar 1
|
||||
unresolved:ant-apache-bsf-1.9.4.jar 1
|
||||
unresolved:ant-jakarta-oro-1.6.1.jar 1
|
||||
unresolved:ant-nodeps-1.8.1.jar 1
|
||||
unresolved:asm-5.0.3.jar 1
|
||||
unresolved:asm-analysis-5.0.3.jar 1
|
||||
unresolved:asm-tree-5.0.3.jar 1
|
||||
unresolved:asm-util-5.0.3.jar 1
|
||||
unresolved:bsf-2.4.0.jar 1
|
||||
unresolved:classworlds-1.1-alpha-2.jar 1
|
||||
unresolved:feign-core-8.18.0.jar 1
|
||||
unresolved:feign-okhttp-8.18.0.jar 1
|
||||
unresolved:hamcrest-core-1.3.jar 1
|
||||
unresolved:jdom-1.1.2.jar 1
|
||||
unresolved:junit-4.12.jar 1
|
||||
unresolved:lombok-1.16.18.jar 1
|
||||
unresolved:parboiled-core-1.1.7.jar 1
|
||||
unresolved:parboiled-java-1.1.7.jar 1
|
||||
unresolved:pegdown-1.6.0.jar 1
|
||||
unresolved:xpp3-1.1.3.4-RC8.jar 1
|
||||
unresolved:xstream-1.1.3.jar 1
|
||||
@@ -0,0 +1,15 @@
|
||||
# 从 multiset 差值中扣减「仅当前构建多出」的条目。
|
||||
cn.cloudwalk.elevator:cw-elevator-application-common:2.0-SNAPSHOT 1
|
||||
cn.cloudwalk.elevator:cw-elevator-application-data:2.0-SNAPSHOT 1
|
||||
cn.cloudwalk.elevator:cw-elevator-application-service:2.0-SNAPSHOT 1
|
||||
cn.cloudwalk.elevator:cw-elevator-application-web:2.0-SNAPSHOT 1
|
||||
com.google.code.findbugs:jsr305:3.0.2 1
|
||||
io.github.openfeign:feign-okhttp:9.5.0 1
|
||||
javax.annotation:javax.annotation-api:1.3.2 1
|
||||
net.bytebuddy:byte-buddy-dep:1.9.6 1
|
||||
org.hibernate.validator:hibernate-validator:6.0.22.Final 1
|
||||
org.jctools:jctools-core:2.1.1 1
|
||||
unresolved:annotations-2.0.1.jar 1
|
||||
unresolved:asm-7.3.1.jar 1
|
||||
unresolved:asm-commons-7.0.jar 1
|
||||
unresolved:lombok-1.16.22.jar 1
|
||||
@@ -0,0 +1,869 @@
|
||||
# cw-elevator-application V1 fat-jar 与 V2 fat-jar 依赖差异核对
|
||||
|
||||
**生成方式**:脚本 `scripts/generate_v1_v2_elevator_dependency_diff.py`(可重复执行覆盖本文件)。
|
||||
|
||||
## 样本路径
|
||||
|
||||
- **V1**:`cw-elevator-application-V1.0.0.20211103/cw-elevator-application-V1.0.0.20211103.jar`
|
||||
- **V2**:`maven-cw-elevator-application/cw-elevator-application-starter/target/cw-elevator-application-2.0.0.jar`
|
||||
|
||||
| 指标 | V1 | V2 |
|
||||
|------|----|----|
|
||||
| 嵌套 jar 条目数(lib / BOOT-INF/lib) | 269 | 242 |
|
||||
| 解析出唯一坐标 `groupId:artifactId:version` 数 | 269 | 242 |
|
||||
| 同名 GA、两侧均有解析且 version 集合不一致(§2.2.1)条数 | — | **4** |
|
||||
| 与 Maven `dependency:list`(runtime)条目数 | — | 242 |
|
||||
|
||||
---
|
||||
|
||||
## 1. Maven 方式(仅 V2 reactor)
|
||||
|
||||
在 `maven-cw-elevator-application` 下执行:`mvn -pl cw-elevator-application-starter -am dependency:list -DincludeScope=runtime -Dsort=true -DoutputFile=target/v2-maven-deps.txt`。`-am` 时每个子模块写各自的 `target/`;**§1.1 使用 starter 模块文件**:`cw-elevator-application-starter/target/v2-maven-deps.txt`。
|
||||
|
||||
**说明**:历史 **V1 运行包** 当前仓库无对应 **1.0** 聚合工程可一键 `dependency:list`;V1 的 Maven 坐标视图见 **§2 二进制嵌套 JAR 的 pom.properties**。
|
||||
|
||||
### 1.1 V2 `dependency:list` 全量(runtime)
|
||||
|
||||
| # | groupId | artifactId | version | scope |
|
||||
|---|---------|--------------|---------|-------|
|
||||
| 1 | `ch.qos.logback` | `logback-classic` | `1.1.11` | `compile` |
|
||||
| 2 | `ch.qos.logback` | `logback-core` | `1.1.11` | `compile` |
|
||||
| 3 | `cn.cloudwalk` | `cloudwalk-device-sdk-protocol-entity` | `2.2.0` | `compile` |
|
||||
| 4 | `cn.cloudwalk` | `cwos-java-sdk-resource` | `1.0.0-SNAPSHOT` | `compile` |
|
||||
| 5 | `cn.cloudwalk` | `cwos-portal-interface` | `1.0.0-SNAPSHOT` | `compile` |
|
||||
| 6 | `cn.cloudwalk.cloud` | `cloudwalk-common-event` | `3.7.2-Brussels-SRX` | `compile` |
|
||||
| 7 | `cn.cloudwalk.cloud` | `cloudwalk-common-result` | `3.7.2-Brussels-SRX` | `compile` |
|
||||
| 8 | `cn.cloudwalk.cloud` | `cloudwalk-common-serial` | `3.7.2-Brussels-SRX` | `compile` |
|
||||
| 9 | `cn.cloudwalk.cloud` | `cloudwalk-common-service` | `3.7.2-Brussels-SRX` | `compile` |
|
||||
| 10 | `cn.cloudwalk.cloud` | `cloudwalk-common-web` | `3.7.2-Brussels-SRX` | `compile` |
|
||||
| 11 | `cn.cloudwalk.cloud` | `cloudwalk-device-manager-common` | `2.0.2` | `compile` |
|
||||
| 12 | `cn.cloudwalk.cloud` | `cloudwalk-device-manager-interface` | `2.0.2` | `compile` |
|
||||
| 13 | `cn.cloudwalk.cloud` | `cwos-common-aks-interface` | `1.0.0-SNAPSHOT` | `compile` |
|
||||
| 14 | `cn.cloudwalk.cloud` | `cwos-component-resource-data` | `1.0.0-SNAPSHOT` | `compile` |
|
||||
| 15 | `cn.cloudwalk.cloud` | `cwos-component-resource-interface` | `1.0.0-SNAPSHOT` | `compile` |
|
||||
| 16 | `cn.cloudwalk.cloud` | `cwos-device-authentication-interface` | `1.0.0-SNAPSHOT` | `compile` |
|
||||
| 17 | `cn.cloudwalk.cloud` | `cwos-sdk-event` | `1.5.0-SNAPSHOT` | `compile` |
|
||||
| 18 | `cn.cloudwalk.elevator` | `cw-elevator-application-common` | `2.0-SNAPSHOT` | `compile` |
|
||||
| 19 | `cn.cloudwalk.elevator` | `cw-elevator-application-data` | `2.0-SNAPSHOT` | `compile` |
|
||||
| 20 | `cn.cloudwalk.elevator` | `cw-elevator-application-service` | `2.0-SNAPSHOT` | `compile` |
|
||||
| 21 | `cn.cloudwalk.elevator` | `cw-elevator-application-web` | `2.0-SNAPSHOT` | `compile` |
|
||||
| 22 | `cn.cloudwalk.intelligent` | `cloudwalk-intelligent-component-lock` | `1.1.1-SNAPSHOT` | `compile` |
|
||||
| 23 | `cn.cloudwalk.intelligent` | `davinci-manager-common` | `1.1.7-SNAPSHOT` | `compile` |
|
||||
| 24 | `cn.cloudwalk.intelligent` | `davinci-manager-storage` | `1.1.7-SNAPSHOT` | `compile` |
|
||||
| 25 | `cn.cloudwalk.intelligent` | `intelligent-cwoscomponent-interface` | `2.9.2-xinghewan` | `compile` |
|
||||
| 26 | `cn.cloudwalk.intelligent` | `intelligent-cwoscomponent-rest` | `2.9.2-xinghewan` | `compile` |
|
||||
| 27 | `com.alibaba` | `fastjson` | `1.2.73` | `compile` |
|
||||
| 28 | `com.aliyun` | `aliyun-java-sdk-core` | `3.2.8` | `compile` |
|
||||
| 29 | `com.aliyun` | `aliyun-java-sdk-dysmsapi` | `1.1.0` | `compile` |
|
||||
| 30 | `com.ecwid.consul` | `consul-api` | `1.3.0` | `compile` |
|
||||
| 31 | `com.fasterxml` | `classmate` | `1.3.4` | `compile` |
|
||||
| 32 | `com.fasterxml.jackson.core` | `jackson-annotations` | `2.11.2` | `compile` |
|
||||
| 33 | `com.fasterxml.jackson.core` | `jackson-core` | `2.11.2` | `compile` |
|
||||
| 34 | `com.fasterxml.jackson.core` | `jackson-databind` | `2.11.2` | `compile` |
|
||||
| 35 | `com.fasterxml.jackson.dataformat` | `jackson-dataformat-yaml` | `2.11.2` | `compile` |
|
||||
| 36 | `com.fasterxml.jackson.datatype` | `jackson-datatype-jsr310` | `2.11.2` | `compile` |
|
||||
| 37 | `com.fasterxml.jackson.module` | `jackson-module-afterburner` | `2.11.2` | `compile` |
|
||||
| 38 | `com.github.jsqlparser` | `jsqlparser` | `1.2` | `compile` |
|
||||
| 39 | `com.github.luben` | `zstd-jni` | `1.4.0-1` | `compile` |
|
||||
| 40 | `com.github.pagehelper` | `pagehelper` | `5.1.2` | `compile` |
|
||||
| 41 | `com.github.pagehelper` | `pagehelper-spring-boot-autoconfigure` | `1.2.5` | `compile` |
|
||||
| 42 | `com.github.virtuald` | `curvesapi` | `1.04` | `compile` |
|
||||
| 43 | `com.google.code.findbugs` | `annotations` | `2.0.1` | `compile` |
|
||||
| 44 | `com.google.code.findbugs` | `jsr305` | `3.0.2` | `compile` |
|
||||
| 45 | `com.google.code.gson` | `gson` | `2.8.5` | `compile` |
|
||||
| 46 | `com.google.guava` | `guava` | `20.0` | `compile` |
|
||||
| 47 | `com.google.zxing` | `core` | `3.3.3` | `compile` |
|
||||
| 48 | `com.netflix.archaius` | `archaius-core` | `0.6.6` | `compile` |
|
||||
| 49 | `com.netflix.hystrix` | `hystrix-core` | `1.5.12` | `compile` |
|
||||
| 50 | `com.netflix.hystrix` | `hystrix-javanica` | `1.5.12` | `compile` |
|
||||
| 51 | `com.netflix.hystrix` | `hystrix-metrics-event-stream` | `1.5.12` | `compile` |
|
||||
| 52 | `com.netflix.hystrix` | `hystrix-serialization` | `1.5.12` | `runtime` |
|
||||
| 53 | `com.netflix.netflix-commons` | `netflix-commons-util` | `0.1.1` | `runtime` |
|
||||
| 54 | `com.netflix.netflix-commons` | `netflix-statistics` | `0.1.1` | `runtime` |
|
||||
| 55 | `com.netflix.ribbon` | `ribbon` | `2.2.5` | `compile` |
|
||||
| 56 | `com.netflix.ribbon` | `ribbon-core` | `2.2.5` | `compile` |
|
||||
| 57 | `com.netflix.ribbon` | `ribbon-httpclient` | `2.2.5` | `compile` |
|
||||
| 58 | `com.netflix.ribbon` | `ribbon-loadbalancer` | `2.2.5` | `compile` |
|
||||
| 59 | `com.netflix.ribbon` | `ribbon-transport` | `2.2.5` | `runtime` |
|
||||
| 60 | `com.netflix.servo` | `servo-core` | `0.10.1` | `runtime` |
|
||||
| 61 | `com.netflix.servo` | `servo-internal` | `0.10.1` | `runtime` |
|
||||
| 62 | `com.squareup.okhttp3` | `okhttp` | `3.2.0` | `compile` |
|
||||
| 63 | `com.squareup.okio` | `okio` | `1.6.0` | `compile` |
|
||||
| 64 | `com.sun.jersey` | `jersey-client` | `1.19.1` | `runtime` |
|
||||
| 65 | `com.sun.jersey` | `jersey-core` | `1.19.1` | `runtime` |
|
||||
| 66 | `com.sun.jersey.contribs` | `jersey-apache-client4` | `1.19.1` | `runtime` |
|
||||
| 67 | `com.zaxxer` | `HikariCP` | `2.5.1` | `compile` |
|
||||
| 68 | `commons-codec` | `commons-codec` | `1.10` | `compile` |
|
||||
| 69 | `commons-collections` | `commons-collections` | `3.2.2` | `runtime` |
|
||||
| 70 | `commons-configuration` | `commons-configuration` | `1.8` | `compile` |
|
||||
| 71 | `commons-fileupload` | `commons-fileupload` | `1.3.1` | `compile` |
|
||||
| 72 | `commons-io` | `commons-io` | `2.5` | `compile` |
|
||||
| 73 | `commons-lang` | `commons-lang` | `2.6` | `compile` |
|
||||
| 74 | `commons-logging` | `commons-logging` | `1.2` | `compile` |
|
||||
| 75 | `de.ruedigermoeller` | `fst` | `2.56` | `compile` |
|
||||
| 76 | `dom4j` | `dom4j` | `1.6.1` | `compile` |
|
||||
| 77 | `io.github.openfeign` | `feign-core` | `9.5.0` | `compile` |
|
||||
| 78 | `io.github.openfeign` | `feign-hystrix` | `9.5.0` | `compile` |
|
||||
| 79 | `io.github.openfeign` | `feign-okhttp` | `9.5.0` | `compile` |
|
||||
| 80 | `io.github.openfeign` | `feign-slf4j` | `9.5.0` | `compile` |
|
||||
| 81 | `io.github.openfeign.form` | `feign-form` | `3.0.3` | `compile` |
|
||||
| 82 | `io.github.openfeign.form` | `feign-form-spring` | `3.0.3` | `compile` |
|
||||
| 83 | `io.netty` | `netty-buffer` | `4.1.33.Final` | `compile` |
|
||||
| 84 | `io.netty` | `netty-codec` | `4.1.33.Final` | `compile` |
|
||||
| 85 | `io.netty` | `netty-codec-dns` | `4.1.33.Final` | `compile` |
|
||||
| 86 | `io.netty` | `netty-common` | `4.1.33.Final` | `compile` |
|
||||
| 87 | `io.netty` | `netty-handler` | `4.1.33.Final` | `compile` |
|
||||
| 88 | `io.netty` | `netty-resolver` | `4.1.33.Final` | `compile` |
|
||||
| 89 | `io.netty` | `netty-resolver-dns` | `4.1.33.Final` | `compile` |
|
||||
| 90 | `io.netty` | `netty-transport` | `4.1.33.Final` | `compile` |
|
||||
| 91 | `io.projectreactor` | `reactor-core` | `2.0.8.RELEASE` | `compile` |
|
||||
| 92 | `io.projectreactor` | `reactor-stream` | `2.0.8.RELEASE` | `compile` |
|
||||
| 93 | `io.reactivex` | `rxjava` | `1.2.0` | `compile` |
|
||||
| 94 | `io.reactivex` | `rxnetty` | `0.4.9` | `runtime` |
|
||||
| 95 | `io.reactivex` | `rxnetty-contexts` | `0.4.9` | `runtime` |
|
||||
| 96 | `io.reactivex` | `rxnetty-servo` | `0.4.9` | `runtime` |
|
||||
| 97 | `io.reactivex.rxjava2` | `rxjava` | `2.1.13` | `compile` |
|
||||
| 98 | `javax.activation` | `activation` | `1.1` | `compile` |
|
||||
| 99 | `javax.annotation` | `javax.annotation-api` | `1.3.2` | `compile` |
|
||||
| 100 | `javax.cache` | `cache-api` | `1.0.0` | `compile` |
|
||||
| 101 | `javax.inject` | `javax.inject` | `1` | `runtime` |
|
||||
| 102 | `javax.mail` | `mail` | `1.4.4` | `compile` |
|
||||
| 103 | `javax.validation` | `validation-api` | `1.1.0.Final` | `compile` |
|
||||
| 104 | `javax.ws.rs` | `jsr311-api` | `1.1.1` | `runtime` |
|
||||
| 105 | `joda-time` | `joda-time` | `2.9.9` | `compile` |
|
||||
| 106 | `mysql` | `mysql-connector-java` | `5.1.47` | `compile` |
|
||||
| 107 | `net.bytebuddy` | `byte-buddy` | `1.9.6` | `compile` |
|
||||
| 108 | `net.bytebuddy` | `byte-buddy-dep` | `1.9.6` | `compile` |
|
||||
| 109 | `net.coobird` | `thumbnailator` | `0.4.8` | `compile` |
|
||||
| 110 | `net.lingala.zip4j` | `zip4j` | `2.6.2` | `compile` |
|
||||
| 111 | `net.sf.ehcache` | `ehcache` | `2.10.5` | `compile` |
|
||||
| 112 | `net.sf.opencsv` | `opencsv` | `2.3` | `compile` |
|
||||
| 113 | `org.antlr` | `antlr4-runtime` | `4.7.2` | `compile` |
|
||||
| 114 | `org.apache.ant` | `ant` | `1.9.6` | `compile` |
|
||||
| 115 | `org.apache.ant` | `ant-launcher` | `1.9.6` | `compile` |
|
||||
| 116 | `org.apache.commons` | `commons-collections4` | `4.1` | `compile` |
|
||||
| 117 | `org.apache.commons` | `commons-compress` | `1.9` | `compile` |
|
||||
| 118 | `org.apache.commons` | `commons-lang3` | `3.5` | `compile` |
|
||||
| 119 | `org.apache.commons` | `commons-pool2` | `2.4.3` | `compile` |
|
||||
| 120 | `org.apache.httpcomponents` | `httpclient` | `4.5.6` | `compile` |
|
||||
| 121 | `org.apache.httpcomponents` | `httpcore` | `4.4.10` | `compile` |
|
||||
| 122 | `org.apache.kafka` | `kafka-clients` | `2.3.0` | `compile` |
|
||||
| 123 | `org.apache.poi` | `poi` | `3.15` | `compile` |
|
||||
| 124 | `org.apache.poi` | `poi-ooxml` | `3.15` | `compile` |
|
||||
| 125 | `org.apache.poi` | `poi-ooxml-schemas` | `3.15` | `compile` |
|
||||
| 126 | `org.apache.shardingsphere` | `encrypt-core-merge` | `4.0.0` | `compile` |
|
||||
| 127 | `org.apache.shardingsphere` | `encrypt-core-rewrite` | `4.0.0` | `compile` |
|
||||
| 128 | `org.apache.shardingsphere` | `sharding-core-api` | `4.0.0` | `compile` |
|
||||
| 129 | `org.apache.shardingsphere` | `sharding-core-common` | `4.0.0` | `compile` |
|
||||
| 130 | `org.apache.shardingsphere` | `sharding-core-entry` | `4.0.0` | `compile` |
|
||||
| 131 | `org.apache.shardingsphere` | `sharding-core-execute` | `4.0.0` | `compile` |
|
||||
| 132 | `org.apache.shardingsphere` | `sharding-core-merge` | `4.0.0` | `compile` |
|
||||
| 133 | `org.apache.shardingsphere` | `sharding-core-rewrite` | `4.0.0` | `compile` |
|
||||
| 134 | `org.apache.shardingsphere` | `sharding-core-route` | `4.0.0` | `compile` |
|
||||
| 135 | `org.apache.shardingsphere` | `sharding-jdbc-core` | `4.0.0` | `compile` |
|
||||
| 136 | `org.apache.shardingsphere` | `sharding-jdbc-spring-boot-starter` | `4.0.0` | `compile` |
|
||||
| 137 | `org.apache.shardingsphere` | `sharding-spring-boot-util` | `4.0.0` | `compile` |
|
||||
| 138 | `org.apache.shardingsphere` | `sharding-transaction-core` | `4.0.0` | `compile` |
|
||||
| 139 | `org.apache.shardingsphere` | `shardingsphere-execute` | `4.0.0` | `compile` |
|
||||
| 140 | `org.apache.shardingsphere` | `shardingsphere-merge` | `4.0.0` | `compile` |
|
||||
| 141 | `org.apache.shardingsphere` | `shardingsphere-rewrite-engine` | `4.0.0` | `compile` |
|
||||
| 142 | `org.apache.shardingsphere` | `shardingsphere-spi` | `4.0.0` | `compile` |
|
||||
| 143 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-engine` | `4.0.0` | `compile` |
|
||||
| 144 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-mysql` | `4.0.0` | `compile` |
|
||||
| 145 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-oracle` | `4.0.0` | `compile` |
|
||||
| 146 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-postgresql` | `4.0.0` | `compile` |
|
||||
| 147 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-relation` | `4.0.0` | `compile` |
|
||||
| 148 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-spi` | `4.0.0` | `compile` |
|
||||
| 149 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-sql92` | `4.0.0` | `compile` |
|
||||
| 150 | `org.apache.shardingsphere` | `shardingsphere-sql-parser-sqlserver` | `4.0.0` | `compile` |
|
||||
| 151 | `org.apache.tomcat` | `tomcat-annotations-api` | `8.5.34` | `compile` |
|
||||
| 152 | `org.apache.tomcat` | `tomcat-jdbc` | `8.5.34` | `compile` |
|
||||
| 153 | `org.apache.tomcat` | `tomcat-juli` | `8.5.34` | `compile` |
|
||||
| 154 | `org.apache.tomcat.embed` | `tomcat-embed-core` | `8.5.34` | `compile` |
|
||||
| 155 | `org.apache.tomcat.embed` | `tomcat-embed-el` | `8.5.34` | `compile` |
|
||||
| 156 | `org.apache.tomcat.embed` | `tomcat-embed-websocket` | `8.5.34` | `compile` |
|
||||
| 157 | `org.apache.xmlbeans` | `xmlbeans` | `2.6.0` | `compile` |
|
||||
| 158 | `org.aspectj` | `aspectjweaver` | `1.8.13` | `compile` |
|
||||
| 159 | `org.bouncycastle` | `bcpkix-jdk15on` | `1.55` | `compile` |
|
||||
| 160 | `org.bouncycastle` | `bcprov-jdk15on` | `1.55` | `compile` |
|
||||
| 161 | `org.codehaus.groovy` | `groovy` | `indy` | `2.4.5` |
|
||||
| 162 | `org.freemarker` | `freemarker` | `2.3.28` | `compile` |
|
||||
| 163 | `org.hdrhistogram` | `HdrHistogram` | `2.1.9` | `compile` |
|
||||
| 164 | `org.hibernate` | `hibernate-validator` | `5.3.6.Final` | `compile` |
|
||||
| 165 | `org.hibernate.validator` | `hibernate-validator` | `6.0.22.Final` | `compile` |
|
||||
| 166 | `org.javassist` | `javassist` | `3.21.0-GA` | `compile` |
|
||||
| 167 | `org.jboss.logging` | `jboss-logging` | `3.3.2.Final` | `compile` |
|
||||
| 168 | `org.jctools` | `jctools-core` | `2.1.1` | `compile` |
|
||||
| 169 | `org.jodd` | `jodd-bean` | `3.7.1` | `compile` |
|
||||
| 170 | `org.jodd` | `jodd-core` | `3.7.1` | `compile` |
|
||||
| 171 | `org.jsoup` | `jsoup` | `1.9.2` | `compile` |
|
||||
| 172 | `org.jvnet` | `animal-sniffer-annotation` | `1.0` | `compile` |
|
||||
| 173 | `org.lz4` | `lz4-java` | `1.6.0` | `compile` |
|
||||
| 174 | `org.mybatis` | `mybatis` | `3.4.6` | `compile` |
|
||||
| 175 | `org.mybatis` | `mybatis-spring` | `1.3.2` | `compile` |
|
||||
| 176 | `org.mybatis.spring.boot` | `mybatis-spring-boot-autoconfigure` | `1.3.1` | `compile` |
|
||||
| 177 | `org.mybatis.spring.boot` | `mybatis-spring-boot-starter` | `1.3.1` | `compile` |
|
||||
| 178 | `org.objenesis` | `objenesis` | `2.1` | `compile` |
|
||||
| 179 | `org.ow2.asm` | `asm` | `7.3.1` | `compile` |
|
||||
| 180 | `org.ow2.asm` | `asm-commons` | `7.0` | `compile` |
|
||||
| 181 | `org.projectlombok` | `lombok` | `1.16.22` | `compile` |
|
||||
| 182 | `org.reactivestreams` | `reactive-streams` | `1.0.2` | `compile` |
|
||||
| 183 | `org.redisson` | `redisson` | `2.15.2` | `compile` |
|
||||
| 184 | `org.redisson` | `redisson-spring-boot-starter` | `2.15.2` | `compile` |
|
||||
| 185 | `org.redisson` | `redisson-spring-data-18` | `2.15.2` | `compile` |
|
||||
| 186 | `org.reflections` | `reflections` | `0.9.9-RC2` | `compile` |
|
||||
| 187 | `org.slf4j` | `jcl-over-slf4j` | `1.7.25` | `compile` |
|
||||
| 188 | `org.slf4j` | `jul-to-slf4j` | `1.7.25` | `compile` |
|
||||
| 189 | `org.slf4j` | `log4j-over-slf4j` | `1.7.25` | `compile` |
|
||||
| 190 | `org.slf4j` | `slf4j-api` | `1.7.25` | `compile` |
|
||||
| 191 | `org.springframework` | `spring-aop` | `4.3.29.RELEASE` | `compile` |
|
||||
| 192 | `org.springframework` | `spring-aspects` | `4.3.29.RELEASE` | `compile` |
|
||||
| 193 | `org.springframework` | `spring-beans` | `4.3.29.RELEASE` | `compile` |
|
||||
| 194 | `org.springframework` | `spring-context` | `4.3.29.RELEASE` | `compile` |
|
||||
| 195 | `org.springframework` | `spring-context-support` | `4.3.29.RELEASE` | `compile` |
|
||||
| 196 | `org.springframework` | `spring-core` | `4.3.29.RELEASE` | `compile` |
|
||||
| 197 | `org.springframework` | `spring-expression` | `4.3.29.RELEASE` | `compile` |
|
||||
| 198 | `org.springframework` | `spring-jdbc` | `4.3.29.RELEASE` | `compile` |
|
||||
| 199 | `org.springframework` | `spring-oxm` | `4.3.29.RELEASE` | `compile` |
|
||||
| 200 | `org.springframework` | `spring-tx` | `4.3.29.RELEASE` | `compile` |
|
||||
| 201 | `org.springframework` | `spring-web` | `4.3.29.RELEASE` | `compile` |
|
||||
| 202 | `org.springframework` | `spring-webmvc` | `4.3.29.RELEASE` | `compile` |
|
||||
| 203 | `org.springframework.boot` | `spring-boot` | `1.5.17.RELEASE` | `compile` |
|
||||
| 204 | `org.springframework.boot` | `spring-boot-actuator` | `1.5.17.RELEASE` | `compile` |
|
||||
| 205 | `org.springframework.boot` | `spring-boot-autoconfigure` | `1.5.17.RELEASE` | `compile` |
|
||||
| 206 | `org.springframework.boot` | `spring-boot-starter` | `1.5.17.RELEASE` | `compile` |
|
||||
| 207 | `org.springframework.boot` | `spring-boot-starter-actuator` | `1.5.17.RELEASE` | `compile` |
|
||||
| 208 | `org.springframework.boot` | `spring-boot-starter-aop` | `1.5.17.RELEASE` | `compile` |
|
||||
| 209 | `org.springframework.boot` | `spring-boot-starter-cache` | `1.5.17.RELEASE` | `compile` |
|
||||
| 210 | `org.springframework.boot` | `spring-boot-starter-data-redis` | `1.5.17.RELEASE` | `compile` |
|
||||
| 211 | `org.springframework.boot` | `spring-boot-starter-freemarker` | `1.5.17.RELEASE` | `compile` |
|
||||
| 212 | `org.springframework.boot` | `spring-boot-starter-jdbc` | `1.5.17.RELEASE` | `compile` |
|
||||
| 213 | `org.springframework.boot` | `spring-boot-starter-logging` | `1.5.17.RELEASE` | `compile` |
|
||||
| 214 | `org.springframework.boot` | `spring-boot-starter-tomcat` | `1.5.17.RELEASE` | `compile` |
|
||||
| 215 | `org.springframework.boot` | `spring-boot-starter-web` | `1.5.17.RELEASE` | `compile` |
|
||||
| 216 | `org.springframework.cloud` | `spring-cloud-commons` | `1.3.5.RELEASE` | `compile` |
|
||||
| 217 | `org.springframework.cloud` | `spring-cloud-consul-core` | `1.3.5.RELEASE` | `compile` |
|
||||
| 218 | `org.springframework.cloud` | `spring-cloud-consul-discovery` | `1.3.5.RELEASE` | `compile` |
|
||||
| 219 | `org.springframework.cloud` | `spring-cloud-context` | `1.3.5.RELEASE` | `compile` |
|
||||
| 220 | `org.springframework.cloud` | `spring-cloud-netflix-core` | `1.4.6.RELEASE` | `compile` |
|
||||
| 221 | `org.springframework.cloud` | `spring-cloud-netflix-hystrix-dashboard` | `1.4.6.RELEASE` | `compile` |
|
||||
| 222 | `org.springframework.cloud` | `spring-cloud-starter` | `1.3.5.RELEASE` | `compile` |
|
||||
| 223 | `org.springframework.cloud` | `spring-cloud-starter-consul` | `1.3.5.RELEASE` | `compile` |
|
||||
| 224 | `org.springframework.cloud` | `spring-cloud-starter-consul-discovery` | `1.3.5.RELEASE` | `compile` |
|
||||
| 225 | `org.springframework.cloud` | `spring-cloud-starter-netflix-archaius` | `1.4.6.RELEASE` | `compile` |
|
||||
| 226 | `org.springframework.cloud` | `spring-cloud-starter-netflix-hystrix` | `1.4.6.RELEASE` | `compile` |
|
||||
| 227 | `org.springframework.cloud` | `spring-cloud-starter-netflix-hystrix-dashboard` | `1.4.6.RELEASE` | `compile` |
|
||||
| 228 | `org.springframework.cloud` | `spring-cloud-starter-netflix-ribbon` | `1.4.6.RELEASE` | `compile` |
|
||||
| 229 | `org.springframework.cloud` | `spring-cloud-starter-openfeign` | `1.4.6.RELEASE` | `compile` |
|
||||
| 230 | `org.springframework.cloud` | `spring-cloud-starter-ribbon` | `1.4.6.RELEASE` | `compile` |
|
||||
| 231 | `org.springframework.data` | `spring-data-commons` | `1.13.16.RELEASE` | `compile` |
|
||||
| 232 | `org.springframework.data` | `spring-data-keyvalue` | `1.2.16.RELEASE` | `compile` |
|
||||
| 233 | `org.springframework.data` | `spring-data-redis` | `1.8.16.RELEASE` | `compile` |
|
||||
| 234 | `org.springframework.security` | `spring-security-crypto` | `4.2.9.RELEASE` | `compile` |
|
||||
| 235 | `org.springframework.security` | `spring-security-rsa` | `1.0.3.RELEASE` | `compile` |
|
||||
| 236 | `org.webjars` | `d3js` | `3.4.11` | `compile` |
|
||||
| 237 | `org.webjars` | `jquery` | `2.1.1` | `compile` |
|
||||
| 238 | `org.xerial.snappy` | `snappy-java` | `1.1.7.3` | `compile` |
|
||||
| 239 | `org.yaml` | `snakeyaml` | `1.17` | `compile` |
|
||||
| 240 | `redis.clients` | `jedis` | `2.9.0` | `compile` |
|
||||
| 241 | `stax` | `stax-api` | `1.0.1` | `compile` |
|
||||
| 242 | `xml-apis` | `xml-apis` | `1.4.01` | `compile` |
|
||||
|
||||
---
|
||||
|
||||
## 2. 二进制方式(嵌套 JAR + pom.properties)
|
||||
|
||||
- **V1**:`lib/*.jar`。
|
||||
- **V2**:自动检测为 `lib/*.jar`(与 spring-boot-maven-plugin 1.3.x + Boot 1.5 一致时为 `lib/`)。
|
||||
|
||||
对每个嵌套 jar 读取 `META-INF/maven/**/pom.properties` 得到 `groupId:artifactId:version`;无法读取时记为 `?:?:?`(多为无 Maven 元数据的第三方包)。
|
||||
|
||||
### 2.1 仅在 V1 出现的坐标(相对 V2 二进制集合)
|
||||
|
||||
**共 41 项**。
|
||||
|
||||
| groupId:artifactId:version | V1 嵌套路径 |
|
||||
|------------------------------|-------------|
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-common:1.0-SNAPSHOT` | `lib/cw-elevator-application-common-1.0-SNAPSHOT.jar` |
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-data:1.0-SNAPSHOT` | `lib/cw-elevator-application-data-1.0-SNAPSHOT.jar` |
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-service:1.0-SNAPSHOT` | `lib/cw-elevator-application-service-1.0-SNAPSHOT.jar` |
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-web:1.0-SNAPSHOT` | `lib/cw-elevator-application-web-1.0-SNAPSHOT.jar` |
|
||||
| `org.apache.maven.wagon:wagon-provider-api:1.0-beta-2` | `lib/wagon-provider-api-1.0-beta-2.jar` |
|
||||
| `org.apache.maven:maven-artifact-manager:2.0.5` | `lib/maven-artifact-manager-2.0.5.jar` |
|
||||
| `org.apache.maven:maven-artifact:2.0.5` | `lib/maven-artifact-2.0.5.jar` |
|
||||
| `org.apache.maven:maven-model:2.0.5` | `lib/maven-model-2.0.5.jar` |
|
||||
| `org.apache.maven:maven-plugin-api:2.0.5` | `lib/maven-plugin-api-2.0.5.jar` |
|
||||
| `org.apache.maven:maven-profile:2.0.5` | `lib/maven-profile-2.0.5.jar` |
|
||||
| `org.apache.maven:maven-project:2.0.5` | `lib/maven-project-2.0.5.jar` |
|
||||
| `org.apache.maven:maven-repository-metadata:2.0.5` | `lib/maven-repository-metadata-2.0.5.jar` |
|
||||
| `org.apache.maven:maven-settings:2.0.5` | `lib/maven-settings-2.0.5.jar` |
|
||||
| `org.codehaus.plexus:plexus-container-default:1.0-alpha-9` | `lib/plexus-container-default-1.0-alpha-9.jar` |
|
||||
| `org.codehaus.plexus:plexus-utils:1.1` | `lib/plexus-utils-1.1.jar` |
|
||||
| `org.jfrog.jade.plugins.common:jade-plugin-common:1.3.8` | `lib/jade-plugin-common-1.3.8.jar` |
|
||||
| `org.jfrog.maven.annomojo:maven-plugin-anno:1.4.1` | `lib/maven-plugin-anno-1.4.1.jar` |
|
||||
| `org.reflections:reflections-maven:0.9.9-RC2` | `lib/reflections-maven-0.9.9-RC2.jar` |
|
||||
| `org.springside:springside-core:4.2.3-GA` | `lib/springside-core-4.2.3-GA.jar` |
|
||||
| `unresolved:annotations-2.0.0.jar` | `lib/annotations-2.0.0.jar` |
|
||||
| `unresolved:ant-1.6.5.jar` | `lib/ant-1.6.5.jar` |
|
||||
| `unresolved:ant-apache-bsf-1.9.4.jar` | `lib/ant-apache-bsf-1.9.4.jar` |
|
||||
| `unresolved:ant-jakarta-oro-1.6.1.jar` | `lib/ant-jakarta-oro-1.6.1.jar` |
|
||||
| `unresolved:ant-nodeps-1.8.1.jar` | `lib/ant-nodeps-1.8.1.jar` |
|
||||
| `unresolved:asm-5.0.3.jar` | `lib/asm-5.0.3.jar` |
|
||||
| `unresolved:asm-analysis-5.0.3.jar` | `lib/asm-analysis-5.0.3.jar` |
|
||||
| `unresolved:asm-tree-5.0.3.jar` | `lib/asm-tree-5.0.3.jar` |
|
||||
| `unresolved:asm-util-5.0.3.jar` | `lib/asm-util-5.0.3.jar` |
|
||||
| `unresolved:bsf-2.4.0.jar` | `lib/bsf-2.4.0.jar` |
|
||||
| `unresolved:classworlds-1.1-alpha-2.jar` | `lib/classworlds-1.1-alpha-2.jar` |
|
||||
| `unresolved:feign-core-8.18.0.jar` | `lib/feign-core-8.18.0.jar` |
|
||||
| `unresolved:feign-okhttp-8.18.0.jar` | `lib/feign-okhttp-8.18.0.jar` |
|
||||
| `unresolved:hamcrest-core-1.3.jar` | `lib/hamcrest-core-1.3.jar` |
|
||||
| `unresolved:jdom-1.1.2.jar` | `lib/jdom-1.1.2.jar` |
|
||||
| `unresolved:junit-4.12.jar` | `lib/junit-4.12.jar` |
|
||||
| `unresolved:lombok-1.16.18.jar` | `lib/lombok-1.16.18.jar` |
|
||||
| `unresolved:parboiled-core-1.1.7.jar` | `lib/parboiled-core-1.1.7.jar` |
|
||||
| `unresolved:parboiled-java-1.1.7.jar` | `lib/parboiled-java-1.1.7.jar` |
|
||||
| `unresolved:pegdown-1.6.0.jar` | `lib/pegdown-1.6.0.jar` |
|
||||
| `unresolved:xpp3-1.1.3.4-RC8.jar` | `lib/xpp3-1.1.3.4-RC8.jar` |
|
||||
| `unresolved:xstream-1.1.3.jar` | `lib/xstream-1.1.3.jar` |
|
||||
|
||||
### 2.2 仅在 V2 出现的坐标(相对 V1 二进制集合)
|
||||
|
||||
**共 14 项**。
|
||||
|
||||
| groupId:artifactId:version | V2 嵌套路径 |
|
||||
|------------------------------|-------------|
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-common:2.0-SNAPSHOT` | `lib/cw-elevator-application-common-2.0-SNAPSHOT.jar` |
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-data:2.0-SNAPSHOT` | `lib/cw-elevator-application-data-2.0-SNAPSHOT.jar` |
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-service:2.0-SNAPSHOT` | `lib/cw-elevator-application-service-2.0-SNAPSHOT.jar` |
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-web:2.0-SNAPSHOT` | `lib/cw-elevator-application-web-2.0-SNAPSHOT.jar` |
|
||||
| `com.google.code.findbugs:jsr305:3.0.2` | `lib/jsr305-3.0.2.jar` |
|
||||
| `io.github.openfeign:feign-okhttp:9.5.0` | `lib/feign-okhttp-9.5.0.jar` |
|
||||
| `javax.annotation:javax.annotation-api:1.3.2` | `lib/javax.annotation-api-1.3.2.jar` |
|
||||
| `net.bytebuddy:byte-buddy-dep:1.9.6` | `lib/byte-buddy-dep-1.9.6.jar` |
|
||||
| `org.hibernate.validator:hibernate-validator:6.0.22.Final` | `lib/hibernate-validator-6.0.22.Final.jar` |
|
||||
| `org.jctools:jctools-core:2.1.1` | `lib/jctools-core-2.1.1.jar` |
|
||||
| `unresolved:annotations-2.0.1.jar` | `lib/annotations-2.0.1.jar` |
|
||||
| `unresolved:asm-7.3.1.jar` | `lib/asm-7.3.1.jar` |
|
||||
| `unresolved:asm-commons-7.0.jar` | `lib/asm-commons-7.0.jar` |
|
||||
| `unresolved:lombok-1.16.22.jar` | `lib/lombok-1.16.22.jar` |
|
||||
|
||||
### 2.2.1 同名构件(groupId:artifactId)在 V1 与 V2 中的版本集合差异
|
||||
|
||||
由嵌套 jar 的 `pom.properties` 聚合:若同一 **GA** 在 V1、V2 中均能解析出版本,且 **version 集合不同**,则单独列出(与 §2.1 / §2.2 中分列的 `g:a:v` 键互为补充)。**不含**仅一侧出现的 GA。
|
||||
|
||||
**共 4 项**。
|
||||
|
||||
| groupId:artifactId | V1 version(s) | V2 version(s) |
|
||||
|--------------------|---------------|---------------|
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-common` | `1.0-SNAPSHOT` | `2.0-SNAPSHOT` |
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-data` | `1.0-SNAPSHOT` | `2.0-SNAPSHOT` |
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-service` | `1.0-SNAPSHOT` | `2.0-SNAPSHOT` |
|
||||
| `cn.cloudwalk.elevator:cw-elevator-application-web` | `1.0-SNAPSHOT` | `2.0-SNAPSHOT` |
|
||||
|
||||
### 2.3 两边均存在且坐标一致的依赖
|
||||
|
||||
**共 228 项**(名称版本完全一致)。
|
||||
|
||||
<details>
|
||||
<summary>展开长表</summary>
|
||||
|
||||
| groupId:artifactId:version |
|
||||
|------------------------------|
|
||||
| `ch.qos.logback:logback-classic:1.1.11` |
|
||||
| `ch.qos.logback:logback-core:1.1.11` |
|
||||
| `cn.cloudwalk.cloud:cloudwalk-common-event:3.7.2-Brussels-SRX` |
|
||||
| `cn.cloudwalk.cloud:cloudwalk-common-result:3.7.2-Brussels-SRX` |
|
||||
| `cn.cloudwalk.cloud:cloudwalk-common-serial:3.7.2-Brussels-SRX` |
|
||||
| `cn.cloudwalk.cloud:cloudwalk-common-service:3.7.2-Brussels-SRX` |
|
||||
| `cn.cloudwalk.cloud:cloudwalk-common-web:3.7.2-Brussels-SRX` |
|
||||
| `cn.cloudwalk.cloud:cloudwalk-device-manager-common:2.0.2` |
|
||||
| `cn.cloudwalk.cloud:cloudwalk-device-manager-interface:2.0.2` |
|
||||
| `cn.cloudwalk.cloud:cwos-common-aks-interface:1.0.0-SNAPSHOT` |
|
||||
| `cn.cloudwalk.cloud:cwos-component-resource-data:1.0.0-SNAPSHOT` |
|
||||
| `cn.cloudwalk.cloud:cwos-component-resource-interface:1.0.0-SNAPSHOT` |
|
||||
| `cn.cloudwalk.cloud:cwos-device-authentication-interface:1.0.0-SNAPSHOT` |
|
||||
| `cn.cloudwalk.cloud:cwos-sdk-event:1.5.0-SNAPSHOT` |
|
||||
| `cn.cloudwalk.intelligent:cloudwalk-intelligent-component-lock:1.1.1-SNAPSHOT` |
|
||||
| `cn.cloudwalk.intelligent:davinci-manager-common:1.1.7-SNAPSHOT` |
|
||||
| `cn.cloudwalk.intelligent:davinci-manager-storage:1.1.7-SNAPSHOT` |
|
||||
| `cn.cloudwalk.intelligent:intelligent-cwoscomponent-interface:2.9.2-xinghewan` |
|
||||
| `cn.cloudwalk.intelligent:intelligent-cwoscomponent-rest:2.9.2-xinghewan` |
|
||||
| `cn.cloudwalk:cloudwalk-device-sdk-protocol-entity:2.2.0` |
|
||||
| `cn.cloudwalk:cwos-java-sdk-resource:1.0.0-SNAPSHOT` |
|
||||
| `cn.cloudwalk:cwos-portal-interface:1.0.0-SNAPSHOT` |
|
||||
| `com.alibaba:fastjson:1.2.73` |
|
||||
| `com.aliyun:aliyun-java-sdk-core:3.2.8` |
|
||||
| `com.aliyun:aliyun-java-sdk-dysmsapi:1.1.0` |
|
||||
| `com.fasterxml.jackson.core:jackson-annotations:2.11.2` |
|
||||
| `com.fasterxml.jackson.core:jackson-core:2.11.2` |
|
||||
| `com.fasterxml.jackson.core:jackson-databind:2.11.2` |
|
||||
| `com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.2` |
|
||||
| `com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.2` |
|
||||
| `com.fasterxml.jackson.module:jackson-module-afterburner:2.11.2` |
|
||||
| `com.fasterxml:classmate:1.3.4` |
|
||||
| `com.github.jsqlparser:jsqlparser:1.2` |
|
||||
| `com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5` |
|
||||
| `com.github.pagehelper:pagehelper:5.1.2` |
|
||||
| `com.github.virtuald:curvesapi:1.04` |
|
||||
| `com.google.code.gson:gson:2.8.5` |
|
||||
| `com.google.guava:guava:20.0` |
|
||||
| `com.google.zxing:core:3.3.3` |
|
||||
| `com.squareup.okhttp3:okhttp:3.2.0` |
|
||||
| `com.squareup.okio:okio:1.6.0` |
|
||||
| `com.sun.jersey.contribs:jersey-apache-client4:1.19.1` |
|
||||
| `com.sun.jersey:jersey-client:1.19.1` |
|
||||
| `com.sun.jersey:jersey-core:1.19.1` |
|
||||
| `com.zaxxer:HikariCP:2.5.1` |
|
||||
| `commons-codec:commons-codec:1.10` |
|
||||
| `commons-collections:commons-collections:3.2.2` |
|
||||
| `commons-configuration:commons-configuration:1.8` |
|
||||
| `commons-fileupload:commons-fileupload:1.3.1` |
|
||||
| `commons-io:commons-io:2.5` |
|
||||
| `commons-lang:commons-lang:2.6` |
|
||||
| `commons-logging:commons-logging:1.2` |
|
||||
| `de.ruedigermoeller:fst:2.56` |
|
||||
| `io.github.openfeign.form:feign-form-spring:3.0.3` |
|
||||
| `io.github.openfeign.form:feign-form:3.0.3` |
|
||||
| `io.github.openfeign:feign-core:9.5.0` |
|
||||
| `io.github.openfeign:feign-hystrix:9.5.0` |
|
||||
| `io.github.openfeign:feign-slf4j:9.5.0` |
|
||||
| `io.netty:netty-buffer:4.1.33.Final` |
|
||||
| `io.netty:netty-codec-dns:4.1.33.Final` |
|
||||
| `io.netty:netty-codec:4.1.33.Final` |
|
||||
| `io.netty:netty-common:4.1.33.Final` |
|
||||
| `io.netty:netty-handler:4.1.33.Final` |
|
||||
| `io.netty:netty-resolver-dns:4.1.33.Final` |
|
||||
| `io.netty:netty-resolver:4.1.33.Final` |
|
||||
| `io.netty:netty-transport:4.1.33.Final` |
|
||||
| `javax.cache:cache-api:1.0.0` |
|
||||
| `javax.mail:mail:1.4.4` |
|
||||
| `javax.validation:validation-api:1.1.0.Final` |
|
||||
| `javax.ws.rs:jsr311-api:1.1.1` |
|
||||
| `joda-time:joda-time:2.9.9` |
|
||||
| `net.bytebuddy:byte-buddy:1.9.6` |
|
||||
| `net.coobird:thumbnailator:0.4.8` |
|
||||
| `net.lingala.zip4j:zip4j:2.6.2` |
|
||||
| `net.sf.ehcache:ehcache:2.10.5` |
|
||||
| `net.sf.opencsv:opencsv:2.3` |
|
||||
| `org.antlr:antlr4-runtime:4.7.2` |
|
||||
| `org.apache.commons:commons-collections4:4.1` |
|
||||
| `org.apache.commons:commons-compress:1.9` |
|
||||
| `org.apache.commons:commons-lang3:3.5` |
|
||||
| `org.apache.commons:commons-pool2:2.4.3` |
|
||||
| `org.apache.httpcomponents:httpclient:4.5.6` |
|
||||
| `org.apache.httpcomponents:httpcore:4.4.10` |
|
||||
| `org.apache.shardingsphere:encrypt-core-merge:4.0.0` |
|
||||
| `org.apache.shardingsphere:encrypt-core-rewrite:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-core-api:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-core-common:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-core-entry:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-core-execute:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-core-merge:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-core-rewrite:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-core-route:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-jdbc-core:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-jdbc-spring-boot-starter:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-spring-boot-util:4.0.0` |
|
||||
| `org.apache.shardingsphere:sharding-transaction-core:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-execute:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-merge:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-rewrite-engine:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-spi:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-sql-parser-engine:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-sql-parser-mysql:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-sql-parser-oracle:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-sql-parser-postgresql:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-sql-parser-relation:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-sql-parser-spi:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-sql-parser-sql92:4.0.0` |
|
||||
| `org.apache.shardingsphere:shardingsphere-sql-parser-sqlserver:4.0.0` |
|
||||
| `org.hdrhistogram:HdrHistogram:2.1.9` |
|
||||
| `org.hibernate:hibernate-validator:5.3.6.Final` |
|
||||
| `org.javassist:javassist:3.21.0-GA` |
|
||||
| `org.jboss.logging:jboss-logging:3.3.2.Final` |
|
||||
| `org.jsoup:jsoup:1.9.2` |
|
||||
| `org.jvnet:animal-sniffer-annotation:1.0` |
|
||||
| `org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.1` |
|
||||
| `org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1` |
|
||||
| `org.mybatis:mybatis-spring:1.3.2` |
|
||||
| `org.mybatis:mybatis:3.4.6` |
|
||||
| `org.redisson:redisson-spring-boot-starter:2.15.2` |
|
||||
| `org.redisson:redisson-spring-data-18:2.15.2` |
|
||||
| `org.redisson:redisson:2.15.2` |
|
||||
| `org.reflections:reflections:0.9.9-RC2` |
|
||||
| `org.slf4j:jcl-over-slf4j:1.7.25` |
|
||||
| `org.slf4j:jul-to-slf4j:1.7.25` |
|
||||
| `org.slf4j:log4j-over-slf4j:1.7.25` |
|
||||
| `org.slf4j:slf4j-api:1.7.25` |
|
||||
| `org.springframework.boot:spring-boot-actuator:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-autoconfigure:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter-actuator:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter-aop:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter-cache:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter-data-redis:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter-freemarker:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter-jdbc:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter-logging:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter-tomcat:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter-web:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot-starter:1.5.17.RELEASE` |
|
||||
| `org.springframework.boot:spring-boot:1.5.17.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-commons:1.3.5.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-consul-core:1.3.5.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-consul-discovery:1.3.5.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-context:1.3.5.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-netflix-core:1.4.6.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-netflix-hystrix-dashboard:1.4.6.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-starter-consul-discovery:1.3.5.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-starter-consul:1.3.5.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-starter-netflix-archaius:1.4.6.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-starter-netflix-hystrix-dashboard:1.4.6.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-starter-netflix-hystrix:1.4.6.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-starter-netflix-ribbon:1.4.6.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-starter-openfeign:1.4.6.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-starter-ribbon:1.4.6.RELEASE` |
|
||||
| `org.springframework.cloud:spring-cloud-starter:1.3.5.RELEASE` |
|
||||
| `org.springframework.data:spring-data-commons:1.13.16.RELEASE` |
|
||||
| `org.springframework.data:spring-data-keyvalue:1.2.16.RELEASE` |
|
||||
| `org.springframework.data:spring-data-redis:1.8.16.RELEASE` |
|
||||
| `org.springframework.security:spring-security-rsa:1.0.3.BUILD-SNAPSHOT` |
|
||||
| `org.webjars:d3js:3.4.11` |
|
||||
| `org.webjars:jquery:2.1.1` |
|
||||
| `org.yaml:snakeyaml:1.17` |
|
||||
| `redis.clients:jedis:2.9.0` |
|
||||
| `unresolved:activation-1.1.jar` |
|
||||
| `unresolved:ant-1.9.6.jar` |
|
||||
| `unresolved:ant-launcher-1.9.6.jar` |
|
||||
| `unresolved:archaius-core-0.6.6.jar` |
|
||||
| `unresolved:aspectjweaver-1.8.13.jar` |
|
||||
| `unresolved:bcpkix-jdk15on-1.55.jar` |
|
||||
| `unresolved:bcprov-jdk15on-1.55.jar` |
|
||||
| `unresolved:consul-api-1.3.0.jar` |
|
||||
| `unresolved:dom4j-1.6.1.jar` |
|
||||
| `unresolved:freemarker-2.3.28.jar` |
|
||||
| `unresolved:groovy-2.4.5-indy.jar` |
|
||||
| `unresolved:hystrix-core-1.5.12.jar` |
|
||||
| `unresolved:hystrix-javanica-1.5.12.jar` |
|
||||
| `unresolved:hystrix-metrics-event-stream-1.5.12.jar` |
|
||||
| `unresolved:hystrix-serialization-1.5.12.jar` |
|
||||
| `unresolved:javax.inject-1.jar` |
|
||||
| `unresolved:jodd-bean-3.7.1.jar` |
|
||||
| `unresolved:jodd-core-3.7.1.jar` |
|
||||
| `unresolved:kafka-clients-2.3.0.jar` |
|
||||
| `unresolved:lz4-java-1.6.0.jar` |
|
||||
| `unresolved:mysql-connector-java-5.1.47.jar` |
|
||||
| `unresolved:netflix-commons-util-0.1.1.jar` |
|
||||
| `unresolved:netflix-statistics-0.1.1.jar` |
|
||||
| `unresolved:objenesis-2.1.jar` |
|
||||
| `unresolved:poi-3.15.jar` |
|
||||
| `unresolved:poi-ooxml-3.15.jar` |
|
||||
| `unresolved:poi-ooxml-schemas-3.15.jar` |
|
||||
| `unresolved:reactive-streams-1.0.2.jar` |
|
||||
| `unresolved:reactor-core-2.0.8.RELEASE.jar` |
|
||||
| `unresolved:reactor-stream-2.0.8.RELEASE.jar` |
|
||||
| `unresolved:ribbon-2.2.5.jar` |
|
||||
| `unresolved:ribbon-core-2.2.5.jar` |
|
||||
| `unresolved:ribbon-httpclient-2.2.5.jar` |
|
||||
| `unresolved:ribbon-loadbalancer-2.2.5.jar` |
|
||||
| `unresolved:ribbon-transport-2.2.5.jar` |
|
||||
| `unresolved:rxjava-1.2.0.jar` |
|
||||
| `unresolved:rxjava-2.1.13.jar` |
|
||||
| `unresolved:rxnetty-0.4.9.jar` |
|
||||
| `unresolved:rxnetty-contexts-0.4.9.jar` |
|
||||
| `unresolved:rxnetty-servo-0.4.9.jar` |
|
||||
| `unresolved:servo-core-0.10.1.jar` |
|
||||
| `unresolved:servo-internal-0.10.1.jar` |
|
||||
| `unresolved:snappy-java-1.1.7.3.jar` |
|
||||
| `unresolved:spring-aop-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-aspects-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-beans-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-context-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-context-support-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-core-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-expression-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-jdbc-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-oxm-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-security-crypto-4.2.9.RELEASE.jar` |
|
||||
| `unresolved:spring-tx-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-web-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-webmvc-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:stax-api-1.0.1.jar` |
|
||||
| `unresolved:tomcat-annotations-api-8.5.34.jar` |
|
||||
| `unresolved:tomcat-embed-core-8.5.34.jar` |
|
||||
| `unresolved:tomcat-embed-el-8.5.34.jar` |
|
||||
| `unresolved:tomcat-embed-websocket-8.5.34.jar` |
|
||||
| `unresolved:tomcat-jdbc-8.5.34.jar` |
|
||||
| `unresolved:tomcat-juli-8.5.34.jar` |
|
||||
| `unresolved:xml-apis-1.4.01.jar` |
|
||||
| `unresolved:xmlbeans-2.6.0.jar` |
|
||||
| `unresolved:zstd-jni-1.4.0-1.jar` |
|
||||
|
||||
</details>
|
||||
|
||||
### 2.4 V2 二进制坐标 vs Maven dependency:list
|
||||
|
||||
- **版本字符串不一致**:例如 reactor 在 `dependency:list` 中为 **`2.0-SNAPSHOT`**,而 fat-jar 内嵌模块 **`cw-elevator-application-*-2.0.6.jar`** 的 `pom.properties` 为 **`2.0.6`**,字符串比对会视为「仅一侧存在」,属**同名构件不同表述**,非缺失依赖。
|
||||
- **在 dependency:list 中但不在嵌套 jar 元数据中的**:多为 **仅存在于解析树、与本模块 jar 文件命名不一致**,需对照 §1 表格。
|
||||
- **未解析 `unresolved:*`**:见 §3,此类条目不参与坐标相等判断。
|
||||
|
||||
- **仅在 Maven list(runtime)**:71 项
|
||||
|
||||
|坐标|
|
||||
|----|
|
||||
| `com.ecwid.consul:consul-api:1.3.0` |
|
||||
| `com.github.luben:zstd-jni:1.4.0-1` |
|
||||
| `com.google.code.findbugs:annotations:2.0.1` |
|
||||
| `com.netflix.archaius:archaius-core:0.6.6` |
|
||||
| `com.netflix.hystrix:hystrix-core:1.5.12` |
|
||||
| `com.netflix.hystrix:hystrix-javanica:1.5.12` |
|
||||
| `com.netflix.hystrix:hystrix-metrics-event-stream:1.5.12` |
|
||||
| `com.netflix.hystrix:hystrix-serialization:1.5.12` |
|
||||
| `com.netflix.netflix-commons:netflix-commons-util:0.1.1` |
|
||||
| `com.netflix.netflix-commons:netflix-statistics:0.1.1` |
|
||||
| `com.netflix.ribbon:ribbon-core:2.2.5` |
|
||||
| `com.netflix.ribbon:ribbon-httpclient:2.2.5` |
|
||||
| `com.netflix.ribbon:ribbon-loadbalancer:2.2.5` |
|
||||
| `com.netflix.ribbon:ribbon-transport:2.2.5` |
|
||||
| `com.netflix.ribbon:ribbon:2.2.5` |
|
||||
| `com.netflix.servo:servo-core:0.10.1` |
|
||||
| `com.netflix.servo:servo-internal:0.10.1` |
|
||||
| `dom4j:dom4j:1.6.1` |
|
||||
| `io.projectreactor:reactor-core:2.0.8.RELEASE` |
|
||||
| `io.projectreactor:reactor-stream:2.0.8.RELEASE` |
|
||||
| `io.reactivex.rxjava2:rxjava:2.1.13` |
|
||||
| `io.reactivex:rxjava:1.2.0` |
|
||||
| `io.reactivex:rxnetty-contexts:0.4.9` |
|
||||
| `io.reactivex:rxnetty-servo:0.4.9` |
|
||||
| `io.reactivex:rxnetty:0.4.9` |
|
||||
| `javax.activation:activation:1.1` |
|
||||
| `javax.inject:javax.inject:1` |
|
||||
| `mysql:mysql-connector-java:5.1.47` |
|
||||
| `org.apache.ant:ant-launcher:1.9.6` |
|
||||
| `org.apache.ant:ant:1.9.6` |
|
||||
| `org.apache.kafka:kafka-clients:2.3.0` |
|
||||
| `org.apache.poi:poi-ooxml-schemas:3.15` |
|
||||
| `org.apache.poi:poi-ooxml:3.15` |
|
||||
| `org.apache.poi:poi:3.15` |
|
||||
| `org.apache.tomcat.embed:tomcat-embed-core:8.5.34` |
|
||||
| `org.apache.tomcat.embed:tomcat-embed-el:8.5.34` |
|
||||
| `org.apache.tomcat.embed:tomcat-embed-websocket:8.5.34` |
|
||||
| `org.apache.tomcat:tomcat-annotations-api:8.5.34` |
|
||||
| `org.apache.tomcat:tomcat-jdbc:8.5.34` |
|
||||
| `org.apache.tomcat:tomcat-juli:8.5.34` |
|
||||
| `org.apache.xmlbeans:xmlbeans:2.6.0` |
|
||||
| `org.aspectj:aspectjweaver:1.8.13` |
|
||||
| `org.bouncycastle:bcpkix-jdk15on:1.55` |
|
||||
| `org.bouncycastle:bcprov-jdk15on:1.55` |
|
||||
| `org.codehaus.groovy:groovy:indy` |
|
||||
| `org.freemarker:freemarker:2.3.28` |
|
||||
| `org.jodd:jodd-bean:3.7.1` |
|
||||
| `org.jodd:jodd-core:3.7.1` |
|
||||
| `org.lz4:lz4-java:1.6.0` |
|
||||
| `org.objenesis:objenesis:2.1` |
|
||||
| `org.ow2.asm:asm-commons:7.0` |
|
||||
| `org.ow2.asm:asm:7.3.1` |
|
||||
| `org.projectlombok:lombok:1.16.22` |
|
||||
| `org.reactivestreams:reactive-streams:1.0.2` |
|
||||
| `org.springframework.security:spring-security-crypto:4.2.9.RELEASE` |
|
||||
| `org.springframework.security:spring-security-rsa:1.0.3.RELEASE` |
|
||||
| `org.springframework:spring-aop:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-aspects:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-beans:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-context-support:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-context:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-core:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-expression:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-jdbc:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-oxm:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-tx:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-web:4.3.29.RELEASE` |
|
||||
| `org.springframework:spring-webmvc:4.3.29.RELEASE` |
|
||||
| `org.xerial.snappy:snappy-java:1.1.7.3` |
|
||||
| `stax:stax-api:1.0.1` |
|
||||
| `xml-apis:xml-apis:1.4.01` |
|
||||
|
||||
- **仅在二进制坐标集合**:71 项
|
||||
|
||||
|坐标|
|
||||
|----|
|
||||
| `org.springframework.security:spring-security-rsa:1.0.3.BUILD-SNAPSHOT` |
|
||||
| `unresolved:activation-1.1.jar` |
|
||||
| `unresolved:annotations-2.0.1.jar` |
|
||||
| `unresolved:ant-1.9.6.jar` |
|
||||
| `unresolved:ant-launcher-1.9.6.jar` |
|
||||
| `unresolved:archaius-core-0.6.6.jar` |
|
||||
| `unresolved:asm-7.3.1.jar` |
|
||||
| `unresolved:asm-commons-7.0.jar` |
|
||||
| `unresolved:aspectjweaver-1.8.13.jar` |
|
||||
| `unresolved:bcpkix-jdk15on-1.55.jar` |
|
||||
| `unresolved:bcprov-jdk15on-1.55.jar` |
|
||||
| `unresolved:consul-api-1.3.0.jar` |
|
||||
| `unresolved:dom4j-1.6.1.jar` |
|
||||
| `unresolved:freemarker-2.3.28.jar` |
|
||||
| `unresolved:groovy-2.4.5-indy.jar` |
|
||||
| `unresolved:hystrix-core-1.5.12.jar` |
|
||||
| `unresolved:hystrix-javanica-1.5.12.jar` |
|
||||
| `unresolved:hystrix-metrics-event-stream-1.5.12.jar` |
|
||||
| `unresolved:hystrix-serialization-1.5.12.jar` |
|
||||
| `unresolved:javax.inject-1.jar` |
|
||||
| `unresolved:jodd-bean-3.7.1.jar` |
|
||||
| `unresolved:jodd-core-3.7.1.jar` |
|
||||
| `unresolved:kafka-clients-2.3.0.jar` |
|
||||
| `unresolved:lombok-1.16.22.jar` |
|
||||
| `unresolved:lz4-java-1.6.0.jar` |
|
||||
| `unresolved:mysql-connector-java-5.1.47.jar` |
|
||||
| `unresolved:netflix-commons-util-0.1.1.jar` |
|
||||
| `unresolved:netflix-statistics-0.1.1.jar` |
|
||||
| `unresolved:objenesis-2.1.jar` |
|
||||
| `unresolved:poi-3.15.jar` |
|
||||
| `unresolved:poi-ooxml-3.15.jar` |
|
||||
| `unresolved:poi-ooxml-schemas-3.15.jar` |
|
||||
| `unresolved:reactive-streams-1.0.2.jar` |
|
||||
| `unresolved:reactor-core-2.0.8.RELEASE.jar` |
|
||||
| `unresolved:reactor-stream-2.0.8.RELEASE.jar` |
|
||||
| `unresolved:ribbon-2.2.5.jar` |
|
||||
| `unresolved:ribbon-core-2.2.5.jar` |
|
||||
| `unresolved:ribbon-httpclient-2.2.5.jar` |
|
||||
| `unresolved:ribbon-loadbalancer-2.2.5.jar` |
|
||||
| `unresolved:ribbon-transport-2.2.5.jar` |
|
||||
| `unresolved:rxjava-1.2.0.jar` |
|
||||
| `unresolved:rxjava-2.1.13.jar` |
|
||||
| `unresolved:rxnetty-0.4.9.jar` |
|
||||
| `unresolved:rxnetty-contexts-0.4.9.jar` |
|
||||
| `unresolved:rxnetty-servo-0.4.9.jar` |
|
||||
| `unresolved:servo-core-0.10.1.jar` |
|
||||
| `unresolved:servo-internal-0.10.1.jar` |
|
||||
| `unresolved:snappy-java-1.1.7.3.jar` |
|
||||
| `unresolved:spring-aop-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-aspects-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-beans-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-context-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-context-support-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-core-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-expression-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-jdbc-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-oxm-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-security-crypto-4.2.9.RELEASE.jar` |
|
||||
| `unresolved:spring-tx-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-web-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:spring-webmvc-4.3.29.RELEASE.jar` |
|
||||
| `unresolved:stax-api-1.0.1.jar` |
|
||||
| `unresolved:tomcat-annotations-api-8.5.34.jar` |
|
||||
| `unresolved:tomcat-embed-core-8.5.34.jar` |
|
||||
| `unresolved:tomcat-embed-el-8.5.34.jar` |
|
||||
| `unresolved:tomcat-embed-websocket-8.5.34.jar` |
|
||||
| `unresolved:tomcat-jdbc-8.5.34.jar` |
|
||||
| `unresolved:tomcat-juli-8.5.34.jar` |
|
||||
| `unresolved:xml-apis-1.4.01.jar` |
|
||||
| `unresolved:xmlbeans-2.6.0.jar` |
|
||||
| `unresolved:zstd-jni-1.4.0-1.jar` |
|
||||
|
||||
---
|
||||
|
||||
## 3. 无法解析 pom.properties 的嵌套 JAR(仅列文件名)
|
||||
|
||||
- **V1** 未解析条目:**88**
|
||||
- `activation-1.1.jar`
|
||||
- `annotations-2.0.0.jar`
|
||||
- `ant-1.6.5.jar`
|
||||
- `ant-1.9.6.jar`
|
||||
- `ant-apache-bsf-1.9.4.jar`
|
||||
- `ant-jakarta-oro-1.6.1.jar`
|
||||
- `ant-launcher-1.9.6.jar`
|
||||
- `ant-nodeps-1.8.1.jar`
|
||||
- `archaius-core-0.6.6.jar`
|
||||
- `asm-5.0.3.jar`
|
||||
- `asm-analysis-5.0.3.jar`
|
||||
- `asm-tree-5.0.3.jar`
|
||||
- `asm-util-5.0.3.jar`
|
||||
- `aspectjweaver-1.8.13.jar`
|
||||
- `bcpkix-jdk15on-1.55.jar`
|
||||
- `bcprov-jdk15on-1.55.jar`
|
||||
- `bsf-2.4.0.jar`
|
||||
- `classworlds-1.1-alpha-2.jar`
|
||||
- `consul-api-1.3.0.jar`
|
||||
- `dom4j-1.6.1.jar`
|
||||
- `feign-core-8.18.0.jar`
|
||||
- `feign-okhttp-8.18.0.jar`
|
||||
- `freemarker-2.3.28.jar`
|
||||
- `groovy-2.4.5-indy.jar`
|
||||
- `hamcrest-core-1.3.jar`
|
||||
- `hystrix-core-1.5.12.jar`
|
||||
- `hystrix-javanica-1.5.12.jar`
|
||||
- `hystrix-metrics-event-stream-1.5.12.jar`
|
||||
- `hystrix-serialization-1.5.12.jar`
|
||||
- `javax.inject-1.jar`
|
||||
- `jdom-1.1.2.jar`
|
||||
- `jodd-bean-3.7.1.jar`
|
||||
- `jodd-core-3.7.1.jar`
|
||||
- `junit-4.12.jar`
|
||||
- `kafka-clients-2.3.0.jar`
|
||||
- `lombok-1.16.18.jar`
|
||||
- `lz4-java-1.6.0.jar`
|
||||
- `mysql-connector-java-5.1.47.jar`
|
||||
- `netflix-commons-util-0.1.1.jar`
|
||||
- `netflix-statistics-0.1.1.jar`
|
||||
- `objenesis-2.1.jar`
|
||||
- `parboiled-core-1.1.7.jar`
|
||||
- `parboiled-java-1.1.7.jar`
|
||||
- `pegdown-1.6.0.jar`
|
||||
- `poi-3.15.jar`
|
||||
- `poi-ooxml-3.15.jar`
|
||||
- `poi-ooxml-schemas-3.15.jar`
|
||||
- `reactive-streams-1.0.2.jar`
|
||||
- `reactor-core-2.0.8.RELEASE.jar`
|
||||
- `reactor-stream-2.0.8.RELEASE.jar`
|
||||
- … 省略 38 条
|
||||
- **V2** 未解析条目:**70**
|
||||
- `activation-1.1.jar`
|
||||
- `annotations-2.0.1.jar`
|
||||
- `ant-1.9.6.jar`
|
||||
- `ant-launcher-1.9.6.jar`
|
||||
- `archaius-core-0.6.6.jar`
|
||||
- `asm-7.3.1.jar`
|
||||
- `asm-commons-7.0.jar`
|
||||
- `aspectjweaver-1.8.13.jar`
|
||||
- `bcpkix-jdk15on-1.55.jar`
|
||||
- `bcprov-jdk15on-1.55.jar`
|
||||
- `consul-api-1.3.0.jar`
|
||||
- `dom4j-1.6.1.jar`
|
||||
- `freemarker-2.3.28.jar`
|
||||
- `groovy-2.4.5-indy.jar`
|
||||
- `hystrix-core-1.5.12.jar`
|
||||
- `hystrix-javanica-1.5.12.jar`
|
||||
- `hystrix-metrics-event-stream-1.5.12.jar`
|
||||
- `hystrix-serialization-1.5.12.jar`
|
||||
- `javax.inject-1.jar`
|
||||
- `jodd-bean-3.7.1.jar`
|
||||
- `jodd-core-3.7.1.jar`
|
||||
- `kafka-clients-2.3.0.jar`
|
||||
- `lombok-1.16.22.jar`
|
||||
- `lz4-java-1.6.0.jar`
|
||||
- `mysql-connector-java-5.1.47.jar`
|
||||
- `netflix-commons-util-0.1.1.jar`
|
||||
- `netflix-statistics-0.1.1.jar`
|
||||
- `objenesis-2.1.jar`
|
||||
- `poi-3.15.jar`
|
||||
- `poi-ooxml-3.15.jar`
|
||||
- `poi-ooxml-schemas-3.15.jar`
|
||||
- `reactive-streams-1.0.2.jar`
|
||||
- `reactor-core-2.0.8.RELEASE.jar`
|
||||
- `reactor-stream-2.0.8.RELEASE.jar`
|
||||
- `ribbon-2.2.5.jar`
|
||||
- `ribbon-core-2.2.5.jar`
|
||||
- `ribbon-httpclient-2.2.5.jar`
|
||||
- `ribbon-loadbalancer-2.2.5.jar`
|
||||
- `ribbon-transport-2.2.5.jar`
|
||||
- `rxjava-1.2.0.jar`
|
||||
- `rxjava-2.1.13.jar`
|
||||
- `rxnetty-0.4.9.jar`
|
||||
- `rxnetty-contexts-0.4.9.jar`
|
||||
- `rxnetty-servo-0.4.9.jar`
|
||||
- `servo-core-0.10.1.jar`
|
||||
- `servo-internal-0.10.1.jar`
|
||||
- `snappy-java-1.1.7.3.jar`
|
||||
- `spring-aop-4.3.29.RELEASE.jar`
|
||||
- `spring-aspects-4.3.29.RELEASE.jar`
|
||||
- `spring-beans-4.3.29.RELEASE.jar`
|
||||
- … 省略 20 条
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
# 电梯生产证据包差异分析(2026-04-30)
|
||||
|
||||
**证据根目录**(仓库内):[`maven-cw-elevator-application/logs/evidence/`](../../maven-cw-elevator-application/logs/evidence/)
|
||||
|
||||
本文基于 `collect_elevator_runtime_evidence.sh` 现场采集产出的三份时间戳目录,对**制品真实版本**、**本地配置**、**Consul 健康实例**、**日志关键行**与 **jcmd** 作对比。与历史排查主线的关系见 [`elevator-service-instance-missing-investigation.md`](elevator-service-instance-missing-investigation.md)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 三份目录与「版本指纹」
|
||||
|
||||
| 目录 | 采集时间(`collected-at.txt`) | `jar-path.txt` 展示名 | `jar.sha256.txt` | `jar-tf.txt` 内模块版本(lib) | 说明 |
|
||||
|------|-------------------------------|------------------------|------------------|--------------------------------|------|
|
||||
| `elevator-evidence-20260430-112820` | 2026-04-30T11:28:20+0800 | `.../cw-elevator-application-V1.0.0.20211103.jar` | `8da5978a7b34...90544908` | **无**(当次未成功生成 `jar-tf`) | 与 113912 **同一 JAR 字节**(见 sha256) |
|
||||
| `elevator-evidence-20260430-113912` | 2026-04-30T11:39:12+0800 | 同上 | **同上** | 含 `cw-elevator-application-*-**2.0.7**.jar` | 可确认 fat-jar 内为 **Maven 2.0.7 发布结构** |
|
||||
| `elevator-evidence-20260430-114350` | 2026-04-30T11:43:50+0800 | 同上 | `c087067de3f6...8942054`(**不同**) | 含 `cw-elevator-application-*-**1.0-SNAPSHOT**.jar` | **第三套制品**:与 113912 非同一文件;内嵌为 **SNAPSHOT 构件** |
|
||||
|
||||
**核心结论(勿仅看文件路径名)**:
|
||||
|
||||
- 三份 `jar-path.txt` 的**文件名**均为历史目录 `cw-elevator-application-V1.0.0.20211103.jar`,但 **112820/113912 与 114350 的 sha256 不同**,说明现场曾**替换过**该路径上的 JAR 或 114350 采自**另一时刻/已换包**。
|
||||
- **112820 与 113912** 的 sha256 **一致**,不是「V1 代码 vs V2 代码」的两套包,而是**同一物理 JAR 的两次采集**;区别仅在于 113912 多出了 `jar-tf.txt` / `java-version.txt` 等,用于认定模块版本为 **2.0.7**。
|
||||
- **114350** 代表另一制品:**内嵌 1.0-SNAPSHOT**,不得与「正式发布 2.0.7」混为一谈。
|
||||
|
||||
**JDK**:113912、114350 的 `java-version.txt` 均为 **OpenJDK 1.8.0_41**(路径脚本写死 `/data/cwos/java`)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 主轴对比:112820 ↔ 113912(同一 JAR、两轮采集)
|
||||
|
||||
| 维度 | 112820 | 113912 | 结论 |
|
||||
|------|--------|--------|------|
|
||||
| 磁盘 `application.properties` | 内容一致 | 一致 | `diff` **无差异** |
|
||||
| 磁盘 `bootstrap.properties` | 一致 | 一致 | **无差异** |
|
||||
| `proc-cmdline.txt` | `java -jar ... cw-elevator-application-V1.0.0.20211103.jar`(含 JDWP) | **相同** | **无差异** |
|
||||
| Consul `/v1/health/service/...?passing=true` | 各服务 **passing 数组长度均为 3** | **相同** | **无差异** |
|
||||
| `elevator-app.log.keylines.txt` | 与 113912 同一时期的日志摘录 | 内容一致(同一日志切片) | **无实质环境差异** |
|
||||
|
||||
**小结**:此轴不宜表述为「V1 与 V2 运行态对比」,应表述为 **同一 2.0.7 制品(sha256 一致)在短时间内的两次证据归档**,第二次补充了 `jar tf` 与 JDK 版本文件。
|
||||
|
||||
---
|
||||
|
||||
## 3. 主轴对比:113912 ↔ 114350(两套不同 JAR)
|
||||
|
||||
| 维度 | 113912 | 114350 | 结论 |
|
||||
|------|--------|--------|------|
|
||||
| `jar.sha256.txt` | `8da5978a...` | `c087067d...` | **不同文件** |
|
||||
| fat-jar 内 `lib/cw-elevator-application-*.jar` | `*-2.0.7.jar` | `*-1.0-SNAPSHOT.jar` | **版本线不同** |
|
||||
| 解压 `jar-application.properties.txt`(BOOT-INF 内嵌默认) | `logging.level.*=debug`,`logging.path=/data/cwos/cw-elevator-application-V1.0.0.20211103/logs` | `logging.level.*=info`,`logging.path=logs` | **打包内嵌默认配置不同**(与磁盘目录 `application.properties` 可能再叠加覆盖) |
|
||||
| 磁盘 `application.properties`(采集快照) | 需与 114350 目录单独比对 | | 以各目录下同名文件为准 |
|
||||
|
||||
**部署含义**:
|
||||
|
||||
- **114350** 更符合「本地 Maven reactor **SNAPSHOT** 打出 fat-jar」的内嵌特征(`1.0-SNAPSHOT` + 内嵌 properties 为相对 `logs`)。
|
||||
- **113912** 更符合「**发布流程 2.0.7**」打入的内嵌与 lib 版本。
|
||||
|
||||
若现场长期沿用目录名 `cw-elevator-application-V1.0.0.20211103` 仅替换 JAR,会出现「路径像 V1、内容实为 2.0.7 或 SNAPSHOT」——**必须以 sha256 + `jar tf` 为准**。
|
||||
|
||||
---
|
||||
|
||||
## 4. jcmd
|
||||
|
||||
三份目录的 `jcmd-system-properties.txt` 均为 **Attach 失败**(`AttachNotSupportedException: Unable to open socket file`),无法对比进程内最终 system properties。后续现场需满足 JVM attach 条件后再采一次(或使用启动参数导出),否则 Ribbon/Feign 运行态只能依赖日志与磁盘配置。
|
||||
|
||||
---
|
||||
|
||||
## 5. 日志与 Ribbon 行为(三份 keylines 共性)
|
||||
|
||||
在 **112820 / 113912** 的 `elevator-app.log.keylines.txt` 中可见一致现象(与 [`elevator-service-instance-missing-investigation.md`](elevator-service-instance-missing-investigation.md) 一致):
|
||||
|
||||
- **Consul 注册**:`elevator-app` 成功注册(带 HTTP health)。
|
||||
- **配置探针**:磁盘 `./bootstrap.properties` 中 `spring.cloud.consul.discovery.enabled=true`,classpath 内嵌为 **false**(多源并存)。
|
||||
- **`ninca-crk-std`**:`DynamicServerListLoadBalancer` 使用 **`ConfigurationBasedServerList`**,但 **current list of Servers=[]**,随后出现 **`Load balancer does not have available server for client: ninca-crk-std`**。
|
||||
- **其他客户端**(如 `cwos-portal`、`ninca-common`)日志中可见 Consul 解析出的 **3 台**实例。
|
||||
|
||||
**差异排查方向**(非本次证据目录两两 diff,而是现象归因):重点核对 **`ninca-crk-std` 的 Ribbon 静态列表 / `NincaCrkStdRibbonConfiguration` 生效路径**与 Consul 列表是否交替覆盖,详见上述 investigation 文档。
|
||||
|
||||
**114350** 的 `elevator-app.log.keylines.txt` 与 113912 **文件不完全相同**(`diff` 有差异),如需逐行对比可在本地对两份 keylines 执行 `diff -u`。
|
||||
|
||||
---
|
||||
|
||||
## 6. `logs/evidence/elevator-app.log` 全量日志专项排查
|
||||
|
||||
**逐项走查(客户端名 / 时序 / Consul vs ConfigurationBased / bootstrap)**:见 [`consul-ribbon-no-server-walkthrough.md`](consul-ribbon-no-server-walkthrough.md)。
|
||||
|
||||
针对 [`maven-cw-elevator-application/logs/evidence/elevator-app.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app.log) 进行额外统计与时间线复盘:
|
||||
|
||||
### 6.1 关键信号统计
|
||||
|
||||
- `Load balancer does not have available server for client: ninca-crk-std`:**290** 次
|
||||
- `ConfigurationBasedServerList`:**1** 次
|
||||
- `ConsulServerList`:**7** 次
|
||||
- 探针启动信号(`CONFIG SOURCE PROBE START` / `RIBBON...PROBE` / `CONSUL...PROBE` / `ELEVATOR DIAGNOSTIC PROBES`):仅 **2** 条(其中可见的为 `CONFIG SOURCE PROBE START`)
|
||||
|
||||
### 6.2 时间线(同一日志内存在两次启动)
|
||||
|
||||
1. **第一次启动窗口(11:16)**
|
||||
- `11:16:24` Tomcat 启动、Consul 注册;
|
||||
- `11:16:24` ConfigSourceProbeRunner 打印:`ninca-crk-std.ribbon.listOfServers value=null`,`ninca-crk-std.ip=10.0.22.102:16106`;
|
||||
- `11:16:34` `ninca-crk-std` 初始化为 `ConfigurationBasedServerList`,但 `current list of Servers=[]`;
|
||||
- 随后大量出现 `Load balancer does not have available server for client: ninca-crk-std`。
|
||||
|
||||
2. **第二次启动窗口(11:43)**
|
||||
- `11:43:24` 再次出现 Tomcat 启动与 Consul 注册(说明同一日志内发生过重启);
|
||||
- `11:43:35` `ninca-crk-std` 初始化时已是 `current list of Servers=[...:16106 x3]`;
|
||||
- 第二次窗口未见与第一次同规模的“空列表 + 连续 no available server”模式。
|
||||
|
||||
### 6.3 结合证据包的解释
|
||||
|
||||
- `112820` / `113912` 与第一次窗口行为一致,暴露出 `ninca-crk-std` 在该时段未拿到可用服务列表;
|
||||
- `114350` 对应另一制品(`1.0-SNAPSHOT`)后,日志中出现 `ninca-crk-std` 能初始化出 3 台服务的信号;
|
||||
- 因三份 Consul 健康快照均显示 `ninca-crk-std` passing=3,可初步排除「Consul 没有实例」这一外因,更可能是客户端侧配置/初始化时序/构件差异导致。
|
||||
|
||||
---
|
||||
|
||||
## 7. Consul 健康快照
|
||||
|
||||
三份目录中下列服务的 **passing 实例数(JSON 数组长度)一致**:均为 **3**(`elevator-app`、`cwos-portal`、`ninca-common`、`ninca-common-component-organization`、`ninca-crk-std`、`cloudwalk-device-thirdparty`)。
|
||||
说明:**本次采集窗口内** Consul 侧上游实例数量**未**成为三份包之间的差异变量;与 JVM 内 Ribbon 列表为空等问题需从 **客户端配置与负载均衡初始化顺序** 侧继续查。
|
||||
|
||||
---
|
||||
|
||||
## 8. 建议的后续动作
|
||||
|
||||
1. **命名归档**:在证据目录或工单中显式标注 **JAR sha256** 与 **`jar tf` 中 `cw-elevator-application-*` 版本**,避免「V1 目录名」误导。
|
||||
2. **修复 jcmd 采集**:解决 attach 权限 / JVM 参数后重采,补齐 **进程内** `ribbon.*` / `feign.*`。
|
||||
3. **`ninca-crk-std`**:按 investigation 文档与 **下节第 1 条** 优先验证 `ribbon.listOfServers` 与 `ninca-crk-std.ip` 的关系。
|
||||
|
||||
---
|
||||
|
||||
## 9. 综合证据 + 日志 + 多进程后的「下一步方向」
|
||||
|
||||
### 9.1 已对齐的事实(减少走弯路)
|
||||
|
||||
| 来源 | 结论 |
|
||||
|------|------|
|
||||
| 三份 `consul-health-*.json` | 各上游(含 `ninca-crk-std`)**passing 均为 3** |
|
||||
| `ps-ef.txt`(随证据采集) | 各业务为**独立 Java 进程**;`ninca-crk-std` 在目标环境以**单独进程**形式存在(与电梯进程不同) |
|
||||
| `proc-cmdline.txt` | 电梯进程为 `java -jar`,工作目录下 **`cw-elevator-application-V1.0.0.20211103.jar`**(文件名可与真实字节不一致,须看 sha256) |
|
||||
| `elevator-app.log` | **同一日志两次启动**:首次 **11:16** `ninca-crk-std` 负载均衡 **Servers=[]**;重启后 **11:43** 同客户端出现 **3 台 :16106**,说明问题偏 **客户端 Ribbon 配置/初始化时序**,而非「现场没有 `ninca-crk-std` 进程」 |
|
||||
|
||||
### 9.2 优先验证:Ribbon 静态列表键 ≠ 业务 `ninca-crk-std.ip`
|
||||
|
||||
证据包内 **`application.properties`**(及仓库 [`deploy/v2-maven/application.properties`](../../maven-cw-elevator-application/deploy/v2-maven/application.properties))仅有:
|
||||
|
||||
- `ninca-crk-std.ip=10.0.22.102:16106`(供业务代码等使用)
|
||||
|
||||
而探针行显示:
|
||||
|
||||
- `ninca-crk-std.ribbon.listOfServers value=null`
|
||||
|
||||
电梯侧对 `ninca-crk-std` 使用 [`NincaCrkStdRibbonConfiguration`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java),其 `ConfigurationBasedServerList` **从 Ribbon 标准配置**(如 `ninca-crk-std.ribbon.listOfServers`)取服务器列表;**与 `ninca-crk-std.ip` 无自动绑定**(`ninca-crk-std.ip` 在业务类中如 `AcsElevatorRecordServiceImpl` 以 `@Value` 使用)。
|
||||
|
||||
对照 [`deploy/v1-legacy/application.properties`](../../maven-cw-elevator-application/deploy/v1-legacy/application.properties) 中显式:
|
||||
|
||||
- `ninca-crk-std.ribbon.NIWSServerListClassName=...`
|
||||
- `ninca-crk-std.ribbon.listOfServers=...`
|
||||
|
||||
**建议下一步(配置侧,变更须评审与灰度)**:
|
||||
|
||||
1. 在**现场**与 **v2 部署模板**中显式增加与现场一致的 **`ninca-crk-std.ribbon.listOfServers`**(可填与日志中负载均衡最终一致的 **三台主机:16106**,或与 Consul 解析一致的主机名列表),使 **首次启动**即不为空;并与 `ninca-crk-std.ip` 的业务语义对齐(同一可达入口集合)。
|
||||
2. 重启后对照日志:首次出现 `DynamicServerListLoadBalancer for client ninca-crk-std initialized` 时 **`current list of Servers`** 是否直接非空。
|
||||
|
||||
### 9.3 观测与采集强化(不改业务契约前提下)
|
||||
|
||||
1. **对照 Ribbon / Consul 探针**(当前代码库默认**始终**运行;延迟见 `ElevatorProbeConstants`):在 `*-probe.log` 中查 **ribbonProbe instance**、**consulProbe instance** 行,与 JVM 及 Consul API 对照(见 [`scripts/collect_elevator_runtime_evidence.sh`](../../scripts/collect_elevator_runtime_evidence.sh))。
|
||||
2. **修复 jcmd Attach**:解决 `jcmd-system-properties.txt` 中的 `AttachNotSupportedException` 后重采,便于核对 **进程内最终** `ribbon.*` / `feign.*`(与磁盘 properties 是否一致)。
|
||||
|
||||
### 9.4 仍建议对照的仓库文档
|
||||
|
||||
- [`elevator-service-instance-missing-investigation.md`](elevator-service-instance-missing-investigation.md):Ribbon 双路径(Consul vs ConfigurationBased)与现象描述。
|
||||
- 若调整 `listOfServers`,需在变更说明中记录 **与对外 HTTP/Feign 契约不变**(仅内部路由与配置)。
|
||||
|
||||
---
|
||||
|
||||
## 10. `elevator-app-probe.log` 同步分析(仓库内样本)
|
||||
|
||||
**文件**:[`maven-cw-elevator-application/logs/evidence/elevator-app-probe.log`](../../maven-cw-elevator-application/logs/evidence/elevator-app-probe.log)(与主日志同一次启动窗口 **2026-04-30 11:16:24**,仅含 `cn.cloudwalk.elevator.debug` 包输出。)
|
||||
|
||||
### 10.1 探针开关(首行汇总)
|
||||
|
||||
本证据文件采自 **2026-04-30** 进程;当时摘要行仍描述 **config / ribbon / consul** 三开关。当前仓库实现为:**三类探针默认全开**,调度仅改源码 [`ElevatorProbeConstants`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ElevatorProbeConstants.java),**不再**使用 `elevator.*.probe.enabled`。
|
||||
|
||||
- **`configProbe=true`**:`ConfigSourceProbeRunner` 已执行(本文件主体)。
|
||||
- **`ribbonProbe=false`**:当时未启用 Ribbon 探针属性,故本文件中**无** `ribbonProbe instance` 等行(非当前代码行为)。
|
||||
- **`consulProbe=false`**:当时未启用 Consul HTTP 探针,故本文件中**无** `consulProbe instance` 等行(非当前代码行为)。
|
||||
|
||||
新版进程应在延迟(Consul 约 20s、Ribbon 约 22s)后于 `*-probe.log` 中出现 **consulProbe** / **ribbonProbe** 明细;与 `elevator-app.log` 中 Netflix Ribbon 行交叉验证时**无需**再开属性开关。
|
||||
|
||||
### 10.2 配置源冲突(与主日志 / keylines 一致)
|
||||
|
||||
| 键 | 合并后 `getProperty` | 并存来源 |
|
||||
|----|----------------------|----------|
|
||||
| `spring.cloud.consul.host` | `10.0.22.102` | 磁盘 `file:./bootstrap` 为 **IP**;`classpath:/bootstrap` 为 **主机名** |
|
||||
| `spring.cloud.consul.discovery.enabled` | `true` | 磁盘为 **true**;classpath 为 **false**(最终以 Environment 合并结果为准,探针 `value=` 为 **true**) |
|
||||
|
||||
### 10.3 Ribbon 相关键在 Environment 中的显式值
|
||||
|
||||
- `*.ribbon.NIWSServerListClassName`:**均为 `null`**(探针未解析到属性文件中的覆盖字符串)。
|
||||
- `*.ribbon.listOfServers`:**均为 `null`**。
|
||||
- `ninca-crk-std.ip`:**`10.0.22.102:16106`**(`file:` 与 `classpath:` 一致)。
|
||||
|
||||
与 [`NincaCrkStdRibbonConfiguration`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java) + 主日志中 **`ConfigurationBasedServerList` 且 Servers=[]** 的现象一并阅读:**Environment 层未出现 `ninca-crk-std.ribbon.listOfServers`**,与「仅靠业务键 `ninca-crk-std.ip`」并存。
|
||||
|
||||
### 10.4 小结
|
||||
|
||||
| 项目 | 结论 |
|
||||
|------|------|
|
||||
| 本文件作用 | 专用 **`elevator-app-probe.log`**,避免在主日志中筛选探针类 |
|
||||
| 本次样本覆盖范围 | **仅 ConfigSource**(当时未开 Ribbon/Consul 探针);新版本默认可见全量探针 |
|
||||
| 与排查关系 | 历史样本解释「旧证据缺 Ribbon/Consul 行」;现行构建以 `ElevatorProbeConstants` 为准,深层 Ribbon 行为仍可对照 **`elevator-app.log`** 中 `DynamicServerListLoadBalancer` |
|
||||
|
||||
---
|
||||
|
||||
**延伸(不改现场属性文件的审核备忘)**:[`elevator-v1-v2-init-timing-config-audit.md`](elevator-v1-v2-init-timing-config-audit.md)(初始化时序、探针顺序、jcmd attach、V1/V2 模板对照)。
|
||||
|
||||
---
|
||||
|
||||
**文档生成说明**:基于仓库内已检入的 `logs/evidence` 快照文件;若现场重新采集,请更新本文件名中的日期或新增一篇并列保留历史结论。
|
||||
@@ -0,0 +1,114 @@
|
||||
# 电梯应用「服务实例缺失」排查结论(2026-04-30)
|
||||
|
||||
本文档落实排查计划:锁定运行形态、Ribbon ServerList 行为、Consul 健康实例、最小风险修复分支。
|
||||
|
||||
## 1. 运行版本与配置目录
|
||||
|
||||
### 1.1 仓库内 Maven 验证日志(`maven-cw-elevator-application/logs/elevator-app.log`)
|
||||
|
||||
- **Tomcat 端口**:`18081`(与 `deploy/README.md` 中 **v2-maven** 并行对拍端口一致)。
|
||||
- **Profile**:`access-control`。
|
||||
- **Kafka**:`192.168.3.12:9092`(本地验证栈)。
|
||||
- **结论**:该日志对应 **本机/验证环境** 启动的 **Maven 构建版 V2 JAR**(非生产星中心 V1 目录),用于 API 对拍或本地联调。
|
||||
|
||||
### 1.2 生产侧采集证据(`artifacts/elevator-evidence-20260430-000038/`)
|
||||
|
||||
- **JAR**:`星中心/cw-elevator-application-V1.0.0.20211103/cw-elevator-application-V1.0.0.20211103.jar`(V1 fat-jar)。
|
||||
- **`start.sh`**:`java -jar cw-elevator-application-V1.0.0.20211103.jar`,**未**附加 `--spring.config.location`。
|
||||
- **`bootstrap.properties`(现场快照)**:`spring.cloud.consul.discovery.enabled=false`,Consul host 为 **主机名**(与发布包内 IP 形式不同)。
|
||||
- **`application.properties`(现场快照)**:含 `feign.*.name`、业务参数、`ninca-crk-std.ip`,**未见** `ninca-crk-std.ribbon.listOfServers`(与 [`deploy/v1-legacy/application.properties`](../../maven-cw-elevator-application/deploy/v1-legacy/application.properties) 中显式 Ribbon 静态段不一致时,行为依赖 JAR 版本与配置合并)。
|
||||
|
||||
**结论**:排查时需区分 **(A) 本仓库 Maven V2 + deploy/v2-maven** 与 **(B) 星中心 V1 fat-jar + 同目录配置**,二者 Consul/Ribbon 生效路径不同;勿混用日志归因。
|
||||
|
||||
---
|
||||
|
||||
## 2. `ninca-crk-std` 的 Ribbon ServerList 是否稳定
|
||||
|
||||
### 2.1 日志统计(同一 `elevator-app.log`)
|
||||
|
||||
| 模式 | 日志特征 | 次数(近似) |
|
||||
|------|-----------|----------------|
|
||||
| Consul 发现 | `ServerList:ConsulServerList{serviceId='ninca-crk-std'` | **19** |
|
||||
| 配置型列表 | 后续行出现 `ServerList:com.netflix.loadbalancer.ConfigurationBasedServerList@…`,且实例列表含静态地址(如 `10.128.161.95:16106`) | **多条**(`ConfigurationBasedServerList@` 在全日志约 **66** 处,含换行续行;并非全部为同一客户端,但 `ninca-crk-std` 存在两种初始化交替) |
|
||||
|
||||
### 2.2 代码与配置依据
|
||||
|
||||
- [`NincaCrkStdRibbonConfiguration`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java) 强制使用 `ConfigurationBasedServerList`,注释说明用于避免 Consul 返回空列表时覆盖静态 `listOfServers`。
|
||||
- **事实**:日志仍出现 **`ConsulServerList`**,说明在部分生命周期/上下文刷新路径下,负载均衡仍会按 **Consul** 解析;**不稳定**,与「仅静态 Ribbon」预期不完全一致。
|
||||
|
||||
### 2.3 次要现象(同一日志)
|
||||
|
||||
- 即使走 `ConfigurationBasedServerList` 且实例为 `10.128.161.95:16106`,仍可能出现 **`Connection refused`**(对端未监听或网络不通),与「无实例」不同,需区分。
|
||||
|
||||
---
|
||||
|
||||
## 3. Consul 侧是否存在依赖服务实例(验证环境实测)
|
||||
|
||||
对 **`http://192.168.3.12:8500`**(仓库 `deploy` 文档中的本地 Consul)执行:
|
||||
|
||||
`GET /v1/health/service/<service>?passing=true`
|
||||
|
||||
| 服务名 | 结果 |
|
||||
|--------|------|
|
||||
| `cwos-portal` | `[]` |
|
||||
| `ninca-common` | `[]` |
|
||||
| `ninca-common-component-organization` | `[]` |
|
||||
| `ninca-crk-std` | `[]` |
|
||||
| `elevator-app` | **有** passing 实例(摘录响应中含 `elevator-app` 注册信息) |
|
||||
|
||||
**结论**:当前验证用 Consul 上 **四个上游均无健康实例**。若应用侧 **`spring.cloud.consul.discovery.enabled=true`**(早期发布包曾在 `bootstrap` 中如此配置;当前基线见 [`deploy/v2-maven/bootstrap.properties`](../../maven-cw-elevator-application/deploy/v2-maven/bootstrap.properties)),Ribbon 走 **`ConsulServerList`** 时会出现 **`Load balancer does not have available server`**,这与实测一致。
|
||||
生产环境请在 **目标 Consul 地址**上重复上述 HTTP 检查([`scripts/collect_elevator_runtime_evidence.sh`](../../scripts/collect_elevator_runtime_evidence.sh) 已内置相同请求)。
|
||||
|
||||
---
|
||||
|
||||
## 4. 最小风险修复分支(二选一)
|
||||
|
||||
### 分支 A:禁用 Consul 客户端发现 + 静态 Ribbon(与 `deploy/v1-legacy`、较新发布包中对齐)
|
||||
|
||||
1. 设置 **`spring.cloud.consul.discovery.enabled=false`**(仍可保留 `consul.enabled=true` 用于配置中心等其他用途,以现场为准)。
|
||||
2. 在 **`application.properties`**(与 JAR 同目录或 Consul KV,以实际生效源为准)为各 Feign 客户端补充 **`*.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList`** 与 **`*.ribbon.listOfServers=host:port`**(至少覆盖:`cwos-portal`、`ninca-common`、`ninca-common-component-organization`、`ninca-crk-std`)。
|
||||
3. **`ninca-crk-std`**:与 [`deploy/v1-legacy/application.properties`](../../maven-cw-elevator-application/deploy/v1-legacy/application.properties) 一致,配置 `ninca-crk-std.ribbon.*` 与 `ninca-crk-std.ip`;Maven V2 已含 `NincaCrkStdRibbonConfiguration`,仍需保证 **静态列表属性**在运行期可见。
|
||||
4. 配置来源探针 **默认已运行**([`ConfigSourceProbeRunner`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ConfigSourceProbeRunner.java));在 `*-probe.log` 核对 `*.ribbon.listOfServers` 的最终来源(无需再设 `elevator.config.probe.enabled`)。
|
||||
|
||||
### 分支 B:启用 Consul 服务发现
|
||||
|
||||
1. 保持 **`spring.cloud.consul.discovery.enabled=true`**。
|
||||
2. 在 **同一 Consul** 上确保四个服务 **注册成功且健康检查 passing**;服务名须与 `feign.*.name` 一致(如 `cwos-portal`、`ninca-common` 等)。
|
||||
3. **不要求**静态 `listOfServers`;若仍报错,用 Consul UI/API 核对实例与健康检查脚本。
|
||||
|
||||
### 版本选择提示
|
||||
|
||||
- **较早的发布包(如 v2.0.1~v2.0.3)**:`bootstrap` 中曾 **`discovery.enabled=true`**,在无上游注册的环境下更易触发本问题。
|
||||
- **v2.0.4 及以后发布包**:**`discovery.enabled=false`**,与「静态 Ribbon」分支一致。
|
||||
|
||||
### `deploy/v2-maven/run.sh` 注意
|
||||
|
||||
当前 [`run.sh`](../../maven-cw-elevator-application/deploy/v2-maven/run.sh) 仅 **`java -jar`**,不注入 `file:./application.properties`。若未通过 Consul KV 提供 Ribbon 键,则依赖 JAR 内默认配置 —— 本地「仅 Consul、无上游」时仍会失败。验证/对拍时请确保 **外置 `application.properties` 与 JAR 同目录** 或 **显式 `--spring.config.location=...`**(以团队约定为准)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 建议的只读复核命令(现场)
|
||||
|
||||
1. **进程与 JAR**:`ps -ef | grep cw-elevator-application`;确认 **工作目录**与 **JAR 文件名**(V1 vs V2)。
|
||||
2. **Consul**:`curl -s "http://<consul>:8500/v1/health/service/<feign服务名>?passing=true"`。
|
||||
3. **日志关键字**:`ConsulServerList`、`ConfigurationBasedServerList`、`Load balancer does not have available server`。
|
||||
|
||||
---
|
||||
|
||||
## 6. 一次性评估:应用内探针与对照方式
|
||||
|
||||
以下均在 **`cn.cloudwalk.elevator.debug`** 包内输出(WARN 用于异常路径),并 **双写** 主日志与 **`*-probe.log`**(见 `logs/logback.xml`);**默认始终启用**,调度见源码 **`ElevatorProbeConstants`**(不再使用 `elevator.*.probe.enabled`)。**Spring Cloud Consul**、**Netflix loadbalancer**、**Discovery** 相关 logger 在 `logback.xml` 中按 **DEBUG** 双写到 `*-probe.log`(与 `cn.cloudwalk.elevator.debug` 一致)。
|
||||
|
||||
| 探针 | 作用 | 与其他探针对照 |
|
||||
|------|------|----------------|
|
||||
| `ConfigSourceProbeRunner` | 启动期打印 Consul/Feign/Ribbon 关键键的 **value** 及 **PropertySource** 命中链 | 确认 `discovery.enabled`、`*.ribbon.listOfServers` 是否被 KV/本地覆盖 |
|
||||
| `RibbonLoadBalancerProbeRunner` | 延迟后打印各 Ribbon 客户端 **实例级 host/port** 与 **`serverCount`** | **Consul passing=0 且此处也为 0**:多为静态配置未生效或未调用;**Consul>0 此处仍 0**:重点查 `NIWSServerListClassName` / 懒加载 |
|
||||
| `ConsulUpstreamHealthProbeRunner` | 延迟 HTTP:**本服务**与上游 **`/v1/health/service/...`** **逐实例**(endpoint、checks 摘要)、**`/v1/agent/self`** | 与上一行 **交叉验证**:区分「注册侧无实例」与「应用侧 Ribbon 未吃到地址」 |
|
||||
|
||||
启动时会打一行 **`ELEVATOR DIAGNOSTIC PROBES always on`** 汇总。进程外仍建议配合 [`scripts/collect_elevator_runtime_evidence.sh`](../../scripts/collect_elevator_runtime_evidence.sh) 做完整证据包。
|
||||
|
||||
**一次性阅读顺序**:`*-probe.log` 中先 **CONFIG SOURCE** →(延迟后)**CONSUL** → **RIBBON**,再对照主日志中的业务异常时间线。
|
||||
|
||||
---
|
||||
|
||||
**文档维护**:若发行包 `bootstrap` 或 `run.sh` 再变更,请同步更新第 4 节与「版本选择提示」。
|
||||
@@ -0,0 +1,67 @@
|
||||
# 电梯 V1 / V2:初始化时序与配置审核备忘(不改现场属性文件)
|
||||
|
||||
**约束**:本文档仅做**代码与模板对照**、**启动与探针时序**说明;**不修改**现场 `bootstrap.properties` / `application.properties`。
|
||||
|
||||
**关联**:证据与日志结论见 [`elevator-evidence-v1-v2-diff-20260430.md`](elevator-evidence-v1-v2-diff-20260430.md);Ribbon 现象见 [`elevator-service-instance-missing-investigation.md`](elevator-service-instance-missing-investigation.md)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 仓库内「V1 模板」与「V2 模板」指代
|
||||
|
||||
| 指代 | 路径 | 用途 |
|
||||
|------|------|------|
|
||||
| V1 部署参考 | [`deploy/v1-legacy/application.properties`](../../maven-cw-elevator-application/deploy/v1-legacy/application.properties) | 同目录 fat-jar、Consul 发现关闭场景下的 **显式** `ninca-crk-std.ribbon.listOfServers` 示例 |
|
||||
| V2 部署参考 | [`deploy/v2-maven/application.properties`](../../maven-cw-elevator-application/deploy/v2-maven/application.properties)、[`bootstrap.properties`](../../maven-cw-elevator-application/deploy/v2-maven/bootstrap.properties) | 当前 Maven 发布包拷贝来源;**含** `ninca-crk-std.ip`,**默认不含** `ninca-crk-std.ribbon.listOfServers`(与 V1 示例段不同) |
|
||||
|
||||
现场实际生效属性以**磁盘文件 + Consul KV + 内嵌 classpath** 合并为准;证据包中探针已打印多源并存现象。
|
||||
|
||||
---
|
||||
|
||||
## 2. 应用入口与 Ribbon 绑定(代码层,与属性文件无关)
|
||||
|
||||
- 入口:[`ElevatorApplication`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/ElevatorApplication.java)
|
||||
- `@RibbonClient(name = "${feign.ninca-crk-std.name:ninca-crk-std}", configuration = NincaCrkStdRibbonConfiguration.class)`
|
||||
- `ninca-crk-std` 专用配置:[`NincaCrkStdRibbonConfiguration`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java)
|
||||
- 使用 **`ConfigurationBasedServerList`**,`initWithNiwsConfig` 从 **Ribbon 约定键**(如 `ninca-crk-std.ribbon.listOfServers`)取列表。
|
||||
- 业务键 **`ninca-crk-std.ip`**(如 `AcsElevatorRecordServiceImpl`)**不自动写入** Ribbon ServerList;二者语义分离。
|
||||
|
||||
**审核结论**:在未改属性文件的前提下,若需证明「仅 ip、无 listOfServers」与空列表的因果关系,应依赖**日志中的 ServerList 初始化行** + **ConfigSourceProbe** 已打印的 `ninca-crk-std.ribbon.listOfServers value=null`(证据包已包含)。
|
||||
|
||||
---
|
||||
|
||||
## 3. 探针与启动时序(已实现的审查手段)
|
||||
|
||||
以下组件**默认均启用**(无 `elevator.*.probe` 开关);延迟秒数见 [`ElevatorProbeConstants`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ElevatorProbeConstants.java)。顺序由 Spring `@Order` / `ApplicationRunner` / `ApplicationListener` 决定:
|
||||
|
||||
| 组件 | 触发时机 | 顺序要点 |
|
||||
|------|-----------|----------|
|
||||
| [`ElevatorProbeSummaryRunner`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ElevatorProbeSummaryRunner.java) | `ApplicationRunner` | `@Order(HIGHEST_PRECEDENCE)`:最先一批 Runner |
|
||||
| [`ConfigSourceProbeRunner`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ConfigSourceProbeRunner.java) | `ApplicationRunner` | 默认顺序;打印 **file vs classpath** 的配置源 |
|
||||
| [`RibbonLoadBalancerProbeRunner`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/RibbonLoadBalancerProbeRunner.java) | `ContextRefreshedEvent` | `@Order(LOWEST_PRECEDENCE)` + **延迟** `RIBBON_LOAD_BALANCER_PROBE_DELAY_SECONDS` |
|
||||
| [`ConsulUpstreamHealthProbeRunner`](../../maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/debug/ConsulUpstreamHealthProbeRunner.java) | 同上 | **延迟** `CONSUL_HTTP_PROBE_DELAY_SECONDS`(先于 Ribbon 数秒,减少日志交错) |
|
||||
|
||||
**审核结论**:ConfigSource 探针回答「**合并后的 Environment 里键值与来源**」;Ribbon/Consul 探针回答「**延迟若干秒后**负载均衡与 Consul HTTP 是否一致」。与「首次请求才创建 LoadBalancer」的懒加载配合时,**日志时间戳**比单次启动瞬间的配置快照更能说明时序问题(见全量 `elevator-app.log` 中 11:16 vs 11:43 两次启动)。
|
||||
|
||||
---
|
||||
|
||||
## 4. jcmd attach 失败时的排查动作(不改属性)
|
||||
|
||||
采集脚本已输出 **`jcmd-attach-diagnose.txt`**(进程用户、`/tmp/hsperfdata_*`、cmdline 中与 attach 相关的 token)。常见修复:
|
||||
|
||||
1. **与 Java 进程同一用户**执行 `jcmd`(例如进程属 `cwos` 而当前为 `root` 时:`sudo -u cwos /data/cwos/java/bin/jcmd <PID> VM.system_properties`)。
|
||||
2. 检查 **`/tmp/hsperfdata_<user>/<pid>`** 是否存在、权限是否正常。
|
||||
3. 确认启动参数中是否包含 **`-XX:+DisableAttachMechanism`**(若有则需调整 **启动脚本/JVM 参数**,不属于应用 properties)。
|
||||
4. JDWP(`-Xdebug` / `-Xrunjdwp`)一般**不**单独阻断 attach;仍以用户与 hsperfdata 为主因居多。
|
||||
|
||||
---
|
||||
|
||||
## 5. 下一步「仅从审核角度」的建议清单(不写回属性文件)
|
||||
|
||||
1. 对照**本次证据包**与全量日志:确认 `ninca-crk-std` 首次出现 **`ConfigurationBasedServerList` + Servers=[]** 的线程与时间,是否与首次 Feign 调用/懒加载一致。
|
||||
2. 对照 **V1 legacy 模板**与 **v2-maven 模板**中 **`ninca-crk-std.ribbon.*` 段的差异**,形成变更评审材料(**实施与否由现场窗口决定**,本文不修改文件)。
|
||||
3. 复采证据时带上 **`jcmd-attach-diagnose.txt`** 与成功时的 **`jcmd-system-properties.txt`**,补齐进程内 `ribbon.*` 最终值。
|
||||
4. 短时开启 **Ribbon / Consul 探针**(仅运行时开关,不改磁盘 properties 内容亦可由运维在启动命令注入 `-D`)用于一次性对照——若政策禁止任何参数变更,则仅依赖现有日志与 Consul JSON。
|
||||
|
||||
---
|
||||
|
||||
**文档性质**:研发侧审核备忘;不作为未经评审的生产变更指令。
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,19 @@
|
||||
release-visitor-noauth-verify-v20260430/
|
||||
├── README.md
|
||||
├── 操作手册.md
|
||||
├── 执行流程设计-简化版.md
|
||||
├── 打包说明.txt
|
||||
├── MANIFEST.txt
|
||||
├── python/
|
||||
│ ├── quick_verify_visitor_floor_policy.py
|
||||
│ ├── requirements.txt
|
||||
│ └── requirements-min.txt
|
||||
├── report/
|
||||
│ └── .gitkeep
|
||||
└── sql/
|
||||
├── 黄平访客ID手工查询.sql
|
||||
├── 租户访客策略基线核查.sql
|
||||
├── 批量样本筛选-多公司多部门.sql
|
||||
├── 人工核查最终楼层结果.sql
|
||||
├── 标准批量25访客-执行后核验.sql
|
||||
└── batch_cases.csv
|
||||
@@ -0,0 +1,105 @@
|
||||
# 访客无鉴权策略验证发布包(v20260430)
|
||||
|
||||
## 1. 发布目标
|
||||
|
||||
本目录为“黄平访问蒙海文”无鉴权策略验证的**版本化发布包**,用于生产执行、结果留痕与归档。
|
||||
|
||||
当前对应代码发布版本:`cw-elevator-application-2.0.9`
|
||||
|
||||
## 2. 包内文件
|
||||
|
||||
- `README.md`:发布说明(本文件)
|
||||
- `操作手册.md`:完整操作步骤与判定规则
|
||||
- `执行流程设计-简化版.md`:先明确流程再执行的最小闭环方案(推荐先读)
|
||||
- `sql/黄平访客ID手工查询.sql`:生产手工查询黄平访客 ID 的 SQL
|
||||
- `sql/批量样本筛选-多公司多部门.sql`:筛选多个公司/多个部门被访人样本 SQL
|
||||
- `sql/人工核查最终楼层结果.sql`:自定义访客 ID 集合时执行后核验
|
||||
- `sql/标准批量25访客-执行后核验.sql`:§4.0 单行命令固定 25 名访客号段后的执行后核验
|
||||
- `python/quick_verify_visitor_floor_policy.py`:执行脚本快照(支持纯 HTTP;可选连组织库/电梯库)
|
||||
- `python/requirements.txt`:`requests` + `pymysql`(预置样本拉取、`--verify-local-db`)
|
||||
- `python/requirements-min.txt`:仅 `requests`(不连库时)
|
||||
- `report/`:脚本输出 JSON 汇总(打包时排除 `*.json` 历史文件)
|
||||
- `打包说明.txt`:生产机 `pip install`、一键 zip、全量预置命令示例
|
||||
- `MANIFEST.txt`:交付清单
|
||||
|
||||
## 3. 关键基线参数
|
||||
|
||||
- 被访人(蒙海文)`personId=964454497399468032`
|
||||
- 访客(黄平)`personId=1102270499947507712`
|
||||
- 租户 `businessId=2524639890ba4f2cba9ba1a4eeaa4015`
|
||||
- 策略语义(与电梯源码一致):未传 **`floorIds`** 且策略启用且 **`allow_zone_ids`** 非空时,生效楼层为 **被访人 `floorList` ∩ `allow_zone_ids`**(求交);无策略或 allow 为空则仍为 **`floorList` 全集**。详见 [`visitor-registration-business-flow.md`](../visitor-registration-business-flow.md)、[`租户组织人员访客-数据模型与用例.md`](../../architecture/租户组织人员访客-数据模型与用例.md)。
|
||||
|
||||
## 4. 测试执行(一行命令)
|
||||
|
||||
以下参数已由交付侧与现场环境对齐:**组织** `http://10.0.22.207:8089`,**电梯** `http://10.0.22.207:16112`;**25 名测试访客** `personId` 为连续号段 `9199000100000000001`~`9199000100000000025`(预置脚本内置 25 个被访人样本,本命令**不访问 MySQL**)。
|
||||
|
||||
**操作:** 打开解压后的发布包目录(能看到子目录 `python/`),**只粘贴下面整行**,回车执行(自动安装缺失的 `requests` 并跑预置 25 人批量无鉴权探测):
|
||||
|
||||
```bash
|
||||
python3 -m pip install -q -r python/requirements-min.txt && python3 python/quick_verify_visitor_floor_policy.py --mode noauth-probe --org-base-url "http://10.0.22.207:8089" --elevator-base-url "http://10.0.22.207:16112" --use-preset-cases --visitor-person-ids "$(python3 -c 'print(",".join(str(9199000100000000000+i) for i in range(1,26)))')" --probe-with-businessid --batch-output-summary "batch-preset-static-$(date +%Y%m%d-%H%M%S).json"
|
||||
```
|
||||
|
||||
汇总 JSON:`report/` 目录下文件名形如 `batch-preset-static-<时间戳>.json`。
|
||||
|
||||
**执行后须查库分析:** 在目标环境 **`cw-elevator-application`** 库运行 `sql/标准批量25访客-执行后核验.sql`,将每名访客的 **`active_row_count`、`zone_id`** 与 JSON 中的 `derived.floor_count`、`derived.floors` 对齐;具体操作与判定要点见 **`操作手册.md` §4.0.1、§4.6**。
|
||||
|
||||
---
|
||||
|
||||
### 附录 A:单样本(广发基金基线)
|
||||
|
||||
```bash
|
||||
python3 python/quick_verify_visitor_floor_policy.py \
|
||||
--mode noauth-probe \
|
||||
--org-base-url "http://10.0.22.207:8089" \
|
||||
--elevator-base-url "http://10.0.22.207:16112" \
|
||||
--business-id "2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
--meng-person-id "964454497399468032" \
|
||||
--visitor-person-id "1102270499947507712" \
|
||||
--probe-with-businessid
|
||||
```
|
||||
|
||||
该访客为存量人员:库表核验易与历史 `image_rule_ref` 混在一起;若以「本轮新增访客 + 证据」为目标,请以 **§4 一行批量号段 `919900…`** 为主。**操作手册 §4.2** 对上述边界有全文说明。
|
||||
|
||||
### 附录 B:连 MySQL 拉样本 / 库表比对
|
||||
|
||||
需与 HTTP 同属一套库的地址与账号由运维另行提供,不由本 README 承载;禁止使用与目标环境不一致的数据库串联验证。
|
||||
|
||||
### 附录 C:`sql/batch_cases.csv` 批量
|
||||
|
||||
```bash
|
||||
python3 python/quick_verify_visitor_floor_policy.py \
|
||||
--mode noauth-probe \
|
||||
--org-base-url "http://10.0.22.207:8089" \
|
||||
--elevator-base-url "http://10.0.22.207:16112" \
|
||||
--batch-input-csv "sql/batch_cases.csv" \
|
||||
--visitor-person-ids "1102270499947507712,1102270499947507713,1102270499947507714" \
|
||||
--visitor-names "黄志平A,黄志平B,黄志平C" \
|
||||
--probe-with-businessid \
|
||||
--batch-output-summary "batch-from-csv-$(date +%Y%m%d-%H%M%S).json"
|
||||
```
|
||||
|
||||
### 附录 D:人员导出 CSV 自动筛选
|
||||
|
||||
```bash
|
||||
python3 python/quick_verify_visitor_floor_policy.py \
|
||||
--mode noauth-probe \
|
||||
--org-base-url "http://10.0.22.207:8089" \
|
||||
--elevator-base-url "http://10.0.22.207:16112" \
|
||||
--batch-source-person-csv "../_cw_is_person__202604302030.csv" \
|
||||
--exclude-business-ids "2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
--sample-companies 3 \
|
||||
--sample-persons-per-company 2 \
|
||||
--visitor-person-ids "1102270499947507712,1102270499947507713,1102270499947507714" \
|
||||
--visitor-names "黄志平A,黄志平B,黄志平C" \
|
||||
--probe-with-businessid \
|
||||
--batch-output-summary "batch-from-export-$(date +%Y%m%d-%H%M%S).json"
|
||||
```
|
||||
|
||||
说明:导出 CSV 需含列 `BUSINESS_ID`,`ID`,`IS_DEL`,`NAME`(等);无部门列时汇总中 `department` 可能为空。
|
||||
|
||||
## 5. 输出位置
|
||||
|
||||
脚本输出(均在发布包下 `report/` 目录):
|
||||
- 单样本:`quick-verify-<timestamp>.json`
|
||||
- 标准批量:见 §4,`batch-preset-static-*.json`
|
||||
- 其他批量:`--batch-output-summary` 指定名;默认 `batch-summary.json`
|
||||
BIN
Binary file not shown.
+1045
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,2 @@
|
||||
# 仅调用组织/电梯 HTTP,不连 MySQL
|
||||
requests>=2.28.0,<3
|
||||
@@ -0,0 +1,5 @@
|
||||
# 生产验证机:Python 3.8+
|
||||
# 仅 HTTP 探测:pip install -r requirements-min.txt
|
||||
requests>=2.28.0,<3
|
||||
# 可选(--fetch-preset-from-org-db / --verify-local-db)
|
||||
pymysql>=1.0.0,<2
|
||||
+2375
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
||||
business_id,meng_person_id,company,department
|
||||
2524639890ba4f2cba9ba1a4eeaa4015,964454497399468032,广发基金,示例部门A
|
||||
replace-business-id-2,replace-person-id-2,示例公司2,示例部门B
|
||||
replace-business-id-3,replace-person-id-3,示例公司3,示例部门C
|
||||
|
@@ -0,0 +1,49 @@
|
||||
-- 用途:脚本执行后,人工核查访客最终楼层权限
|
||||
-- 说明:
|
||||
-- * 「已授权楼层」= image_rule_ref 中 person_delete = 0 的行(与 passRule/image 可查到的楼层一致)
|
||||
-- * person_delete = 1 为撤销/作废,不参与当前授权
|
||||
-- 将 IN (...) 中的访客 person_id 替换为本次执行的访客集合
|
||||
|
||||
-- 主查:仅已授权楼层(推荐与接口 / JSON derived.floors 对拍)
|
||||
SELECT
|
||||
irr.person_id,
|
||||
irr.business_id,
|
||||
irr.zone_id,
|
||||
irr.zone_name,
|
||||
irr.last_update_time
|
||||
FROM `cw-elevator-application`.`image_rule_ref` irr
|
||||
WHERE irr.person_id IN (
|
||||
'1102270499947507712'
|
||||
-- ,'替换为其他访客personId'
|
||||
)
|
||||
AND irr.person_delete = 0
|
||||
ORDER BY irr.person_id, irr.zone_id;
|
||||
|
||||
-- 明细(含已撤销历史行,核对 person_delete / 时间线时用)
|
||||
SELECT
|
||||
irr.person_id,
|
||||
irr.business_id,
|
||||
irr.zone_id,
|
||||
irr.zone_name,
|
||||
irr.person_delete,
|
||||
irr.create_time,
|
||||
irr.last_update_time
|
||||
FROM `cw-elevator-application`.`image_rule_ref` irr
|
||||
WHERE irr.person_id IN (
|
||||
'1102270499947507712'
|
||||
-- ,'替换为其他访客personId'
|
||||
)
|
||||
ORDER BY irr.person_id, irr.last_update_time DESC, irr.zone_id;
|
||||
|
||||
-- 可选:统计每个访客当前「已授权」楼层数量(person_delete = 0)
|
||||
SELECT
|
||||
irr.person_id,
|
||||
COUNT(1) AS floor_count
|
||||
FROM `cw-elevator-application`.`image_rule_ref` irr
|
||||
WHERE irr.person_id IN (
|
||||
'1102270499947507712'
|
||||
-- ,'替换为其他访客personId'
|
||||
)
|
||||
AND irr.person_delete = 0
|
||||
GROUP BY irr.person_id
|
||||
ORDER BY irr.person_id;
|
||||
@@ -0,0 +1,35 @@
|
||||
-- 用途:从组织库筛选“多个公司 + 多个部门”的被访人样本
|
||||
-- MySQL:连接主机/端口/账号按**当前环境**填写(开发与生产分离;不要用开发库导出的样本去打生产)
|
||||
--
|
||||
-- 已与 component-organization 典型结构对齐(2026-04-30 开发库 INFORMATION_SCHEMA 核对):
|
||||
-- cw_is_person 人员主键列为 ID(无 person_id);删除标记 IS_DEL(无 deleted);
|
||||
-- 无 labels/business_name/organization_name 列;访客身份通过 cw_is_person_label_ref + cw_is_label 识别。
|
||||
-- 连接参数可复制 maven-cw-elevator-application/tools/visitor_floor_verification/.env.visitor_verify(勿提交密钥)。
|
||||
|
||||
SELECT
|
||||
p.BUSINESS_ID AS business_id,
|
||||
p.ID AS meng_person_id,
|
||||
COALESCE(parent_org.NAME, '') AS company,
|
||||
COALESCE(o.NAME, '') AS department
|
||||
FROM `component-organization`.`cw_is_person` p
|
||||
INNER JOIN `component-organization`.`cw_is_person_organization_ref` r ON r.PERSON_ID = p.ID
|
||||
LEFT JOIN `component-organization`.`cw_is_organization` o ON o.ID = r.ORG_ID
|
||||
LEFT JOIN `component-organization`.`cw_is_organization` parent_org ON parent_org.ID = o.PARENT_ID
|
||||
WHERE (p.IS_DEL = 0 OR p.IS_DEL IS NULL)
|
||||
AND p.BUSINESS_ID IS NOT NULL
|
||||
AND p.BUSINESS_ID <> ''
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `component-organization`.`cw_is_person_label_ref` lr
|
||||
INNER JOIN `component-organization`.`cw_is_label` lb ON lb.ID = lr.LABEL_ID
|
||||
WHERE lr.PERSON_ID = p.ID
|
||||
AND lb.BUSINESS_ID = p.BUSINESS_ID
|
||||
AND lb.NAME = '访客'
|
||||
)
|
||||
ORDER BY p.BUSINESS_ID, department, p.LAST_UPDATE_TIME DESC;
|
||||
|
||||
-- 建议导出后人工抽样:
|
||||
-- 1) 至少 3 个 business_id
|
||||
-- 2) 每个 business_id 至少 2 个不同 department
|
||||
-- 3) 生成 batch_cases.csv,列头固定为:
|
||||
-- business_id,meng_person_id,company,department
|
||||
@@ -0,0 +1,58 @@
|
||||
-- 用途:`README`/操作手册 §4.0 标准单行批量跑完后,在电梯库核查写库是否与接口侧一致
|
||||
-- 库:`cw-elevator-application`
|
||||
-- 表:`image_rule_ref`(访客 person_id 维度楼层规则)
|
||||
-- 访客清单:与本包约定的 9199000100000000001~9199000100000000025 完全一致;若现场改用其它 personId,请改下方 expected 子查询或直接用 `sql/人工核查最终楼层结果.sql`。
|
||||
|
||||
-- ------------------------------------------------------------------
|
||||
-- A) 每名访客当前「有效」规则行数 + 最近一次更新时间(核对 JSON 里的 floor_count / 时间点)
|
||||
-- ------------------------------------------------------------------
|
||||
SELECT
|
||||
e.visitor_person_id,
|
||||
SUM(CASE WHEN irr.person_delete = 0 THEN 1 ELSE 0 END) AS active_row_count,
|
||||
MAX(CASE WHEN irr.person_delete = 0 THEN irr.last_update_time END) AS latest_active_update_ms
|
||||
FROM (
|
||||
SELECT '9199000100000000001' AS visitor_person_id
|
||||
UNION ALL SELECT '9199000100000000002'
|
||||
UNION ALL SELECT '9199000100000000003'
|
||||
UNION ALL SELECT '9199000100000000004'
|
||||
UNION ALL SELECT '9199000100000000005'
|
||||
UNION ALL SELECT '9199000100000000006'
|
||||
UNION ALL SELECT '9199000100000000007'
|
||||
UNION ALL SELECT '9199000100000000008'
|
||||
UNION ALL SELECT '9199000100000000009'
|
||||
UNION ALL SELECT '9199000100000000010'
|
||||
UNION ALL SELECT '9199000100000000011'
|
||||
UNION ALL SELECT '9199000100000000012'
|
||||
UNION ALL SELECT '9199000100000000013'
|
||||
UNION ALL SELECT '9199000100000000014'
|
||||
UNION ALL SELECT '9199000100000000015'
|
||||
UNION ALL SELECT '9199000100000000016'
|
||||
UNION ALL SELECT '9199000100000000017'
|
||||
UNION ALL SELECT '9199000100000000018'
|
||||
UNION ALL SELECT '9199000100000000019'
|
||||
UNION ALL SELECT '9199000100000000020'
|
||||
UNION ALL SELECT '9199000100000000021'
|
||||
UNION ALL SELECT '9199000100000000022'
|
||||
UNION ALL SELECT '9199000100000000023'
|
||||
UNION ALL SELECT '9199000100000000024'
|
||||
UNION ALL SELECT '9199000100000000025'
|
||||
) e
|
||||
LEFT JOIN `cw-elevator-application`.`image_rule_ref` irr
|
||||
ON irr.person_id = e.visitor_person_id
|
||||
GROUP BY e.visitor_person_id
|
||||
ORDER BY e.visitor_person_id;
|
||||
|
||||
-- ------------------------------------------------------------------
|
||||
-- B) 有效规则明细(与报告 `derived.floors` 比对 zone_id;按人+时间排序)
|
||||
-- ------------------------------------------------------------------
|
||||
SELECT
|
||||
irr.person_id,
|
||||
irr.zone_id,
|
||||
irr.zone_name,
|
||||
irr.person_delete,
|
||||
irr.business_id,
|
||||
irr.create_time,
|
||||
irr.last_update_time
|
||||
FROM `cw-elevator-application`.`image_rule_ref` irr
|
||||
WHERE irr.person_id BETWEEN '9199000100000000001' AND '9199000100000000025'
|
||||
ORDER BY irr.person_id, irr.last_update_time DESC, irr.zone_id;
|
||||
@@ -0,0 +1,43 @@
|
||||
-- 租户访客楼层策略最小核查 SQL(执行前确认数据库实例为电梯业务库)
|
||||
-- 目标租户:广发基金 business_id = 2524639890ba4f2cba9ba1a4eeaa4015
|
||||
|
||||
-- 1) 表结构与索引确认
|
||||
SHOW CREATE TABLE tenant_visitor_floor_policy;
|
||||
|
||||
-- 2) 广发租户策略主检查
|
||||
SELECT id,
|
||||
business_id,
|
||||
policy_type,
|
||||
allow_zone_ids,
|
||||
building_id,
|
||||
enabled,
|
||||
policy_version,
|
||||
updated_at,
|
||||
remark
|
||||
FROM tenant_visitor_floor_policy
|
||||
WHERE business_id = '2524639890ba4f2cba9ba1a4eeaa4015'
|
||||
ORDER BY updated_at DESC, policy_version DESC;
|
||||
|
||||
-- 3) 同租户是否存在多条默认策略(building_id 为空)
|
||||
SELECT business_id, COUNT(*) AS cnt
|
||||
FROM tenant_visitor_floor_policy
|
||||
WHERE business_id = '2524639890ba4f2cba9ba1a4eeaa4015'
|
||||
AND (building_id IS NULL OR building_id = '')
|
||||
GROUP BY business_id
|
||||
HAVING COUNT(*) > 1;
|
||||
|
||||
-- 4) enabled 与 policy_type 分布
|
||||
SELECT policy_type, enabled, COUNT(*) AS cnt
|
||||
FROM tenant_visitor_floor_policy
|
||||
WHERE business_id = '2524639890ba4f2cba9ba1a4eeaa4015'
|
||||
GROUP BY policy_type, enabled
|
||||
ORDER BY cnt DESC;
|
||||
|
||||
-- 5) allow_zone_ids 是否包含 28F zone_id
|
||||
SELECT id, allow_zone_ids
|
||||
FROM tenant_visitor_floor_policy
|
||||
WHERE business_id = '2524639890ba4f2cba9ba1a4eeaa4015'
|
||||
AND enabled = 1
|
||||
AND policy_type = 'INTERSECT_ALLOWLIST'
|
||||
AND allow_zone_ids LIKE '%605560545117995008%';
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
-- 访客:黄平(手机号 13926442944)手工查询 SQL
|
||||
-- 已确认库表:component-organization.cw_is_person
|
||||
|
||||
SELECT
|
||||
person_id,
|
||||
name,
|
||||
mobile,
|
||||
business_id,
|
||||
labels,
|
||||
deleted,
|
||||
create_time,
|
||||
update_time
|
||||
FROM `component-organization`.`cw_is_person`
|
||||
WHERE business_id = '2524639890ba4f2cba9ba1a4eeaa4015'
|
||||
AND name = '黄平'
|
||||
AND mobile = '13926442944'
|
||||
ORDER BY update_time DESC;
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
发布包目录(源码内):
|
||||
docs/testing/release-visitor-noauth-verify-v20260430
|
||||
|
||||
一、测试执行(单行,与 README「4」一致;在解压后的发布包根目录执行,须有子目录 python/)
|
||||
|
||||
python3 -m pip install -q -r python/requirements-min.txt && python3 python/quick_verify_visitor_floor_policy.py --mode noauth-probe --org-base-url "http://10.0.22.207:8089" --elevator-base-url "http://10.0.22.207:16112" --use-preset-cases --visitor-person-ids "$(python3 -c 'print(",".join(str(9199000100000000000+i) for i in range(1,26)))')" --probe-with-businessid --batch-output-summary "batch-preset-static-$(date +%Y%m%d-%H%M%S).json"
|
||||
|
||||
二、一键打包(在仓库根「源码」目录执行,排除本地 report 里的 JSON 痕迹与 __pycache__)
|
||||
|
||||
STAMP=$(date +%Y%m%d-%H%M%S)
|
||||
OUT="docs/testing/release-visitor-noauth-verify-v20260430-prod-${STAMP}.zip"
|
||||
zip -r "$OUT" docs/testing/release-visitor-noauth-verify-v20260430 \
|
||||
-x 'docs/testing/release-visitor-noauth-verify-v20260430/report/*.json' \
|
||||
-x '*.pyc' -x '*__pycache__*' -x '*.pyo'
|
||||
unzip -l "$OUT" | tail -5
|
||||
echo "written: $OUT"
|
||||
|
||||
三、解压到测试机后的目录示例
|
||||
|
||||
mkdir -p ~/visitor-noauth-verify && cd ~/visitor-noauth-verify
|
||||
unzip -q release-visitor-noauth-verify-v20260430-prod-*.zip
|
||||
cd docs/testing/release-visitor-noauth-verify-v20260430
|
||||
(在此目录执行上文「一行命令」)
|
||||
|
||||
四、打包前自检
|
||||
|
||||
1) python/quick_verify_visitor_floor_policy.py、requirements*.txt 存在
|
||||
2) sql/、README.md 与交付地址/访客号段约定一致
|
||||
3) MANIFEST.txt 与目录一致
|
||||
|
||||
五、选配:连 MySQL 等参数由运维另表提供,不写死于此文件;勿用开发与目标不一致的库串联 HTTP。
|
||||
@@ -0,0 +1,90 @@
|
||||
# 访客楼层策略验证执行流程(简化版)
|
||||
|
||||
## 1. 目标
|
||||
|
||||
按固定顺序完成两组验证,并输出汇总结果:
|
||||
|
||||
1. **基线组(广发基金)**:新增“黄平访客 -> 被访人蒙海文(`personId=964454497399468032`)”,再查询该访客楼层权限;
|
||||
2. **对照组(其他公司多样本)**:从数据库筛选多个公司/多个部门被访人,分别新增“黄志平访客”,再查询各自楼层权限;
|
||||
3. 最终输出“每个样本是否成功、楼层数量与楼层清单”。
|
||||
|
||||
> 说明:本流程强调顺序和可复核性,不再依赖复杂自动推断。
|
||||
|
||||
## 2. 统一原则
|
||||
|
||||
- 只以 `personId` 作为最终查询键,不以姓名直接判定权限。
|
||||
- 姓名查询仅用于“定位候选人”,不用于最终业务判定。
|
||||
- 判定顺序固定:**先写(add/visitor),再读(passRule/image)**。
|
||||
|
||||
## 3. 执行总流程(必须按顺序)
|
||||
|
||||
### 步骤A:准备参数与样本
|
||||
|
||||
- 访客固定:黄平/黄志平(按现场实际确认对应 `visitorPersonId`)
|
||||
- 先准备两类样本:
|
||||
- 样本1(广发基金基线):`businessId=252463...`,被访人 `964454497399468032`
|
||||
- 样本2(多公司多部门对照):在**与目标验证环境一致**的组织库/MySQL 上筛选多个公司和部门被访人(禁止使用开发库数据去打生产接口)
|
||||
|
||||
### 步骤B:执行样本1(广发基金基线)
|
||||
|
||||
1. 调 `add/visitor` 新增访客;
|
||||
2. 紧接着调 `passRule/image` 查询楼层;
|
||||
3. 记录基线组结果(期望仅 `28F`,若策略开启)。
|
||||
|
||||
### 步骤C:执行样本2(多公司多部门)
|
||||
|
||||
对每个被访人样本重复:
|
||||
|
||||
1. 调 `add/visitor` 新增“黄志平访客”;
|
||||
2. 调 `passRule/image` 查询该访客楼层;
|
||||
3. 记录结果到汇总表。
|
||||
|
||||
### 步骤D:输出总结果
|
||||
|
||||
按样本输出字段:
|
||||
- 公司
|
||||
- 部门
|
||||
- 被访人 `personId`
|
||||
- 访客 `personId`
|
||||
- `add/visitor` 结果码
|
||||
- 楼层数量
|
||||
- 楼层清单
|
||||
|
||||
## 4. 异常分流(必须遵守)
|
||||
|
||||
### 4.1 add/visitor 失败(任何样本)
|
||||
|
||||
结论:该样本不具备“策略生效验证条件”。
|
||||
|
||||
动作:
|
||||
1. 查同时间窗口服务日志;
|
||||
2. 定位具体失败点(远程超时、依赖服务不可用、SQL异常等);
|
||||
3. 修复后仅重跑失败样本。
|
||||
|
||||
### 4.2 add/visitor 成功但楼层不符
|
||||
|
||||
动作:
|
||||
1. 查策略读取日志(`policyDecision`、`allowFloorSize`、`effectiveFloorSize`);
|
||||
2. 查策略表配置是否匹配租户;
|
||||
3. 查 `image_rule_ref` 当前 `person_delete=0` 记录是否包含历史残留。
|
||||
|
||||
## 5. 为什么采用该顺序
|
||||
|
||||
- 先做广发基金基线,可快速判断策略主路径是否正常;
|
||||
- 再做多公司多部门对照,可评估是否存在租户间差异或历史规则干扰;
|
||||
- 最后统一汇总,避免单条日志或单个样本误导结论。
|
||||
|
||||
## 6. 推荐命令模板(单样本)
|
||||
|
||||
```bash
|
||||
python3 python/quick_verify_visitor_floor_policy.py \
|
||||
--mode noauth-probe \
|
||||
--org-base-url "http://10.0.22.207:8089" \
|
||||
--elevator-base-url "http://10.0.22.207:16112" \
|
||||
--business-id "2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
--meng-person-id "964454497399468032" \
|
||||
--visitor-person-id "1102270499947507712" \
|
||||
--probe-with-businessid
|
||||
```
|
||||
|
||||
> 多样本场景建议外层脚本循环调用本命令,并将结果JSON汇总为一张表。
|
||||
@@ -0,0 +1,194 @@
|
||||
# 访客无鉴权策略验证-操作手册(发布版)
|
||||
|
||||
## 1. 适用范围
|
||||
|
||||
- 目标:验证无鉴权模式下访客接口是否可调用,以及“黄平访问蒙海文”是否触发策略。
|
||||
- 环境:生产环境(建议低峰时段执行)。
|
||||
- 对应版本:`cw-elevator-application-2.0.9`
|
||||
- 建议先读:`执行流程设计-简化版.md`(先定流程,再执行)
|
||||
|
||||
## 2. 前置条件
|
||||
|
||||
1. Python 3.8+
|
||||
2. **推荐(与 §4.0 一致)**:`python3 -m pip install -r python/requirements-min.txt`(安装 `requests`)。若仅单笔安装亦可:`python3 -m pip install requests`。
|
||||
|
||||
3. 关键参数确认:
|
||||
|
||||
- `businessId=2524639890ba4f2cba9ba1a4eeaa4015`
|
||||
- `蒙海文personId=964454497399468032`
|
||||
- `黄平personId=1102270499947507712`
|
||||
- `黄平姓名=黄平`、`手机号=13926442944`(仅用于人工核对)
|
||||
|
||||
说明:
|
||||
- 被访者ID参数为 `--meng-person-id`,默认即 `964454497399468032`,可按现场覆盖。
|
||||
|
||||
## 3. 手工 SQL(访客 ID 复核)
|
||||
|
||||
见:`sql/黄平访客ID手工查询.sql`
|
||||
|
||||
## 3.1 策略基线核查 SQL(必须先执行)
|
||||
|
||||
见:`sql/租户访客策略基线核查.sql`
|
||||
|
||||
重点核验:
|
||||
|
||||
- `business_id='2524639890ba4f2cba9ba1a4eeaa4015'`
|
||||
- `policy_type='INTERSECT_ALLOWLIST'`
|
||||
- `enabled=1`
|
||||
- `allow_zone_ids` 包含 `605560545117995008`(28F)
|
||||
- 同租户 `building_id` 为空的默认策略仅 1 条
|
||||
- 策略语义(与电梯源码一致):启用且 **`allow_zone_ids`** 非空时,访客生效楼层为 **被访人组织组件返回的 `floorList` 与 `allow_zone_ids` 的交集(求交)**;交集为空则业务失败 **`76260532`**。勿将本文旧稿「覆盖优先」理解为跳过求交——详见 [`visitor-registration-business-flow.md`](../visitor-registration-business-flow.md)、[`租户组织人员访客-数据模型与用例.md`](../../architecture/租户组织人员访客-数据模型与用例.md)。
|
||||
|
||||
## 3.2 多公司多部门样本筛选 SQL(第二步)
|
||||
|
||||
见:`sql/批量样本筛选-多公司多部门.sql`
|
||||
|
||||
筛选结果请保存为 `sql/batch_cases.csv`,列头要求:
|
||||
|
||||
`business_id,meng_person_id,company,department`
|
||||
|
||||
## 4. 执行步骤
|
||||
|
||||
### 4.0 标准预置 25 人批量(推荐,单行命令)
|
||||
|
||||
在发布包根目录(见 4.1)下**复制整行**执行即可(与 `README.md` §4 相同;不写占位符:组织/电梯 URL 与访客号段已由交付对齐):
|
||||
|
||||
```bash
|
||||
python3 -m pip install -q -r python/requirements-min.txt && python3 python/quick_verify_visitor_floor_policy.py --mode noauth-probe --org-base-url "http://10.0.22.207:8089" --elevator-base-url "http://10.0.22.207:16112" --use-preset-cases --visitor-person-ids "$(python3 -c 'print(",".join(str(9199000100000000000+i) for i in range(1,26)))')" --probe-with-businessid --batch-output-summary "batch-preset-static-$(date +%Y%m%d-%H%M%S).json"
|
||||
```
|
||||
|
||||
结果见 `report/batch-preset-static-*.json`。
|
||||
|
||||
### 4.0.1 执行后数据库核验(必须)
|
||||
|
||||
在完成 §4.0 且已拿到批量 JSON 后,于**与本环境电梯服务写入同一套库的** MySQL(`cw-elevator-application`)执行:
|
||||
|
||||
`sql/标准批量25访客-执行后核验.sql`
|
||||
|
||||
**如何对照判断「是否跑成功」**
|
||||
|
||||
1. 打开本轮 `report/batch-preset-static-*.json`,对每条样本看 `steps.add_visitor.business_ok`、`derived.floor_count`、`grade`。
|
||||
2. 对 **`add_visitor` 业务成功** 且 `passRule/image` HTTP 大体正常的样本,在同一库中期望:查询 **A** 中该行访客的 **`active_row_count` ≥ 1**(租户策略或写库链路正常时,`person_delete=0` 的规则行应与接口返回楼层有对应);**全部为 0** 则重点排查写库延迟、租户/访客 ID 不真实、或网关虽 200 实际未打到目标实例。
|
||||
3. 查询 **B** 与 JSON 内 `derived.floors[].zoneId` 做逐项比对;若库中 `person_delete=1` 的历史行较多,结合 `last_update_time` 看是否为本次执行产生的新生效行。
|
||||
4. 若访客号段与本包约定不一致(非 `919900…`),请改用 `sql/人工核查最终楼层结果.sql`,将 `IN (...)` 换为当天 JSON 中全部 `resolved_visitor_person_id`。
|
||||
|
||||
### 4.1 进入发布目录
|
||||
|
||||
```bash
|
||||
cd docs/testing/release-visitor-noauth-verify-v20260430
|
||||
```
|
||||
|
||||
### 4.2 样本1(广发基金基线)执行
|
||||
|
||||
本节「黄平 + 蒙海文」样本用于:**无鉴权下探针是否可走通**,以及 **`passRule/image` 返回是否与租户策略语义一致**。它**不是用来**证明「在本次执行中产出了全新访客主数据」——`add/visitor` 传入的是已在组织/电梯侧建档的访客 `personId` 时,写库常为**续约/补齐规则**,`image_rule_ref` 里的行常与**历史登记**混在一起。
|
||||
|
||||
若验收目标是「必须先有真实新增访客,再验证派梯」,请:
|
||||
|
||||
- **优先**:走 **§4.0** 约定号段 **`9199000100000000001`~`…0025`** 的批量预置链路(租户内已预置对应用人,`image_rule_ref` 证据与 JSON 对齐);
|
||||
- 或:业务流程上**新开一名访客**,再将其 `visitorPersonId` 交给本脚本;查库时对 `last_update_time` 与脚本 JSON 顶层 **`started_at`** 做对时(仅能辅助说明「本轮是否写过」)。
|
||||
|
||||
```bash
|
||||
python3 python/quick_verify_visitor_floor_policy.py \
|
||||
--mode noauth-probe \
|
||||
--org-base-url "http://10.0.22.207:8089" \
|
||||
--elevator-base-url "http://10.0.22.207:16112" \
|
||||
--business-id "2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
--meng-person-id "964454497399468032" \
|
||||
--visitor-person-id "1102270499947507712" \
|
||||
--probe-with-businessid
|
||||
```
|
||||
|
||||
### 4.3 样本2(其他公司多部门)执行
|
||||
|
||||
在与**当前验证目标环境一致**的 MySQL 上执行 `sql/批量样本筛选-多公司多部门.sql`(或等价查询),导出被访人到 `sql/batch_cases.csv`。**禁止**用开发环境数据库导出样本却去打生产 HTTP。**开发环境快照仅可用于开发联调**,生产走查必须使用生产侧数据或手写/审批过的样本 CSV。
|
||||
|
||||
```bash
|
||||
python3 python/quick_verify_visitor_floor_policy.py \
|
||||
--mode noauth-probe \
|
||||
--org-base-url "http://10.0.22.207:8089" \
|
||||
--elevator-base-url "http://10.0.22.207:16112" \
|
||||
--batch-input-csv "sql/batch_cases.csv" \
|
||||
--visitor-person-ids "<访客ID1>,<访客ID2>,<访客ID3>" \
|
||||
--visitor-names "黄志平A,黄志平B,黄志平C" \
|
||||
--probe-with-businessid
|
||||
```
|
||||
|
||||
建议最少覆盖:
|
||||
- 3 个不同公司;
|
||||
- 每公司 2 个不同部门被访人。
|
||||
|
||||
若已导出 `docs/testing/_cw_is_person__202604302030.csv`,可直接自动筛选(排除广发基金):
|
||||
|
||||
```bash
|
||||
python3 python/quick_verify_visitor_floor_policy.py \
|
||||
--mode noauth-probe \
|
||||
--org-base-url "http://10.0.22.207:8089" \
|
||||
--elevator-base-url "http://10.0.22.207:16112" \
|
||||
--batch-source-person-csv "../_cw_is_person__202604302030.csv" \
|
||||
--exclude-business-ids "2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
--sample-companies 3 \
|
||||
--sample-persons-per-company 2 \
|
||||
--visitor-person-ids "<访客ID1>,<访客ID2>,<访客ID3>" \
|
||||
--visitor-names "黄志平A,黄志平B,黄志平C" \
|
||||
--probe-with-businessid
|
||||
```
|
||||
|
||||
说明:
|
||||
- 自动筛选依赖列:`BUSINESS_ID`,`ID`,`NAME`;若存在 **`IS_DEL`**,脚本会**跳过已删除行**(`IS_DEL≠0` 或与 `true`/`1` 等价)。
|
||||
- 该 CSV 若无标准部门列,汇总中 `department` 将为空。
|
||||
|
||||
### 4.4 结果判定
|
||||
|
||||
脚本 `noauth-probe` 对每条样本计算 `grade`(单样本写入 `quick-verify-*.json`;批量写入每条 `results[]`):
|
||||
|
||||
- `grade=high_risk`:任一步均未出现 401/403,且 **`add/visitor` 的 HTTP 成功(<300)且接口业务码判定为成功**(`business_ok`),判定高风险放开(安全问题成立)。若仅 HTTP 200 但业务失败,归为 `needs_review`,不是 `high_risk`。
|
||||
- `grade=expected_block`:**人员详情、`add/visitor`、`passRule/image` 任一步**出现 401/403,视为无鉴权被拦截,符合安全预期。
|
||||
- `grade=needs_review`:未出现 401/403,但未达到上述「放行且业务成功」条件(例如网关超时、业务码失败等),需人工复核。
|
||||
- `grade=failed`(批量中单条可出现):访客 `personId` 无法解析且无内置兜底等情况,脚本未完成调链;不按上述安全三档解释,需先看 `summary`/JSON 报错原因。
|
||||
|
||||
### 4.5 汇总输出(必须)
|
||||
|
||||
最终按样本输出表格(建议 CSV/Markdown;字段可从批量 JSON **`results[]`** 各条中取):
|
||||
|
||||
- 公司:`sample.company`
|
||||
- 部门:`sample.department`
|
||||
- 被访人 `personId`:`args.meng_person_id`
|
||||
- 访客 `personId`:`args.resolved_visitor_person_id`
|
||||
- **`add/visitor` 业务码**:`steps.add_visitor.business_code`(及 `http_status`)
|
||||
- **`passRule/image`**:`steps.passrule_image` 内的 `business_code` / `http_status`
|
||||
- 楼层数量:`derived.floor_count`
|
||||
- 楼层清单:`derived.floors`(元素含 `zoneId`/`zoneName`)
|
||||
- 安全分档:`grade`、`summary`
|
||||
|
||||
控制台会摘要打印 `company/department`、`addCode`、`floorCount`;完整以 JSON 为准。
|
||||
|
||||
批量汇总文件:**默认** `report/batch-summary.json`;若使用了 `--batch-output-summary`(如 §4.0 的 `batch-preset-static-*.json`),则路径为 **`report/` + 传入文件名**。
|
||||
|
||||
### 4.6 人工 SQL 核查最终结果(最后一步)
|
||||
|
||||
- §4.0 固定 25 号段:**优先**执行 `sql/标准批量25访客-执行后核验.sql`。
|
||||
- 其它访客清单或单笔核对:执行 `sql/人工核查最终楼层结果.sql`,自行替换 `IN (...)`。
|
||||
|
||||
核查要点:
|
||||
- 按本次访客ID集合过滤,确认 `person_delete=0` 的有效规则;
|
||||
- 对比 `zone_id` 与脚本输出楼层清单;
|
||||
- 如存在历史残留,结合 `create_time` / **`last_update_time`**(`image_rule_ref`)判定最新记录。
|
||||
|
||||
### 4.7 业务侧整改后关键日志检查点
|
||||
|
||||
本版整改聚焦业务策略链路,不调整鉴权逻辑。应用日志需出现:
|
||||
|
||||
- 策略决策日志(`PersonRuleServiceImpl`)含字段:
|
||||
- `policyDecision`、`hostFloorSize`、`allowFloorSize`、`effectiveFloorSize`(有一条覆盖生效日志中占位名为 `effectiveSize`,与同次决策中的楼层数量一致)、`policyId`、`policyVersion`
|
||||
|
||||
失败路径上的告警亦多为 `WARN`/`INFO`(如「访客派梯楼层决策失败-…」「allow_zone_ids JSON 无效」),便于在无 DEBUG 前提下排查。**是否仍存在「仅为探针、且仍为 DEBUG」的日志行,请以当前发布包镜像实际 `logback` 与源码为准逐项核对**。
|
||||
|
||||
## 5. 证据留档
|
||||
|
||||
至少归档以下内容:
|
||||
|
||||
1. 执行命令
|
||||
2. 脚本输出摘要(控制台)
|
||||
3. 生成的 JSON:**单样本** `report/quick-verify-*.json`;**标准批量** `report/batch-preset-static-*.json` 或其他 `--batch-output-summary` 指定名
|
||||
4. **`sql/标准批量25访客-执行后核验.sql`(或等价)查询导出**与其它 SQL 核验结果一并留档
|
||||
5. 关键接口返回截图/日志
|
||||
@@ -0,0 +1,162 @@
|
||||
# 访客无鉴权策略验证-生产操作手册
|
||||
|
||||
## 1. 文档目的
|
||||
|
||||
本手册用于生产环境执行以下验证并留痕:
|
||||
|
||||
- 在**无鉴权模式**下调用访客相关接口,确认是否存在放开风险。
|
||||
- 验证“黄平(访客)访问蒙海文(被访人)”是否触发访客楼层策略。
|
||||
- 输出可审计报告(JSON)用于归档与发布。
|
||||
|
||||
本手册基于已确认信息:
|
||||
|
||||
- 被访人(蒙海文)`personId=964454497399468032`
|
||||
- 访客(黄平)`personId=1102270499947507712`
|
||||
- 租户 `businessId=2524639890ba4f2cba9ba1a4eeaa4015`
|
||||
|
||||
---
|
||||
|
||||
## 2. 目录与交付件
|
||||
|
||||
本发布包目录:
|
||||
|
||||
- `docs/testing/release-visitor-noauth-verify/访客无鉴权策略验证-生产操作手册.md`
|
||||
- `docs/testing/release-visitor-noauth-verify/黄平访客ID手工查询.sql`
|
||||
|
||||
执行脚本(仓库已有,已按无鉴权流程更新):
|
||||
|
||||
- `maven-cw-elevator-application/tools/visitor_floor_verification/scripts/quick_verify_visitor_floor_policy.py`
|
||||
|
||||
---
|
||||
|
||||
## 3. 验证范围
|
||||
|
||||
本次仅验证以下调用链:
|
||||
|
||||
1. `POST /component/person/detail`
|
||||
2. `POST /elevator/person/add/visitor`
|
||||
3. `POST /elevator/passRule/image`
|
||||
|
||||
请求模式:
|
||||
|
||||
- `noauth-probe`(不传 Authorization/loginid/platformuserid/applicationid)
|
||||
- 可选保留 `businessid` 头:`--probe-with-businessid`
|
||||
|
||||
---
|
||||
|
||||
## 4. 前置条件
|
||||
|
||||
### 4.1 运行环境
|
||||
|
||||
- 可访问生产网络的 Linux 主机
|
||||
- Python 3.8+
|
||||
- 已拉取本仓库代码
|
||||
|
||||
### 4.2 依赖安装
|
||||
|
||||
```bash
|
||||
cd maven-cw-elevator-application/tools/visitor_floor_verification
|
||||
python3 -m pip install -r requirements.txt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 参数基线
|
||||
|
||||
建议使用以下固定参数:
|
||||
|
||||
- `org-base-url`:`http://10.0.22.207:8089`(按现场网关/portal入口可调整)
|
||||
- `elevator-base-url`:`http://10.0.22.207:16112`
|
||||
- `business-id`:`2524639890ba4f2cba9ba1a4eeaa4015`
|
||||
- `meng-person-id`:`964454497399468032`
|
||||
- `visitor-person-id`:`1102270499947507712`
|
||||
|
||||
说明:
|
||||
|
||||
- 当前脚本内置默认 `--meng-person-id=964454497399468032`,可不显式传参。
|
||||
|
||||
---
|
||||
|
||||
## 6. 标准执行命令
|
||||
|
||||
```bash
|
||||
python3 maven-cw-elevator-application/tools/visitor_floor_verification/scripts/quick_verify_visitor_floor_policy.py \
|
||||
--mode noauth-probe \
|
||||
--org-base-url "http://10.0.22.207:8089" \
|
||||
--elevator-base-url "http://10.0.22.207:16112" \
|
||||
--business-id "2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
--visitor-person-id "1102270499947507712" \
|
||||
--probe-with-businessid
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 输出与结果判定
|
||||
|
||||
脚本终端会输出:
|
||||
|
||||
- `mode`
|
||||
- `grade`
|
||||
- `summary`
|
||||
- `report`(报告文件路径)
|
||||
- `add_visitor_status/code`
|
||||
- `passrule_image_status/code`
|
||||
|
||||
报告文件输出目录:
|
||||
|
||||
- `maven-cw-elevator-application/tools/visitor_floor_verification/report/quick-verify-<timestamp>.json`
|
||||
|
||||
### 7.1 关键判定规则
|
||||
|
||||
#### A. 无鉴权风险判定(noauth-probe)
|
||||
|
||||
- `grade=high_risk`:`add/visitor` 在无鉴权下业务成功,判定高风险放开。
|
||||
- `grade=expected_block`:返回 401/403,判定符合安全预期。
|
||||
- `grade=needs_review`:非拦截但未成功,需人工复核网关策略。
|
||||
|
||||
#### B. 策略触发判定
|
||||
|
||||
- 若 `add/visitor` 成功,且 `passRule/image` 回读到楼层数据,判定策略触发成功。
|
||||
- 若 `add/visitor` 返回 `76260532`,表示策略求交为空(策略生效但无可放行楼层)。
|
||||
|
||||
---
|
||||
|
||||
## 8. 黄平访客ID手工复核
|
||||
|
||||
可执行以下命令打印 SQL 模板:
|
||||
|
||||
```bash
|
||||
python3 maven-cw-elevator-application/tools/visitor_floor_verification/scripts/quick_verify_visitor_floor_policy.py \
|
||||
--print-visitor-sql-only \
|
||||
--org-base-url "http://10.0.22.207:8089" \
|
||||
--elevator-base-url "http://10.0.22.207:16112" \
|
||||
--visitor-person-id "dummy"
|
||||
```
|
||||
|
||||
或直接使用本包 SQL 文件:
|
||||
|
||||
- `docs/testing/release-visitor-noauth-verify/黄平访客ID手工查询.sql`
|
||||
|
||||
---
|
||||
|
||||
## 9. 发布归档建议
|
||||
|
||||
建议将以下文件打包归档:
|
||||
|
||||
1. 本操作手册
|
||||
2. SQL 文件
|
||||
3. 实际执行命令记录
|
||||
4. `quick-verify-<timestamp>.json` 报告
|
||||
5. 关键日志截图(含执行时间与业务码)
|
||||
|
||||
建议包名:
|
||||
|
||||
- `visitor-noauth-verify-<yyyyMMdd-HHmm>.zip`
|
||||
|
||||
---
|
||||
|
||||
## 10. 风险提示
|
||||
|
||||
- 本流程为生产探测,务必在低峰窗口执行。
|
||||
- 无鉴权探测若成功,属于安全风险项,应立即同步网关/服务鉴权负责人处理。
|
||||
- 所有返回结果以现场实际响应为准,需保留原始响应证据。
|
||||
@@ -0,0 +1,20 @@
|
||||
-- 访客:黄平(手机号 13926442944)手工查询 SQL
|
||||
-- 场景:生产环境复核/确认访客 person_id
|
||||
-- 已知租户:2524639890ba4f2cba9ba1a4eeaa4015
|
||||
-- 已确认库表:component-organization.cw_is_person
|
||||
|
||||
SELECT
|
||||
person_id,
|
||||
name,
|
||||
mobile,
|
||||
business_id,
|
||||
labels,
|
||||
deleted,
|
||||
create_time,
|
||||
update_time
|
||||
FROM `component-organization`.`cw_is_person`
|
||||
WHERE business_id = '2524639890ba4f2cba9ba1a4eeaa4015'
|
||||
AND name = '黄平'
|
||||
AND mobile = '13926442944'
|
||||
ORDER BY update_time DESC;
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
# 租户访客默认楼层(广发及后续租户定制)与「不影响其他公司」的边界说明
|
||||
|
||||
## 1. 目标表述
|
||||
|
||||
| 诉求 | 含义 |
|
||||
|------|------|
|
||||
| **定制** | 某租户希望:访客在 **不传 `floorIds`** 时,仅开通 **接待层等默认楼层**(与员工本人多层权限区分)。 |
|
||||
| **不影响未定义公司** | 未启用该能力的租户 / 机构,行为与改造前一致:**不因他人策略误伤**。 |
|
||||
|
||||
实现落点在本仓库:**`PersonRuleServiceImpl#addVisitor`** + 表 **`tenant_visitor_floor_policy`**(详见 `visitor-registration-business-flow.md`)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 当前实现下的真实隔离粒度(必读)
|
||||
|
||||
### 2.1 策略生效键:**`business_id`(机构/租户 ID)**
|
||||
|
||||
- DAO:**`TenantVisitorFloorPolicyDao#selectEnabledTenantDefault(businessId)`**
|
||||
- SQL(节选):`WHERE business_id = ? AND enabled = 1 AND policy_type = 'INTERSECT_ALLOWLIST' AND (building_id IS NULL OR building_id = '')`
|
||||
- **含义**:一行策略绑定的是 **Cloudwalk 上下文里的 `companyId`(即 Header `businessid`)**,不是单个「公司名称字符串」,也不是单个部门 `org_id`。
|
||||
|
||||
### 2.2 「未定义」租户的行为 — **不受影响**
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph T1["租户 A:库中无策略行"]
|
||||
A1[addVisitor floorIds 空]
|
||||
A2[detail 取 host floorList]
|
||||
A3[selectEnabledTenantDefault → null]
|
||||
A4[effectiveFloors = hostFloors 全集]
|
||||
A1 --> A2 --> A3 --> A4
|
||||
end
|
||||
subgraph T2["租户 B:有启用策略"]
|
||||
B1[detail 取 host floorList]
|
||||
B2[与 allow_zone_ids 求交]
|
||||
B1 --> B2
|
||||
end
|
||||
```
|
||||
|
||||
- **无策略行**或 **enabled≠1**:代码分支 **不执行求交**,访客楼层等同于 **被访人 `floorList`**(在「不传 floorIds」前提下)。
|
||||
→ **其他未配置策略的 `business_id`**:逻辑 **不变**,满足「未定义则不收紧」。
|
||||
|
||||
### 2.3 「广发定制」与同一 `business_id` 下其他部门 — **当前同属租户级策略**
|
||||
|
||||
- 若 **星河湾中心**与 **广发基金**等业务共用一个 **`business_id`**(现场组织库 `cw_is_organization.BUSINESS_ID` 相同),则 **库中一条租户默认策略会对该 ID 下全部主体生效**,**无法**仅靠配置表做到「只收紧广发公司、不收紧同租户下其他公司」。
|
||||
- **产品级隔离选项(需实施选型,超出当前表结构默认能力)**:
|
||||
- **拆租户**:广发使用 **独立 `business_id`**(独立机构树),策略只插入该行;或
|
||||
- **演进能力**:使用/扩展 **`building_id`** 维度的策略行(表已预留列,需扩展 Mapper 查询与产品规则);或
|
||||
- **调用方传 `floorIds`**:由 BFF 按公司算出楼层,电梯不再依赖默认求交。
|
||||
|
||||
---
|
||||
|
||||
## 3. 业务流程图(有 / 无策略)
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([POST /elevator/person/add/visitor]) --> Empty{floorIds 空?}
|
||||
Empty -- 否 --> UseIn[使用传入 floorIds]
|
||||
Empty -- 是 --> Det[PersonService.detail 被访人 personId]
|
||||
Det --> HF{floorList 非空?}
|
||||
HF -- 否 --> E31[76260531]
|
||||
HF -- 是 --> Pol{存在启用租户默认策略且 allow 非空?}
|
||||
Pol -- 否 --> UseIn2[effectiveFloors = floorList]
|
||||
Pol -- 是 --> Xsect[floorList ∩ allow_zone_ids]
|
||||
Xsect --> Xe{交集非空?}
|
||||
Xe -- 否 --> E32[76260532]
|
||||
Xe -- 是 --> UseIn3[effectiveFloors = 交集]
|
||||
UseIn --> Zone[首层→楼栋→imageStoreId]
|
||||
UseIn2 --> Zone
|
||||
UseIn3 --> Zone
|
||||
Zone --> IRR[写 image_rule_ref personId=visitorId]
|
||||
IRR --> Bind[图库 batchBind visitorId]
|
||||
Bind --> OK([成功])
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 时序图(不传 floorIds + 有策略)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Caller as 调用方/BFF
|
||||
participant API as AcsPersonController
|
||||
participant PR as PersonRuleServiceImpl
|
||||
participant PS as PersonService 组件
|
||||
participant Pol as TenantVisitorFloorPolicyDao
|
||||
participant Ir as ImageRuleRefDao
|
||||
participant IS as ImageStorePersonService
|
||||
|
||||
Caller->>API: visitorId, personId(被访人), floorIds=[]
|
||||
API->>PR: addVisitor
|
||||
PR->>PS: detail(personId, businessId)
|
||||
PS-->>PR: PersonResult.floorList
|
||||
PR->>Pol: selectEnabledTenantDefault(businessId)
|
||||
Pol-->>PR: allow_zone_ids JSON
|
||||
Note over PR: effectiveFloors = intersect(floorList, allow)
|
||||
PR->>Ir: insertList 每层默认规则 visitorId
|
||||
PR->>IS: batchBind(visitorId, 访期)
|
||||
IS-->>PR: ok
|
||||
PR-->>API: success
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 与测试矩阵的关系
|
||||
|
||||
- **自动化快照**按 **`business_id`** 拉策略与人员;若需验证「无策略租户」,使用 **第二 `business_id`** 套件或 **空策略库**。
|
||||
- **每部门 10 名员工**:验证「同一策略下不同被访人 floorList」与求交结果多样性;**不**等价于「按公司隔离策略」。
|
||||
|
||||
---
|
||||
|
||||
## 6. 文档索引
|
||||
|
||||
- 租户 / 组织 / 人员 / 访客 ER、表关系与用例:`docs/architecture/租户组织人员访客-数据模型与用例.md`
|
||||
- 楼层与 API 字段:`docs/testing/visitor-registration-business-flow.md`
|
||||
- 服务层逐步说明:`cw-elevator-application-service/docs/08-visitor-registration-and-elevator-auth.md`
|
||||
- 测试方案:`docs/testing/visitor-registration-floor-validation.md`
|
||||
@@ -0,0 +1,123 @@
|
||||
# 访客注册与派梯:被访人、访客与楼层 — 源码级业务流程
|
||||
|
||||
> 本文与 `**cw-elevator-application-service/docs/08-visitor-registration-and-elevator-auth.md**` 互补:08 偏「接口步骤清单」,本文强调 **被访人 / 访客 / 楼层** 三者关系与 **类方法落点**。电梯应用不负责完整「访客档案登记 UI」,但 `**add/visitor` 显式依赖两条人员主键**。
|
||||
|
||||
---
|
||||
|
||||
## 1. 术语(避免混用)
|
||||
|
||||
|
||||
| 称呼 | HTTP / 参数字段 | 含义 | 数据哪里来 |
|
||||
| ----------- | ----------------------------- | ----------------------------------------------------- | -------------------------------------------- |
|
||||
| **访客** | `visitorId` | 已在**平台人员体系**存在的档案 ID(登记/同步发生在访客业务或 CWOS 组件侧) | 组织库 `cw_is_person` 等;常打 **「访客」标签** |
|
||||
| **被访人(员工)** | `personId` | **接待访客的员工**,用于在 **未传 `floorIds`** 时拉取其可派梯楼层 | 同库在职人员,与 `cw_is_person_organization_ref` 挂组织 |
|
||||
| **生效楼层** | 内部 `param.floorIds`(可能由服务端改写) | 最终写入 `**image_rule_ref`**、绑定图库的 **楼层 zoneId 列表**(雪花串) | 见 §3 |
|
||||
|
||||
|
||||
**易错点**:`personId` **不是**访客 ID,而是**被访员工** ID。
|
||||
|
||||
---
|
||||
|
||||
## 2. 端到端角色关系(产品语义)
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph 登记域["登记域(多在外部/组件)"]
|
||||
V["访客档案 visitorId"]
|
||||
H["员工档案 personId\n被访人"]
|
||||
end
|
||||
subgraph 电梯域["电梯应用"]
|
||||
A["POST /elevator/person/add/visitor"]
|
||||
R["image_rule_ref\npersonId=visitorId"]
|
||||
end
|
||||
H -->|Feign detail 取 floorList| A
|
||||
V --> A
|
||||
A --> R
|
||||
```
|
||||
|
||||
|
||||
|
||||
- **访客要访问的是员工(被访人)** → API 上体现为:用 `**personId`** 定位被访人,用 `**visitorId**` 定位访客档案。
|
||||
- **电梯侧写规则**:按 `**visitorId`** 在各区写入规则引用(`ImageRuleRefAddDto.personId = visitorId`),**不是**写在被访人名下。
|
||||
|
||||
---
|
||||
|
||||
## 3. 楼层从哪里来(核心业务逻辑)
|
||||
|
||||
实现类:`**PersonRuleServiceImpl#addVisitor`**(`person/impl/PersonRuleServiceImpl.java`)。
|
||||
|
||||
### 3.1 调用方 **传入非空 `floorIds`**
|
||||
|
||||
- **跳过**被访人详情与租户策略整段。
|
||||
- **直接使用**调用方给出的楼层列表作为 `**effectiveFloors`**(需非空,否则 `76260531`)。
|
||||
- **责任**:楼层合法性、是否仍应受租户策略约束,由调用方或上游 BFF 保证(产品文档另有说明)。
|
||||
|
||||
### 3.2 调用方 **未传 / 空 `floorIds`(常见访客路径)**
|
||||
|
||||
1. `**PersonService#detail`**(Feign,组件 `**/component/person/detail**`)
|
||||
- 入参:`PersonDetailParam.id = param.getPersonId()`(**被访人**)、`businessId = context.getCompany().getCompanyId()`。
|
||||
- 出参:`**PersonResult.getFloorList()`** → 记为 `**hostFloors**`(字符串列表,元素为电梯域认可的 **zoneId**,雪花形态,与 `**image_rule_ref.zone_id`** 一致)。
|
||||
2. **失败分支**
|
||||
- detail 失败 / 无数据 / `**hostFloors` 为空** → `**76260531`**(无可用楼层依据)。
|
||||
3. **租户默认策略(可选收窄)**
|
||||
- `**TenantVisitorFloorPolicyDao#selectEnabledTenantDefault(companyId)`** → 表 `**tenant_visitor_floor_policy**`。
|
||||
- 条件:`enabled=1`、`policy_type=INTERSECT_ALLOWLIST`、租户级默认(`building_id` 空)。
|
||||
- `**allow_zone_ids**`:JSON 字符串数组,解析为 `**allowSet**`。
|
||||
- **生效楼层**:`**effectiveFloors = hostFloors 按原顺序过滤,仅保留 ∈ allowSet`**(`intersectPreserveHostOrder`)。
|
||||
- 若交集 **为空** → `**76260532`**(与租户允许楼层无交集)。
|
||||
4. **首层 → 楼栋 → 图库**
|
||||
- 取 `**effectiveFloors.get(0)`**,`**ZoneService#page**` 得 `**ZoneResult**`,再 `**deviceImageStoreDao.getByBuildingId(首层 parentId)**` → `**imageStoreId**`。
|
||||
5. **逐层写规则 + 绑访客图库**
|
||||
- 对每个 floorId:`**imageRuleRefDao.getDefaultByZoneId`** → 组装 `**ImageRuleRefAddDto**`,`**personId = param.getVisitorId()**`(访客)。
|
||||
- `**imageStorePersonService.batchBind**`:把 **访客** 绑到该楼栋图库,访期 `**begVisitorTime` / `endVisitorTime`**。
|
||||
- `**updateGroupPersonRef**`:同步组人员引用。
|
||||
|
||||
### 3.3 小结公式
|
||||
|
||||
- **无显式 floorIds 时**:
|
||||
|
||||
\text{effectiveFloors} = \begin{cases}
|
||||
\text{hostFloors} & \text{无启用策略或 allow 为空}
|
||||
\text{hostFloors} \cap \text{allowzoneids} & \text{策略启用且 allow 非空}
|
||||
\end{cases}
|
||||
|
||||
- **交集为空** → `**76260532`**;**hostFloors 为空** → `**76260531`**。
|
||||
|
||||
---
|
||||
|
||||
## 4. 与「访客注册」一词的边界
|
||||
|
||||
|
||||
| 步骤 | 是否在电梯仓实现 |
|
||||
| ------------------------------------ | ------------------ |
|
||||
| 访客姓名/证件/人脸建档、预约单 | **否**(外部系统 / 组件) |
|
||||
| 拿到 `**visitorId` + 被访员工 `personId`** | 前置条件 |
|
||||
| **派梯授权**(写规则 + 绑图库) | **是**,`addVisitor` |
|
||||
|
||||
|
||||
因此:**完整「访客注册」业务** = 外部登记 + **本接口授权**;本文楼层逻辑仅覆盖授权链。
|
||||
|
||||
---
|
||||
|
||||
## 5. 关键源码索引
|
||||
|
||||
|
||||
| 步骤 | 类 / 方法 |
|
||||
| ------- | ---------------------------------------------------------- |
|
||||
| HTTP 入口 | `AcsPersonController` → `/elevator/person/add/visitor` |
|
||||
| 聚合逻辑 | `PersonRuleServiceImpl#addVisitor` |
|
||||
| 被访人楼层 | `PersonService#detail` → `PersonResult#getFloorList` |
|
||||
| 租户策略 | `TenantVisitorFloorPolicyDao#selectEnabledTenantDefault` |
|
||||
| 策略表 | `tenant_visitor_floor_policy` |
|
||||
| 规则落库 | `ImageRuleRefDao#getDefaultByZoneId` / `insertList` |
|
||||
| 图库 | `ImageStorePersonService#batchBind`、`updateGroupPersonRef` |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 6. 测试数据在建模上的要求
|
||||
|
||||
- **每条用例**应能指向:**组织 / 部门**、**一名被访员工(host)**、**一名访客(visitor)**。
|
||||
- 导出脚本从 DB 解析:**员工** = 部门下在职人员;**访客** = 带「访客」标签的人员池,按套件 `**business_id`** 过滤,与用例 **轮询配对**(避免同源语义缺失)。
|
||||
- 详见 `**tools/visitor_floor_verification/config/test_matrix.json`** 与导出快照 `**host_employee` / `visitor_for_api**` 字段。
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
# 访客注册(派梯开通)与可达楼层验证 — 测试方案与计划
|
||||
|
||||
## 0. 关联文档
|
||||
|
||||
- **租户 / 组织 / 人员 / 访客 ER 与表关系**:`docs/architecture/租户组织人员访客-数据模型与用例.md`
|
||||
- **被访人 / 访客 / 楼层逻辑(源码走查)**:`docs/testing/visitor-registration-business-flow.md`
|
||||
- **服务层逐步说明与活动图(与 08 同谱系)**:`maven-cw-elevator-application/cw-elevator-application-service/docs/08-visitor-registration-and-elevator-auth.md`
|
||||
- **租户定制默认楼层 vs 未定义租户隔离边界(流程图/时序图)**:`docs/testing/tenant-visitor-default-floor-isolation.md`
|
||||
|
||||
### 0.1 数据模型(测试矩阵 v3)
|
||||
|
||||
- **`export_settings.employees_per_department`**:每部门导出员工人数(默认 **10**),写入快照 **`host_employees`**。
|
||||
- **`visitor_resolution.pool_limit`**:访客标签池上限(与 **`visitor_pool_limit`** 取大)。
|
||||
|
||||
- **`personId`(被访人)**:**员工**;导出按部门取最多 N 人写入 **`host_employees[]`**(N 见矩阵 `employees_per_department`)。
|
||||
- **`visitorId`(访客)**:**访客档案**(「访客」标签);导出为 **每名员工** 分配 **`visitor_for_api`**(全局槽位轮询);`test_matrix.json` 中部门级 **`visitor_person_id`** 可令该部门全部员工共用同一访客。
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景与范围
|
||||
|
||||
### 1.1 业务链路(电梯应用)
|
||||
|
||||
- **接口**:`POST /elevator/person/add/visitor`,请求体 `floorIds` **为空**时,服务内部:
|
||||
1. Feign 调用组织组件 `**/component/person/detail`**,取被访人 `**floorList`**(雪花 `zone_id` 字符串列表)。
|
||||
2. 查询 `**tenant_visitor_floor_policy**`(租户默认策略,`business_id` = 登录上下文机构)。
|
||||
3. 策略为 `**INTERSECT_ALLOWLIST**` 且启用时:**生效楼层 = `floorList ∩ allow_zone_ids`**(顺序保留被访人顺序)。
|
||||
4. 交集为空 → 业务码 `**76260532**`;否则按生效楼层写 `**image_rule_ref**` 并绑图库。
|
||||
- **回读验收**:`POST /elevator/passRule/image`,`personId` = 访客 ID,从 `**data[]`** 读取 `zoneId` / `zoneName`。
|
||||
|
||||
### 1.2 当前库内策略现状(重要)
|
||||
|
||||
- `**tenant_visitor_floor_policy`** 按 `**business_id**` 维度生效;现场 `**cw-elevator-application**` 中为租户 `**2524639890ba4f2cba9ba1a4eeaa4015**`(与组织库 `**cw_is_organization.BUSINESS_ID**` 一致)配置了广发接待层 **28F** 对应 `**zone_id`**。
|
||||
- **含义**:凡使用该 `**business_id`** 登录的星河湾/星中心主体(含非「广发」名字的部门),在未显式传 `floorIds` 时**同样**适用「与 allowlist 求交」——验收与风险评估时需写明该前提;若产品上要「仅广发主体生效」,需另行产品设计(如楼栋/机构维度策略扩展),**不在本脚本假定范围内**。
|
||||
|
||||
### 1.3 现场组织库事实(`component-organization`)
|
||||
|
||||
- `**BUSINESS_ID = 2524639890ba4f2cba9ba1a4eeaa4015`**:根机构 `**星河湾中心`**,其下含 **[28-38F]广发基金管理有限公司** 及其 **9 个子部门**(合计 **10** 个节点:1 公司 + 9 部门),为本方案 **「广发基金套件」** 覆盖对象。
|
||||
- `**BUSINESS_ID = 9f19a307b3ea4854bf2d7dafe69649c9`**:仅 `**默认根节点`**;现场 `**cw_is_person**` 侧未见该租户人员——**联调用例若依赖在职被访人**,可能无法执行;保留为「策略缺失对照」说明项。
|
||||
- **命名**:文中「星河湾中心」为现场 **`cw_is_organization`** 根节点 **`NAME`** 示例;口语「星河湾集团」等与库内节点全称不一定一一对应,请以现场 **`NAME`/`ID`** 为准。租户 / 组织 / 人员 / 访客 ER 与术语见 [`docs/architecture/租户组织人员访客-数据模型与用例.md`](../architecture/租户组织人员访客-数据模型与用例.md)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 测试层级定义
|
||||
|
||||
|
||||
| 层级 | 名称 | 手段 | 产出 |
|
||||
| ------ | ------ | --------------------------------------------------------- | ----------------------- |
|
||||
| **L0** | 数据导出 | MySQL 读组织、策略、样例人员 | `catalog_snapshot.json` |
|
||||
| **L1** | 静态一致性 | 校验导出 JSON 内 suite 与策略字段口径 | 控制台 / 报告一节 |
|
||||
| **L2** | 联机楼层验收 | 调用 `**add/visitor`**(`floorIds=[]`)+ `**passRule/image`** | Markdown 报告 |
|
||||
| **L3** | 可选扩展 | 对接组件 `**/component/person/detail`** 预计算交集(需另行网关/脚本权限) | 未默认启用 |
|
||||
|
||||
|
||||
说明:**被访人 `floorList` 不可仅从电梯库推导**(以组件为准),故 **L2** 以「开通结果 + 回读楼层」为权威验收;若需预知交集,须 **L3** 或人工查组件。
|
||||
|
||||
---
|
||||
|
||||
## 3. 测试套件与用例矩阵(摘要)
|
||||
|
||||
### 3.1 `guangfa_fund_10` — 广发基金管理有限公司 subtree(10)
|
||||
|
||||
|
||||
| # | 组织 ID(节选) | 名称 |
|
||||
| ---- | ---------------------------------------- | --------------------------- |
|
||||
| 1 | `488b8ad049bb43408a6fbcc50bcb89ac` | [28-38F]广发基金管理有限公司 |
|
||||
| 2~10 | 其子部门(含 `32F-广发外包`、`信息技术部`、`公司领导` 等共 9 个) | 见 `config/test_matrix.json` |
|
||||
|
||||
|
||||
**每条用例**:同一租户上下文(Header `businessid`)下,指定 **被访人 `personId`**(从该部门导出 **1 名在职人员**)、**访客 `personId`**(测试账号)、访客有效期;不传 `**floorIds**`。
|
||||
|
||||
**期望类型(L2)**:
|
||||
|
||||
- **成功路径**:`add/visitor` 返回成功码;`passRule/image` 中 `**zoneName` 均落在策略允许集合对应的楼层展示名**(现场允清单示例:**28F**,正则可在脚本中用 `--allowed-zone-name-regex` 约束)。
|
||||
- **失败路径**:若组件返回的被访人 `**floorList`** 与 `**allow_zone_ids`** 无交集 → `**76260532**`,记为 **EXPECTED_FAIL**,断言业务码而非楼层列表。
|
||||
|
||||
### 3.2 `xinghewan_star_center` — 星河湾 / 星中心代表部门(非广发字样)
|
||||
|
||||
从 `**星河湾中心`** 根下选取包含 **「星河湾」「星中心」** 语义的部门若干(示例:**星河湾集团总部**、**星中心物管公司**),每部门 **1** 名被访人样例。
|
||||
|
||||
**期望**:与 **3.1** 相同租户策略下,仍应按「求交」结果开通或失败(不得以「非广发」跳过策略)。
|
||||
|
||||
### 3.3 `tenant_secondary` — 第二 `BUSINESS_ID`(对照)
|
||||
|
||||
- **目的**:无 `**tenant_visitor_floor_policy`** 行时,行为应与「未收窄」一致(以组件 `**floorList`** 为准);现场若无人员,标记 **SKIP**。
|
||||
|
||||
---
|
||||
|
||||
## 4. 测试数据约定
|
||||
|
||||
|
||||
| 数据项 | 来源 | 说明 |
|
||||
| -------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
|
||||
| `business_id` | Header `**businessid`** | 与 DB `**tenant_visitor_floor_policy.business_id`**、组织 `**BUSINESS_ID**` 一致 |
|
||||
| 被访人 `personId` | MySQL `cw_is_person` + `cw_is_person_organization_ref` | 导出脚本按 `**ORG_ID**` 取 **每部门 1 人** |
|
||||
| 访客 `personId` | 测试环境固定账号 | **环境变量 `VISITOR_TEST_PERSON_ID`**(或脚本参数);勿用生产真实访客随意写入 |
|
||||
| 访客有效期 | `begVisitorTime` / `endVisitorTime` | 毫秒时间戳;避免重叠冲突可调脚本 `--window-days` |
|
||||
| 允许楼层参照 | `tenant_visitor_floor_policy.allow_zone_ids` + `cw_is_area`(`cwos_portal`) | 展示名校验用 `**zoneName**`(如 **28F**) |
|
||||
|
||||
|
||||
详细字段级快照见仓库 `**maven-cw-elevator-application/tools/visitor_floor_verification/data/`**(导出生成)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 准入 / 准出标准
|
||||
|
||||
**准入**
|
||||
|
||||
- 电梯服务可访问(`BASE_URL`);网关鉴权头 `**ELEVATOR_HEADER_*`** 已配置;
|
||||
- MySQL 可从运行脚本环境访问(导出阶段);
|
||||
- 已书面确认:**租户级策略** 对全体使用该 `business_id` 的主体生效。
|
||||
|
||||
**准出**
|
||||
|
||||
- `catalog_snapshot.json` 生成成功且含三类套件定义;
|
||||
- L2 报告:**通过率 / SKIP / FAIL** 可区分;失败附 `**code`** 与响应摘要;
|
||||
- 对 `**EXPECTED_FAIL`**(交集为空)类用例,业务码符合 `**76260532**`。
|
||||
|
||||
---
|
||||
|
||||
## 6. 执行顺序建议
|
||||
|
||||
1. `python scripts/export_catalog.py` → 刷新快照(依赖 DB)。
|
||||
2. 复核快照内 `**sample_host_person_id**` 是否为在职账号。
|
||||
3. `python scripts/run_visitor_floor_suite.py --phase report`(仅导出校验)或 `**--phase live**`(联机)。
|
||||
4. 归档报告 `**report/visitor-floor-suite-<timestamp>.md**`。
|
||||
|
||||
---
|
||||
|
||||
## 7. 仓库内工件路径(索引)
|
||||
|
||||
|
||||
| 工件 | 路径 |
|
||||
| ----------------------------- | ---------------------------------------------------------------------------------------- |
|
||||
| 测试方案与计划(本文档) | `docs/testing/visitor-registration-floor-validation.md` |
|
||||
| 套件矩阵(广发10 + 星河湾/星中心 + 第二租户占位) | `maven-cw-elevator-application/tools/visitor_floor_verification/config/test_matrix.json` |
|
||||
| **导出快照(建议纳入变更或由内网生成)** | `.../tools/visitor_floor_verification/data/catalog_snapshot.json` |
|
||||
| 导出脚本 | `.../scripts/export_catalog.py` |
|
||||
| 报告 / 联机执行脚本 | `.../scripts/run_visitor_floor_suite.py` |
|
||||
| 报告输出目录 | `.../tools/visitor_floor_verification/report/` |
|
||||
|
||||
|
||||
策略初始化 SQL(广发 28F allowlist)见 `docs/sql/tenant_visitor_floor_policy_init_guangfa_fund.sql`。
|
||||
|
||||
---
|
||||
|
||||
## 8. 风险与限制
|
||||
|
||||
- **重复开通**:同一访客短期内多次 `add/visitor` 可能叠加规则或触发远端校验失败;建议使用 **专用测试访客** 或拉长有效期区间。
|
||||
- **环境与生产**:口令与 URL **勿提交仓库**;快照 JSON 若含真实 ID,纳入内部介质分发策略。
|
||||
- **策略维度**:当前库表 **无「仅广发」机构字段**;跨部门验收等价验证「同一租户策略」。
|
||||
@@ -0,0 +1,307 @@
|
||||
# 广发基金访客被访楼层接口生产验证操作文档
|
||||
|
||||
## 1. 目标与范围
|
||||
|
||||
本文用于生产环境验证以下事项:
|
||||
|
||||
- 广发基金租户下,访客开通接口在不传 `floorIds` 时,是否按被访人楼层与租户策略进行处理。
|
||||
- 验证对象固定为广发基金员工 **蒙海文** 的关联信息(`personId`、`businessId`、`floorList`)。
|
||||
- 输出可审计的执行记录,包含输入参数、返回结果、结论与留痕。
|
||||
|
||||
说明:本操作仅做接口调用和数据核验,不修改生产配置、不执行策略变更 SQL。
|
||||
|
||||
## 2. 前置条件
|
||||
|
||||
### 2.1 必备信息
|
||||
|
||||
- 电梯服务地址:`ELEVATOR_BASE_URL`(示例:`http://<host>:16112`)。
|
||||
- 组织服务地址:`ORG_BASE_URL`(示例:`http://<host>:17016` 或网关地址)。
|
||||
- 广发基金租户 `businessId`:`2524639890ba4f2cba9ba1a4eeaa4015`。
|
||||
- 测试访客 `visitorId`(专用测试账号,避免使用真实业务访客)。
|
||||
- 鉴权头(按现场网关要求):`authorization`、`loginid`、`platformuserid`、`applicationid`。
|
||||
|
||||
### 2.2 风险提示
|
||||
|
||||
- 生产环境调用会产生真实接口访问日志,请在低峰时段执行。
|
||||
- `add/visitor` 会写入访客通行规则,建议只使用测试访客并设置短期有效期。
|
||||
- 若现场策略已变更,需先复核 `tenant_visitor_floor_policy` 再执行。
|
||||
|
||||
## 3. 蒙海文关联信息确认(必做)
|
||||
|
||||
先确认“蒙海文”在组织服务中的关键关联信息,作为后续请求入参依据。
|
||||
|
||||
### 3.1 确认项清单
|
||||
|
||||
- 员工姓名:蒙海文
|
||||
- 员工 `personId`:`<MENG_HAI_WEN_PERSON_ID>`
|
||||
- 员工 `businessId`:`2524639890ba4f2cba9ba1a4eeaa4015`
|
||||
- 员工 `floorList`:`["..."]`(至少 1 个楼层 ID)
|
||||
|
||||
### 3.2 被访人详情接口请求模板(输入参数)
|
||||
|
||||
接口:`POST /component/person/detail`
|
||||
|
||||
请求头模板:
|
||||
|
||||
```text
|
||||
Content-Type: application/json
|
||||
businessid: 2524639890ba4f2cba9ba1a4eeaa4015
|
||||
authorization: Bearer <TOKEN>
|
||||
loginid: <LOGIN_ID>
|
||||
platformuserid: <PLATFORM_USER_ID>
|
||||
applicationid: <APPLICATION_ID>
|
||||
```
|
||||
|
||||
请求体模板:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "<MENG_HAI_WEN_PERSON_ID>",
|
||||
"businessId": "2524639890ba4f2cba9ba1a4eeaa4015"
|
||||
}
|
||||
```
|
||||
|
||||
`curl` 示例:
|
||||
|
||||
```bash
|
||||
curl -sS -X POST "${ORG_BASE_URL}/component/person/detail" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "businessid: 2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
-H "authorization: Bearer <TOKEN>" \
|
||||
-H "loginid: <LOGIN_ID>" \
|
||||
-H "platformuserid: <PLATFORM_USER_ID>" \
|
||||
-H "applicationid: <APPLICATION_ID>" \
|
||||
-d '{
|
||||
"id":"<MENG_HAI_WEN_PERSON_ID>",
|
||||
"businessId":"2524639890ba4f2cba9ba1a4eeaa4015"
|
||||
}'
|
||||
```
|
||||
|
||||
验收要点:
|
||||
|
||||
- `data.name` 为“蒙海文”。
|
||||
- `data.businessId` 为 `2524639890ba4f2cba9ba1a4eeaa4015`。
|
||||
- `data.floorList` 非空并记录原始值。
|
||||
|
||||
## 4. 租户策略基线确认(建议)
|
||||
|
||||
用于确认广发基金策略是否启用,避免误判。
|
||||
|
||||
参考策略脚本:`docs/sql/tenant_visitor_floor_policy_init_guangfa_fund.sql`
|
||||
|
||||
关键期望:
|
||||
|
||||
- `business_id='2524639890ba4f2cba9ba1a4eeaa4015'`
|
||||
- `policy_type='INTERSECT_ALLOWLIST'`
|
||||
- `enabled=1`
|
||||
- `allow_zone_ids` 含 `605560545117995008`(28F)
|
||||
|
||||
示例查询(电梯库):
|
||||
|
||||
```sql
|
||||
SELECT business_id, policy_type, allow_zone_ids, enabled, policy_version, updated_at
|
||||
FROM tenant_visitor_floor_policy
|
||||
WHERE business_id = '2524639890ba4f2cba9ba1a4eeaa4015';
|
||||
```
|
||||
|
||||
## 5. 访客开通接口验证(核心)
|
||||
|
||||
### 5.1 请求信息(输入参数)
|
||||
|
||||
接口:`POST /elevator/person/add/visitor`
|
||||
|
||||
请求头:与第 3 节一致,`businessid` 固定为 `2524639890ba4f2cba9ba1a4eeaa4015`。
|
||||
|
||||
请求体模板(验证“自动按被访人楼层处理”时,`floorIds` 置空或不传):
|
||||
|
||||
```json
|
||||
{
|
||||
"visitorId": "<TEST_VISITOR_PERSON_ID>",
|
||||
"personId": "<MENG_HAI_WEN_PERSON_ID>",
|
||||
"begVisitorTime": <BEGIN_TS_MS>,
|
||||
"endVisitorTime": <END_TS_MS>,
|
||||
"floorIds": []
|
||||
}
|
||||
```
|
||||
|
||||
时间戳示例(毫秒):
|
||||
|
||||
- `begVisitorTime`: 当前时间
|
||||
- `endVisitorTime`: 当前时间 + 1 天
|
||||
|
||||
`curl` 示例:
|
||||
|
||||
```bash
|
||||
curl -sS -X POST "${ELEVATOR_BASE_URL}/elevator/person/add/visitor" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "businessid: 2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
-H "authorization: Bearer <TOKEN>" \
|
||||
-H "loginid: <LOGIN_ID>" \
|
||||
-H "platformuserid: <PLATFORM_USER_ID>" \
|
||||
-H "applicationid: <APPLICATION_ID>" \
|
||||
-d '{
|
||||
"visitorId":"<TEST_VISITOR_PERSON_ID>",
|
||||
"personId":"<MENG_HAI_WEN_PERSON_ID>",
|
||||
"begVisitorTime":<BEGIN_TS_MS>,
|
||||
"endVisitorTime":<END_TS_MS>,
|
||||
"floorIds":[]
|
||||
}'
|
||||
```
|
||||
|
||||
期望:
|
||||
|
||||
- 返回成功码(常见 `code=0` 或 `success=true`,以现场协议为准)。
|
||||
- 若返回 `76260532`,表示求交后无可开通楼层,需按“预期失败”流程记录。
|
||||
|
||||
## 6. 回读访客楼层权限验证
|
||||
|
||||
### 6.1 回读接口请求模板(输入参数)
|
||||
|
||||
接口:`POST /elevator/passRule/image`
|
||||
|
||||
请求体模板:
|
||||
|
||||
```json
|
||||
{
|
||||
"personId": "<TEST_VISITOR_PERSON_ID>",
|
||||
"businessId": "2524639890ba4f2cba9ba1a4eeaa4015",
|
||||
"imageStoreIds": [],
|
||||
"includeOrganizations": [],
|
||||
"includeLabels": []
|
||||
}
|
||||
```
|
||||
|
||||
`curl` 示例:
|
||||
|
||||
```bash
|
||||
curl -sS -X POST "${ELEVATOR_BASE_URL}/elevator/passRule/image" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "businessid: 2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
-H "authorization: Bearer <TOKEN>" \
|
||||
-H "loginid: <LOGIN_ID>" \
|
||||
-H "platformuserid: <PLATFORM_USER_ID>" \
|
||||
-H "applicationid: <APPLICATION_ID>" \
|
||||
-d '{
|
||||
"personId":"<TEST_VISITOR_PERSON_ID>",
|
||||
"businessId":"2524639890ba4f2cba9ba1a4eeaa4015",
|
||||
"imageStoreIds":[],
|
||||
"includeOrganizations":[],
|
||||
"includeLabels":[]
|
||||
}'
|
||||
```
|
||||
|
||||
### 6.2 判定规则
|
||||
|
||||
- 成功判定:
|
||||
- `add/visitor` 成功。
|
||||
- `passRule/image` 返回 `data[]` 非空。
|
||||
- 返回楼层(`zoneId` / `zoneName`)符合当前租户策略和被访人 `floorList` 的交集预期。
|
||||
- 预期失败判定:
|
||||
- `add/visitor` 返回 `76260532`(交集为空),记录为预期失败,不记为系统缺陷。
|
||||
- 异常失败判定:
|
||||
- 鉴权失败(401/403)。
|
||||
- 参数格式错误(400)。
|
||||
- 下游服务不可达、超时、5xx。
|
||||
|
||||
## 7. 标准执行顺序
|
||||
|
||||
1. 记录执行人、时间窗、目标环境与业务单号。
|
||||
2. 调 `/component/person/detail`,确认并记录蒙海文信息。
|
||||
3. (建议)执行策略查询,确认 allowlist 状态。
|
||||
4. 调 `/elevator/person/add/visitor` 开通测试访客。
|
||||
5. 调 `/elevator/passRule/image` 回读访客楼层。
|
||||
6. 依据第 6.2 节判定并形成结论。
|
||||
|
||||
## 8. 现场结论记录模板(复制填写)
|
||||
|
||||
### 8.1 基本信息
|
||||
|
||||
- 执行时间:
|
||||
- 执行环境:
|
||||
- 执行人:
|
||||
- 工单/需求编号:
|
||||
|
||||
### 8.2 蒙海文关联信息核对结果
|
||||
|
||||
- 姓名:蒙海文
|
||||
- `personId`:
|
||||
- `businessId`:
|
||||
- `floorList`:
|
||||
- 核对结论(通过/不通过):
|
||||
|
||||
### 8.3 接口调用记录
|
||||
|
||||
1) `/component/person/detail`
|
||||
- 请求参数摘要:
|
||||
- 响应摘要:
|
||||
- 结果判定:
|
||||
|
||||
2) `/elevator/person/add/visitor`
|
||||
- 请求参数摘要(含 `visitorId`、`personId`、时间窗):
|
||||
- 响应摘要(含业务码):
|
||||
- 结果判定:
|
||||
|
||||
3) `/elevator/passRule/image`
|
||||
- 请求参数摘要:
|
||||
- 响应摘要(含 `zoneId/zoneName`):
|
||||
- 结果判定:
|
||||
|
||||
### 8.4 最终结论
|
||||
|
||||
- 结论:通过 / 预期失败 / 失败
|
||||
- 失败原因分类:
|
||||
- 后续处理建议:
|
||||
|
||||
## 9. 附件留痕要求
|
||||
|
||||
至少保留以下附件(脱敏后归档):
|
||||
|
||||
- 三次接口请求与响应(建议 JSON 文件各 1 份)。
|
||||
- 关键日志截图(包含时间戳与业务码)。
|
||||
- 本文档第 8 节填写后的结果页。
|
||||
|
||||
建议命名:`gf-visitor-floor-verify-<yyyyMMdd-HHmm>-<executor>.zip`
|
||||
|
||||
## 10. 方案B:Python 脚本一键模拟(完整实现)
|
||||
|
||||
仓库已提供可执行脚本:
|
||||
|
||||
- `maven-cw-elevator-application/tools/visitor_floor_verification/scripts/simulate_gf_visitor_flow.py`
|
||||
|
||||
### 10.1 安装依赖
|
||||
|
||||
```bash
|
||||
cd maven-cw-elevator-application/tools/visitor_floor_verification
|
||||
python3 -m pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 10.2 设置请求头环境变量
|
||||
|
||||
```bash
|
||||
export ELEVATOR_HEADER_AUTHORIZATION='Bearer <TOKEN>'
|
||||
export ELEVATOR_HEADER_LOGINID='<LOGIN_ID>'
|
||||
export ELEVATOR_HEADER_PLATFORMUSERID='<PLATFORM_USER_ID>'
|
||||
export ELEVATOR_HEADER_APPLICATIONID='<APPLICATION_ID>'
|
||||
```
|
||||
|
||||
说明:`businessid` 由脚本参数 `--business-id` 自动注入,同时也会写入 `ELEVATOR_HEADER_BUSINESSID`。
|
||||
|
||||
### 10.3 执行脚本
|
||||
|
||||
```bash
|
||||
python3 scripts/simulate_gf_visitor_flow.py \
|
||||
--org-base-url "http://<ORG_HOST>:<ORG_PORT>" \
|
||||
--elevator-base-url "http://<ELEVATOR_HOST>:<ELEVATOR_PORT>" \
|
||||
--meng-person-id "<MENG_HAI_WEN_PERSON_ID>" \
|
||||
--visitor-person-id "<TEST_VISITOR_PERSON_ID>" \
|
||||
--business-id "2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
--window-hours 24 \
|
||||
--strict-name-check
|
||||
```
|
||||
|
||||
### 10.4 输出与判定
|
||||
|
||||
- 控制台会打印三步调用的关键摘要(详情 code、回读 data 条数、是否全通过)。
|
||||
- 报告文件自动生成到:
|
||||
- `maven-cw-elevator-application/tools/visitor_floor_verification/report/gf-visitor-sim-<timestamp>.json`
|
||||
- 若脚本退出码为 `0` 表示检查通过;退出码为 `1` 表示存在未通过项,需查看报告里的 `checks`、`steps` 字段。
|
||||
@@ -0,0 +1,140 @@
|
||||
# 访客接口无鉴权调用评估与生产快测方案
|
||||
|
||||
## 1. 目标
|
||||
|
||||
- 基于生产日志评估“无鉴权调用访客接口”的真实边界。
|
||||
- 给出生产可执行的快测方案,验证访客楼层策略是否生效。
|
||||
- 通过脚本同时支持:
|
||||
- `auth`:标准鉴权验证(正式验收路径)
|
||||
- `noauth-probe`:无鉴权探测(安全风险判定,不作业务通过依据)
|
||||
|
||||
## 2. 日志证据与边界结论
|
||||
|
||||
日志来源:
|
||||
|
||||
- `maven-cw-elevator-application/logs/访客相关接口日志分析/日志分析/访客调用楼层放开接口清单.md`
|
||||
- `maven-cw-elevator-application/logs/访客相关接口日志分析/日志分析/10.0.22.209/202604301713/logs/elevator-app.log`
|
||||
|
||||
关键证据:
|
||||
|
||||
- 文档中同时存在“JWT 调用”和“无鉴权(username)调用”样本。
|
||||
- 但同批日志中的 `PersonRuleServiceImpl:196` 记录可见 `CloudwalkCallContext` 已包含:
|
||||
- `company.companyId`
|
||||
- `user.callerName`
|
||||
- 部分请求带 `ext.value.authorization`(JWT 场景)
|
||||
|
||||
边界判定:
|
||||
|
||||
1. 观察到的“无 Authorization header”不能直接等价为“外部匿名可裸调”。
|
||||
2. 更可能是平台或网关已注入上下文后触发的内部调用路径。
|
||||
3. 生产对外验证必须以 `auth` 模式为准。
|
||||
4. `noauth-probe` 仅用于探测当前网关/应用是否放开了不应放开的入口。
|
||||
|
||||
## 3. 快测脚本与模式
|
||||
|
||||
脚本路径:
|
||||
|
||||
- `maven-cw-elevator-application/tools/visitor_floor_verification/scripts/quick_verify_visitor_floor_policy.py`
|
||||
|
||||
### 3.1 auth 模式(正式)
|
||||
|
||||
三步调用:
|
||||
|
||||
1. `POST /component/person/detail`
|
||||
2. `POST /elevator/person/add/visitor`
|
||||
3. `POST /elevator/passRule/image`
|
||||
|
||||
请求头采用 `ELEVATOR_HEADER_*`(authorization/loginid/platformuserid/applicationid)+ `businessid`。
|
||||
|
||||
### 3.2 noauth-probe 模式(探测)
|
||||
|
||||
- 仅发送 `Content-Type`,可选附加 `businessid`。
|
||||
- 不发送 Authorization、loginid、platformuserid、applicationid。
|
||||
- 输出状态码/业务码用于判定“是否存在风险放开”。
|
||||
|
||||
## 4. 结果分级规则
|
||||
|
||||
### 4.1 auth 模式
|
||||
|
||||
- 通过:
|
||||
- 三步 HTTP 均成功返回;
|
||||
- `add/visitor` 业务成功,或返回 `76260532`(交集为空,预期失败);
|
||||
- `passRule/image` 返回可解析数据。
|
||||
- 失败:
|
||||
- HTTP 4xx/5xx、超时、响应不可解析;
|
||||
- 关键业务码异常且不属于 `76260532`。
|
||||
|
||||
### 4.2 noauth-probe 模式
|
||||
|
||||
- 预期拦截(正常):
|
||||
- 返回 401/403,或明确鉴权失败业务码。
|
||||
- 安全异常(高风险):
|
||||
- 返回 2xx 且业务成功(特别是 `add/visitor` 成功)。
|
||||
- 待排查:
|
||||
- 返回 2xx 但业务失败且错误语义不清晰,需要结合网关策略判断。
|
||||
|
||||
## 5. 运行方式
|
||||
|
||||
先准备头信息(auth 模式):
|
||||
|
||||
```bash
|
||||
cd maven-cw-elevator-application/tools/visitor_floor_verification
|
||||
python3 -m pip install -r requirements.txt
|
||||
|
||||
export ELEVATOR_HEADER_AUTHORIZATION='Bearer <TOKEN>'
|
||||
export ELEVATOR_HEADER_LOGINID='<LOGIN_ID>'
|
||||
export ELEVATOR_HEADER_PLATFORMUSERID='<PLATFORM_USER_ID>'
|
||||
export ELEVATOR_HEADER_APPLICATIONID='<APPLICATION_ID>'
|
||||
```
|
||||
|
||||
也可使用模板文件:
|
||||
|
||||
- `maven-cw-elevator-application/tools/visitor_floor_verification/.env.quick_verify.example`
|
||||
|
||||
例如:
|
||||
|
||||
```bash
|
||||
set -a
|
||||
source .env.quick_verify
|
||||
set +a
|
||||
```
|
||||
|
||||
auth 模式(正式验收):
|
||||
|
||||
```bash
|
||||
python3 scripts/quick_verify_visitor_floor_policy.py \
|
||||
--mode auth \
|
||||
--org-base-url "http://<ORG_HOST>:<ORG_PORT>" \
|
||||
--elevator-base-url "http://<ELEVATOR_HOST>:<ELEVATOR_PORT>" \
|
||||
--meng-person-id "<MENG_HAI_WEN_PERSON_ID>" \
|
||||
--visitor-person-id "<TEST_VISITOR_PERSON_ID>" \
|
||||
--business-id "2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
--strict-name-check
|
||||
```
|
||||
|
||||
noauth-probe 模式(可选一次):
|
||||
|
||||
```bash
|
||||
python3 scripts/quick_verify_visitor_floor_policy.py \
|
||||
--mode noauth-probe \
|
||||
--org-base-url "http://<ORG_HOST>:<ORG_PORT>" \
|
||||
--elevator-base-url "http://<ELEVATOR_HOST>:<ELEVATOR_PORT>" \
|
||||
--meng-person-id "<MENG_HAI_WEN_PERSON_ID>" \
|
||||
--visitor-person-id "<TEST_VISITOR_PERSON_ID>" \
|
||||
--business-id "2524639890ba4f2cba9ba1a4eeaa4015" \
|
||||
--probe-with-businessid
|
||||
```
|
||||
|
||||
## 6. 报告与留痕
|
||||
|
||||
脚本输出:
|
||||
|
||||
- 控制台摘要(模式、三步状态、业务码、风险级别)
|
||||
- 报告文件:`report/quick-verify-<timestamp>.json`
|
||||
|
||||
建议归档:
|
||||
|
||||
- 本次执行命令
|
||||
- 报告 JSON
|
||||
- 对应时段接口日志摘录
|
||||
- 最终分级(通过 / 预期拦截 / 高风险)
|
||||
Reference in New Issue
Block a user