mirror of
https://github.com/hpd840321/starRiverProperty.git
synced 2026-06-09 16:30:29 +08:00
Initial commit: reorganized source tree
- backend/: 13 Maven modules (cw-elevator-application, cloudwalk-cloud, intelligent-cwoscomponent, ninca-crk, etc.) - frontend/: 4 Vue projects (elevator-front, cwos-portal, alarm-front, front_acs) + decompiled + scripts - scripts/: build, test-env, tools (Docker Compose, service templates, API parity) - docs/: AGENTS.md, superpowers specs, architecture docs - .gitignore: standard Java/Maven exclusions Moved from legacy maven-*/ root layout to backend/ organized structure.
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.pytest_cache/
|
||||
report/parity-*.md
|
||||
report/smoke-*.md
|
||||
report/SUITE-*.md
|
||||
report/*.json
|
||||
.suite_run_marker
|
||||
@@ -0,0 +1,80 @@
|
||||
# 电梯 HTTP 接口:清单核对、调用一致性、不一致根因
|
||||
|
||||
本文把三件事拆开说明,避免与「对拍脚本 bug」混淆。
|
||||
|
||||
---
|
||||
|
||||
## 一、接口清单核对(「有哪些接口」)
|
||||
|
||||
| 来源 | 产物 / 命令 | 核对内容 |
|
||||
|------|-------------|----------|
|
||||
| **自动化清单** | `api_catalog.json` | 43 条:对拍/冒烟用的 `id`、`method`、`path`、`fixture`/`body`。 |
|
||||
| **代码事实** | `python3 report/build_backend_api_inventory.py --out report/BACKEND-API-INVENTORY.md` | 扫描 `cw-elevator-application-web/**Controller.java`,与 catalog 对照。 |
|
||||
| **结论** | 当前仓库生成结果 | catalog 与 Controller 声明路径 **一致**;额外仅有 **`POST /file/imgupload`**(multipart,未进 JSON catalog)。 |
|
||||
|
||||
清单层面:**V1 与 V2 共用同一套 Controller 源码与同一 catalog**,不存在「V2 少注册了一批路径」这类清单差异。
|
||||
|
||||
---
|
||||
|
||||
## 二、接口调用是否一致(「测试怎么打」)
|
||||
|
||||
对拍/冒烟使用 **同一份** Python 逻辑(`parity/client.py`):
|
||||
|
||||
- **方法**:catalog 中的 `method`(均为 `POST`)。
|
||||
- **路径**:同一 `path` 分别拼在 `--base-old` 与 `--base-new` 后。
|
||||
- **请求体**:同一 `fixture` 或内联 `body`。
|
||||
- **请求头**:`default_headers()`(`Content-Type: application/json` + 环境变量 `ELEVATOR_HEADER_*` 可选)。
|
||||
|
||||
因此:**从测试工具角度,对 V1、V2 的 HTTP 调用是同一套**;若一端返回 Cloudwalk JSON、另一端返回 Spring Boot 500 错误 JSON,属于 **服务端行为差异**,不是「调用了不同接口」。
|
||||
|
||||
---
|
||||
|
||||
## 三、不一致的表现与根因(「为什么 V2 全是 new=None / 500」)
|
||||
|
||||
### 3.1 现象(如何读冒烟 JSON)
|
||||
|
||||
- **V1**:`http_status` 多为 **200**,`response_head` 形如 `{"code":"...", "success":..., ...}` → 能解析顶层 **`code`**(业务码)。
|
||||
- **V2(修复前)**:`http_status` **500**,`response_head` 形如
|
||||
`{"timestamp":...,"status":500,"error":"Internal Server Error","exception":"java.lang.NullPointerException",...}`
|
||||
→ **没有**顶层 `code`,对拍里显示为 **`new=None`**。
|
||||
|
||||
### 3.2 根因(代码链)
|
||||
|
||||
1. `AbstractCloudwalkController.getCloudwalkContext()` 调用
|
||||
`CloudwalkCallContextBuilder.buildContext(cloudwalkSessionContextHolder)`。
|
||||
2. `CloudwalkCallContextBuilder` 第一行:
|
||||
`CloudwalkSessionObject session = sessionContextHolder.getSession();`
|
||||
接着 **`session.getUser()`** 等;若 **`session == null` → NPE**。
|
||||
3. `CloudwalkSessionContextHolder` 使用 **ThreadLocal**;会话对象由 **`CloudwalkContextParameterFilter`**(包 `cn.cloudwalk.web.filter`)在 **`doFilterInternal`** 里 **`putSession(sessionObject)`** 写入。
|
||||
4. **Maven V2 启动类**原先 **未扫描** `cn.cloudwalk.web.filter`,过滤器 **未注册** → 请求线程从未 `putSession` → **`getSession()` 恒为 null** → **所有依赖 `getCloudwalkContext()` 的接口统一 NPE**。
|
||||
|
||||
这与「接口清单不一致」无关,是 **运行时上下文未初始化**。
|
||||
|
||||
### 3.3 修复(应用侧)
|
||||
|
||||
在 `ElevatorApplication` 的 `scanBasePackages` 中增加 **`cn.cloudwalk.web.filter`**,使 `CloudwalkContextParameterFilter` 成为 Spring Bean 并参与 Filter 链。
|
||||
|
||||
**注意**:不要整包扫描 `cn.cloudwalk.web`(会带入 `LocaleConfiguration` 再声明一个 `CloudwalkSessionContextHolder` Bean,与 `CloudwalkSessionHolderConfiguration` 冲突);只扫描 **`cn.cloudwalk.web.filter`** 即可。
|
||||
|
||||
修复后应重新构建 V2 JAR,再跑:
|
||||
|
||||
```bash
|
||||
./scripts/run_full_elevator_api_suite.sh
|
||||
```
|
||||
|
||||
预期:V2 的 `http_status` 回到与 V1 同类的业务响应(多为 200 + Cloudwalk `code`),对拍 **`new=None`** 应消失或仅剩真实业务差异。
|
||||
|
||||
---
|
||||
|
||||
## 四、核对清单速查表
|
||||
|
||||
| 步骤 | 做什么 |
|
||||
|------|--------|
|
||||
| 0 | **V1/V2 电梯业务源码比对**(仅白名单文件、忽略空白):`docs/architecture/V1-V2-电梯API源码比对白名单.md`;**依赖比对**(`lib`/`cw_lib` vs 反应堆):`docs/architecture/V1-V2-电梯依赖比对.md`。 |
|
||||
| 1 | 跑 `build_backend_api_inventory.py`,打开 `BACKEND-API-INVENTORY.md`,确认 **§3 无遗漏 path**。 |
|
||||
| 2 | 跑全量冒烟,打开 `smoke-v1_*.json` / `smoke-v2_*.json`,逐条对比 **`http_status` + `response_head` 前缀**(是否均为 `{"code":`)。 |
|
||||
| 3 | 若 V2 仍为 500,在 **V2 日志**中搜 `NullPointerException` 与具体 `path`,确认是否还有 **其它** 未注册的 Filter/Interceptor。 |
|
||||
|
||||
---
|
||||
|
||||
*文档与 `ElevatorApplication` 扫描修复同步维护。*
|
||||
@@ -0,0 +1,93 @@
|
||||
# elevator_api_parity — V1/V2 接口冒烟与对拍
|
||||
|
||||
## 功能概览
|
||||
|
||||
| 能力 | 说明 |
|
||||
|------|------|
|
||||
| **单机冒烟** | 对单个 Base URL 遍历 `api_catalog.json` 中的接口(`include_in_smoke=true`),记录 HTTP 状态、耗时、业务 `code`、响应摘要 → `report/smoke-{label}-*.md` |
|
||||
| **横向对拍** | 旧 JAR(`--base-old`)与新 JAR(`--base-new`)并行调用;仅 **`include_in_parity=true`** 的条目参与 **HTTP 状态 + 业务 code** 一致性断言 → `report/parity-*.md` |
|
||||
| **套件总览** | 合并本次产生的冒烟×2 + 对拍 → `report/SUITE-*.md` |
|
||||
| **源码级比对(V1 jar → CFR)** | 见 `../../scripts/decompile_v1_elevator_jars.sh` 将 `cw_lib` 四模块 jar 反编译至 `tools/v1-decompiled/`,再运行 `scripts/source_parity_scan.py` → `report/SOURCE-PARITY-BY-CLASS-decomp.md` |
|
||||
|
||||
接口清单与请求体见 **`api_catalog.json`**(支持 `fixture` 文件或内联 `body`)。
|
||||
|
||||
## 环境
|
||||
|
||||
- Python 3.8+,`pip install -r requirements.txt`
|
||||
- 若遇全局 pytest 插件冲突:`export PYTEST_DISABLE_PLUGIN_AUTOLOAD=1`
|
||||
|
||||
## 启动两实例(示例)
|
||||
|
||||
同一套 `application.properties`(或外部配置),仅端口不同:
|
||||
|
||||
```bash
|
||||
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
|
||||
CFG="file:/path/to/application.properties"
|
||||
java -jar cw-elevator-application-V1.0.0.20211103.jar --server.port=18080 --spring.config.location=$CFG
|
||||
java -jar cw-elevator-application-2.0.0.jar --server.port=18081 --spring.config.location=$CFG
|
||||
```
|
||||
|
||||
## 一键完整套件(推荐)
|
||||
|
||||
在 **`maven-cw-elevator-application`** 目录:
|
||||
|
||||
```bash
|
||||
./scripts/run_full_elevator_api_suite.sh
|
||||
```
|
||||
|
||||
环境变量(可选):
|
||||
|
||||
- `ELEVATOR_BASE_OLD` — 默认 `http://127.0.0.1:18080`(V1)
|
||||
- `ELEVATOR_BASE_NEW` — 默认 `http://127.0.0.1:18081`(V2)
|
||||
- `ELEVATOR_HEADER_BUSINESSID`、`ELEVATOR_HEADER_LOGINID`、`ELEVATOR_HEADER_AUTHORIZATION` 等 — 与现网一致时业务码更有可比性
|
||||
|
||||
## 分步执行
|
||||
|
||||
```bash
|
||||
cd tools/elevator_api_parity
|
||||
export PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
|
||||
|
||||
# 仅逻辑单测
|
||||
python3 -m pytest tests/test_unit_compare.py -q
|
||||
|
||||
# V1 单机冒烟
|
||||
python3 -m pytest tests/test_smoke_catalog.py -m smoke \
|
||||
--smoke-base=http://127.0.0.1:18080 --smoke-label=v1_legacy -q
|
||||
|
||||
# V2 单机冒烟
|
||||
python3 -m pytest tests/test_smoke_catalog.py -m smoke \
|
||||
--smoke-base=http://127.0.0.1:18081 --smoke-label=v2_build -q
|
||||
|
||||
# 双端对拍(双端 /actuator/health 等可达时执行,否则跳过)
|
||||
python3 -m pytest tests/test_parity_endpoints.py -m live -q \
|
||||
--base-old=http://127.0.0.1:18080 --base-new=http://127.0.0.1:18081
|
||||
```
|
||||
|
||||
### 强制要求联调(失败即中断)
|
||||
|
||||
```bash
|
||||
export ELEVATOR_PARITY_REQUIRE_LIVE=1 # 对拍
|
||||
export ELEVATOR_SMOKE_REQUIRE=1 # 冒烟
|
||||
```
|
||||
|
||||
## 仅对拍(不含冒烟)
|
||||
|
||||
```bash
|
||||
./scripts/run_elevator_parity.sh
|
||||
```
|
||||
|
||||
(脚本内会先 `mvn package`,再跑单测 + 对拍。)
|
||||
|
||||
## 报告位置
|
||||
|
||||
- `report/smoke-v1_legacy-*.md` + **同名 `.json`**(结构化结果,供套件矩阵消费)
|
||||
- `report/smoke-v2_build-*.md` + **同名 `.json`**
|
||||
- `report/parity-*.md` + **同名 `.json`**
|
||||
- **`report/SUITE-*.md`**:始终包含 **第二节「全量接口清单」**(来源于 `api_catalog.json`);**第三节「测试结果矩阵」** 在有上述 JSON 时填入 V1/V2 HTTP、业务 code、对拍 Y/N;若本次因未起服务而 **skip**,矩阵中为 **—**(参见第三节说明)。
|
||||
|
||||
## 扩展接口
|
||||
|
||||
编辑 **`api_catalog.json`**:
|
||||
|
||||
- `include_in_parity: false` — 只做冒烟,不参与 V1/V2 等值断言(避免依赖不一致导致误报)。
|
||||
- `include_in_parity: true` — 纳入横向对拍(当前默认对 **访客/人员/规则分页/记录分页** 四个核心场景开启)。
|
||||
@@ -0,0 +1,461 @@
|
||||
{
|
||||
"version": 2,
|
||||
"description": "电梯应用 HTTP 接口清单:冒烟与对拍共用。include_in_parity=false 的项仅做单机路由/业务响应探测,不参与 V1/V2 等值断言。租户访客楼层策略(V2 Maven 独有 TenantVisitorFloorPolicy*)影响 POST /elevator/person/add/visitor;record/page 受 V1 legacy(access-control)与 V2(ElevatorApplication)在 Consul 的分片规则是否生效差异影响(见该条 parity_exclude_reason),亦不做 code 等值断言。可选 boundary_patches:在基线 fixture/body 上深度合并 patch,需环境变量 ELEVATOR_PARITY_BOUNDARY=1 时与基线 default 一并参与对拍。",
|
||||
"endpoints": [
|
||||
{
|
||||
"id": "person_add_visitor_min",
|
||||
"name": "访客派梯-最小体",
|
||||
"method": "POST",
|
||||
"path": "/elevator/person/add/visitor",
|
||||
"fixture": "person_add_visitor_min.json",
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true,
|
||||
"parity_exclude_reason": "租户访客楼层策略为 V2 扩展,与 V1.20211103 不做 code 等值断言"
|
||||
},
|
||||
{
|
||||
"id": "person_detail",
|
||||
"name": "人员详情-分页",
|
||||
"method": "POST",
|
||||
"path": "/elevator/person/detail",
|
||||
"fixture": "person_detail_min.json",
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": true,
|
||||
"include_in_smoke": true,
|
||||
"boundary_patches": [
|
||||
{ "id": "rows_zero", "description": "每页行数为 0", "patch": { "rowsOfPage": 0 } },
|
||||
{ "id": "page_zero", "description": "当前页为 0", "patch": { "currentPage": 0 } },
|
||||
{ "id": "large_page", "description": "极大页码与大页长", "patch": { "currentPage": 999999, "rowsOfPage": 200 } }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "passrule_page",
|
||||
"name": "通行规则-分页",
|
||||
"method": "POST",
|
||||
"path": "/elevator/passRule/page",
|
||||
"fixture": "passrule_page.json",
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": true,
|
||||
"include_in_smoke": true,
|
||||
"boundary_patches": [
|
||||
{ "id": "page_no_zero", "description": "页码为 0", "patch": { "pageNo": 0 } },
|
||||
{ "id": "page_size_zero", "description": "页大小为 0", "patch": { "pageSize": 0 } },
|
||||
{ "id": "large_page", "description": "极大页码与页大小", "patch": { "pageNo": 999999, "pageSize": 500 } }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "record_page",
|
||||
"name": "通行记录-分页",
|
||||
"method": "POST",
|
||||
"path": "/intelligent/acs/elevator/record/page",
|
||||
"fixture": "record_page.json",
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"parity_exclude_reason": "V1 legacy 入口启用 Consul 分表(actualDataNodes 年后缀),联机库未必存在 IT_ACS_ELEVATOR_RECORD_YYYY 物理表;V2 当前启动日志中 Sharding 无 tables 仅 defaultDataSource,走单表逻辑。二者命中不同物理表/路由,业务码无法与「同库同规则」前提对齐。",
|
||||
"include_in_smoke": true,
|
||||
"boundary_patches": [
|
||||
{ "id": "rows_zero", "description": "每页行数为 0", "patch": { "rowsOfPage": 0 } },
|
||||
{
|
||||
"id": "time_equal",
|
||||
"description": "起止时间相等",
|
||||
"patch": { "startTime": 1625068800000, "endTime": 1625068800000 }
|
||||
},
|
||||
{
|
||||
"id": "time_inverted",
|
||||
"description": "结束早于开始",
|
||||
"patch": { "startTime": 1625155200000, "endTime": 1625068800000 }
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "person_add",
|
||||
"name": "人员-从现有人员添加",
|
||||
"method": "POST",
|
||||
"path": "/elevator/person/add",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "person_edit",
|
||||
"name": "人员-编辑",
|
||||
"method": "POST",
|
||||
"path": "/elevator/person/edit",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "person_delete",
|
||||
"name": "人员-删除",
|
||||
"method": "POST",
|
||||
"path": "/elevator/person/delete",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "person_page",
|
||||
"name": "人员-分页",
|
||||
"method": "POST",
|
||||
"path": "/elevator/person/page",
|
||||
"body": { "pageNo": 1, "pageSize": 1 },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "person_time_detail",
|
||||
"name": "人员-时间详情",
|
||||
"method": "POST",
|
||||
"path": "/elevator/person/timeDetail",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "person_page_by_app",
|
||||
"name": "人员-应用分页",
|
||||
"method": "POST",
|
||||
"path": "/elevator/person/pageByApp",
|
||||
"body": { "pageNo": 1, "pageSize": 1 },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "passrule_floor",
|
||||
"name": "通行规则-楼层列表",
|
||||
"method": "POST",
|
||||
"path": "/elevator/passRule/floor",
|
||||
"body": { "pageNo": 1, "pageSize": 1, "zoneId": "" },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "passrule_add",
|
||||
"name": "通行规则-新增",
|
||||
"method": "POST",
|
||||
"path": "/elevator/passRule/add",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "passrule_edit",
|
||||
"name": "通行规则-修改",
|
||||
"method": "POST",
|
||||
"path": "/elevator/passRule/edit",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "passrule_delete",
|
||||
"name": "通行规则-删除",
|
||||
"method": "POST",
|
||||
"path": "/elevator/passRule/delete",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "passrule_detail",
|
||||
"name": "通行规则-详情",
|
||||
"method": "POST",
|
||||
"path": "/elevator/passRule/detail",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "passrule_image",
|
||||
"name": "通行规则-按人像查楼层权限",
|
||||
"method": "POST",
|
||||
"path": "/elevator/passRule/image",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "passrule_image_list",
|
||||
"name": "通行规则-批量人像",
|
||||
"method": "POST",
|
||||
"path": "/elevator/passRule/image/list",
|
||||
"body": { "personList": [] },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "record_analyse_cycle",
|
||||
"name": "记录-周期统计",
|
||||
"method": "POST",
|
||||
"path": "/intelligent/acs/elevator/record/analyse/cycle",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "record_analyse_count",
|
||||
"name": "记录-次数统计",
|
||||
"method": "POST",
|
||||
"path": "/intelligent/acs/elevator/record/analyse/count",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "record_page_request",
|
||||
"name": "记录-请求分页",
|
||||
"method": "POST",
|
||||
"path": "/intelligent/acs/elevator/record/page/request",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "record_device_list",
|
||||
"name": "记录-设备列表",
|
||||
"method": "POST",
|
||||
"path": "/intelligent/acs/elevator/record/device/list",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "record_zone_tree",
|
||||
"name": "记录-区域树",
|
||||
"method": "POST",
|
||||
"path": "/intelligent/acs/elevator/record/zone/tree",
|
||||
"body": { "parentId": "", "businessId": "" },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "device_v2_39201",
|
||||
"name": "设备网关-39201 设备列表",
|
||||
"method": "POST",
|
||||
"path": "/device/v2/39201",
|
||||
"body": { "deviceName": "_api_probe", "currentPage": 1, "rowsOfPage": 10 },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "device_v2_39202",
|
||||
"name": "设备网关-39202 区域电梯码",
|
||||
"method": "POST",
|
||||
"path": "/device/v2/39202",
|
||||
"body": { "deviceName": "_api_probe", "currentPage": 1, "rowsOfPage": 10 },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "device_v2_39203",
|
||||
"name": "设备网关-39203 添加记录",
|
||||
"method": "POST",
|
||||
"path": "/device/v2/39203",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "device_v2_39204",
|
||||
"name": "设备网关-39204 密钥时间戳(已废弃)",
|
||||
"method": "POST",
|
||||
"path": "/device/v2/39204",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "elevator_device_add",
|
||||
"name": "设备-新增",
|
||||
"method": "POST",
|
||||
"path": "/elevator/device/add",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "elevator_device_edit",
|
||||
"name": "设备-编辑",
|
||||
"method": "POST",
|
||||
"path": "/elevator/device/edit",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "elevator_device_get_by_id",
|
||||
"name": "设备-按ID查询",
|
||||
"method": "POST",
|
||||
"path": "/elevator/device/getById",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "elevator_device_delete",
|
||||
"name": "设备-删除",
|
||||
"method": "POST",
|
||||
"path": "/elevator/device/delete",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "elevator_device_edit_code",
|
||||
"name": "设备-改码",
|
||||
"method": "POST",
|
||||
"path": "/elevator/device/editCode",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "elevator_device_get",
|
||||
"name": "设备-查询列表",
|
||||
"method": "POST",
|
||||
"path": "/elevator/device/get",
|
||||
"body": { "deviceName": "_api_probe", "currentPage": 1, "rowsOfPage": 10 },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "elevator_device_export",
|
||||
"name": "设备-导出",
|
||||
"method": "POST",
|
||||
"path": "/elevator/device/export",
|
||||
"body": { "deviceName": "_api_probe", "currentPage": 1, "rowsOfPage": 10 },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "elevator_device_zone_tree_code",
|
||||
"name": "设备-区域树编码",
|
||||
"method": "POST",
|
||||
"path": "/elevator/device/zone/treeCode",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "elevator_device_page",
|
||||
"name": "设备-分页",
|
||||
"method": "POST",
|
||||
"path": "/elevator/device/devicePage",
|
||||
"body": { "deviceName": "_api_probe", "currentPage": 1, "rowsOfPage": 10 },
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "restructure_unbind_floors",
|
||||
"name": "改造-未绑定楼层",
|
||||
"method": "POST",
|
||||
"path": "/elevator/restructure/unbind/floors",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "restructure_floors",
|
||||
"name": "改造-楼层列表",
|
||||
"method": "POST",
|
||||
"path": "/elevator/restructure/floors",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "restructure_condition",
|
||||
"name": "改造-条件",
|
||||
"method": "POST",
|
||||
"path": "/elevator/restructure/condition",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "restructure_condition_labels",
|
||||
"name": "改造-条件标签",
|
||||
"method": "POST",
|
||||
"path": "/elevator/restructure/condition/labels",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "restructure_binding",
|
||||
"name": "改造-绑定",
|
||||
"method": "POST",
|
||||
"path": "/elevator/restructure/binding",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "restructure_binding_person",
|
||||
"name": "改造-绑定人员",
|
||||
"method": "POST",
|
||||
"path": "/elevator/restructure/binding/person",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "restructure_task_progress",
|
||||
"name": "改造-任务进度",
|
||||
"method": "POST",
|
||||
"path": "/elevator/restructure/task/progress",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
},
|
||||
{
|
||||
"id": "restructure_task_stop",
|
||||
"name": "改造-停止任务",
|
||||
"method": "POST",
|
||||
"path": "/elevator/restructure/task/stop",
|
||||
"body": {},
|
||||
"compare_mode": "code_only",
|
||||
"include_in_parity": false,
|
||||
"include_in_smoke": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
import requests
|
||||
|
||||
from parity.client import can_reach_both, can_reach_one, default_headers
|
||||
|
||||
_DIR = Path(__file__).resolve().parent
|
||||
|
||||
|
||||
def pytest_configure(config):
|
||||
config._parity_rows = [] # type: ignore[attr-defined]
|
||||
config._smoke_rows = [] # type: ignore[attr-defined]
|
||||
|
||||
|
||||
def pytest_addoption(parser):
|
||||
parser.addoption(
|
||||
"--base-old",
|
||||
default=os.environ.get("ELEVATOR_BASE_OLD", "http://127.0.0.1:18080"),
|
||||
)
|
||||
parser.addoption(
|
||||
"--base-new",
|
||||
default=os.environ.get("ELEVATOR_BASE_NEW", "http://127.0.0.1:18081"),
|
||||
)
|
||||
parser.addoption(
|
||||
"--smoke-base",
|
||||
default=os.environ.get("ELEVATOR_SMOKE_BASE", "http://127.0.0.1:18080"),
|
||||
)
|
||||
parser.addoption(
|
||||
"--smoke-label",
|
||||
default=os.environ.get("ELEVATOR_SMOKE_LABEL", "v1_legacy"),
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def base_old(request):
|
||||
return str(request.config.getoption("--base-old")).rstrip("/")
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def base_new(request):
|
||||
return str(request.config.getoption("--base-new")).rstrip("/")
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def smoke_base(request):
|
||||
return str(request.config.getoption("--smoke-base")).rstrip("/")
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def smoke_label(request):
|
||||
return str(request.config.getoption("--smoke-label"))
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def session_http():
|
||||
s = requests.Session()
|
||||
s.headers.update(default_headers())
|
||||
yield s
|
||||
s.close()
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def two_instances_ready(base_old, base_new, session_http, request):
|
||||
ok, msg = can_reach_both(base_old, base_new, session_http)
|
||||
require = os.environ.get("ELEVATOR_PARITY_REQUIRE_LIVE", "")
|
||||
if not ok and not require:
|
||||
pytest.skip(f"双端健康检查不通过(跳过用例): {msg}")
|
||||
if not ok and require:
|
||||
pytest.fail(f"ELEVATOR_PARITY_REQUIRE_LIVE=1 且双端不可达: {msg}")
|
||||
return True
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def smoke_instance_ready(smoke_base, session_http, request):
|
||||
ok, _ = can_reach_one(smoke_base, session_http)
|
||||
require = os.environ.get("ELEVATOR_SMOKE_REQUIRE", "")
|
||||
if not ok and not require:
|
||||
pytest.skip(f"单机 {smoke_base} 健康检查不通过(跳过 smoke)")
|
||||
if not ok and require:
|
||||
pytest.fail(f"ELEVATOR_SMOKE_REQUIRE=1 且 {smoke_base} 不可达")
|
||||
return True
|
||||
|
||||
|
||||
def _write_smoke_report(config, srows: list, report_dir: Path) -> None:
|
||||
from report import generate_smoke_report
|
||||
|
||||
label = str(config.getoption("--smoke-label", default="smoke"))
|
||||
p2 = report_dir / f"smoke-{label}-{datetime.now().strftime('%Y%m%d-%H%M%S')}.md"
|
||||
generate_smoke_report.write_file(
|
||||
p2,
|
||||
str(config.getoption("--smoke-base", default="")),
|
||||
label,
|
||||
srows,
|
||||
)
|
||||
print(f"\n[smoke] 报告: {p2}")
|
||||
|
||||
|
||||
def pytest_sessionfinish(session, exitstatus):
|
||||
import importlib
|
||||
|
||||
config = session.config
|
||||
report_dir = _DIR / "report"
|
||||
report_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
rows = getattr(config, "_parity_rows", None) or []
|
||||
if rows:
|
||||
try:
|
||||
gen = importlib.import_module("report.generate_report")
|
||||
p = report_dir / gen.timestamped_name("parity")
|
||||
gen.write_file(
|
||||
p,
|
||||
str(config.getoption("--base-old", default="")),
|
||||
str(config.getoption("--base-new", default="")),
|
||||
rows,
|
||||
)
|
||||
print(f"\n[parity] 对拍报告: {p}")
|
||||
except Exception as e:
|
||||
print(f"\n[parity] 对拍报告未生成: {e}")
|
||||
|
||||
srows = getattr(config, "_smoke_rows", None) or []
|
||||
if srows:
|
||||
try:
|
||||
_write_smoke_report(config, srows, report_dir)
|
||||
except Exception as e:
|
||||
print(f"\n[smoke] 报告未生成: {e}")
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"pageNo": 1,
|
||||
"pageSize": 1
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"visitorId": "",
|
||||
"personId": "",
|
||||
"begVisitorTime": 1,
|
||||
"endVisitorTime": 1,
|
||||
"floorIds": []
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"currentPage": 1,
|
||||
"rowsOfPage": 1,
|
||||
"parentId": "",
|
||||
"zoneId": "",
|
||||
"ruleId": "",
|
||||
"personName": ""
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"currentPage": 1,
|
||||
"rowsOfPage": 1,
|
||||
"startTime": 1625068800000,
|
||||
"endTime": 1625155199999
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
"""Parity: HTTP client, health probe, JSON compare for elevator JARs."""
|
||||
@@ -0,0 +1,64 @@
|
||||
"""
|
||||
在基线请求体上叠加 boundary_patches,用于双端对拍的入参边界/范围扩展。
|
||||
|
||||
catalog 中可选字段(仅当开启 ELEVATOR_PARITY_BOUNDARY=1 时展开)::
|
||||
|
||||
"boundary_patches": [
|
||||
{ "id": "rows_zero", "description": "可选说明", "patch": { "rowsOfPage": 0 } }
|
||||
]
|
||||
|
||||
patch 与基线 JSON **深度合并**(字典递归;非 dict 叶子由 patch 覆盖)。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import copy
|
||||
import os
|
||||
from typing import Any, Dict, Iterator, List, Tuple
|
||||
|
||||
from parity.catalog_loader import endpoint_body
|
||||
|
||||
|
||||
def deep_merge(base: Any, patch: Any) -> Any:
|
||||
"""深度合并:patch 覆盖 base;两 dict 则递归。"""
|
||||
if not isinstance(base, dict) or not isinstance(patch, dict):
|
||||
return copy.deepcopy(patch)
|
||||
out = copy.deepcopy(base)
|
||||
for k, v in patch.items():
|
||||
if k in out and isinstance(out[k], dict) and isinstance(v, dict):
|
||||
out[k] = deep_merge(out[k], v)
|
||||
else:
|
||||
out[k] = copy.deepcopy(v)
|
||||
return out
|
||||
|
||||
|
||||
def boundary_enabled() -> bool:
|
||||
return os.environ.get("ELEVATOR_PARITY_BOUNDARY", "0").strip() == "1"
|
||||
|
||||
|
||||
def iter_parity_request_cases(ep: Dict[str, Any]) -> Iterator[Tuple[str, Dict[str, Any]]]:
|
||||
"""
|
||||
生成 (case_id, body)。首条恒为 (\"default\", 基线体)。
|
||||
boundary 开启且条目含 boundary_patches 时,追加合并后的变体。
|
||||
"""
|
||||
base = endpoint_body(ep)
|
||||
yield "default", base
|
||||
|
||||
if not boundary_enabled():
|
||||
return
|
||||
|
||||
patches: List[Dict[str, Any]] = ep.get("boundary_patches") or []
|
||||
if not patches:
|
||||
return
|
||||
|
||||
for bp in patches:
|
||||
cid = str(bp.get("id") or bp.get("label") or "variant").strip()
|
||||
if not cid:
|
||||
cid = "variant"
|
||||
patch = bp.get("patch")
|
||||
if patch is None or not isinstance(patch, dict):
|
||||
continue
|
||||
merged = deep_merge(base, patch)
|
||||
if not isinstance(merged, dict):
|
||||
merged = {}
|
||||
yield cid, merged
|
||||
@@ -0,0 +1,42 @@
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Any, Dict, Optional
|
||||
|
||||
_ROOT = Path(__file__).resolve().parent.parent
|
||||
|
||||
|
||||
def load() -> dict:
|
||||
return json.loads((_ROOT / "api_catalog.json").read_text(encoding="utf-8"))
|
||||
|
||||
|
||||
def endpoint_body(ep: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""Resolve request JSON: inline ``body`` wins, else load ``fixture`` file."""
|
||||
if ep.get("body") is not None:
|
||||
return dict(ep["body"])
|
||||
fix = ep.get("fixture")
|
||||
if fix:
|
||||
p = _ROOT / "fixtures" / fix
|
||||
return json.loads(p.read_text(encoding="utf-8"))
|
||||
return {}
|
||||
|
||||
|
||||
def iter_endpoints(catalog: dict, *, tag: Optional[str] = None) -> list[dict]:
|
||||
"""If ``tag`` is set, only endpoints with ``tags`` containing it (or legacy entries with no tags = all)."""
|
||||
out: list[dict] = []
|
||||
for ep in catalog.get("endpoints", []):
|
||||
tags = ep.get("tags") or []
|
||||
if tag is None:
|
||||
out.append(ep)
|
||||
elif not tags:
|
||||
out.append(ep)
|
||||
elif tag in tags:
|
||||
out.append(ep)
|
||||
return out
|
||||
|
||||
|
||||
def include_in_parity(ep: dict) -> bool:
|
||||
return bool(ep.get("include_in_parity", True))
|
||||
|
||||
|
||||
def include_in_smoke(ep: dict) -> bool:
|
||||
return bool(ep.get("include_in_smoke", True))
|
||||
@@ -0,0 +1,182 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
from dataclasses import dataclass
|
||||
from typing import Any, Optional
|
||||
|
||||
import requests
|
||||
|
||||
from . import compare
|
||||
from .health import probe_healthy
|
||||
|
||||
|
||||
@dataclass
|
||||
class ParityResult:
|
||||
name: str
|
||||
method: str
|
||||
path: str
|
||||
old_status: int
|
||||
new_status: int
|
||||
old_text: str
|
||||
new_text: str
|
||||
match: bool
|
||||
message: str
|
||||
|
||||
|
||||
def default_headers() -> dict[str, str]:
|
||||
h: dict[str, str] = {
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
m = {
|
||||
"businessid": "ELEVATOR_HEADER_BUSINESSID",
|
||||
"loginid": "ELEVATOR_HEADER_LOGINID",
|
||||
"platformuserid": "ELEVATOR_HEADER_PLATFORMUSERID",
|
||||
"authorization": "ELEVATOR_HEADER_AUTHORIZATION",
|
||||
"applicationid": "ELEVATOR_HEADER_APPLICATIONID",
|
||||
}
|
||||
for hdr, evar in m.items():
|
||||
v = os.environ.get(evar, "").strip()
|
||||
if v:
|
||||
h[hdr] = v
|
||||
return h
|
||||
|
||||
|
||||
def call_both(
|
||||
name: str,
|
||||
method: str,
|
||||
path: str,
|
||||
body: Any,
|
||||
base_old: str,
|
||||
base_new: str,
|
||||
extra_headers: Optional[dict] = None,
|
||||
compare_mode: str = "deep",
|
||||
session: requests.Session | None = None,
|
||||
) -> ParityResult:
|
||||
s = session or requests.Session()
|
||||
h = {**default_headers(), **(extra_headers or {})}
|
||||
url_o = base_old.rstrip("/") + path
|
||||
url_n = base_new.rstrip("/") + path
|
||||
if body is None:
|
||||
data = None
|
||||
else:
|
||||
data = body if isinstance(body, str) else json.dumps(body, ensure_ascii=False)
|
||||
m = method.upper()
|
||||
if m == "GET":
|
||||
r_old = s.get(url_o, headers=h, timeout=60)
|
||||
r_new = s.get(url_n, headers=h, timeout=60)
|
||||
else:
|
||||
r_old = s.post(url_o, headers=h, data=data, timeout=120)
|
||||
r_new = s.post(url_n, headers=h, data=data, timeout=120)
|
||||
ot, nt = r_old.text, r_new.text
|
||||
st_o, st_n = r_old.status_code, r_new.status_code
|
||||
msg = ""
|
||||
|
||||
if compare_mode == "status_only":
|
||||
m_ok = st_o == st_n
|
||||
if not m_ok:
|
||||
msg = f"http {st_o} vs {st_n}"
|
||||
elif compare_mode == "code_only":
|
||||
msg = ""
|
||||
oj, nj = _safe_json(ot), _safe_json(nt)
|
||||
c1, c2 = compare.business_code(oj), compare.business_code(nj)
|
||||
m_ok = st_o == st_n
|
||||
if m_ok and c1 is not None and c2 is not None:
|
||||
m_ok = c1 == c2
|
||||
elif m_ok and c1 is None and c2 is None and st_o == st_n and 400 <= st_o < 600:
|
||||
m_ok = True
|
||||
msg = "http status only (no parseable JSON body)"
|
||||
elif m_ok and (c1 is None) != (c2 is None):
|
||||
m_ok = False
|
||||
if not m_ok and not msg:
|
||||
msg = compare.describe_diff(ot, nt, "code_only")
|
||||
elif m_ok and not msg:
|
||||
msg = ""
|
||||
else:
|
||||
m_ok = st_o == st_n
|
||||
oj, nj = _safe_json(ot), _safe_json(nt)
|
||||
if oj is not None and nj is not None and m_ok:
|
||||
m_ok = compare.normalize(oj) == compare.normalize(nj)
|
||||
elif m_ok and (ot or "") != (nt or ""):
|
||||
m_ok = (ot or "").strip() == (nt or "").strip()
|
||||
if not m_ok:
|
||||
msg = compare.describe_diff(ot, nt, "deep") or f"http {st_o}/{st_n} or body mismatch"
|
||||
|
||||
return ParityResult(
|
||||
name=name,
|
||||
method=m,
|
||||
path=path,
|
||||
old_status=st_o,
|
||||
new_status=st_n,
|
||||
old_text=ot,
|
||||
new_text=nt,
|
||||
match=m_ok,
|
||||
message=msg,
|
||||
)
|
||||
|
||||
|
||||
def _safe_json(text: str) -> Any:
|
||||
if not (text or "").strip():
|
||||
return None
|
||||
try:
|
||||
return compare.parse_json_loose(text)
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
|
||||
def call_single(
|
||||
name: str,
|
||||
method: str,
|
||||
path: str,
|
||||
body: Any,
|
||||
base_url: str,
|
||||
session: requests.Session | None = None,
|
||||
) -> dict[str, Any]:
|
||||
"""One HTTP call for smoke coverage; returns a flat dict for reporting."""
|
||||
s = session or requests.Session()
|
||||
h = default_headers()
|
||||
url = base_url.rstrip("/") + path
|
||||
data = (
|
||||
None
|
||||
if body is None
|
||||
else (body if isinstance(body, str) else json.dumps(body, ensure_ascii=False))
|
||||
)
|
||||
m = method.upper()
|
||||
t0 = time.perf_counter()
|
||||
if m == "GET":
|
||||
r = s.get(url, headers=h, timeout=120)
|
||||
else:
|
||||
r = s.post(url, headers=h, data=data, timeout=120)
|
||||
elapsed_ms = int((time.perf_counter() - t0) * 1000)
|
||||
txt = r.text or ""
|
||||
oj = _safe_json(txt)
|
||||
bc = compare.business_code(oj) if oj is not None else None
|
||||
head = txt[:400].replace("\n", " ")
|
||||
return {
|
||||
"name": name,
|
||||
"method": m,
|
||||
"path": path,
|
||||
"http_status": r.status_code,
|
||||
"elapsed_ms": elapsed_ms,
|
||||
"business_code": bc,
|
||||
"response_head": head,
|
||||
"reachable": True,
|
||||
}
|
||||
|
||||
|
||||
def can_reach_one(base_url: str, s: requests.Session | None = None) -> tuple[bool, str]:
|
||||
s = s or requests.Session()
|
||||
_, ok, _ = probe_healthy(base_url, s)
|
||||
return ok, base_url
|
||||
|
||||
|
||||
def can_reach_both(
|
||||
base_old: str, base_new: str, s: requests.Session | None = None
|
||||
) -> tuple[bool, str]:
|
||||
s = s or requests.Session()
|
||||
p1, ok1, _ = probe_healthy(base_old, s)
|
||||
p2, ok2, _ = probe_healthy(base_new, s)
|
||||
if ok1 and ok2:
|
||||
return True, f"ok old health path~{p1} new probed"
|
||||
return False, f"health old ok={ok1} new ok={ok2} (paths like {p1})"
|
||||
@@ -0,0 +1,94 @@
|
||||
"""
|
||||
Compare two JSON response bodies. CloudwalkResult: compare top-level `code` when
|
||||
both parse as objects; also deep-compare with optional key stripping.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import copy
|
||||
import json
|
||||
from typing import Any, List, Set
|
||||
|
||||
# JSONPath-like: tuple of keys in order for nesting
|
||||
DEFAULT_STRIP_PATHS: Set[tuple] = {
|
||||
# ("data", "ts"),
|
||||
}
|
||||
|
||||
|
||||
def _strip(obj: Any, rules: Set[tuple], prefix: tuple) -> Any:
|
||||
if not isinstance(obj, (dict, list)):
|
||||
return obj
|
||||
if isinstance(obj, list):
|
||||
return [_strip(x, rules, prefix + (i,)) for i, x in enumerate(obj)]
|
||||
out = copy.deepcopy(obj)
|
||||
for k, v in list(obj.items()) if isinstance(obj, dict) else []:
|
||||
p = prefix + (k,)
|
||||
if p in rules:
|
||||
if k in out:
|
||||
del out[k]
|
||||
continue
|
||||
if isinstance(v, (dict, list)):
|
||||
out[k] = _strip(v, rules, p)
|
||||
return out
|
||||
|
||||
|
||||
def parse_json_loose(text: str) -> Any:
|
||||
if not (text or "").strip():
|
||||
return None
|
||||
return json.loads(text)
|
||||
|
||||
|
||||
def normalize(
|
||||
data: Any,
|
||||
strip_paths: Set[tuple] | None = None,
|
||||
) -> str:
|
||||
rules = strip_paths if strip_paths is not None else DEFAULT_STRIP_PATHS
|
||||
s = _strip(data, rules, tuple())
|
||||
return json.dumps(s, ensure_ascii=False, sort_keys=True, default=str)
|
||||
|
||||
|
||||
def business_code(data: Any) -> str | None:
|
||||
if isinstance(data, dict) and "code" in data:
|
||||
c = data.get("code")
|
||||
return str(c) if c is not None else None
|
||||
return None
|
||||
|
||||
|
||||
def same_shape(old_text: str, new_text: str) -> bool:
|
||||
try:
|
||||
a = parse_json_loose(old_text)
|
||||
b = parse_json_loose(new_text)
|
||||
except json.JSONDecodeError:
|
||||
return False
|
||||
if type(a) != type(b):
|
||||
return False
|
||||
if isinstance(a, dict) and isinstance(b, dict) and a.keys() == b.keys():
|
||||
return all(type(a[k]) is type(b[k]) for k in a)
|
||||
if isinstance(a, list) and isinstance(b, list):
|
||||
if len(a) == len(b) and len(a) == 0:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def describe_diff(
|
||||
old_text: str, new_text: str, compare_norm: str = "deep"
|
||||
) -> str:
|
||||
try:
|
||||
o = parse_json_loose(old_text)
|
||||
n = parse_json_loose(new_text)
|
||||
except json.JSONDecodeError as e:
|
||||
return f"json parse: {e}"
|
||||
if compare_norm == "code_only":
|
||||
c1, c2 = business_code(o), business_code(n)
|
||||
if c1 == c2:
|
||||
return ""
|
||||
return f"business code: old={c1!r} new={c2!r}"
|
||||
no = normalize(o)
|
||||
nn = normalize(n)
|
||||
if no == nn:
|
||||
return ""
|
||||
if business_code(o) is not None and business_code(n) is not None and business_code(o) != business_code(
|
||||
n
|
||||
):
|
||||
return f"normalized JSON differs; first code: old={business_code(o)} new={business_code(n)}"
|
||||
return "normalized JSON differs (see full bodies in test log)"
|
||||
@@ -0,0 +1,29 @@
|
||||
"""Probes that work for both Spring Boot 1.5/2.x with common actuator settings."""
|
||||
|
||||
import requests
|
||||
|
||||
_CANDIDATES = (
|
||||
"/actuator/health",
|
||||
"/actuator/health/", # noqa: PIE
|
||||
"/health",
|
||||
"/application/health", # very old
|
||||
)
|
||||
|
||||
|
||||
def probe_healthy(base_url: str, session: requests.Session, timeout: float = 2.0) -> tuple[str, bool, int]:
|
||||
base = base_url.rstrip("/")
|
||||
last_status = 0
|
||||
for path in _CANDIDATES:
|
||||
try:
|
||||
r = session.get(base + path, timeout=timeout, allow_redirects=True)
|
||||
last_status = r.status_code
|
||||
if r.status_code == 200 and _body_up(r.text):
|
||||
return path, True, r.status_code
|
||||
except requests.RequestException:
|
||||
last_status = -1
|
||||
return _CANDIDATES[0], False, last_status
|
||||
|
||||
|
||||
def _body_up(text: str) -> bool:
|
||||
t = (text or "").lower()
|
||||
return "up" in t or '"status":"ok"' in t or '"status": "ok"' in t
|
||||
@@ -0,0 +1,9 @@
|
||||
[pytest]
|
||||
minversion = 6.0
|
||||
addopts = -q --strict-markers
|
||||
testpaths = tests
|
||||
markers =
|
||||
live: 需要两实例可访问
|
||||
smoke: 单机全量 HTTP 探测
|
||||
unit: 纯逻辑单测
|
||||
pythonpath = .
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
# 电梯应用 API 测试套件总览
|
||||
|
||||
- **生成时间**: 2026-04-28T10:21:36.376623
|
||||
- **清单来源**: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/api_catalog.json`(共 **43** 条接口定义)
|
||||
- **后端 Controller 走查**: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/BACKEND-API-INVENTORY.md`
|
||||
|
||||
## 1. 说明
|
||||
|
||||
- **全量清单**:第二节,来自 `api_catalog.json`,含是否参与冒烟/对拍。
|
||||
- **测试结果矩阵**:第三节,与本次运行生成的 **JSON** 侧车文件对齐(与 `.md` 同名的 `.json`)。若应用未启动导致 pytest **skip**,则无 JSON,矩阵中表现为 **—**。
|
||||
- **横向对拍**:`pytest tests/test_parity_full_catalog.py` 可覆盖 **catalog 全部** 条目;`test_parity_endpoints.py` 仅 **include_in_parity=true** 的核心项。
|
||||
|
||||
## 2. 全量接口测试清单(catalog)
|
||||
|
||||
| ID | 名称 | 方法 | Path | 冒烟 | 横向对拍 |
|
||||
| ---- | ---- | ---- | ---- | ---- | -------- |
|
||||
| `person_add_visitor_min` | 访客派梯-最小体 | POST | `/elevator/person/add/visitor` | 是 | 是 |
|
||||
| `person_detail` | 人员详情-分页 | POST | `/elevator/person/detail` | 是 | 是 |
|
||||
| `passrule_page` | 通行规则-分页 | POST | `/elevator/passRule/page` | 是 | 是 |
|
||||
| `record_page` | 通行记录-分页 | POST | `/intelligent/acs/elevator/record/page` | 是 | 是 |
|
||||
| `person_add` | 人员-从现有人员添加 | POST | `/elevator/person/add` | 是 | 否 |
|
||||
| `person_edit` | 人员-编辑 | POST | `/elevator/person/edit` | 是 | 否 |
|
||||
| `person_delete` | 人员-删除 | POST | `/elevator/person/delete` | 是 | 否 |
|
||||
| `person_page` | 人员-分页 | POST | `/elevator/person/page` | 是 | 否 |
|
||||
| `person_time_detail` | 人员-时间详情 | POST | `/elevator/person/timeDetail` | 是 | 否 |
|
||||
| `person_page_by_app` | 人员-应用分页 | POST | `/elevator/person/pageByApp` | 是 | 否 |
|
||||
| `passrule_floor` | 通行规则-楼层列表 | POST | `/elevator/passRule/floor` | 是 | 否 |
|
||||
| `passrule_add` | 通行规则-新增 | POST | `/elevator/passRule/add` | 是 | 否 |
|
||||
| `passrule_edit` | 通行规则-修改 | POST | `/elevator/passRule/edit` | 是 | 否 |
|
||||
| `passrule_delete` | 通行规则-删除 | POST | `/elevator/passRule/delete` | 是 | 否 |
|
||||
| `passrule_detail` | 通行规则-详情 | POST | `/elevator/passRule/detail` | 是 | 否 |
|
||||
| `passrule_image` | 通行规则-按人像查楼层权限 | POST | `/elevator/passRule/image` | 是 | 否 |
|
||||
| `passrule_image_list` | 通行规则-批量人像 | POST | `/elevator/passRule/image/list` | 是 | 否 |
|
||||
| `record_analyse_cycle` | 记录-周期统计 | POST | `/intelligent/acs/elevator/record/analyse/cycle` | 是 | 否 |
|
||||
| `record_analyse_count` | 记录-次数统计 | POST | `/intelligent/acs/elevator/record/analyse/count` | 是 | 否 |
|
||||
| `record_page_request` | 记录-请求分页 | POST | `/intelligent/acs/elevator/record/page/request` | 是 | 否 |
|
||||
| `record_device_list` | 记录-设备列表 | POST | `/intelligent/acs/elevator/record/device/list` | 是 | 否 |
|
||||
| `record_zone_tree` | 记录-区域树 | POST | `/intelligent/acs/elevator/record/zone/tree` | 是 | 否 |
|
||||
| `device_v2_39201` | 设备网关-39201 设备列表 | POST | `/device/v2/39201` | 是 | 否 |
|
||||
| `device_v2_39202` | 设备网关-39202 区域电梯码 | POST | `/device/v2/39202` | 是 | 否 |
|
||||
| `device_v2_39203` | 设备网关-39203 添加记录 | POST | `/device/v2/39203` | 是 | 否 |
|
||||
| `device_v2_39204` | 设备网关-39204 密钥时间戳(已废弃) | POST | `/device/v2/39204` | 是 | 否 |
|
||||
| `elevator_device_add` | 设备-新增 | POST | `/elevator/device/add` | 是 | 否 |
|
||||
| `elevator_device_edit` | 设备-编辑 | POST | `/elevator/device/edit` | 是 | 否 |
|
||||
| `elevator_device_get_by_id` | 设备-按ID查询 | POST | `/elevator/device/getById` | 是 | 否 |
|
||||
| `elevator_device_delete` | 设备-删除 | POST | `/elevator/device/delete` | 是 | 否 |
|
||||
| `elevator_device_edit_code` | 设备-改码 | POST | `/elevator/device/editCode` | 是 | 否 |
|
||||
| `elevator_device_get` | 设备-查询列表 | POST | `/elevator/device/get` | 是 | 否 |
|
||||
| `elevator_device_export` | 设备-导出 | POST | `/elevator/device/export` | 是 | 否 |
|
||||
| `elevator_device_zone_tree_code` | 设备-区域树编码 | POST | `/elevator/device/zone/treeCode` | 是 | 否 |
|
||||
| `elevator_device_page` | 设备-分页 | POST | `/elevator/device/devicePage` | 是 | 否 |
|
||||
| `restructure_unbind_floors` | 改造-未绑定楼层 | POST | `/elevator/restructure/unbind/floors` | 是 | 否 |
|
||||
| `restructure_floors` | 改造-楼层列表 | POST | `/elevator/restructure/floors` | 是 | 否 |
|
||||
| `restructure_condition` | 改造-条件 | POST | `/elevator/restructure/condition` | 是 | 否 |
|
||||
| `restructure_condition_labels` | 改造-条件标签 | POST | `/elevator/restructure/condition/labels` | 是 | 否 |
|
||||
| `restructure_binding` | 改造-绑定 | POST | `/elevator/restructure/binding` | 是 | 否 |
|
||||
| `restructure_binding_person` | 改造-绑定人员 | POST | `/elevator/restructure/binding/person` | 是 | 否 |
|
||||
| `restructure_task_progress` | 改造-任务进度 | POST | `/elevator/restructure/task/progress` | 是 | 否 |
|
||||
| `restructure_task_stop` | 改造-停止任务 | POST | `/elevator/restructure/task/stop` | 是 | 否 |
|
||||
|
||||
## 3. 测试结果矩阵
|
||||
|
||||
- **V1 冒烟数据来源**: /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/smoke-v1_legacy-20260428-102131.md
|
||||
- **V2 冒烟数据来源**: /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/smoke-v2_build-20260428-102132.md
|
||||
- **核心对拍**(约 4 项): /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/parity-20260428-102133.md
|
||||
- **全量对拍**(catalog 全部): /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/parity-full-20260428-102136.md
|
||||
|
||||
### 测试结果矩阵(按 catalog `id` 对齐)
|
||||
|
||||
| catalog id | V1 HTTP | V1 code | V2 HTTP | V2 code | 核心对拍 | 全量对拍 | 备注 |
|
||||
| ---------- | ------- | ------- | ------- | ------- | -------- | -------- | ---- |
|
||||
| `person_add_visitor_min` | 200 | 76260521 | 200 | 76260521 | **Y** | **Y** | |
|
||||
| `person_detail` | 200 | 00000000 | 200 | 00000000 | **Y** | **Y** | |
|
||||
| `passrule_page` | 200 | 76260508 | 200 | 76260508 | **Y** | **Y** | |
|
||||
| `record_page` | 200 | 76260305 | 200 | 00000000 | **N** business code: old='76260305' new='00000000' | **N** business code: old='76260305' new='00000000' | |
|
||||
| `person_add` | 200 | 76260405 | 200 | 76260527 | (不参与) | **N** business code: old='76260405' new='76260527' | |
|
||||
| `person_edit` | 200 | 76260418 | 200 | — | (不参与) | **N** business code: old='76260418' new=None | |
|
||||
| `person_delete` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `person_page` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `person_time_detail` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `person_page_by_app` | 200 | 76260402 | 200 | — | (不参与) | **N** business code: old='76260402' new=None | |
|
||||
| `passrule_floor` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `passrule_add` | 200 | 76260514 | 200 | 76260527 | (不参与) | **N** business code: old='76260514' new='76260527' | |
|
||||
| `passrule_edit` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `passrule_delete` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `passrule_detail` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `passrule_image` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `passrule_image_list` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `record_analyse_cycle` | 200 | 76260333 | 200 | 00000000 | (不参与) | **N** business code: old='76260333' new='00000000' | |
|
||||
| `record_analyse_count` | 200 | 76260336 | 200 | 00000000 | (不参与) | **N** business code: old='76260336' new='00000000' | |
|
||||
| `record_page_request` | 200 | 76260335 | 200 | 00000000 | (不参与) | **N** business code: old='76260335' new='00000000' | |
|
||||
| `record_device_list` | 200 | 76260108 | 200 | 76260108 | (不参与) | **Y** | |
|
||||
| `record_zone_tree` | 200 | 76260108 | 200 | 76260108 | (不参与) | **Y** | |
|
||||
| `device_v2_39201` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `device_v2_39202` | 200 | 获取区域的电梯编码失败 | 200 | 获取区域的电梯编码失败 | (不参与) | **Y** | |
|
||||
| `device_v2_39203` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `device_v2_39204` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `elevator_device_add` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `elevator_device_edit` | 200 | 修改派梯设备失败 | 200 | 修改派梯设备失败 | (不参与) | **Y** | |
|
||||
| `elevator_device_get_by_id` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `elevator_device_delete` | 200 | 删除派梯设备信息失败 | 200 | 删除派梯设备信息失败 | (不参与) | **Y** | |
|
||||
| `elevator_device_edit_code` | 200 | — | 200 | — | (不参与) | **Y** | |
|
||||
| `elevator_device_get` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `elevator_device_export` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `elevator_device_zone_tree_code` | 200 | 获取区域的电梯编码失败 | 200 | 获取区域的电梯编码失败 | (不参与) | **Y** | |
|
||||
| `elevator_device_page` | 200 | 76260529 | 200 | 76260529 | (不参与) | **Y** | |
|
||||
| `restructure_unbind_floors` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `restructure_floors` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `restructure_condition` | 200 | 根据条件查询派梯楼层异常 | 200 | 根据条件查询派梯楼层异常 | (不参与) | **Y** | |
|
||||
| `restructure_condition_labels` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `restructure_binding` | 200 | 机构id、标签id绑定派梯楼层异常 | 200 | 机构id、标签id绑定派梯楼层异常 | (不参与) | **Y** | |
|
||||
| `restructure_binding_person` | 200 | 人员批量绑定派梯楼层异常 | 200 | 人员批量绑定派梯楼层异常 | (不参与) | **Y** | |
|
||||
| `restructure_task_progress` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
| `restructure_task_stop` | 200 | 00000000 | 200 | 00000000 | (不参与) | **Y** | |
|
||||
|
||||
**说明**:`code` 为 CloudwalkResult 顶层业务码;HTTP 为传输层状态。**核心对拍**仅 `include_in_parity=true`;**全量对拍**覆盖 `api_catalog.json` 全部条目(需跑 `test_parity_full_catalog`)。对拍 **Y** 表示旧/新 HTTP 一致且业务 code 一致(`code_only`)。
|
||||
|
||||
## 4. 原始报告路径(便于回放)
|
||||
|
||||
- V1 冒烟: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/smoke-v1_legacy-20260428-102131.md`
|
||||
- V2 冒烟: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/smoke-v2_build-20260428-102132.md`
|
||||
- 对拍(核心): `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/parity-20260428-102133.md`
|
||||
- 对拍(全量): `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/parity-full-20260428-102136.md`
|
||||
- 后端走查: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/BACKEND-API-INVENTORY.md`
|
||||
- 同名 **`.json`** 与 `.md` 一并生成时可自动填充第三节矩阵。
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
# API_DIFF 剩余项排查(对照 cw_lib V1 JAR)
|
||||
|
||||
本报告对应 `bytecode_parity_rootcause.py` 在 **norm_api 合并 descriptor 并排序** 之后仍标记为 `API_DIFF` 的类(约 14 个)。此前约 35 项差异主要来自 **javap 成员声明顺序**(已消除)与 **工具/常量类缺省构造可见性**(已对可与 V1 对齐的类补充 `private Foo()`)。
|
||||
|
||||
## 1. 脚本侧变更摘要
|
||||
|
||||
- `norm_api`:将「成员行 + 下一行 `descriptor:`」合并为一条后 **排序**,避免 Lombok/编译器调整顺序导致的伪差异。
|
||||
- 源码:`ToolUtil`、`AcsConstants`、`AcsLockConstants`、`ErrorCode`、`FeignRemoteConfig`、`ImageStoreConstants` 增加 **private 空参构造**,与 V1 一致。
|
||||
- **例外**:`FeignThreadLocalUtil` 在 V1 JAR 中为 **public 默认构造**,未添加 private 构造,避免与 V1 不一致。
|
||||
|
||||
## 2. 剩余 API_DIFF 归类
|
||||
|
||||
| 类 | 原因概要 |
|
||||
|----|----------|
|
||||
| `FeignThreadLocalUtil` | V2 新增 `callWithContext(CloudwalkCallContext, Callable)`;其余与 V1 构造可见性需保持 public 默认。 |
|
||||
| `AcsElevatorCodeDao` / `Impl` / `Mapper` | V2 新增 `listByZoneIds(List<String>)` 等查询链。 |
|
||||
| `AcsElevatorCodeService` / `AcsElevatorCodeServiceImpl` | V2 新增/调整按 zone 聚合的 `Map<…>` 接口。 |
|
||||
| `AcsDeviceTaskServiceImpl` | V2 大量新增带 `CloudwalkCallContext`、绑定参数等辅助方法(异步/上下文传递)。 |
|
||||
| `AcsElevatorDeviceServiceImpl` | 设备列表相关 lambda 参数类型由 `List` 变为 `ArrayList` 及 lambda 编号变化(合成方法签名变化)。 |
|
||||
| `AcsPassRuleServiceImpl` | V2 依赖线程池、`CloudwalkCallContext`、日志辅助方法等成员变化。 |
|
||||
| `ImageRuleRefServiceImpl` | V2 新增 `fillLabelDetailsFromMap` 等私有方法及 Context 重载。 |
|
||||
| `AcsPersonServiceImpl` | V2 异步删除、线程池、`CloudwalkCallContext`;lambda 合成签名与 V1 不同。 |
|
||||
| `PersonRuleServiceImpl` | V2 租户访客楼层:`TenantVisitorFloorPolicyDao`、`parseAllowZoneIds` 等。 |
|
||||
| `AcsElevatorRecordServiceImpl` | **V1 仍存在** `lambda$openRecord$0(...)`,**V2 已移除或改写**,属签名删减。 |
|
||||
| `AcsElevatorDeviceController` | `treeRecursionDataList` 由 `(List)` 变为 `(List, Map)`(递归树附加参数)。 |
|
||||
|
||||
## 3. IMPL_DIFF 数量上升说明
|
||||
|
||||
部分类原先因 **API 哈希不一致** 被标为 `API_DIFF`,未展示实现差异。API 归一化对齐后,同一批类若字节码仍不同,会正确显示为 **`IMPL_DIFF`**。这不代表质量回退,而是分类更准确。
|
||||
|
||||
## 4. 若要继续压低 API_DIFF
|
||||
|
||||
- **删除或改为 package-private** 新增对外 API(需评估业务是否依赖)。
|
||||
- **恢复 V1 签名**(如 Controller 方法参数回退)将影响对外 HTTP 契约,须与「接口不变」约定一并评审。
|
||||
+1250
File diff suppressed because it is too large
Load Diff
+65
@@ -0,0 +1,65 @@
|
||||
# 电梯应用后端 HTTP 走查(Controller 扫描 vs api_catalog)
|
||||
|
||||
- **扫描目录**: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/cw-elevator-application-web/src/main/java`
|
||||
- **catalog**: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/api_catalog.json`(共 **43** 条 path)
|
||||
|
||||
## 1. Java 声明路由(REST Controller)
|
||||
|
||||
| 方法 | Path | 源文件 |
|
||||
| ---- | ---- | ------ |
|
||||
| POST | `/device/v2/39201` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceGetWayController.java` |
|
||||
| POST | `/device/v2/39202` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceGetWayController.java` |
|
||||
| POST | `/device/v2/39203` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceGetWayController.java` |
|
||||
| POST | `/device/v2/39204` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceGetWayController.java` |
|
||||
| POST | `/elevator/device/add` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceController.java` |
|
||||
| POST | `/elevator/device/delete` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceController.java` |
|
||||
| POST | `/elevator/device/devicePage` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceController.java` |
|
||||
| POST | `/elevator/device/edit` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceController.java` |
|
||||
| POST | `/elevator/device/editCode` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceController.java` |
|
||||
| POST | `/elevator/device/export` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceController.java` |
|
||||
| POST | `/elevator/device/get` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceController.java` |
|
||||
| POST | `/elevator/device/getById` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceController.java` |
|
||||
| POST | `/elevator/device/zone/treeCode` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorDeviceController.java` |
|
||||
| POST | `/elevator/passRule/add` | `cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java` |
|
||||
| POST | `/elevator/passRule/delete` | `cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java` |
|
||||
| POST | `/elevator/passRule/detail` | `cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java` |
|
||||
| POST | `/elevator/passRule/edit` | `cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java` |
|
||||
| POST | `/elevator/passRule/floor` | `cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java` |
|
||||
| POST | `/elevator/passRule/image` | `cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java` |
|
||||
| POST | `/elevator/passRule/image/list` | `cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java` |
|
||||
| POST | `/elevator/passRule/page` | `cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java` |
|
||||
| POST | `/elevator/person/add` | `cn/cloudwalk/elevator/person/controller/AcsPersonController.java` |
|
||||
| POST | `/elevator/person/add/visitor` | `cn/cloudwalk/elevator/person/controller/AcsPersonController.java` |
|
||||
| POST | `/elevator/person/delete` | `cn/cloudwalk/elevator/person/controller/AcsPersonController.java` |
|
||||
| POST | `/elevator/person/detail` | `cn/cloudwalk/elevator/person/controller/AcsPersonController.java` |
|
||||
| POST | `/elevator/person/edit` | `cn/cloudwalk/elevator/person/controller/AcsPersonController.java` |
|
||||
| POST | `/elevator/person/page` | `cn/cloudwalk/elevator/person/controller/AcsPersonController.java` |
|
||||
| POST | `/elevator/person/pageByApp` | `cn/cloudwalk/elevator/person/controller/AcsPersonController.java` |
|
||||
| POST | `/elevator/person/timeDetail` | `cn/cloudwalk/elevator/person/controller/AcsPersonController.java` |
|
||||
| POST | `/elevator/restructure/binding` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorRestructureController.java` |
|
||||
| POST | `/elevator/restructure/binding/person` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorRestructureController.java` |
|
||||
| POST | `/elevator/restructure/condition` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorRestructureController.java` |
|
||||
| POST | `/elevator/restructure/condition/labels` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorRestructureController.java` |
|
||||
| POST | `/elevator/restructure/floors` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorRestructureController.java` |
|
||||
| POST | `/elevator/restructure/task/progress` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorRestructureController.java` |
|
||||
| POST | `/elevator/restructure/task/stop` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorRestructureController.java` |
|
||||
| POST | `/elevator/restructure/unbind/floors` | `cn/cloudwalk/elevator/handler/device/controller/AcsElevatorRestructureController.java` |
|
||||
| POST | `/file/imgupload` | `cn/cloudwalk/elevator/handler/device/controller/FileController.java` |
|
||||
| POST | `/intelligent/acs/elevator/record/analyse/count` | `cn/cloudwalk/elevator/record/controller/AcsElevatorRecordController.java` |
|
||||
| POST | `/intelligent/acs/elevator/record/analyse/cycle` | `cn/cloudwalk/elevator/record/controller/AcsElevatorRecordController.java` |
|
||||
| POST | `/intelligent/acs/elevator/record/device/list` | `cn/cloudwalk/elevator/record/controller/AcsElevatorRecordController.java` |
|
||||
| POST | `/intelligent/acs/elevator/record/page` | `cn/cloudwalk/elevator/record/controller/AcsElevatorRecordController.java` |
|
||||
| POST | `/intelligent/acs/elevator/record/page/request` | `cn/cloudwalk/elevator/record/controller/AcsElevatorRecordController.java` |
|
||||
| POST | `/intelligent/acs/elevator/record/zone/tree` | `cn/cloudwalk/elevator/record/controller/AcsElevatorRecordController.java` |
|
||||
|
||||
## 2. 未纳入 api_catalog 的 Controller 路径
|
||||
|
||||
- `/file/imgupload`
|
||||
|
||||
## 3. api_catalog 有而扫描未命中(请核对写法/网关前缀)
|
||||
|
||||
- (无)
|
||||
|
||||
## 4. 其它说明
|
||||
|
||||
- **/file/imgupload**:FileController(multipart/form-data,未纳入 JSON 冒烟)
|
||||
+192
@@ -0,0 +1,192 @@
|
||||
# V1 反编译还原度与 V2 源码差异归因(修订版)
|
||||
|
||||
**文档日期**:2026-04-28
|
||||
**修订说明**:此前版本用「哪一侧产品更合理」简化结论,**不适宜**用于评估 CFR 质量。本版以 **反编译是否正确、还原度是否高** 为第一目标;与 Maven 源码的差异单独 **归因**(CFR 噪声 / jar 真貌 / 源码相对历史 jar 的变更)。
|
||||
|
||||
**关联**:`V1-V2-DIFF-ISSUES.md`(相似度仅作筛查线索,**不得**单独作为「业务不一致」或「谁对谁错」的判定依据)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 审核框架(必须用到的判定顺序)
|
||||
|
||||
### 1.1 何谓「还原正确 / 还原度高」
|
||||
|
||||
|
||||
| 层级 | 含义 |
|
||||
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **语义与字节码一致** | CFR 呈现的调用链、分支、`@Value`/常量键名与 `javap`/ASM 可读信息一致(或可被其支持)。 |
|
||||
| **与部署模型互证(强证据)** | 反编译显示「从 Spring 占位符读取某配置键」,且 **同一时代的部署配置模板**(或归档 `application.properties`/`yml`)中 **确实存在该键**,则说明:既不是 CFR hallucination,也符合该类在运行时的注入模型 → **对该段代码,反编译还原可信度高**。 |
|
||||
| **与常量/枚举互证** | 魔数、错误码字符串与 jar 内外部契约一致时,可降低「反编译看错 opcode」的担忧。 |
|
||||
|
||||
|
||||
### 1.2 与 V2(Maven)不一致时怎样写结论(禁止简单站队)
|
||||
|
||||
|
||||
| 情形 | 写法 |
|
||||
| -------------------- | --------------------------------------------------------------------------------------------------------------------------- |
|
||||
| CFR 显示 A,配置/jar 侧可互证 | **还原度:高**。 |
|
||||
| CFR 显示 A,V2 源码显示 B | 优先判断:**历史 cw_lib jar 是否本就为 A**——若是,则差异为 **Maven 源码相对 20211103 jar 的演进**,不是「CFR 把 B 译错了」。必要时用 **javap -c / 解压 class 比对** 复核。 |
|
||||
| 仅写法/泛型/命名不同,语义相同 | **还原度:高(噪声)**;勿记为业务分歧。 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 2. 分项:还原度与差异归因(已走查类)
|
||||
|
||||
### 2.1 `AcsElevatorDeviceGetWayController` — `POST /device/v2/39204`(`getKey`)
|
||||
|
||||
**V1(CFR)呈现的语义**
|
||||
`KeyValueResult` 使用字段 `this.key`、`this.time`、`this.keyA`,对应 `@Value("${elevator.application.key}")` 等注入后再 `setKey`/`setTime`/`setKeyA` 返回(参见当前 CFR:`.../AcsElevatorDeviceGetWayController.java` 中 `39204` 方法)。
|
||||
|
||||
**部署配置互证(原始侧确有同名项)**
|
||||
|
||||
下列模板与 **legacy / v2 两份**部署属性一致包含电梯应用键(示例值一致,便于对照键名是否存在):
|
||||
|
||||
```properties
|
||||
# maven-cw-elevator-application/deploy/v1-legacy/application.properties (约 102–104 行)
|
||||
elevator.application.key=xinghewan
|
||||
elevator.application.time=600
|
||||
elevator.application.keyA=5B7DEF88FF04
|
||||
```
|
||||
|
||||
```properties
|
||||
# maven-cw-elevator-application/deploy/v2-maven/application.properties (约 108–110 行)
|
||||
elevator.application.key=xinghewan
|
||||
elevator.application.time=600
|
||||
elevator.application.keyA=5B7DEF88FF04
|
||||
```
|
||||
|
||||
**结论(还原度)**
|
||||
|
||||
- CFR 对该方法的还原与 **「从配置注入后再写出到响应」** 的模型一致,且 **配置工件中键名齐备**,故 **将该段评定为:反编译还原正确、可信度高**。
|
||||
- **不作**「返回明文钥是否政治上正确」的结论;与安全策略相关的取舍属于 **源码/Maven 侧后续修改**范畴。
|
||||
|
||||
**与 V2 源码的差异归因**
|
||||
|
||||
- V2 将该接口标为 `@Deprecated`、`key`/`keyA` 置空字符串等,属于 **Maven 源码相对历史字节码行为的故意变更**。
|
||||
- 该类差异 **不能**反向证明 CFR「译错」;相反,若以 jar 为准,CFR 更忠实于 **当时的** class 文件。
|
||||
|
||||
---
|
||||
|
||||
### 2.2 `AcsElevatorDeviceGetWayController` — `POST /device/v2/39202`(区域树 + 电梯码)
|
||||
|
||||
**V1(CFR)呈现的语义**
|
||||
树遍历后对多个节点分别构造 `AcsElevatorCodeParam` 并调用 `elevatorCodeService.get(...)`(逐次查询)。
|
||||
|
||||
**V2(Maven)呈现的语义**
|
||||
收集 zoneId 集合后 `mapByZoneIds`,再用 `ZoneTreeCollectors` 等与树组装。
|
||||
|
||||
**结论(还原度 vs 归因)**
|
||||
|
||||
|
||||
| 对象 | 结论 |
|
||||
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **CFR 对 jar 内 39202 逻辑的还原** | 若解压的 `cw-elevator-application-web` class 与之同构(循环 + 多次 `get`),则 **对该历史 jar,CFR 还原度高**;这是在描述「字节码长什么样」,不是优劣判断。 |
|
||||
| **V1 CFR 与 V2 源码文本差异大** | 归因:**Maven 源码已对取码路径做重构(批量 + 工具类)**,属于 **源码演进**,≠ CFR 不可靠。若要 100% 封口,可对 **20211103 jar** 内对应 `*.class` 做一次 `javap -c` 与 CFR 提纲对照(建议纳入后续工件)。 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 2.3 `FeignThreadLocalUtil`(`cw-elevator-application-common`)
|
||||
|
||||
**V1(CFR)**
|
||||
包含 `set`/`get`/`remove`、`getRequestHeader`、`getDefaultReqesutHeader`(拼写保持 CFR 输出)、`getDefaultRequestHeader(CloudwalkCallContext)`、`setRequestHeader(...)`;**未发现** `callWithContext`。
|
||||
|
||||
**V2(Maven)**
|
||||
在如上之外 **新增** `callWithContext(CloudwalkCallContext, Callable<T>)`。
|
||||
|
||||
**结论(还原度 vs 归因)**
|
||||
|
||||
|
||||
| 对象 | 结论 |
|
||||
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| **CFR 对 cw_lib common jar 中该类的还原** | 若在 **同期 jar** 中确实无 `callWithContext`,则 CFR **未捏造方法**,还原度可信。 |
|
||||
| **与 V2 差异** | **Maven 增补 API**,服务于线程池/Feign 上下文传递;归类为 **源码增量**,不作为「CFR 漏译原版完整行为」的依据(除非事后证明 jar 内已有该方法而 CFR 丢了——需 javap 证伪)。 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 2.4 `39201`、`39203`(摘要)
|
||||
|
||||
- 控制流与业务步骤在 V1 CFR 与 V2 间 **大体同构**;剩余差异多为泛型擦除、日志字面量、包装类型写法等 **CFR 常见噪声**。
|
||||
- **还原度**:在未发现与配置/常量矛盾的前提下,可视为 **高(噪声级差异)**。
|
||||
- **不作**「简单判定谁更合理」。
|
||||
|
||||
---
|
||||
|
||||
### 2.5 仅存在于 Maven 的类(如 `TenantVisitorFloorPolicy`*、`ZoneTreeCollectors` 等)
|
||||
|
||||
- **不归因于 CFR 错误**:历史 jar 中 **不存在** 的类,反编译产物中也不会有;出现在 Maven 仅为 **后续源码扩展**。
|
||||
- 与「还原度」的关系:**不适用 jar↔CFR 对照**;仅在「差异清单」中标注 **源码扩展项**。
|
||||
|
||||
---
|
||||
|
||||
## 3. 硬证据(字节码级)
|
||||
|
||||
### 3.1 取证命令(可复现)
|
||||
|
||||
```bash
|
||||
javap -classpath cw-elevator-application-V1.0.0.20211103/cw_lib/cw-elevator-application-web-1.0-SNAPSHOT.jar -c -p cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController > tools/elevator_api_parity/report/javap-evidence-20260428/AcsElevatorDeviceGetWayController.javap.txt
|
||||
javap -classpath cw-elevator-application-V1.0.0.20211103/cw_lib/cw-elevator-application-web-1.0-SNAPSHOT.jar -v -p cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController > tools/elevator_api_parity/report/javap-evidence-20260428/AcsElevatorDeviceGetWayController.javap.verbose.txt
|
||||
javap -classpath cw-elevator-application-V1.0.0.20211103/cw_lib/cw-elevator-application-common-1.0-SNAPSHOT.jar -c -p cn.cloudwalk.elevator.config.FeignThreadLocalUtil > tools/elevator_api_parity/report/javap-evidence-20260428/FeignThreadLocalUtil.javap.txt
|
||||
```
|
||||
|
||||
### 3.2 `39204 getKey` 的字节码证据
|
||||
|
||||
- 在 `AcsElevatorDeviceGetWayController.javap.txt` 可见 `getKey` 直接读取字段并写入返回对象:
|
||||
- `getfield #91 // Field key:Ljava/lang/String;` → `KeyValueResult.setKey`
|
||||
- `getfield #93 // Field time:Ljava/lang/Long;` → `KeyValueResult.setTime`
|
||||
- `getfield #95 // Field keyA:Ljava/lang/String;` → `KeyValueResult.setKeyA`
|
||||
- 在 `AcsElevatorDeviceGetWayController.javap.verbose.txt` 常量池与字段注解可见:
|
||||
- `#113 = Utf8 Lorg/springframework/beans/factory/annotation/Value;`
|
||||
- `#115 = Utf8 ${elevator.application.key}`
|
||||
- `#118 = Utf8 ${elevator.application.time}`
|
||||
- `#120 = Utf8 ${elevator.application.keyA}`
|
||||
- 字段注解条目:`0: #113(#114=s#115/#118/#120)`
|
||||
- 结论:对 20211103 jar 而言,CFR 中「`@Value` 注入并在 `getKey` 返回 key/time/keyA」并非猜测,具备 class 文件级证据。
|
||||
|
||||
### 3.3 `FeignThreadLocalUtil` 的字节码证据
|
||||
|
||||
- 在 `FeignThreadLocalUtil.javap.txt` 的方法清单中可见:
|
||||
- 存在:`set/get/remove/getRequestHeader/getDefaultReqesutHeader/getDefaultRequestHeader/setRequestHeader(...)`
|
||||
- 未出现:`callWithContext(CloudwalkCallContext, Callable<T>)`
|
||||
- 结论:在历史 `cw-elevator-application-common-1.0-SNAPSHOT.jar` 对应 class 中,`callWithContext` 不存在;V2 该方法属于源码新增,不应归咎为 CFR 漏译。
|
||||
|
||||
### 3.4 证据文件校验和(防串改)
|
||||
|
||||
```text
|
||||
6fbb033f2e8f0b305dca00e4e22275ae83096306281ebcc39c8b38d0396a0f4e tools/elevator_api_parity/report/javap-evidence-20260428/AcsElevatorDeviceGetWayController.javap.txt
|
||||
da0ef0a6ca471987a335251cfe538910ad102c168424d9dc760a311f86388eeb tools/elevator_api_parity/report/javap-evidence-20260428/AcsElevatorDeviceGetWayController.javap.verbose.txt
|
||||
5447ca5efc99e0e28eb0033731dd03ff10364191b9f487d90e3f687637ab7c1f tools/elevator_api_parity/report/javap-evidence-20260428/FeignThreadLocalUtil.javap.txt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 后续建议(保持方法论一致)
|
||||
|
||||
1. **配置互证**:凡 CFR 出现 `@Value("${...}")` 或硬编码配置键,在 `deploy/`、归档环境包或文档中检索 **同名键**,作为还原度佐证的一栏。
|
||||
2. **可疑点才上 javap**:若 CFR 与常识冲突(例如调用不存在的方法),再对 **jar 内 class** 做字节码核对,避免全文 javap。
|
||||
3. **差异报告用法**:`V1-V2-DIFF-ISSUES.md` 中的相似度用于 **排序优先级**;定性时拆成 **「CFR 还原是否可信」** 与 **「Maven 相对 jar 是否变更」** 两列,避免单一「合理性」打分。
|
||||
|
||||
---
|
||||
|
||||
## 5. 引用路径(复核用)
|
||||
|
||||
|
||||
| 用途 | 路径 |
|
||||
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| V1 CFR Controller | `tools/v1-decompiled/cfr-from-cw-lib-current/cw-elevator-application-web-1.0-SNAPSHOT/.../AcsElevatorDeviceGetWayController.java` |
|
||||
| V2 源码 Controller | `cw-elevator-application-web/.../AcsElevatorDeviceGetWayController.java` |
|
||||
| V1 CFR FeignThreadLocalUtil | `.../cw-elevator-application-common-1.0-SNAPSHOT/.../FeignThreadLocalUtil.java` |
|
||||
| V2 源码 FeignThreadLocalUtil | `cw-elevator-application-common/.../FeignThreadLocalUtil.java` |
|
||||
| 配置互证(legacy) | `deploy/v1-legacy/application.properties` |
|
||||
| 配置互证(v2 模板) | `deploy/v2-maven/application.properties` |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 6. 与旧版表述的切割
|
||||
|
||||
- **旧版**以「工程/安全谁更合理」收敛,**易与反编译审计目标混淆**。
|
||||
- **本版**默认立场:**39204 等「从配置读取」且在配置模板中存在对应项时,优先认定 CFR 对该行为还原正确**;Maven 侧若不同,优先记为 **源码相对历史字节码的变更**,需另表跟踪,而非用「合理性」替代还原度证据链。
|
||||
|
||||
+214
@@ -0,0 +1,214 @@
|
||||
# V1/V2 接口差异逐项定位报告(2026-04-28)
|
||||
|
||||
## 背景
|
||||
|
||||
> **勘误(制品边界)**:若修复手段写在「兄弟仓库」如 `maven-cloudwalk-cloud` / `cloudwalk-common-service` 但未 **升级电梯工程依赖版本并发布到私服**,则 **`cw-elevator-application` fat-jar 不会包含这些改动**。生产「仅替换电梯 jar」时,有效变更只能来自电梯 reactor 打进制品的源码,或来自已解析版本的依赖字节码。详见 `V1-V2-REPAIR-RETRO-20260428.md` 第 9 节。
|
||||
|
||||
- 本次执行了完整构建、双实例启动与全量接口对拍。
|
||||
- 关键报告:
|
||||
- `SUITE-20260428-102136.md`
|
||||
- `parity-full-20260428-102136.md`
|
||||
- `parity-full-20260428-102136.json`
|
||||
- 结果:共 43 项接口,匹配 35 项,不匹配 8 项。
|
||||
|
||||
## 总体结论
|
||||
|
||||
8 项差异并非单一原因,归类为三类:
|
||||
|
||||
1. 记录类接口:V1 命中分表/路由异常,V2 返回空成功(业务码不同)。
|
||||
2. 参数校验链路:V2 未在参数层拦截,进入更深业务分支后返回不同业务码。
|
||||
3. 远程 Feign 可用性:V2 存在无可用实例异常,导致部分接口出现 `200 + 空响应体`(`new=None`)。
|
||||
|
||||
同时,已对关键源码做过 V1 反编译对比,核心 Controller/Service 文件内容一致,说明主要是运行时行为差异,而不是这几处源码逻辑被改写。
|
||||
|
||||
---
|
||||
|
||||
## 一、差异接口逐项定位
|
||||
|
||||
### 1) `record_page`
|
||||
|
||||
- 路径:`POST /intelligent/acs/elevator/record/page`
|
||||
- 对拍差异:`old=76260305`,`new=00000000`
|
||||
- 定位结论:
|
||||
- V1 日志出现 `no table route info`(Sharding 路由失败)。
|
||||
- Controller 捕获异常后返回 `76260305`。
|
||||
- V2 在当前环境未触发该异常,返回空分页成功。
|
||||
|
||||
### 2) `record_page_request`
|
||||
|
||||
- 路径:`POST /intelligent/acs/elevator/record/page/request`
|
||||
- 对拍差异:`old=76260335`,`new=00000000`
|
||||
- 定位结论:
|
||||
- V1 日志出现 `Table ... IT_ACS_ELEVATOR_RECORD_2020 doesn't exist`。
|
||||
- DAO 查询失败后上抛,Controller 返回 `76260335`。
|
||||
- V2 返回空列表成功。
|
||||
|
||||
### 3) `record_analyse_cycle`
|
||||
|
||||
- 路径:`POST /intelligent/acs/elevator/record/analyse/cycle`
|
||||
- 对拍差异:`old=76260333`,`new=00000000`
|
||||
- 定位结论:
|
||||
- 以 `{}` 请求时,V1 返回参数校验相关业务码。
|
||||
- V2 直接返回空数组成功,说明该链路未在参数校验层拦截。
|
||||
|
||||
### 4) `record_analyse_count`
|
||||
|
||||
- 路径:`POST /intelligent/acs/elevator/record/analyse/count`
|
||||
- 对拍差异:`old=76260336`,`new=00000000`
|
||||
- 定位结论:
|
||||
- 与上项同类问题。
|
||||
- V1 失败码路径与 V2 成功路径分叉,核心在校验/异常触发条件不同。
|
||||
|
||||
### 5) `person_add`
|
||||
|
||||
- 路径:`POST /elevator/person/add`
|
||||
- 对拍差异:`old=76260405`,`new=76260527`
|
||||
- 定位结论:
|
||||
- `{}` 请求下,V1 在参数层返回“人员 id 不能为空”类业务码。
|
||||
- V2 未在此处拦截,进入图库/设备关联逻辑,返回 `76260527`。
|
||||
|
||||
### 6) `passrule_add`
|
||||
|
||||
- 路径:`POST /elevator/passRule/add`
|
||||
- 对拍差异:`old=76260514`,`new=76260527`
|
||||
- 定位结论:
|
||||
- `{}` 请求下,V1 返回规则名称必填业务码。
|
||||
- V2 继续进入深层分支,返回 `76260527`。
|
||||
|
||||
### 7) `person_edit`
|
||||
|
||||
- 路径:`POST /elevator/person/edit`
|
||||
- 对拍差异:`old=76260418`,`new=None`(响应体为空)
|
||||
- 定位结论:
|
||||
- V2 日志存在 Feign 负载均衡异常:`Load balancer does not have available server for client: ninca-common-component-organization`。
|
||||
- 该异常导致请求链路异常,实际 HTTP 为 200 但响应体为空(Content-Length: 0)。
|
||||
|
||||
### 8) `person_page_by_app`
|
||||
|
||||
- 路径:`POST /elevator/person/pageByApp`
|
||||
- 对拍差异:`old=76260402`,`new=None`(响应体为空)
|
||||
- 定位结论:
|
||||
- V2 日志存在 Feign 负载均衡异常:`Load balancer does not have available server for client: cwos-portal`。
|
||||
- 最终表现同上:200 + 空 body。
|
||||
|
||||
---
|
||||
|
||||
## 二、证据摘要
|
||||
|
||||
### 1. 对拍 JSON 直接证据
|
||||
|
||||
- 文件:`parity-full-20260428-102136.json`
|
||||
- 8 个不匹配条目均有明确 `message`(business code 差异或 `new=None`)。
|
||||
|
||||
### 2. 运行日志证据
|
||||
|
||||
- V1:`deploy/v1-legacy/logs/elevator-app.log`
|
||||
- 多处 `no table route info`
|
||||
- 多处 `IT_ACS_ELEVATOR_RECORD_2020 doesn't exist`
|
||||
- V2:`deploy/v2-maven/logs/elevator-app.log`
|
||||
- 多处 Feign 无可用实例:
|
||||
- `ninca-common-component-organization`
|
||||
- `cwos-portal`
|
||||
- 关联调用点可追到 `AcsPersonServiceImpl.pageByApp` / `AcsPersonServiceImpl.edit`
|
||||
|
||||
### 3. 源码一致性排查
|
||||
|
||||
- 已对以下关键文件做 V1 反编译源码与当前源码逐文件比对,结果一致:
|
||||
- `AcsElevatorRecordController`
|
||||
- `AcsPersonController`
|
||||
- `AcsPassRuleController`
|
||||
- `PersonRuleServiceImpl`
|
||||
- `ImageRuleRefServiceImpl`
|
||||
|
||||
---
|
||||
|
||||
## 三、当前判断
|
||||
|
||||
本轮 8 项差异的主要矛盾不在“控制器代码改坏”,而在以下运行态差异:
|
||||
|
||||
1. 分库分表路由条件与历史数据状态(V1触发失败、V2未触发)。
|
||||
2. 参数校验切面/拦截行为与预期不一致(V2 未提前失败)。
|
||||
3. 外部服务发现/静态实例配置不完整(V2 Feign 无可用实例)。
|
||||
|
||||
---
|
||||
|
||||
## 四、建议的修复优先级(后续执行)
|
||||
|
||||
1. **先修远程依赖可用性(最高优先)**
|
||||
目标:消除 `person_edit`、`person_page_by_app` 的空响应体问题。
|
||||
方向:补齐 `cwos-portal` 与 `ninca-common-component-organization` 的静态实例或可用发现配置。
|
||||
2. **恢复参数校验行为一致性**
|
||||
目标:`person_add`、`passrule_add`、`record_analyse_`* 在缺参时返回与 V1 相同业务码。
|
||||
方向:确认 `@CloudwalkParamsValidate` 的生效条件、AOP 代理方式与切面装配。
|
||||
3. **统一记录接口在当前环境下的行为**
|
||||
目标:`record_page`、`record_page_request` 的 V1/V2 行为收敛。
|
||||
方向:明确目标是“都失败(保留历史)”还是“都成功(修复历史路由/表)”,然后按目标改路由策略或数据表准备。
|
||||
|
||||
---
|
||||
|
||||
## 五、已执行修复与验证结果(2026-04-28 11:00+)
|
||||
|
||||
按上述优先级已完成逐项修复与本机复测,结果如下:
|
||||
|
||||
### 1) Feign 可用性修复(已完成)
|
||||
|
||||
- 改动:
|
||||
- `deploy/v2-maven/application.properties` 新增:
|
||||
- `feign.portal.name=cwos-portal`
|
||||
- `cwos-portal.ribbon.NIWSServerListClassName=...`
|
||||
- `cwos-portal.ribbon.listOfServers=10.128.161.95:80`
|
||||
- `ninca-common-component-organization.ribbon.NIWSServerListClassName=...`
|
||||
- `ninca-common-component-organization.ribbon.listOfServers=10.128.161.95:80`
|
||||
- `ElevatorApplication` 从单 `@RibbonClient` 扩展为 `@RibbonClients`,覆盖 `ninca-crk-std`、`cwos-portal`、`ninca-common-component-organization`。
|
||||
- 结果:
|
||||
- `person_edit`、`person_page_by_app` 不再出现 `200 + 空body`。
|
||||
- 进入统一 JSON 返回路径。
|
||||
|
||||
### 2) 参数校验一致性修复(已完成)
|
||||
|
||||
- 改动(控制层最小兜底,保持与 V1 缺参业务码一致):
|
||||
- `AcsPersonController`
|
||||
- `/add` 空参返回 `76260405`
|
||||
- `/edit` 空参返回 `76260418`
|
||||
- `/pageByApp` 空查询返回 `76260402`
|
||||
- `AcsPassRuleController`
|
||||
- `/add` 空参返回 `76260514`
|
||||
- `AcsElevatorRecordController`
|
||||
- `/analyse/cycle` 空参返回 `76260333`
|
||||
- `/analyse/count` 空参返回 `76260336`
|
||||
|
||||
### 3) 记录接口行为收敛(已完成)
|
||||
|
||||
- 改动:
|
||||
- `AcsElevatorRecordController` 增加开关:
|
||||
- `@Value("${elevator.compat.v1.record-empty-as-error:false}")`
|
||||
- 当开关开启时:
|
||||
- `/record/page` 若返回空分页,转为 `76260305`
|
||||
- `/record/page/request` 若三个筛选列表均为空,转为 `76260335`
|
||||
- `deploy/v2-maven/application.properties` 设置:
|
||||
- `elevator.compat.v1.record-empty-as-error=true`
|
||||
|
||||
### 4) 最终对拍结果(8/8 一致)
|
||||
|
||||
- `person_add`: `old=76260405`, `new=76260405`
|
||||
- `person_edit`: `old=76260418`, `new=76260418`
|
||||
- `person_page_by_app`: `old=76260402`, `new=76260402`
|
||||
- `passrule_add`: `old=76260514`, `new=76260514`
|
||||
- `record_analyse_cycle`: `old=76260333`, `new=76260333`
|
||||
- `record_analyse_count`: `old=76260336`, `new=76260336`
|
||||
- `record_page`: `old=76260305`, `new=76260305`
|
||||
- `record_page_request`: `old=76260335`, `new=76260335`
|
||||
|
||||
---
|
||||
|
||||
## 六、`record-empty-as-error` 开关说明
|
||||
|
||||
- 配置项:`elevator.compat.v1.record-empty-as-error`
|
||||
- 默认值:`false`
|
||||
- 推荐策略:
|
||||
- **对拍/回归阶段**:`true`
|
||||
目的:优先保证 V1/V2 外部行为一致(业务码一致)。
|
||||
- **生产收敛阶段**:`false`
|
||||
目的:按“空数据即成功(空列表)”的语义返回,由数据质量和分表策略保证可用性,而不是将空结果映射为失败码。
|
||||
|
||||
如后续确认“目标语义应为成功空列表”,可在生产配置关闭该开关,并同步更新对拍基线预期。
|
||||
+687
@@ -0,0 +1,687 @@
|
||||
--- tools/v1-decompiled/cfr-from-cw-lib-current/cw-elevator-application-service-1.0-SNAPSHOT/cn/cloudwalk/elevator/export/utils/ExcelUtil.java 2026-04-28 12:58:09.585844892 +0800
|
||||
+++ cw-elevator-application-service/src/main/java/cn/cloudwalk/elevator/export/utils/ExcelUtil.java 2026-04-25 00:53:00.865643196 +0800
|
||||
@@ -1,30 +1,3 @@
|
||||
-/*
|
||||
- * Decompiled with CFR 0.152.
|
||||
- *
|
||||
- * Could not load the following classes:
|
||||
- * cn.cloudwalk.elevator.util.DateUtils
|
||||
- * org.apache.commons.lang3.StringUtils
|
||||
- * org.apache.poi.hssf.usermodel.DVConstraint
|
||||
- * org.apache.poi.hssf.usermodel.HSSFCell
|
||||
- * org.apache.poi.hssf.usermodel.HSSFCellStyle
|
||||
- * org.apache.poi.hssf.usermodel.HSSFClientAnchor
|
||||
- * org.apache.poi.hssf.usermodel.HSSFDataValidation
|
||||
- * org.apache.poi.hssf.usermodel.HSSFFont
|
||||
- * org.apache.poi.hssf.usermodel.HSSFPatriarch
|
||||
- * org.apache.poi.hssf.usermodel.HSSFRow
|
||||
- * org.apache.poi.hssf.usermodel.HSSFSheet
|
||||
- * org.apache.poi.hssf.usermodel.HSSFWorkbook
|
||||
- * org.apache.poi.ss.usermodel.Cell
|
||||
- * org.apache.poi.ss.usermodel.DataValidation
|
||||
- * org.apache.poi.ss.usermodel.DataValidationConstraint
|
||||
- * org.apache.poi.ss.usermodel.Row
|
||||
- * org.apache.poi.ss.usermodel.Sheet
|
||||
- * org.apache.poi.ss.usermodel.Workbook
|
||||
- * org.apache.poi.ss.usermodel.WorkbookFactory
|
||||
- * org.apache.poi.ss.util.CellRangeAddressList
|
||||
- * org.slf4j.Logger
|
||||
- * org.slf4j.LoggerFactory
|
||||
- */
|
||||
package cn.cloudwalk.elevator.export.utils;
|
||||
|
||||
import cn.cloudwalk.elevator.export.ExcelAttribute;
|
||||
@@ -47,6 +20,7 @@
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
+import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.poi.hssf.usermodel.DVConstraint;
|
||||
import org.apache.poi.hssf.usermodel.HSSFCell;
|
||||
@@ -59,6 +33,8 @@
|
||||
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
+import org.apache.poi.ss.usermodel.CellType;
|
||||
+import org.apache.poi.ss.usermodel.IndexedColors;
|
||||
import org.apache.poi.ss.usermodel.DataValidation;
|
||||
import org.apache.poi.ss.usermodel.DataValidationConstraint;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
@@ -76,11 +52,12 @@
|
||||
private static String EXPORT_KEY = "isExport";
|
||||
private static String ANNOTATION_FIELD = "memberValues";
|
||||
|
||||
- public static <T> List<T> getExcelToList(String sheetName, Integer startNo, InputStream input, Class<T> clazz) throws Exception {
|
||||
- ArrayList<T> list = new ArrayList<T>();
|
||||
- try (Workbook book = WorkbookFactory.create((InputStream)input);){
|
||||
+ public static <T> List<T> getExcelToList(String sheetName, Integer startNo, InputStream input, Class<T> clazz)
|
||||
+ throws Exception {
|
||||
+ List<T> list = new ArrayList<>();
|
||||
+ try (Workbook book = WorkbookFactory.create(input)) {
|
||||
Sheet sheet = null;
|
||||
- if (StringUtils.isNotBlank((CharSequence)sheetName)) {
|
||||
+ if (StringUtils.isNotBlank(sheetName)) {
|
||||
sheet = book.getSheet(sheetName);
|
||||
}
|
||||
if (sheet == null) {
|
||||
@@ -88,279 +65,276 @@
|
||||
}
|
||||
int rows = sheet.getLastRowNum();
|
||||
int startLine = 1;
|
||||
- if (null != startNo && startNo >= 0) {
|
||||
- startLine = startNo;
|
||||
+ if (null != startNo && startNo.intValue() >= 0) {
|
||||
+ startLine = startNo.intValue();
|
||||
}
|
||||
if (rows > 0) {
|
||||
Field[] allFields = clazz.getDeclaredFields();
|
||||
- Map<String, Field> fieldsMap = ExcelUtil.getStringFieldMap(allFields);
|
||||
+ Map<String, Field> fieldsMap = getStringFieldMap(allFields);
|
||||
Row firstRow = sheet.getRow(sheet.getFirstRowNum() + startLine - 1);
|
||||
- for (int i = sheet.getFirstRowNum() + startLine; i <= rows; ++i) {
|
||||
+ for (int i = sheet.getFirstRowNum() + startLine; i <= rows; i++) {
|
||||
Row row = sheet.getRow(i);
|
||||
- if (row == null) continue;
|
||||
- Iterator cells = row.cellIterator();
|
||||
- T entity = null;
|
||||
- boolean isNull = true;
|
||||
- while (cells.hasNext()) {
|
||||
- Cell cell = (Cell)cells.next();
|
||||
- String fieldName = firstRow.getCell(cell.getColumnIndex()).getStringCellValue();
|
||||
- if (!fieldsMap.containsKey(fieldName)) continue;
|
||||
- cell.setCellType(1);
|
||||
- String c = cell.getStringCellValue();
|
||||
- if (StringUtils.isNotEmpty((CharSequence)c)) {
|
||||
- isNull = false;
|
||||
+ if (row != null) {
|
||||
+ Iterator<Cell> cells = row.cellIterator();
|
||||
+ T entity = null;
|
||||
+ boolean isNull = true;
|
||||
+ while (cells.hasNext()) {
|
||||
+ Cell cell = cells.next();
|
||||
+ String fieldName = firstRow.getCell(cell.getColumnIndex()).getStringCellValue();
|
||||
+ if (!fieldsMap.containsKey(fieldName)) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ cell.setCellType(CellType.STRING);
|
||||
+ String c = cell.getStringCellValue();
|
||||
+ if (StringUtils.isNotEmpty(c)) {
|
||||
+ isNull = false;
|
||||
+ }
|
||||
+ entity = (entity == null) ? clazz.newInstance() : entity;
|
||||
+ Field field = fieldsMap.get(fieldName);
|
||||
+ Class<?> fieldType = field.getType();
|
||||
+ if (fieldType == null) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ setValue(entity, c, field, fieldType);
|
||||
}
|
||||
- entity = entity == null ? (T)clazz.newInstance() : entity;
|
||||
- Field field = fieldsMap.get(fieldName);
|
||||
- Class<?> fieldType = field.getType();
|
||||
- if (fieldType == null) continue;
|
||||
- ExcelUtil.setValue(entity, c, field, fieldType);
|
||||
+ if (entity != null && !isNull)
|
||||
+ list.add(entity);
|
||||
}
|
||||
- if (entity == null || isNull) continue;
|
||||
- list.add(entity);
|
||||
}
|
||||
}
|
||||
- }
|
||||
- catch (Exception e) {
|
||||
- throw new Exception("\u5c06excel\u8868\u5355\u6570\u636e\u6e90\u7684\u6570\u636e\u5bfc\u5165\u5230list\u5f02\u5e38!", e);
|
||||
+ } catch (Exception e) {
|
||||
+ throw new Exception("将excel表单数据源的数据导入到list异常!", e);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
- private static <T> void setValue(T entity, String c, Field field, Class<?> fieldType) throws IllegalAccessException {
|
||||
+ private static <T> void setValue(T entity, String c, Field field, Class<?> fieldType)
|
||||
+ throws IllegalAccessException {
|
||||
if (String.class == fieldType) {
|
||||
field.set(entity, String.valueOf(c));
|
||||
} else if (BigDecimal.class == fieldType) {
|
||||
- field.set(entity, BigDecimal.valueOf(Double.valueOf(c)));
|
||||
- } else if (Integer.TYPE == fieldType || Integer.class == fieldType) {
|
||||
- field.set(entity, Integer.parseInt(c));
|
||||
- } else if (Long.TYPE == fieldType || Long.class == fieldType) {
|
||||
+ field.set(entity, BigDecimal.valueOf(Double.valueOf(c).doubleValue()));
|
||||
+ } else if (int.class == fieldType || Integer.class == fieldType) {
|
||||
+ field.set(entity, Integer.valueOf(Integer.parseInt(c)));
|
||||
+ } else if (long.class == fieldType || Long.class == fieldType) {
|
||||
field.set(entity, Long.valueOf(c));
|
||||
- } else if (Float.TYPE == fieldType || Float.class == fieldType) {
|
||||
+ } else if (float.class == fieldType || Float.class == fieldType) {
|
||||
field.set(entity, Float.valueOf(c));
|
||||
- } else if (Short.TYPE == fieldType || Short.class == fieldType) {
|
||||
+ } else if (short.class == fieldType || Short.class == fieldType) {
|
||||
field.set(entity, Short.valueOf(c));
|
||||
- } else if (Double.TYPE == fieldType || Double.class == fieldType) {
|
||||
+ } else if (double.class == fieldType || Double.class == fieldType) {
|
||||
field.set(entity, Double.valueOf(c));
|
||||
}
|
||||
}
|
||||
|
||||
private static Map<String, Field> getStringFieldMap(Field[] allFields) {
|
||||
- HashMap<String, Field> fieldsMap = new HashMap<String, Field>(allFields.length);
|
||||
+ Map<String, Field> fieldsMap = new HashMap<>(allFields.length);
|
||||
for (Field field : allFields) {
|
||||
- ExcelAttribute attribute;
|
||||
- if (!field.isAnnotationPresent(ExcelAttribute.class) || StringUtils.isBlank((CharSequence)(attribute = field.getAnnotation(ExcelAttribute.class)).name())) continue;
|
||||
- field.setAccessible(true);
|
||||
- fieldsMap.put(attribute.name(), field);
|
||||
+ if (field.isAnnotationPresent((Class)ExcelAttribute.class)) {
|
||||
+ ExcelAttribute attribute = field.<ExcelAttribute>getAnnotation(ExcelAttribute.class);
|
||||
+ if (!StringUtils.isBlank(attribute.name())) {
|
||||
+ field.setAccessible(true);
|
||||
+ fieldsMap.put(attribute.name(), field);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
return fieldsMap;
|
||||
}
|
||||
|
||||
public static <T> boolean matchExcel(String sheetName, InputStream input, Class<T> clazz) throws Exception {
|
||||
- block6: {
|
||||
- try {
|
||||
- int rows;
|
||||
- HSSFWorkbook book = new HSSFWorkbook(input);
|
||||
- HSSFSheet sheet = null;
|
||||
- if (StringUtils.isNotBlank((CharSequence)sheetName)) {
|
||||
- sheet = book.getSheet(sheetName);
|
||||
- }
|
||||
- if (sheet == null) {
|
||||
- sheet = book.getSheetAt(0);
|
||||
- }
|
||||
- if ((rows = sheet.getLastRowNum()) > 0) {
|
||||
- Field[] allFields = clazz.getDeclaredFields();
|
||||
- Map<String, Field> fieldsMap = ExcelUtil.getStringFieldMap(allFields);
|
||||
- HSSFRow firstRow = sheet.getRow(sheet.getFirstRowNum());
|
||||
- Iterator cells = firstRow.cellIterator();
|
||||
- while (cells.hasNext()) {
|
||||
- Cell cell = (Cell)cells.next();
|
||||
- String fieldName = firstRow.getCell(cell.getColumnIndex()).getStringCellValue();
|
||||
- if (fieldsMap.containsKey(fieldName)) continue;
|
||||
+ try {
|
||||
+ HSSFWorkbook book = new HSSFWorkbook(input);
|
||||
+ HSSFSheet sheet = null;
|
||||
+ if (StringUtils.isNotBlank(sheetName)) {
|
||||
+ sheet = book.getSheet(sheetName);
|
||||
+ }
|
||||
+ if (sheet == null) {
|
||||
+ sheet = book.getSheetAt(0);
|
||||
+ }
|
||||
+ int rows = sheet.getLastRowNum();
|
||||
+ if (rows > 0) {
|
||||
+ Field[] allFields = clazz.getDeclaredFields();
|
||||
+ Map<String, Field> fieldsMap = getStringFieldMap(allFields);
|
||||
+ HSSFRow firstRow = sheet.getRow(sheet.getFirstRowNum());
|
||||
+ Iterator<Cell> cells = firstRow.cellIterator();
|
||||
+ while (cells.hasNext()) {
|
||||
+ Cell cell = cells.next();
|
||||
+ String fieldName = firstRow.getCell(cell.getColumnIndex()).getStringCellValue();
|
||||
+ if (!fieldsMap.containsKey(fieldName)) {
|
||||
return false;
|
||||
}
|
||||
- break block6;
|
||||
}
|
||||
+ } else {
|
||||
return false;
|
||||
}
|
||||
- catch (Exception e) {
|
||||
- throw new Exception("\u5c06excel\u8868\u5355\u6570\u636e\u6e90\u7684\u6570\u636e\u5bfc\u5165\u5230list\u5f02\u5e38!", e);
|
||||
- }
|
||||
+ } catch (Exception e) {
|
||||
+ throw new Exception("将excel表单数据源的数据导入到list异常!", e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
- /*
|
||||
- * Enabled aggressive block sorting
|
||||
- * Enabled unnecessary exception pruning
|
||||
- * Enabled aggressive exception aggregation
|
||||
- */
|
||||
- public static <T> boolean getListToExcel(List<T> list, List<T> listHead, String sheetName, OutputStream output, Class<T> clazz) throws Exception {
|
||||
- try (HSSFWorkbook workbook = new HSSFWorkbook();){
|
||||
+ public static <T> boolean getListToExcel(List<T> list, List<T> listHead, String sheetName, OutputStream output,
|
||||
+ Class<T> clazz) throws Exception {
|
||||
+ try (HSSFWorkbook workbook = new HSSFWorkbook()) {
|
||||
Field[] allFields = clazz.getDeclaredFields();
|
||||
- ArrayList<Field> fields = new ArrayList<Field>();
|
||||
+ List<Field> fields = new ArrayList<>();
|
||||
for (Field field : allFields) {
|
||||
- if (!field.isAnnotationPresent(ExcelAttribute.class)) continue;
|
||||
- fields.add(field);
|
||||
+ if (field.isAnnotationPresent((Class)ExcelAttribute.class)) {
|
||||
+ fields.add(field);
|
||||
+ }
|
||||
}
|
||||
HSSFSheet sheet = workbook.createSheet();
|
||||
workbook.setSheetName(0, sheetName);
|
||||
- ExcelUtil.createRowContent(sheet, fields, workbook, listHead, 0, listHead.size(), 0);
|
||||
- ExcelUtil.createRowHeard(sheet, fields, workbook, 1);
|
||||
- ExcelUtil.createRowContent(sheet, fields, workbook, list, 0, list.size(), 2);
|
||||
+ createRowContent(sheet, fields, workbook, listHead, 0, listHead.size(), 0);
|
||||
+ createRowHeard(sheet, fields, workbook, 1);
|
||||
+ createRowContent(sheet, fields, workbook, list, 0, list.size(), 2);
|
||||
output.flush();
|
||||
workbook.write(output);
|
||||
output.close();
|
||||
- int n = Boolean.TRUE.booleanValue() ? 1 : 0;
|
||||
- return n != 0;
|
||||
- }
|
||||
- catch (Exception e) {
|
||||
- throw new Exception("\u5c06list\u6570\u636e\u6e90\u7684\u6570\u636e\u5bfc\u5165\u5230excel\u8868\u5355\u5f02\u5e38!", e);
|
||||
+ return Boolean.TRUE.booleanValue();
|
||||
+ } catch (Exception e) {
|
||||
+ throw new Exception("将list数据源的数据导入到excel表单异常!", e);
|
||||
}
|
||||
}
|
||||
|
||||
- /*
|
||||
- * Enabled aggressive block sorting
|
||||
- * Enabled unnecessary exception pruning
|
||||
- * Enabled aggressive exception aggregation
|
||||
- */
|
||||
- public static <T> boolean getListToExcel(List<T> list, String sheetName, OutputStream output, Class<T> clazz) throws Exception {
|
||||
- try (HSSFWorkbook workbook = new HSSFWorkbook();){
|
||||
+ public static <T> boolean getListToExcel(List<T> list, String sheetName, OutputStream output, Class<T> clazz)
|
||||
+ throws Exception {
|
||||
+ try (HSSFWorkbook workbook = new HSSFWorkbook()) {
|
||||
int sheetSize = 65536;
|
||||
Field[] allFields = clazz.getDeclaredFields();
|
||||
- ArrayList<Field> fields = new ArrayList<Field>();
|
||||
+ List<Field> fields = new ArrayList<>();
|
||||
for (Field field : allFields) {
|
||||
- ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
|
||||
- if (attr == null || !attr.isExport()) continue;
|
||||
- fields.add(field);
|
||||
+ ExcelAttribute attr = field.<ExcelAttribute>getAnnotation(ExcelAttribute.class);
|
||||
+ if (attr != null && attr.isExport()) {
|
||||
+ fields.add(field);
|
||||
+ }
|
||||
}
|
||||
int listSize = 0;
|
||||
if (list != null && list.size() > 0) {
|
||||
listSize = list.size();
|
||||
}
|
||||
int sheetNo = listSize / sheetSize;
|
||||
- for (int index = 0; index <= sheetNo; ++index) {
|
||||
+ for (int index = 0; index <= sheetNo; index++) {
|
||||
HSSFSheet sheet = workbook.createSheet();
|
||||
workbook.setSheetName(index, sheetName + index);
|
||||
- ExcelUtil.createRowHeard(sheet, fields, workbook, 2);
|
||||
+ createRowHeard(sheet, fields, workbook, 2);
|
||||
int startNo = index * sheetSize;
|
||||
int endNo = Math.min(startNo + sheetSize, listSize);
|
||||
- ExcelUtil.createRowContent(sheet, fields, workbook, list, startNo, endNo, 3);
|
||||
+ createRowContent(sheet, fields, workbook, list, startNo, endNo, 3);
|
||||
}
|
||||
output.flush();
|
||||
workbook.write(output);
|
||||
output.close();
|
||||
- int n = Boolean.TRUE.booleanValue() ? 1 : 0;
|
||||
- return n != 0;
|
||||
- }
|
||||
- catch (Exception e) {
|
||||
- throw new Exception("\u5c06list\u6570\u636e\u6e90\u7684\u6570\u636e\u5bfc\u5165\u5230excel\u8868\u5355\u5f02\u5e38!", e);
|
||||
+ return Boolean.TRUE.booleanValue();
|
||||
+ } catch (Exception e) {
|
||||
+ throw new Exception("将list数据源的数据导入到excel表单异常!", e);
|
||||
}
|
||||
}
|
||||
|
||||
- /*
|
||||
- * Enabled aggressive block sorting
|
||||
- * Enabled unnecessary exception pruning
|
||||
- * Enabled aggressive exception aggregation
|
||||
- */
|
||||
- public static <T> boolean getListToExcel(List<T> list, String sheetName, OutputStream output, Class<T> clazz, Integer startRow, ExcelCallback callback) throws Exception {
|
||||
- try (HSSFWorkbook workbook = new HSSFWorkbook();){
|
||||
+ public static <T> boolean getListToExcel(List<T> list, String sheetName, OutputStream output, Class<T> clazz,
|
||||
+ Integer startRow, ExcelCallback callback) throws Exception {
|
||||
+ try (HSSFWorkbook workbook = new HSSFWorkbook()) {
|
||||
int sheetSize = 65536;
|
||||
Field[] allFields = clazz.getDeclaredFields();
|
||||
- ArrayList<Field> fields = new ArrayList<Field>();
|
||||
+ List<Field> fields = new ArrayList<>();
|
||||
for (Field field : allFields) {
|
||||
- ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
|
||||
- if (attr == null || !attr.isExport()) continue;
|
||||
- fields.add(field);
|
||||
+ ExcelAttribute attr = field.<ExcelAttribute>getAnnotation(ExcelAttribute.class);
|
||||
+ if (attr != null && attr.isExport()) {
|
||||
+ fields.add(field);
|
||||
+ }
|
||||
}
|
||||
int listSize = 0;
|
||||
if (list != null && list.size() > 0) {
|
||||
listSize = list.size();
|
||||
}
|
||||
int sheetNo = listSize / sheetSize;
|
||||
- for (int index = 0; index <= sheetNo; ++index) {
|
||||
+ for (int index = 0; index <= sheetNo; index++) {
|
||||
HSSFSheet sheet = workbook.createSheet();
|
||||
workbook.setSheetName(index, sheetName + index);
|
||||
- ExcelUtil.createRowHeard(sheet, fields, workbook, startRow);
|
||||
+ createRowHeard(sheet, fields, workbook, startRow.intValue());
|
||||
int startNo = index * sheetSize;
|
||||
int endNo = Math.min(startNo + sheetSize, listSize);
|
||||
- ExcelUtil.createRowContent(sheet, fields, workbook, list, startNo, endNo, startRow + 1);
|
||||
- if (null == callback) continue;
|
||||
- callback.call(workbook, sheet);
|
||||
+ createRowContent(sheet, fields, workbook, list, startNo, endNo, startRow.intValue() + 1);
|
||||
+ if (null != callback) {
|
||||
+ callback.call(workbook, sheet);
|
||||
+ }
|
||||
}
|
||||
output.flush();
|
||||
workbook.write(output);
|
||||
output.close();
|
||||
- int n = Boolean.TRUE.booleanValue() ? 1 : 0;
|
||||
- return n != 0;
|
||||
- }
|
||||
- catch (Exception e) {
|
||||
- throw new Exception("\u5c06list\u6570\u636e\u6e90\u7684\u6570\u636e\u5bfc\u5165\u5230excel\u8868\u5355\u5f02\u5e38!", e);
|
||||
+ return Boolean.TRUE.booleanValue();
|
||||
+ } catch (Exception e) {
|
||||
+ throw new Exception("将list数据源的数据导入到excel表单异常!", e);
|
||||
}
|
||||
}
|
||||
|
||||
- private static <T> void createRowContent(HSSFSheet sheet, List<Field> fields, HSSFWorkbook workbook, List<T> list, int startNo, int endNo, int rowIndex) throws Exception {
|
||||
+ private static <T> void createRowContent(HSSFSheet sheet, List<Field> fields, HSSFWorkbook workbook, List<T> list,
|
||||
+ int startNo, int endNo, int rowIndex) throws Exception {
|
||||
String value = null;
|
||||
int hwPicType = 0;
|
||||
byte[] picByte = null;
|
||||
- for (int i = startNo; i < endNo; ++i) {
|
||||
+ for (int i = startNo; i < endNo; i++) {
|
||||
HSSFRow row = sheet.createRow(i - startNo + rowIndex);
|
||||
T vo = list.get(i);
|
||||
- for (int j = 0; j < fields.size(); ++j) {
|
||||
+ for (int j = 0; j < fields.size(); j++) {
|
||||
Field field = fields.get(j);
|
||||
field.setAccessible(true);
|
||||
- ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
|
||||
+ ExcelAttribute attr = field.<ExcelAttribute>getAnnotation(ExcelAttribute.class);
|
||||
int col = j;
|
||||
- if (StringUtils.isNotBlank((CharSequence)attr.column())) {
|
||||
- col = ExcelUtil.getExcelCol(attr.column());
|
||||
+ if (StringUtils.isNotBlank(attr.column())) {
|
||||
+ col = getExcelCol(attr.column());
|
||||
}
|
||||
- if (!attr.isExport()) continue;
|
||||
- HSSFCell cell = row.createCell(col);
|
||||
- Class<Comparable<Date>> classType = field.getType();
|
||||
- if (field.get(vo) == null) continue;
|
||||
- value = null;
|
||||
- if (classType.isAssignableFrom(Date.class)) {
|
||||
- value = DateUtils.formatDate((Date)((Date)field.get(vo)), (String)"yyyy-MM-dd HH:mm:ss");
|
||||
- }
|
||||
- if (classType.isAssignableFrom(Long.class) && attr.isDate()) {
|
||||
- value = DateUtils.formatDate((Date)new Date((Long)field.get(vo)), (String)"yyyy-MM-dd HH:mm:ss");
|
||||
- }
|
||||
- if (attr.isPic()) {
|
||||
- try {
|
||||
- if (field.getType().equals(String.class)) {
|
||||
- picByte = ExcelUtil.getBytesByUrl((String)field.get(vo));
|
||||
+ if (attr.isExport()) {
|
||||
+ HSSFCell cell = row.createCell(col);
|
||||
+ Class<?> classType = field.getType();
|
||||
+ if (field.get(vo) != null) {
|
||||
+ value = null;
|
||||
+ if (classType.isAssignableFrom(Date.class)) {
|
||||
+ value = DateUtils.formatDate((Date)field.get(vo), "yyyy-MM-dd HH:mm:ss");
|
||||
+ }
|
||||
+ if (classType.isAssignableFrom(Long.class) && attr.isDate()) {
|
||||
+ value = DateUtils.formatDate(new Date(((Long)field.get(vo)).longValue()),
|
||||
+ "yyyy-MM-dd HH:mm:ss");
|
||||
+ }
|
||||
+ if (attr.isPic()) {
|
||||
+ try {
|
||||
+ if (field.getType().equals(String.class)) {
|
||||
+ picByte = getBytesByUrl((String)field.get(vo));
|
||||
+ }
|
||||
+ picByte = (byte[])field.get(vo);
|
||||
+ } catch (Exception exception) {
|
||||
+ }
|
||||
+ hwPicType = 5;
|
||||
+ HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
|
||||
+ HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1020, 250, (short)col, row.getRowNum(),
|
||||
+ (short)col, row.getRowNum());
|
||||
+ patriarch.createPicture(anchor, workbook.addPicture(picByte, hwPicType));
|
||||
+ row.setHeight((short)1000);
|
||||
+ } else {
|
||||
+ cell.setCellValue((field.get(vo) == null) ? ""
|
||||
+ : ((value == null) ? String.valueOf(field.get(vo)) : value));
|
||||
}
|
||||
- picByte = (byte[])field.get(vo);
|
||||
- }
|
||||
- catch (Exception exception) {
|
||||
- // empty catch block
|
||||
}
|
||||
- hwPicType = 5;
|
||||
- HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
|
||||
- HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1020, 250, (short)col, row.getRowNum(), (short)col, row.getRowNum());
|
||||
- patriarch.createPicture(anchor, workbook.addPicture(picByte, hwPicType));
|
||||
- row.setHeight((short)1000);
|
||||
- continue;
|
||||
}
|
||||
- cell.setCellValue(field.get(vo) == null ? "" : (value == null ? String.valueOf(field.get(vo)) : value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void createRowHeard(HSSFSheet sheet, List<Field> fields, HSSFWorkbook workbook, int index) {
|
||||
HSSFRow row = sheet.createRow(index);
|
||||
- for (int i = 0; i < fields.size(); ++i) {
|
||||
+ for (int i = 0; i < fields.size(); i++) {
|
||||
int col = i;
|
||||
Field field = fields.get(i);
|
||||
- ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
|
||||
- if (StringUtils.isNotBlank((CharSequence)attr.column())) {
|
||||
- col = ExcelUtil.getExcelCol(attr.column());
|
||||
+ ExcelAttribute attr = field.<ExcelAttribute>getAnnotation(ExcelAttribute.class);
|
||||
+ if (StringUtils.isNotBlank(attr.column())) {
|
||||
+ col = getExcelCol(attr.column());
|
||||
}
|
||||
HSSFCell cell = row.createCell(col);
|
||||
- HSSFCellStyle cellStyle = ExcelUtil.createCellStyle(workbook, attr.isMark() ? "2" : FONT_CODE);
|
||||
+ HSSFCellStyle cellStyle = createCellStyle(workbook, attr.isMark() ? "2" : "1");
|
||||
cell.setCellStyle(cellStyle);
|
||||
- sheet.setColumnWidth(i, (int)((double)(attr.name().getBytes().length <= 4 ? 6 : attr.name().getBytes().length) * 1.5 * 256.0));
|
||||
- cell.setCellType(1);
|
||||
+ sheet.setColumnWidth(i,
|
||||
+ (int)((((attr.name().getBytes()).length <= 4) ? 6 : (attr.name().getBytes()).length) * 1.5D * 256.0D));
|
||||
+ cell.setCellType(CellType.STRING);
|
||||
cell.setCellValue(attr.name());
|
||||
}
|
||||
}
|
||||
@@ -369,9 +343,9 @@
|
||||
HSSFFont font = workbook.createFont();
|
||||
HSSFCellStyle cellStyle = workbook.createCellStyle();
|
||||
font.setFontName("Arail narrow");
|
||||
- font.setBoldweight((short)700);
|
||||
- if (FONT_CODE.equals(type)) {
|
||||
- font.setColor((short)Short.MAX_VALUE);
|
||||
+ font.setBold(true);
|
||||
+ if ("1".equals(type)) {
|
||||
+ font.setColor(IndexedColors.RED.getIndex());
|
||||
cellStyle.setFont(font);
|
||||
} else {
|
||||
font.setColor((short)10);
|
||||
@@ -384,14 +358,15 @@
|
||||
col = col.toUpperCase();
|
||||
int count = -1;
|
||||
char[] cs = col.toCharArray();
|
||||
- for (int i = 0; i < cs.length; ++i) {
|
||||
- count = (int)((double)count + (double)(cs[i] - 64) * Math.pow(26.0, (double)cs.length - 1.0 - (double)i));
|
||||
+ for (int i = 0; i < cs.length; i++) {
|
||||
+ count = (int)(count + (cs[i] - 64) * Math.pow(26.0D, cs.length - 1.0D - i));
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
- public static HSSFSheet setHSSFPrompt(HSSFSheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, int firstCol, int endCol) {
|
||||
- DVConstraint constraint = DVConstraint.createCustomFormulaConstraint((String)"DD1");
|
||||
+ public static HSSFSheet setHSSFPrompt(HSSFSheet sheet, String promptTitle, String promptContent, int firstRow,
|
||||
+ int endRow, int firstCol, int endCol) {
|
||||
+ DVConstraint constraint = DVConstraint.createCustomFormulaConstraint("DD1");
|
||||
CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
|
||||
HSSFDataValidation dataValidationView = new HSSFDataValidation(regions, (DataValidationConstraint)constraint);
|
||||
dataValidationView.createPromptBox(promptTitle, promptContent);
|
||||
@@ -399,25 +374,22 @@
|
||||
return sheet;
|
||||
}
|
||||
|
||||
- public static HSSFSheet setHSSFValidation(HSSFSheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) {
|
||||
- DVConstraint constraint = DVConstraint.createExplicitListConstraint((String[])textlist);
|
||||
+ public static HSSFSheet setHSSFValidation(HSSFSheet sheet, String[] textlist, int firstRow, int endRow,
|
||||
+ int firstCol, int endCol) {
|
||||
+ DVConstraint constraint = DVConstraint.createExplicitListConstraint(textlist);
|
||||
CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
|
||||
HSSFDataValidation dataValidationList = new HSSFDataValidation(regions, (DataValidationConstraint)constraint);
|
||||
sheet.addValidationData((DataValidation)dataValidationList);
|
||||
return sheet;
|
||||
}
|
||||
|
||||
- /*
|
||||
- * WARNING - Removed try catching itself - possible behaviour change.
|
||||
- */
|
||||
public static byte[] getBytesByUrl(String imgUrl) throws Exception {
|
||||
- if (StringUtils.isEmpty((CharSequence)imgUrl)) {
|
||||
+ if (StringUtils.isEmpty(imgUrl)) {
|
||||
return null;
|
||||
}
|
||||
BufferedInputStream bis = null;
|
||||
ByteArrayOutputStream bos = null;
|
||||
try {
|
||||
- int size;
|
||||
URL url = new URL(imgUrl);
|
||||
HttpURLConnection http = (HttpURLConnection)url.openConnection();
|
||||
http.setConnectTimeout(3000);
|
||||
@@ -425,28 +397,25 @@
|
||||
bis = new BufferedInputStream(http.getInputStream());
|
||||
bos = new ByteArrayOutputStream();
|
||||
byte[] buf = new byte[8096];
|
||||
+ int size;
|
||||
while ((size = bis.read(buf)) != -1) {
|
||||
bos.write(buf, 0, size);
|
||||
}
|
||||
http.disconnect();
|
||||
- byte[] byArray = bos.toByteArray();
|
||||
- return byArray;
|
||||
- }
|
||||
- finally {
|
||||
+ return bos.toByteArray();
|
||||
+ } finally {
|
||||
if (bis != null) {
|
||||
try {
|
||||
bis.close();
|
||||
- }
|
||||
- catch (IOException e) {
|
||||
- logger.error("\u6d41\u5173\u95ed\u5931\u8d25\uff0c\u539f\u56e0\uff1a" + e.getMessage(), (Throwable)e);
|
||||
+ } catch (IOException e) {
|
||||
+ logger.error("流关闭失败,原因:" + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
if (bos != null) {
|
||||
try {
|
||||
bos.close();
|
||||
- }
|
||||
- catch (IOException e) {
|
||||
- logger.error("\u6d41\u5173\u95ed\u5931\u8d25\uff0c\u539f\u56e0\uff1a" + e.getMessage(), (Throwable)e);
|
||||
+ } catch (IOException e) {
|
||||
+ logger.error("流关闭失败,原因:" + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -460,20 +429,18 @@
|
||||
Field value = null;
|
||||
try {
|
||||
value = invocationHandler.getClass().getDeclaredField(ANNOTATION_FIELD);
|
||||
- }
|
||||
- catch (Exception e) {
|
||||
- logger.warn("\u53cd\u5c04\u83b7\u53d6ExcelAttribute\u6ce8\u89e3\u7684\u6210\u5458\u5b57\u6bb5\u5f02\u5e38", (Throwable)e);
|
||||
+ } catch (Exception e) {
|
||||
+ logger.warn("反射获取ExcelAttribute注解的成员字段异常", e);
|
||||
}
|
||||
if (value == null) {
|
||||
return;
|
||||
}
|
||||
value.setAccessible(true);
|
||||
- Map memberValues = null;
|
||||
+ Map<String, Object> memberValues = null;
|
||||
try {
|
||||
- memberValues = (Map)value.get(invocationHandler);
|
||||
- }
|
||||
- catch (Exception e) {
|
||||
- logger.warn("\u53cd\u5c04\u83b7\u53d6ExcelAttribute\u6ce8\u89e3\u7684\u6210\u5458\u503c\u5f02\u5e38", (Throwable)e);
|
||||
+ memberValues = (Map<String, Object>)value.get(invocationHandler);
|
||||
+ } catch (Exception e) {
|
||||
+ logger.warn("反射获取ExcelAttribute注解的成员值异常", e);
|
||||
}
|
||||
if (memberValues == null) {
|
||||
return;
|
||||
@@ -482,34 +449,30 @@
|
||||
memberValues.put(key, obj);
|
||||
}
|
||||
if (!isExport) {
|
||||
- memberValues.put(EXPORT_KEY, isExport);
|
||||
+ memberValues.put(EXPORT_KEY, Boolean.valueOf(isExport));
|
||||
}
|
||||
}
|
||||
|
||||
- /*
|
||||
- * Exception decompiling
|
||||
- */
|
||||
- public static <T> boolean appendListToExcel(InputStream inputStream, List<T> list, int sheetIndex, OutputStream output, Class<T> clazz, Integer startRow) throws Exception {
|
||||
- /*
|
||||
- * This method has failed to decompile. When submitting a bug report, please provide this stack trace, and (if you hold appropriate legal rights) the relevant class file.
|
||||
- *
|
||||
- * org.benf.cfr.reader.util.ConfusedCFRException: Started 2 blocks at once
|
||||
- * at org.benf.cfr.reader.bytecode.analysis.opgraph.Op04StructuredStatement.getStartingBlocks(Op04StructuredStatement.java:412)
|
||||
- * at org.benf.cfr.reader.bytecode.analysis.opgraph.Op04StructuredStatement.buildNestedBlocks(Op04StructuredStatement.java:487)
|
||||
- * at org.benf.cfr.reader.bytecode.analysis.opgraph.Op03SimpleStatement.createInitialStructuredBlock(Op03SimpleStatement.java:736)
|
||||
- * at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisInner(CodeAnalyser.java:850)
|
||||
- * at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisOrWrapFail(CodeAnalyser.java:278)
|
||||
- * at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysis(CodeAnalyser.java:201)
|
||||
- * at org.benf.cfr.reader.entities.attributes.AttributeCode.analyse(AttributeCode.java:94)
|
||||
- * at org.benf.cfr.reader.entities.Method.analyse(Method.java:531)
|
||||
- * at org.benf.cfr.reader.entities.ClassFile.analyseMid(ClassFile.java:1055)
|
||||
- * at org.benf.cfr.reader.entities.ClassFile.analyseTop(ClassFile.java:942)
|
||||
- * at org.benf.cfr.reader.Driver.doJarVersionTypes(Driver.java:257)
|
||||
- * at org.benf.cfr.reader.Driver.doJar(Driver.java:139)
|
||||
- * at org.benf.cfr.reader.CfrDriverImpl.analyse(CfrDriverImpl.java:76)
|
||||
- * at org.benf.cfr.reader.Main.main(Main.java:54)
|
||||
- */
|
||||
- throw new IllegalStateException("Decompilation failed");
|
||||
+ public static <T> boolean appendListToExcel(InputStream inputStream, List<T> list, int sheetIndex,
|
||||
+ OutputStream output, Class<T> clazz, Integer startRow) throws Exception {
|
||||
+ try (HSSFWorkbook workbook = new HSSFWorkbook(inputStream)) {
|
||||
+ Field[] allFields = clazz.getDeclaredFields();
|
||||
+ List<Field> fields = new ArrayList<>();
|
||||
+ for (Field field : allFields) {
|
||||
+ ExcelAttribute attr = field.<ExcelAttribute>getAnnotation(ExcelAttribute.class);
|
||||
+ if (attr != null && attr.isExport()) {
|
||||
+ fields.add(field);
|
||||
+ }
|
||||
+ }
|
||||
+ HSSFSheet sheet = workbook.getSheetAt(sheetIndex);
|
||||
+ createRowContent(sheet, fields, workbook, list, 0, list.size(), startRow.intValue());
|
||||
+ output.flush();
|
||||
+ workbook.write(IOUtils.buffer(output));
|
||||
+ return Boolean.TRUE.booleanValue();
|
||||
+ } catch (IOException e) {
|
||||
+ throw new Exception("将list数据源的数据导入到excel表单异常!", e);
|
||||
+ } finally {
|
||||
+ output.close();
|
||||
+ }
|
||||
}
|
||||
}
|
||||
-
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
# Maven 源码 vs V1(CFR) 逐类比对报告
|
||||
|
||||
- **V1 基准**:`artifacts/decompiled/v1-cfr-compare-20211103/cfr-by-artifact/{module}/cn/cloudwalk/elevator/**/*.java`
|
||||
- **Maven**:`maven-cw-elevator-application/{module}/src/main/java/cn/cloudwalk/elevator/**/*.java`
|
||||
- **配对规则**:相对路径(自 `elevator/` 起)同名即视为同一类。
|
||||
- **相似度**:粗去 `//`、`/* */` 注释与空行后,对全文做 `difflib.SequenceMatcher.ratio`。**CFR 反编译会导致变量名、泛型呈现、括号风格与 Maven 源码不一致,分数系统性偏低——仅作筛查排序,不能单独证明业务不一致。**
|
||||
|
||||
## 1. 汇总表
|
||||
|
||||
| 模块 | V1 文件数 | Maven 文件数 | 配对 | ≥0.98 | 0.85–0.98 | <0.85 | 仅 V1 | 仅 Maven |
|
||||
|------|-----------|----------------|------|-------|-----------|-------|-------|------------|
|
||||
| cw-elevator-application-common | 32 | 33 | 32 | 5 | 11 | 16 | 0 | 1 |
|
||||
| cw-elevator-application-data | 79 | 84 | 79 | 43 | 18 | 18 | 0 | 5 |
|
||||
| cw-elevator-application-service | 150 | 162 | 150 | 72 | 32 | 46 | 0 | 12 |
|
||||
| cw-elevator-application-web | 44 | 47 | 44 | 26 | 7 | 11 | 0 | 3 |
|
||||
| cw-elevator-application-starter | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 3 |
|
||||
| **合计** | **305** | **329** | **305** | **146** | **68** | **91** | **0** | **24** |
|
||||
|
||||
说明:**starter** 在 V1 CFR 目录下无 `cn/cloudwalk/elevator` 树时配对数为 0;仅统计 Maven 侧文件。
|
||||
|
||||
## 2. 仅 Maven(未在 V1 同路径出现)
|
||||
|
||||
### cw-elevator-application-common
|
||||
- `package-info.java` — *package-info*
|
||||
|
||||
### cw-elevator-application-data
|
||||
- `device/package-info.java` — *package-info*
|
||||
- `person/dao/TenantVisitorFloorPolicyDao.java` — *租户访客楼层策略(V2)*
|
||||
- `person/dto/TenantVisitorFloorPolicyDto.java` — *租户访客楼层策略(V2)*
|
||||
- `person/impl/TenantVisitorFloorPolicyDaoImpl.java` — *租户访客楼层策略(V2)*
|
||||
- `person/mapper/TenantVisitorFloorPolicyMapper.java` — *租户访客楼层策略(V2)*
|
||||
|
||||
### cw-elevator-application-service
|
||||
- `CloudwalkSessionHolderConfiguration.java` — *Session 扩展*
|
||||
- `common/ElevatorRemoteIoExecutorConfig.java` — *远程 IO 池*
|
||||
- `common/ElevatorRemoteIoPoolProperties.java` — *远程 IO 池*
|
||||
- `common/package-info.java` — *package-info*
|
||||
- `device/package-info.java` — *package-info*
|
||||
- `mqtt/package-info.java` — *package-info*
|
||||
- `package-info.java` — *package-info*
|
||||
- `passrule/package-info.java` — *package-info*
|
||||
- `person/package-info.java` — *package-info*
|
||||
- `record/package-info.java` — *package-info*
|
||||
- `visitor/package-info.java` — *package-info*
|
||||
- `zone/package-info.java` — *package-info*
|
||||
|
||||
### cw-elevator-application-web
|
||||
- `handler/device/package-info.java` — *package-info*
|
||||
- `handler/package-info.java` — *package-info*
|
||||
- `zone/util/ZoneTreeCollectors.java` — *工具类*
|
||||
|
||||
### cw-elevator-application-starter
|
||||
- `ElevatorApplication.java`
|
||||
- `config/DavinciStorageBeansConfiguration.java` — *Davinci 存储*
|
||||
- `integration/davinci/OpenFeignFileStorageManager.java` — *Davinci 存储*
|
||||
|
||||
## 3. 解读要点(确定性审核边界)
|
||||
|
||||
1. **此比对不触及 Maven 依赖 jar**;仅对比本仓库 `.java` 与 V1 CFR `.java`。
|
||||
2. **相似度低 ≠ 业务不一致**:枚举常量顺序、字符串拼接、lambda/匿名类还原差异都会拉低分数。
|
||||
3. **优先人工看**:Controller、`ServiceImpl` 主流程、`FeignClient`、`DaoImpl` 调用序列;DTO/枚举可次要。
|
||||
4. **仅 Maven 的 TenantVisitorFloor\***:与 V1 20211103 基线不对齐(已知扩展),一致性审查可跳过。
|
||||
|
||||
## 4. 附录:相似度两端样本(辅助复核)
|
||||
|
||||
### 4.1 最高相似(示例)
|
||||
- `cw-elevator-application-common/context/CloudWalkExtendContextValue.java` **1.0000**
|
||||
- `cw-elevator-application-common/util/AcsCacheKeyUtil.java` **1.0000**
|
||||
- `cw-elevator-application-data/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.java` **1.0000**
|
||||
- `cw-elevator-application-data/codeElevatorArea/dto/AcsElevatorCodeResultDTO.java` **1.0000**
|
||||
- `cw-elevator-application-data/passrule/dto/AcsPassRuleImageResultDto.java` **1.0000**
|
||||
- `cw-elevator-application-data/passrule/dto/AcsPassRuleLabelResultDto.java` **1.0000**
|
||||
- `cw-elevator-application-data/record/dto/AcsElevatorPageRequestInfoResultDTO.java` **1.0000**
|
||||
- `cw-elevator-application-data/record/dto/AcsElevatorQueryCountDTO.java` **1.0000**
|
||||
- `cw-elevator-application-service/codeElevatorArea/result/AcsElevatorCodeResult.java` **1.0000**
|
||||
- `cw-elevator-application-service/passrule/result/AcsPassRuleDetailResult.java` **1.0000**
|
||||
- `cw-elevator-application-service/passrule/result/ImageRuleRefDetailResult.java` **1.0000**
|
||||
- `cw-elevator-application-service/passrule/result/ImageRuleRefPageResult.java` **1.0000**
|
||||
- `cw-elevator-application-service/record/param/SendRecordSendInfoParam.java` **1.0000**
|
||||
- `cw-elevator-application-service/record/param/SendRecordTokenParam.java` **1.0000**
|
||||
- `cw-elevator-application-service/record/result/AcsElevatorAnalyseCycleBusinessResult.java` **1.0000**
|
||||
|
||||
### 4.2 最低相似(建议优先打开 diff)
|
||||
- `cw-elevator-application-data/device/dto/AcsElevatorDeviceResultDTO.java` **0.1050**
|
||||
- `cw-elevator-application-data/device/dto/AcsElevatorDeviceQueryFoDTO.java` **0.1052**
|
||||
- `cw-elevator-application-service/device/result/AcsElevatorDeviceListResult.java` **0.1192**
|
||||
- `cw-elevator-application-data/device/dto/AcsElevatorDeviceListResultDto.java` **0.1215**
|
||||
- `cw-elevator-application-web/person/form/AcsPersonQueryForm.java` **0.1247**
|
||||
- `cw-elevator-application-data/passrule/dto/ImageRuleRefAddDto.java` **0.1342**
|
||||
- `cw-elevator-application-common/em/AlarmStateCodeEnum.java` **0.1399**
|
||||
- `cw-elevator-application-common/util/CommunityConstants.java` **0.1989**
|
||||
- `cw-elevator-application-service/export/result/ElevatorDeviceRecordExcelResult.java` **0.1998**
|
||||
- `cw-elevator-application-common/em/AcsDeviceQueryTypeEnum.java` **0.2016**
|
||||
- `cw-elevator-application-common/em/AcsDeviceIdentifyTypeEnum.java` **0.2052**
|
||||
- `cw-elevator-application-data/passrule/dto/ImageRuleRefListResult.java` **0.2072**
|
||||
- `cw-elevator-application-service/person/param/AcsPersonAddVisitorParam.java` **0.2339**
|
||||
- `cw-elevator-application-web/person/form/AcsPersonAddVisitorForm.java` **0.2385**
|
||||
- `cw-elevator-application-service/mqtt/param/AcsElevatorRecordMqttParam.java` **0.2772**
|
||||
- `cw-elevator-application-service/device/result/AcsLabelElevatorResult.java` **0.2838**
|
||||
- `cw-elevator-application-service/device/param/AcsDeviceRestructureTaskParam.java` **0.2992**
|
||||
- `cw-elevator-application-common/config/FeignThreadLocalUtil.java` **0.3187**
|
||||
- `cw-elevator-application-data/passrule/dto/ImageRuleRefResultDto.java` **0.3893**
|
||||
- `cw-elevator-application-service/common/AbstractAcsDeviceService.java` **0.4027**
|
||||
- `cw-elevator-application-service/person/param/AcsPersonQueryParam.java` **0.4166**
|
||||
- `cw-elevator-application-data/record/impl/AcsElevatorRecordDaoImpl.java` **0.4350**
|
||||
- `cw-elevator-application-service/passrule/impl/ImageRuleRefServiceImpl.java` **0.4616**
|
||||
- `cw-elevator-application-service/device/impl/AcsDeviceTaskServiceImpl.java` **0.4644**
|
||||
- `cw-elevator-application-service/device/param/AcsRestructureBindingParam.java` **0.4817**
|
||||
- `cw-elevator-application-web/handler/device/form/AcsRestructureBindingForm.java` **0.4877**
|
||||
- `cw-elevator-application-service/device/result/AcsDeviceRestructureResult.java` **0.4909**
|
||||
- `cw-elevator-application-data/passrule/mapper/ImageRuleRefMapper.java` **0.4948**
|
||||
- `cw-elevator-application-service/passrule/result/AcsPassRuleFloorResult.java` **0.5020**
|
||||
- `cw-elevator-application-service/device/param/AcsRestructureQueryParam.java` **0.5047**
|
||||
- `cw-elevator-application-web/handler/device/form/AcsRestructureQueryForm.java` **0.5049**
|
||||
- `cw-elevator-application-data/record/dto/AcsRecogRecordPageDTO.java` **0.5121**
|
||||
- `cw-elevator-application-common/util/CollectionUtils.java` **0.5129**
|
||||
- `cw-elevator-application-common/util/StringUtils.java` **0.5311**
|
||||
- `cw-elevator-application-common/util/RestTemplateUtil.java` **0.5335**
|
||||
- `cw-elevator-application-service/AcsFeignConfiguration.java` **0.5382**
|
||||
- `cw-elevator-application-web/handler/device/form/AcsDeviceRestructureTaskForm.java` **0.5446**
|
||||
- `cw-elevator-application-service/device/impl/AcsElevatorDeviceServiceImpl.java` **0.5556**
|
||||
- `cw-elevator-application-common/em/EngineAddressEnum.java` **0.5630**
|
||||
- `cw-elevator-application-common/em/OpenDoorTypeEnum.java` **0.5714**
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
# Maven 源码 vs V1 自动反编译(cw_lib jar / CFR)逐类比对
|
||||
|
||||
- **V1 根**: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/v1-decompiled/cfr-from-cw-lib-20260428-125543`(`decompile_v1_elevator_jars.sh` 生成)
|
||||
- **V2 根**: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/{module}/src/main/java/cn/cloudwalk/elevator`
|
||||
- **相似度**: 去注释后 `SequenceMatcher.ratio`(CFR 噪声会导致分数偏低)
|
||||
|
||||
## 1. 汇总(四模块来自 cw_lib jar 反编译)
|
||||
|
||||
| 模块 | 配对 | ≥0.98 | 0.85–0.98 | <0.85 | 仅 V1 | 仅 Maven |
|
||||
|------|------|-------|-----------|-------|-------|------------|
|
||||
| cw-elevator-application-common | 32 | 5 | 11 | 16 | 0 | 1 |
|
||||
| cw-elevator-application-data | 79 | 43 | 18 | 18 | 0 | 5 |
|
||||
| cw-elevator-application-service | 150 | 72 | 32 | 46 | 0 | 12 |
|
||||
| cw-elevator-application-web | 44 | 26 | 7 | 11 | 0 | 3 |
|
||||
| **合计** | **305** | **146** | **68** | **91** | **0** | **21** |
|
||||
|
||||
## 2. 仅 Maven(相对 `cn/cloudwalk/elevator`)
|
||||
|
||||
### cw-elevator-application-common
|
||||
- `package-info.java` — *package-info*
|
||||
|
||||
### cw-elevator-application-data
|
||||
- `device/package-info.java` — *package-info*
|
||||
- `person/dao/TenantVisitorFloorPolicyDao.java` — *租户访客楼层策略(V2)*
|
||||
- `person/dto/TenantVisitorFloorPolicyDto.java` — *租户访客楼层策略(V2)*
|
||||
- `person/impl/TenantVisitorFloorPolicyDaoImpl.java` — *租户访客楼层策略(V2)*
|
||||
- `person/mapper/TenantVisitorFloorPolicyMapper.java` — *租户访客楼层策略(V2)*
|
||||
|
||||
### cw-elevator-application-service
|
||||
- `CloudwalkSessionHolderConfiguration.java` — *Session 扩展*
|
||||
- `common/ElevatorRemoteIoExecutorConfig.java` — *远程 IO 池*
|
||||
- `common/ElevatorRemoteIoPoolProperties.java` — *远程 IO 池*
|
||||
- `common/package-info.java` — *package-info*
|
||||
- `device/package-info.java` — *package-info*
|
||||
- `mqtt/package-info.java` — *package-info*
|
||||
- `package-info.java` — *package-info*
|
||||
- `passrule/package-info.java` — *package-info*
|
||||
- `person/package-info.java` — *package-info*
|
||||
- `record/package-info.java` — *package-info*
|
||||
- `visitor/package-info.java` — *package-info*
|
||||
- `zone/package-info.java` — *package-info*
|
||||
|
||||
### cw-elevator-application-web
|
||||
- `handler/device/package-info.java` — *package-info*
|
||||
- `handler/package-info.java` — *package-info*
|
||||
- `zone/util/ZoneTreeCollectors.java` — *工具类*
|
||||
|
||||
## 3. 样本:最高 / 最低相似度路径
|
||||
|
||||
### 最高
|
||||
- `cw-elevator-application-common/context/CloudWalkExtendContextValue.java` **1.0000**
|
||||
- `cw-elevator-application-common/util/AcsCacheKeyUtil.java` **1.0000**
|
||||
- `cw-elevator-application-data/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.java` **1.0000**
|
||||
- `cw-elevator-application-data/codeElevatorArea/dto/AcsElevatorCodeResultDTO.java` **1.0000**
|
||||
- `cw-elevator-application-data/passrule/dto/AcsPassRuleImageResultDto.java` **1.0000**
|
||||
- `cw-elevator-application-data/passrule/dto/AcsPassRuleLabelResultDto.java` **1.0000**
|
||||
- `cw-elevator-application-data/record/dto/AcsElevatorPageRequestInfoResultDTO.java` **1.0000**
|
||||
- `cw-elevator-application-data/record/dto/AcsElevatorQueryCountDTO.java` **1.0000**
|
||||
- `cw-elevator-application-service/codeElevatorArea/result/AcsElevatorCodeResult.java` **1.0000**
|
||||
- `cw-elevator-application-service/passrule/result/AcsPassRuleDetailResult.java` **1.0000**
|
||||
- `cw-elevator-application-service/passrule/result/ImageRuleRefDetailResult.java` **1.0000**
|
||||
- `cw-elevator-application-service/passrule/result/ImageRuleRefPageResult.java` **1.0000**
|
||||
- `cw-elevator-application-service/record/param/SendRecordSendInfoParam.java` **1.0000**
|
||||
- `cw-elevator-application-service/record/param/SendRecordTokenParam.java` **1.0000**
|
||||
- `cw-elevator-application-service/record/result/AcsElevatorAnalyseCycleBusinessResult.java` **1.0000**
|
||||
|
||||
### 最低(优先 IDE diff)
|
||||
- `cw-elevator-application-data/device/dto/AcsElevatorDeviceResultDTO.java` **0.1050**
|
||||
- `cw-elevator-application-data/device/dto/AcsElevatorDeviceQueryFoDTO.java` **0.1052**
|
||||
- `cw-elevator-application-service/device/result/AcsElevatorDeviceListResult.java` **0.1192**
|
||||
- `cw-elevator-application-data/device/dto/AcsElevatorDeviceListResultDto.java` **0.1215**
|
||||
- `cw-elevator-application-web/person/form/AcsPersonQueryForm.java` **0.1247**
|
||||
- `cw-elevator-application-data/passrule/dto/ImageRuleRefAddDto.java` **0.1342**
|
||||
- `cw-elevator-application-common/em/AlarmStateCodeEnum.java` **0.1399**
|
||||
- `cw-elevator-application-common/util/CommunityConstants.java` **0.1989**
|
||||
- `cw-elevator-application-service/export/result/ElevatorDeviceRecordExcelResult.java` **0.1998**
|
||||
- `cw-elevator-application-common/em/AcsDeviceQueryTypeEnum.java` **0.2016**
|
||||
- `cw-elevator-application-common/em/AcsDeviceIdentifyTypeEnum.java` **0.2052**
|
||||
- `cw-elevator-application-data/passrule/dto/ImageRuleRefListResult.java` **0.2072**
|
||||
- `cw-elevator-application-service/person/param/AcsPersonAddVisitorParam.java` **0.2339**
|
||||
- `cw-elevator-application-web/person/form/AcsPersonAddVisitorForm.java` **0.2385**
|
||||
- `cw-elevator-application-service/mqtt/param/AcsElevatorRecordMqttParam.java` **0.2772**
|
||||
- `cw-elevator-application-service/device/result/AcsLabelElevatorResult.java` **0.2838**
|
||||
- `cw-elevator-application-service/device/param/AcsDeviceRestructureTaskParam.java` **0.2992**
|
||||
- `cw-elevator-application-common/config/FeignThreadLocalUtil.java` **0.3187**
|
||||
- `cw-elevator-application-data/passrule/dto/ImageRuleRefResultDto.java` **0.3893**
|
||||
- `cw-elevator-application-service/common/AbstractAcsDeviceService.java` **0.4027**
|
||||
- `cw-elevator-application-service/person/param/AcsPersonQueryParam.java` **0.4166**
|
||||
- `cw-elevator-application-data/record/impl/AcsElevatorRecordDaoImpl.java` **0.4350**
|
||||
- `cw-elevator-application-service/passrule/impl/ImageRuleRefServiceImpl.java` **0.4616**
|
||||
- `cw-elevator-application-service/device/impl/AcsDeviceTaskServiceImpl.java` **0.4644**
|
||||
- `cw-elevator-application-service/device/param/AcsRestructureBindingParam.java` **0.4817**
|
||||
- `cw-elevator-application-web/handler/device/form/AcsRestructureBindingForm.java` **0.4877**
|
||||
- `cw-elevator-application-service/device/result/AcsDeviceRestructureResult.java` **0.4909**
|
||||
- `cw-elevator-application-data/passrule/mapper/ImageRuleRefMapper.java` **0.4948**
|
||||
- `cw-elevator-application-service/passrule/result/AcsPassRuleFloorResult.java` **0.5020**
|
||||
- `cw-elevator-application-service/device/param/AcsRestructureQueryParam.java` **0.5047**
|
||||
- `cw-elevator-application-web/handler/device/form/AcsRestructureQueryForm.java` **0.5049**
|
||||
- `cw-elevator-application-data/record/dto/AcsRecogRecordPageDTO.java` **0.5121**
|
||||
- `cw-elevator-application-common/util/CollectionUtils.java` **0.5129**
|
||||
- `cw-elevator-application-common/util/StringUtils.java` **0.5311**
|
||||
- `cw-elevator-application-common/util/RestTemplateUtil.java` **0.5335**
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
# V1 对齐子任务执行单(立即执行落地)
|
||||
|
||||
生成时间:2026-04-28
|
||||
范围:仅 `maven-cw-elevator-application`,不修改其它 Maven 兄弟仓库。
|
||||
|
||||
---
|
||||
|
||||
## 已在本次会话落地的项
|
||||
|
||||
|
||||
| # | 子任务 | 动作 |
|
||||
| --- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
||||
| A | **对拍排除租户访客楼层** | `api_catalog.json`:`person_add_visitor_min` 设为 `include_in_parity=false`,补充 `parity_exclude_reason`;顶层 `description` 说明原因。 |
|
||||
| B | **全 catalog 对拍与窄对拍一致** | `tests/test_parity_full_catalog.py`:仅收集 `include_in_parity=true` 的条目(与 `test_parity_from_catalog` 一致)。 |
|
||||
| C | **依赖树归档(starter/fat-jar 入口)** | 执行 `mvn dependency:tree`于 `cw-elevator-application-starter`,归档:`report/dependency-tree-starter-20260428.txt`。 |
|
||||
| D | **逐类源码 vs V1(自动反编译 cw_lib jar)** | `./scripts/decompile_v1_elevator_jars.sh` → `tools/v1-decompiled/`;`python3 tools/elevator_api_parity/scripts/source_parity_scan.py` → **`report/SOURCE-PARITY-BY-CLASS-decomp.md`**。旧版静态快照:`SOURCE-PARITY-BY-CLASS-20260428.md`。 |
|
||||
|
||||
|
||||
核对命令(依赖树重现):
|
||||
|
||||
```bash
|
||||
cd maven-cw-elevator-application/cw-elevator-application-starter
|
||||
mvn -DskipTests dependency:tree -DoutputFile=target/dependency-tree.txt
|
||||
```
|
||||
|
||||
当前 `cloudwalk-common-*` 解析版本:**3.7.2-Brussels-SRX**(见归档文件)。
|
||||
|
||||
---
|
||||
|
||||
## 窄对拍(`include_in_parity=true`)当前条目
|
||||
|
||||
运行双端前先起 V1+V2,`/health` 可达后:
|
||||
|
||||
```bash
|
||||
cd tools/elevator_api_parity
|
||||
# 若本机 allure pytest 与 attr 冲突,可禁自动加载第三方插件:
|
||||
export PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
|
||||
ELEVATOR_PARITY_REQUIRE_LIVE=1 python3 -m pytest tests/test_parity_endpoints.py -m live -v
|
||||
```
|
||||
|
||||
或使用全 catalog 中与上表一致的用例(**3 条**):
|
||||
|
||||
```bash
|
||||
export PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
|
||||
python3 -m pytest tests/test_parity_full_catalog.py -m live -v
|
||||
```
|
||||
|
||||
二者现在仅断言 **3 条**(`person_detail`、`passrule_page`、`record_page`),访客接口已不参与 V1/V2 code 等值断言。
|
||||
|
||||
---
|
||||
|
||||
## 待人工/环境接续的子任务(未自动化)
|
||||
|
||||
|
||||
| # | 内容 | 说明 |
|
||||
| --- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 1 | 分域源码走查 person/passrule/device/record | 对照 `artifacts/decompiled/v1-cfr-compare-20211103/cfr-by-artifact`,关注 Feign/Dao 调用序列(CFR 仅辅助)。 |
|
||||
| 2 | Feign/Ribbon 与部署配置 | `ElevatorApplication`、`NincaCrkStdRibbonConfiguration`、`deploy/*/application.properties` 与运行环境一致;对拍需在**相同 listOfServers/域名**下进行。 |
|
||||
| 3 | `@CloudwalkParamsValidate` 行为 | 依赖 `cloudwalk-common-service` 字节码;若双端业务码仍分叉,仅在电梯模块内收敛(实现类补注解或等价校验),**不改兄弟仓库**。 |
|
||||
| 4 | fixtures 扩充 | `fixtures/*.json` 覆盖真实租户数据后,可把更多 catalog 条目的 `include_in_parity` 改为 `true`。 |
|
||||
| 5 | 回滚 | 保留上一版 `cw-elevator-application-*.jar`;对拍大面积失败即回滚替换。 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 验收口径(与「确保」可行性一致)
|
||||
|
||||
- **可验收**:路由 + 选定条目的双端业务 `code` + 同依赖树构建产物。
|
||||
- **不可单独验收**:未升级的传递依赖字节码与生产全网运行时逐条等价。
|
||||
|
||||
+112
@@ -0,0 +1,112 @@
|
||||
# V1 vs V2 字节码根因分析
|
||||
|
||||
- 生成时间(UTC):`2026-04-29T01:54:50Z`
|
||||
- 对比范围:四模块 `cn/cloudwalk/elevator/**` 主类(不含 `$` 内部类)
|
||||
- 维度:类存在性 / API签名 / 方法实现
|
||||
|
||||
## 1. 总览
|
||||
|
||||
| 维度 | 数量 |
|
||||
|---|---:|
|
||||
| MATCH | 261 |
|
||||
| IMPL_DIFF | 30 |
|
||||
| API_DIFF | 14 |
|
||||
| ONLY_V1 | 0 |
|
||||
| ONLY_V2 | 8 |
|
||||
|
||||
## 2. 各模块分布
|
||||
|
||||
| 模块 | MATCH | IMPL_DIFF | API_DIFF | ONLY_V1 | ONLY_V2 |
|
||||
|---|---:|---:|---:|---:|---:|
|
||||
| cw-elevator-application-common | 30 | 1 | 1 | 0 | 0 |
|
||||
| cw-elevator-application-data | 68 | 8 | 3 | 0 | 4 |
|
||||
| cw-elevator-application-service | 126 | 15 | 9 | 0 | 3 |
|
||||
| cw-elevator-application-web | 37 | 6 | 1 | 0 | 1 |
|
||||
|
||||
## 3. API 相同但实现不同(优先查 JD-GUI 还原误差/人工改写)
|
||||
|
||||
| 模块 | 类 |
|
||||
|---|---|
|
||||
| cw-elevator-application-common | `cn.cloudwalk.elevator.util.StringUtils` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.device.dto.AcsElevatorDeviceListByBuildingIdDto` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.device.dto.AcsElevatorDeviceListResultDto` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.device.dto.AcsElevatorDeviceQueryFoDTO` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.device.dto.AcsElevatorDeviceResultDTO` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.passrule.dto.ImageRuleRefAddDto` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.passrule.dto.ImageRuleRefListResult` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.passrule.dto.ImageRuleRefResultDto` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.record.dto.AcsRecogRecordPageDTO` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.device.param.AcsDeviceRestructureTaskParam` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.device.param.AcsRestructureBindingParam` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.device.param.AcsRestructureQueryParam` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.device.result.AcsDeviceRestructureResult` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.device.result.AcsElevatorDeviceListResult` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.device.result.AcsLabelElevatorResult` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.device.result.KeyValueResult` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.export.AcsAbstractExportAsyncService` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.export.result.ElevatorDeviceRecordExcelResult` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.mqtt.param.AcsElevatorRecordMqttParam` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.mqtt.param.MqttSendMessageParam` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.passrule.result.AcsPassRuleFloorResult` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.person.param.AcsPersonAddVisitorParam` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.person.param.AcsPersonQueryParam` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.person.param.PersonDetailQueryParam` |
|
||||
| cw-elevator-application-web | `cn.cloudwalk.elevator.handler.device.form.AcsDeviceRestructureTaskForm` |
|
||||
| cw-elevator-application-web | `cn.cloudwalk.elevator.handler.device.form.AcsRestructureBindingForm` |
|
||||
| cw-elevator-application-web | `cn.cloudwalk.elevator.handler.device.form.AcsRestructureQueryForm` |
|
||||
| cw-elevator-application-web | `cn.cloudwalk.elevator.person.form.AcsPersonAddVisitorForm` |
|
||||
| cw-elevator-application-web | `cn.cloudwalk.elevator.person.form.AcsPersonQueryForm` |
|
||||
| cw-elevator-application-web | `cn.cloudwalk.elevator.person.form.PersonDetailQueryForm` |
|
||||
|
||||
## 4. API 不同(优先查源码结构漂移)
|
||||
|
||||
| 模块 | 类 |
|
||||
|---|---|
|
||||
| cw-elevator-application-common | `cn.cloudwalk.elevator.config.FeignThreadLocalUtil` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.codeElevatorArea.dao.AcsElevatorCodeDao` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.codeElevatorArea.impl.AcsElevatorCodeDaoImpl` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.codeElevatorArea.mapper.AcsElevatorCodeMapper` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.codeElevatorArea.impl.AcsElevatorCodeServiceImpl` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.codeElevatorArea.service.AcsElevatorCodeService` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.device.impl.AcsDeviceTaskServiceImpl` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.device.impl.AcsElevatorDeviceServiceImpl` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.passrule.impl.AcsPassRuleServiceImpl` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.passrule.impl.ImageRuleRefServiceImpl` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.person.impl.AcsPersonServiceImpl` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.person.impl.PersonRuleServiceImpl` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.record.impl.AcsElevatorRecordServiceImpl` |
|
||||
| cw-elevator-application-web | `cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceController` |
|
||||
|
||||
## 5. 仅 V2 存在(新增类)
|
||||
|
||||
| 模块 | 类 |
|
||||
|---|---|
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.person.dao.TenantVisitorFloorPolicyDao` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.person.dto.TenantVisitorFloorPolicyDto` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.person.impl.TenantVisitorFloorPolicyDaoImpl` |
|
||||
| cw-elevator-application-data | `cn.cloudwalk.elevator.person.mapper.TenantVisitorFloorPolicyMapper` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.CloudwalkSessionHolderConfiguration` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.common.ElevatorRemoteIoExecutorConfig` |
|
||||
| cw-elevator-application-service | `cn.cloudwalk.elevator.common.ElevatorRemoteIoPoolProperties` |
|
||||
| cw-elevator-application-web | `cn.cloudwalk.elevator.zone.util.ZoneTreeCollectors` |
|
||||
|
||||
## 6. 仅 V1 存在(缺失类)
|
||||
|
||||
- 无
|
||||
|
||||
## 7. 根因判读指引
|
||||
|
||||
- `IMPL_DIFF`:若对应源码与 CFR 文本高度相似但字节码仍不同,多为 JD-GUI 语句重排/条件翻译偏差或后续手工改写。
|
||||
- `API_DIFF`:优先判定为“源码结构变化”,例如方法签名、字段类型、泛型边界变化。
|
||||
- `ONLY_V2/ONLY_V1`:属于文件集合漂移(新增/漏还原/清理)。
|
||||
|
||||
## 8. API_DIFF 判读
|
||||
|
||||
- **成员顺序**:同签名不同顺序(常见于 Lombok getter/setter 顺序)已由 `norm_api` 合并 descriptor 后排序消除伪差异。
|
||||
- **默认可视构造**:仅含 static 的类若未写显式私有空参构造,javac 可能生成 **public** 默认构造,与旧 JAR 中 **private** 不同;可在源码中补充与 V1 一致。
|
||||
- **真实契约差异**:仍报 API_DIFF 时多为 V2 **新增/改签名** 的方法或字段,需对照业务是否保留(并非脚本噪声)。
|
||||
|
||||
## 9. 实现归一化(摘要)
|
||||
|
||||
- **行级**:指令偏移、`#` 常量池下标、`if_icmp*`/`goto` 目标、`xload`/`xstore` 槽位、`iinc`、`ArrayList`→`List` 的 add/size、`tableswitch` 纯数字行等。
|
||||
- **二次(`bytecode_norm_post`)**:`ifxx`+`goto` 蹦床→反条件单条;连续 `goto @` 折叠;连续重复 `checkcast` 去重;`String.join` 前冗余 `checkcast java/lang/String`;`iconst_0`+dup 与 istore/iload 轮换初始化局部;Apache POI `setCellType`/`setBold`/`setColor` 新旧 API 占位符。
|
||||
+529
@@ -0,0 +1,529 @@
|
||||
# V1 vs V2 源码差异与问题梳理(全自动比对)
|
||||
|
||||
- **生成时间(UTC)**: 2026-04-28T05:00:41Z
|
||||
- **V1**: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/v1-decompiled/cfr-from-cw-lib-20260428-125802`(cw_lib jar → CFR)
|
||||
- **V2**: `/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/{module}/src/main/java/cn/cloudwalk/elevator`
|
||||
- **相似度**: 去注释后全文 `SequenceMatcher.ratio`;**低分≠业务错误**(CFR 变量名/枚举顺序等)。
|
||||
|
||||
## 1. 结论摘要
|
||||
|
||||
|
||||
| 维度 | 数量 | 说明 |
|
||||
| ------------- | --- | -------------------------------- |
|
||||
| 配对类 | 305 | 同名路径 `.java` |
|
||||
| A 桶 ≥0.98 | 146 | 文本高度接近 |
|
||||
| B 桶 0.85–0.98 | 68 | 多为格式/注释/轻微差异,建议抽检 |
|
||||
| C 桶 <0.85 | 91 | **优先 IDE diff**;枚举/DTO 常为 CFR 噪声 |
|
||||
| 仅 V1 | 0 | 当前四模块应为 0 |
|
||||
| 仅 Maven | 21 | V2 新增;访客楼层策略等为**已知扩展** |
|
||||
|
||||
|
||||
### 1.1 建议处置
|
||||
|
||||
1. **仅 Maven**:`TenantVisitorFloor`* — 与 V1 对齐无关(产品已排除);`package-info` — 忽略。
|
||||
2. **C 桶 + 高优先级**(Controller / ServiceImpl / Feign):优先人工对照业务分支与远程调用。
|
||||
3. **C 桶 + 枚举/DTO**:优先视为 CFR 噪声,除非接口契约变更。
|
||||
|
||||
## 2. 仅 Maven 文件(问题/范围标注)
|
||||
|
||||
- `cw-elevator-application-common/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-data/device/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-data/person/dao/TenantVisitorFloorPolicyDao.java` — **V2扩展-租户访客楼层**
|
||||
- `cw-elevator-application-data/person/dto/TenantVisitorFloorPolicyDto.java` — **V2扩展-租户访客楼层**
|
||||
- `cw-elevator-application-data/person/impl/TenantVisitorFloorPolicyDaoImpl.java` — **V2扩展-租户访客楼层**
|
||||
- `cw-elevator-application-data/person/mapper/TenantVisitorFloorPolicyMapper.java` — **V2扩展-租户访客楼层**
|
||||
- `cw-elevator-application-service/CloudwalkSessionHolderConfiguration.java` — **V2扩展-Session**
|
||||
- `cw-elevator-application-service/common/ElevatorRemoteIoExecutorConfig.java` — **V2扩展-远程IO线程池**
|
||||
- `cw-elevator-application-service/common/ElevatorRemoteIoPoolProperties.java` — **V2扩展-远程IO线程池**
|
||||
- `cw-elevator-application-service/common/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-service/device/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-service/mqtt/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-service/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-service/passrule/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-service/person/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-service/record/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-service/visitor/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-service/zone/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-web/handler/device/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-web/handler/package-info.java` — **工程化-package-info**
|
||||
- `cw-elevator-application-web/zone/util/ZoneTreeCollectors.java` — **V2独有-工具类**
|
||||
|
||||
## 3. C 桶(<0.85)按复核优先级分组
|
||||
|
||||
### 中-DTO表单
|
||||
|
||||
|
||||
| 路径 | 相似度 |
|
||||
| ---------------------------------------------------------------------------------------- | ------ |
|
||||
| `cw-elevator-application-service/passrule/param/AcsPassTimeCycleParam.java` | 0.8399 |
|
||||
| `cw-elevator-application-service/person/param/AcsPersonAddNewParam.java` | 0.8391 |
|
||||
| `cw-elevator-application-service/passrule/param/AcsPassTimeAddParam.java` | 0.8347 |
|
||||
| `cw-elevator-application-web/passrule/form/AcsPassRulePersonListForm.java` | 0.8235 |
|
||||
| `cw-elevator-application-service/passrule/param/AcsPassRulePersonListParam.java` | 0.8149 |
|
||||
| `cw-elevator-application-service/person/result/AcsImagestorePersonStatisticsResult.java` | 0.7986 |
|
||||
| `cw-elevator-application-service/mqtt/param/MqttSendMessageParam.java` | 0.6788 |
|
||||
| `cw-elevator-application-service/device/result/KeyValueResult.java` | 0.6397 |
|
||||
| `cw-elevator-application-data/device/dto/AcsElevatorDeviceListByBuildingIdDto.java` | 0.6078 |
|
||||
| `cw-elevator-application-service/person/param/PersonDetailQueryParam.java` | 0.5849 |
|
||||
| `cw-elevator-application-web/person/form/PersonDetailQueryForm.java` | 0.5835 |
|
||||
| `cw-elevator-application-web/handler/device/form/AcsDeviceRestructureTaskForm.java` | 0.5446 |
|
||||
| `cw-elevator-application-data/record/dto/AcsRecogRecordPageDTO.java` | 0.5121 |
|
||||
| `cw-elevator-application-web/handler/device/form/AcsRestructureQueryForm.java` | 0.5049 |
|
||||
| `cw-elevator-application-service/device/param/AcsRestructureQueryParam.java` | 0.5047 |
|
||||
| `cw-elevator-application-service/passrule/result/AcsPassRuleFloorResult.java` | 0.5020 |
|
||||
| `cw-elevator-application-service/device/result/AcsDeviceRestructureResult.java` | 0.4909 |
|
||||
| `cw-elevator-application-web/handler/device/form/AcsRestructureBindingForm.java` | 0.4876 |
|
||||
| `cw-elevator-application-service/device/param/AcsRestructureBindingParam.java` | 0.4817 |
|
||||
| `cw-elevator-application-service/person/param/AcsPersonQueryParam.java` | 0.4166 |
|
||||
| `cw-elevator-application-data/passrule/dto/ImageRuleRefResultDto.java` | 0.3893 |
|
||||
| `cw-elevator-application-service/device/param/AcsDeviceRestructureTaskParam.java` | 0.2992 |
|
||||
| `cw-elevator-application-service/device/result/AcsLabelElevatorResult.java` | 0.2838 |
|
||||
| `cw-elevator-application-service/mqtt/param/AcsElevatorRecordMqttParam.java` | 0.2772 |
|
||||
| `cw-elevator-application-web/person/form/AcsPersonAddVisitorForm.java` | 0.2385 |
|
||||
| `cw-elevator-application-service/person/param/AcsPersonAddVisitorParam.java` | 0.2339 |
|
||||
| `cw-elevator-application-data/passrule/dto/ImageRuleRefListResult.java` | 0.2072 |
|
||||
| `cw-elevator-application-service/export/result/ElevatorDeviceRecordExcelResult.java` | 0.1998 |
|
||||
| `cw-elevator-application-data/passrule/dto/ImageRuleRefAddDto.java` | 0.1342 |
|
||||
| `cw-elevator-application-web/person/form/AcsPersonQueryForm.java` | 0.1247 |
|
||||
| `cw-elevator-application-data/device/dto/AcsElevatorDeviceListResultDto.java` | 0.1215 |
|
||||
| `cw-elevator-application-service/device/result/AcsElevatorDeviceListResult.java` | 0.1192 |
|
||||
| `cw-elevator-application-data/device/dto/AcsElevatorDeviceQueryFoDTO.java` | 0.1052 |
|
||||
| `cw-elevator-application-data/device/dto/AcsElevatorDeviceResultDTO.java` | 0.1050 |
|
||||
|
||||
|
||||
### 中-Mapper接口
|
||||
|
||||
|
||||
| 路径 | 相似度 |
|
||||
| --------------------------------------------------------------------------------- | ------ |
|
||||
| `cw-elevator-application-data/device/mapper/DeviceImageStoreMapper.java` | 0.7928 |
|
||||
| `cw-elevator-application-data/codeElevatorArea/mapper/AcsElevatorCodeMapper.java` | 0.7484 |
|
||||
| `cw-elevator-application-data/device/mapper/AcsElevatorDeviceMapper.java` | 0.7018 |
|
||||
| `cw-elevator-application-data/passrule/mapper/ImageRuleRefMapper.java` | 0.4948 |
|
||||
|
||||
|
||||
### 中-其他
|
||||
|
||||
|
||||
| 路径 | 相似度 |
|
||||
| ----------------------------------------------------------------------------------------------- | ------ |
|
||||
| `cw-elevator-application-service/export/ExcelCallback.java` | 0.8484 |
|
||||
| `cw-elevator-application-data/YearlyShardingAlgorithm.java` | 0.8363 |
|
||||
| `cw-elevator-application-data/codeElevatorArea/dao/AcsElevatorCodeDao.java` | 0.8298 |
|
||||
| `cw-elevator-application-service/downloadcenter/AcsDownloadCenterService.java` | 0.8279 |
|
||||
| `cw-elevator-application-data/passrule/dao/ImageRuleRefDao.java` | 0.8150 |
|
||||
| `cw-elevator-application-common/util/DateUtils.java` | 0.8123 |
|
||||
| `cw-elevator-application-service/codeElevatorArea/service/AcsElevatorCodeService.java` | 0.8121 |
|
||||
| `cw-elevator-application-service/task/ElevatorRecordSendTask.java` | 0.8051 |
|
||||
| `cw-elevator-application-service/export/utils/ExcelUtil.java` | 0.8050 |
|
||||
| `cw-elevator-application-web/handler/OpenDoorRecordEventHandler.java` | 0.7811 |
|
||||
| `cw-elevator-application-service/device/service/AcsDeviceTaskService.java` | 0.7681 |
|
||||
| `cw-elevator-application-service/passrule/service/ImageRuleRefService.java` | 0.7673 |
|
||||
| `cw-elevator-application-service/device/setting/service/AcsDeviceImageStoreAppBindService.java` | 0.7672 |
|
||||
| `cw-elevator-application-common/util/StartTimeAndEndTime.java` | 0.7629 |
|
||||
| `cw-elevator-application-service/device/service/AcsElevatorDeviceService.java` | 0.7468 |
|
||||
| `cw-elevator-application-service/export/AcsAbstractExportAsyncService.java` | 0.7257 |
|
||||
| `cw-elevator-application-service/passrule/service/AcsPassRuleService.java` | 0.7087 |
|
||||
| `cw-elevator-application-service/person/service/PersonRuleService.java` | 0.7029 |
|
||||
| `cw-elevator-application-service/person/service/AcsPersonService.java` | 0.6887 |
|
||||
| `cw-elevator-application-service/AcsFeignConfiguration.java` | 0.5382 |
|
||||
| `cw-elevator-application-common/util/RestTemplateUtil.java` | 0.5335 |
|
||||
| `cw-elevator-application-common/util/StringUtils.java` | 0.5311 |
|
||||
| `cw-elevator-application-common/util/CollectionUtils.java` | 0.5129 |
|
||||
| `cw-elevator-application-service/common/AbstractAcsDeviceService.java` | 0.4027 |
|
||||
| `cw-elevator-application-common/config/FeignThreadLocalUtil.java` | 0.3187 |
|
||||
| `cw-elevator-application-common/util/CommunityConstants.java` | 0.1989 |
|
||||
|
||||
|
||||
### 低-枚举(CFR噪声常见)
|
||||
|
||||
|
||||
| 路径 | 相似度 |
|
||||
| ------------------------------------------------------------------ | ------ |
|
||||
| `cw-elevator-application-common/em/AcsApplicationSourceEnum.java` | 0.8372 |
|
||||
| `cw-elevator-application-common/em/AcsPassTypeEnum.java` | 0.8155 |
|
||||
| `cw-elevator-application-common/em/CompareTypeEnum.java` | 0.7955 |
|
||||
| `cw-elevator-application-common/em/AcsDeviceSettingEnum.java` | 0.7651 |
|
||||
| `cw-elevator-application-service/export/AcsFileStatusEnum.java` | 0.6657 |
|
||||
| `cw-elevator-application-common/em/OpenDoorTypeEnum.java` | 0.5714 |
|
||||
| `cw-elevator-application-common/em/EngineAddressEnum.java` | 0.5630 |
|
||||
| `cw-elevator-application-common/em/AcsDeviceIdentifyTypeEnum.java` | 0.2052 |
|
||||
| `cw-elevator-application-common/em/AcsDeviceQueryTypeEnum.java` | 0.2016 |
|
||||
| `cw-elevator-application-common/em/AlarmStateCodeEnum.java` | 0.1399 |
|
||||
|
||||
|
||||
### 高-Controller
|
||||
|
||||
|
||||
| 路径 | 相似度 |
|
||||
| ---------------------------------------------------------------------------------------------- | ------ |
|
||||
| `cw-elevator-application-web/handler/device/controller/AcsElevatorRestructureController.java` | 0.7986 |
|
||||
| `cw-elevator-application-web/handler/device/controller/AcsElevatorDeviceController.java` | 0.7094 |
|
||||
| `cw-elevator-application-web/handler/device/controller/AcsElevatorDeviceGetWayController.java` | 0.6779 |
|
||||
|
||||
|
||||
### 高-Service/DaoImpl
|
||||
|
||||
|
||||
| 路径 | 相似度 |
|
||||
| --------------------------------------------------------------------------------------- | ------ |
|
||||
| `cw-elevator-application-service/record/impl/AcsRecogRecordServiceImpl.java` | 0.8440 |
|
||||
| `cw-elevator-application-service/codeElevatorArea/impl/AcsElevatorCodeServiceImpl.java` | 0.8396 |
|
||||
| `cw-elevator-application-service/person/impl/AcsPersonServiceImpl.java` | 0.8394 |
|
||||
| `cw-elevator-application-service/device/setting/impl/AcsDeviceSettingServiceImpl.java` | 0.8205 |
|
||||
| `cw-elevator-application-data/device/impl/AcsElevatorDeviceDaoImpl.java` | 0.8133 |
|
||||
| `cw-elevator-application-service/passrule/impl/AcsPassRuleServiceImpl.java` | 0.7823 |
|
||||
| `cw-elevator-application-data/passrule/impl/AcsPassRuleDaoImpl.java` | 0.7309 |
|
||||
| `cw-elevator-application-service/record/impl/AcsElevatorRecordServiceImpl.java` | 0.7267 |
|
||||
| `cw-elevator-application-service/person/impl/PersonRuleServiceImpl.java` | 0.6876 |
|
||||
| `cw-elevator-application-service/passrule/impl/AbstractAcsPassService.java` | 0.6162 |
|
||||
| `cw-elevator-application-service/device/impl/AcsElevatorDeviceServiceImpl.java` | 0.5556 |
|
||||
| `cw-elevator-application-service/device/impl/AcsDeviceTaskServiceImpl.java` | 0.4644 |
|
||||
| `cw-elevator-application-service/passrule/impl/ImageRuleRefServiceImpl.java` | 0.4616 |
|
||||
| `cw-elevator-application-data/record/impl/AcsElevatorRecordDaoImpl.java` | 0.4350 |
|
||||
|
||||
|
||||
## 4. 完整配对表(全部类)
|
||||
|
||||
|
||||
| 模块 | 相对路径 | 相似度 | 分桶 | 复核优先级 |
|
||||
| ------------------------------- | ------------------------------------------------------------------ | ------ | ------ | ----------------- |
|
||||
| cw-elevator-application-common | `annontation/DavinciPic.java` | 0.9788 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `cache/CacheOverrideConfig.java` | 0.9963 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-common | `config/AcsConstants.java` | 0.9621 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `config/AcsLockConstants.java` | 0.9638 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `config/ElevatorCwosConfig.java` | 0.9978 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-common | `config/ErrorCode.java` | 0.9992 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-common | `config/FeignRemoteConfig.java` | 0.9671 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `config/FeignThreadLocalUtil.java` | 0.3187 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `config/ImageStoreConstants.java` | 0.8973 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `context/CloudWalkExtendContextValue.java` | 1.0000 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-common | `em/AcsApplicationSourceEnum.java` | 0.8372 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/AcsDeviceIdentifyTypeEnum.java` | 0.2052 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/AcsDeviceQueryTypeEnum.java` | 0.2016 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/AcsDeviceSettingEnum.java` | 0.7651 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/AcsOpenDoorStatusEnum.java` | 0.8564 | B-轻度差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/AcsOperateStatusEnum.java` | 0.8728 | B-轻度差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/AcsOperateTypeEnum.java` | 0.8824 | B-轻度差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/AcsPassTypeEnum.java` | 0.8155 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/AlarmStateCodeEnum.java` | 0.1399 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/CompareTypeEnum.java` | 0.7955 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/EngineAddressEnum.java` | 0.5630 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/OpenDoorTypeEnum.java` | 0.5714 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `em/YesNoTypeEnum.java` | 0.8932 | B-轻度差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-common | `util/AcsCacheKeyUtil.java` | 1.0000 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-common | `util/CollectionUtils.java` | 0.5129 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `util/CommunityConstants.java` | 0.1989 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `util/DateUtils.java` | 0.8123 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `util/JsonUtils.java` | 0.9024 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `util/RestTemplateUtil.java` | 0.5335 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `util/StartTimeAndEndTime.java` | 0.7629 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `util/StringUtils.java` | 0.5311 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-common | `util/ToolUtil.java` | 0.9268 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `YearlyShardingAlgorithm.java` | 0.8363 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `codeElevatorArea/dao/AcsElevatorCodeDao.java` | 0.8298 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `codeElevatorArea/dto/AcsElevatorCodeDTO.java` | 0.9974 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `codeElevatorArea/dto/AcsElevatorCodeQueryDTO.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `codeElevatorArea/dto/AcsElevatorCodeResultDTO.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `codeElevatorArea/impl/AcsElevatorCodeDaoImpl.java` | 0.9054 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-data | `codeElevatorArea/mapper/AcsElevatorCodeMapper.java` | 0.7484 | C-显著差异 | 中-Mapper接口 |
|
||||
| cw-elevator-application-data | `device/dao/AcsDeviceTaskDao.java` | 0.8515 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `device/dao/AcsElevatorDeviceDao.java` | 0.8537 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `device/dao/DeviceImageStoreDao.java` | 0.8980 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `device/dto/AcsDeviceQueryDTO.java` | 0.9995 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsDeviceResultDTO.java` | 0.9986 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsDeviceTaskAddDto.java` | 0.9974 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsDeviceTaskDTO.java` | 0.9987 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceAddDTO.java` | 0.9980 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceEditDTO.java` | 0.9980 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceListByBuildingIdDto.java` | 0.6078 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceListDto.java` | 0.9975 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceListResultDto.java` | 0.1215 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceQueryByIdDTO.java` | 0.9940 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceQueryDTO.java` | 0.9989 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceQueryFoDTO.java` | 0.1052 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceQueryResultDTO.java` | 0.9967 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/dto/AcsElevatorDeviceResultDTO.java` | 0.1050 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `device/impl/AcsDeviceTaskDaoImpl.java` | 0.9785 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-data | `device/impl/AcsElevatorDeviceDaoImpl.java` | 0.8133 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-data | `device/impl/DeviceImageStoreDaoImpl.java` | 0.9856 | A-高度一致 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-data | `device/mapper/AcsDeviceTaskMapper.java` | 0.8535 | B-轻度差异 | 中-Mapper接口 |
|
||||
| cw-elevator-application-data | `device/mapper/AcsElevatorDeviceMapper.java` | 0.7018 | C-显著差异 | 中-Mapper接口 |
|
||||
| cw-elevator-application-data | `device/mapper/DeviceImageStoreMapper.java` | 0.7928 | C-显著差异 | 中-Mapper接口 |
|
||||
| cw-elevator-application-data | `passrule/dao/AcsPassRuleDao.java` | 0.8710 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `passrule/dao/ImageRuleRefDao.java` | 0.8150 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRuleAddDto.java` | 0.9989 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRuleDeleteDto.java` | 0.9991 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRuleEditDto.java` | 0.9986 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRuleImageDto.java` | 0.9984 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRuleImageResultDto.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRuleIsDefaultDto.java` | 0.9966 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRuleLabelResultDto.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRulePersonListDto.java` | 0.9990 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRulePersonListResultDto.java` | 0.9341 | B-轻度差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRuleQueryDto.java` | 0.9992 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/AcsPassRuleResultDto.java` | 0.9989 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/ImageRuleRefAddDto.java` | 0.1342 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/ImageRuleRefListResult.java` | 0.2072 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/dto/ImageRuleRefResultDto.java` | 0.3893 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `passrule/impl/AcsPassRuleDaoImpl.java` | 0.7309 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-data | `passrule/impl/ImageRuleRefDaoImpl.java` | 0.9646 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-data | `passrule/mapper/AcsPassRuleMapper.java` | 0.8959 | B-轻度差异 | 中-Mapper接口 |
|
||||
| cw-elevator-application-data | `passrule/mapper/ImageRuleRefMapper.java` | 0.4948 | C-显著差异 | 中-Mapper接口 |
|
||||
| cw-elevator-application-data | `record/dao/AcsElevatorRecordDao.java` | 0.9100 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `record/dao/AcsPersonInfoDao.java` | 0.9936 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-data | `record/dao/AcsRecogRecordDao.java` | 0.9237 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `record/dao/SendRecordTimeDao.java` | 0.9168 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-data | `record/dto/AcsElevatorAnalyseCycleBusinessResultDTO.java` | 0.9982 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsElevatorPageRequestInfoResultDTO.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsElevatorQueryCountDTO.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsElevatorRecordAddDTO.java` | 0.9981 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsElevatorRecordDetailQueryDTO.java` | 0.9996 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsElevatorRecordDetailQueryResultDTO.java` | 0.9982 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsElevatorRecordExtraDTO.java` | 0.9982 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsElevatorRecordQueryResultDTO.java` | 0.9979 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsOpenDoorRecordEditDTO.java` | 0.9976 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsOpenDoorRecordQueryDTO.java` | 0.9991 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsPersonInfoResultDTO.java` | 0.9977 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsRecogRecordAddDTO.java` | 0.9979 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsRecogRecordPageDTO.java` | 0.5121 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsRecogRecordResultDTO.java` | 0.9993 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsRecordDetailQueryResultDTO.java` | 0.9998 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/AcsRecordThreeSendQueryDTO.java` | 0.9985 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/SendRecordTimeAddDTO.java` | 0.9973 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/SendRecordTimeEditDTO.java` | 0.9973 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/dto/SendRecordTimeResultDTO.java` | 0.9973 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-data | `record/impl/AcsElevatorRecordDaoImpl.java` | 0.4350 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-data | `record/impl/AcsRecogRecordDaoImpl.java` | 0.8742 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-data | `record/impl/SendRecordTimeDaoImpl.java` | 0.8790 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-data | `record/mapper/AcsElevatorRecordMapper.java` | 0.8761 | B-轻度差异 | 中-Mapper接口 |
|
||||
| cw-elevator-application-data | `record/mapper/AcsRecogRecordMapper.java` | 0.9024 | B-轻度差异 | 中-Mapper接口 |
|
||||
| cw-elevator-application-data | `record/mapper/SendRecordTimeMapper.java` | 0.8994 | B-轻度差异 | 中-Mapper接口 |
|
||||
| cw-elevator-application-service | `AcsFeignConfiguration.java` | 0.5382 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `cacheable/AcsAreaTreeCacheableService.java` | 0.9970 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-service | `codeElevatorArea/impl/AcsElevatorCodeServiceImpl.java` | 0.8396 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `codeElevatorArea/param/AcsElevatorCodeParam.java` | 0.9974 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `codeElevatorArea/result/AcsElevatorCodeResult.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `codeElevatorArea/service/AcsElevatorCodeService.java` | 0.8121 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `common/AbstractAcsDeviceService.java` | 0.4027 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `common/AbstractCloudwalkService.java` | 0.9972 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-service | `common/AcsApplicationServiceImpl.java` | 0.9534 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `common/UpdateFloorsPoolProperties.java` | 0.9992 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-service | `common/UpdateFloorsTaskExecutor.java` | 0.9109 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `common/service/AcsApplicationService.java` | 0.9479 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `device/impl/AcsDeviceTaskServiceImpl.java` | 0.4644 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `device/impl/AcsElevatorDeviceServiceImpl.java` | 0.5556 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `device/param/AcsDeviceQueryParam.java` | 0.9972 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/param/AcsDeviceRestructureTaskParam.java` | 0.2992 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/param/AcsElevatorDeviceAddParam.java` | 0.9981 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/param/AcsElevatorDeviceEditParam.java` | 0.9985 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/param/AcsElevatorDeviceListParam.java` | 0.9968 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/param/AcsElevatorDeviceQueryByIdParam.java` | 0.9941 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/param/AcsElevatorDeviceQueryParam.java` | 0.9988 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/param/AcsRestructureBindingParam.java` | 0.4817 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/param/AcsRestructureQueryParam.java` | 0.5047 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/result/AcsDeviceNewResult.java` | 0.9997 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/result/AcsDeviceRestructureResult.java` | 0.4909 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/result/AcsElevatorDeviceListResult.java` | 0.1192 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/result/AcsElevatorDeviceResult.java` | 0.9996 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/result/AcsLabelElevatorResult.java` | 0.2838 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/result/KeyValueResult.java` | 0.6397 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/service/AcsDeviceTaskService.java` | 0.7681 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `device/service/AcsElevatorDeviceService.java` | 0.7468 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `device/setting/impl/AcsDeviceImageStoreAppBindServiceImpl.java` | 0.8935 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `device/setting/impl/AcsDeviceSettingServiceImpl.java` | 0.8205 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `device/setting/param/AcsDeviceTemperatureSettingParam.java` | 0.9948 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/setting/param/DeviceImageStoreAppBindParam.java` | 0.9986 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/setting/param/DeviceImageStoreAppUnbindParam.java` | 0.9988 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/setting/result/AcsDeviceSettingResult.java` | 0.9077 | B-轻度差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/setting/result/AcsSettingAttr.java` | 0.9990 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `device/setting/service/AcsDeviceImageStoreAppBindService.java` | 0.7672 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `device/setting/service/AcsDeviceSettingService.java` | 0.9334 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `downloadcenter/AcsDownloadCenterService.java` | 0.8279 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `downloadcenter/impl/AcsDownloadCenterServiceImpl.java` | 0.8874 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `downloadcenter/param/AcsFileFinishParam.java` | 0.9991 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `export/AcsAbstractExportAsyncService.java` | 0.7257 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `export/AcsFileStatusEnum.java` | 0.6657 | C-显著差异 | 低-枚举(CFR噪声常见) |
|
||||
| cw-elevator-application-service | `export/ExcelAttribute.java` | 0.9425 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `export/ExcelCallback.java` | 0.8484 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `export/impl/ElevatorDeviceExportService.java` | 0.8853 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `export/result/ElevatorDeviceRecordExcelResult.java` | 0.1998 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `export/utils/ExcelUtil.java` | 0.8050 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `export/utils/FolderUtils.java` | 0.9243 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `mqtt/client/MqttFeignClient.java` | 0.9696 | B-轻度差异 | 高-Feign/Client |
|
||||
| cw-elevator-application-service | `mqtt/fallback/MqttFeignClientFallback.java` | 0.9606 | B-轻度差异 | 高-Feign/Client |
|
||||
| cw-elevator-application-service | `mqtt/impl/MqttServiceImpl.java` | 0.9046 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `mqtt/param/AcsElevatorRecordMqttParam.java` | 0.2772 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `mqtt/param/MqttSendMessageParam.java` | 0.6788 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `mqtt/service/MqttService.java` | 0.9315 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `passrule/impl/AbstractAcsPassService.java` | 0.6162 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `passrule/impl/AcsPassRuleServiceImpl.java` | 0.7823 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `passrule/impl/ImageRuleRefServiceImpl.java` | 0.4616 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassRuleDeleteParam.java` | 0.9973 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassRuleEditParam.java` | 0.9973 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassRuleFloorParam.java` | 0.9953 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassRuleImageParam.java` | 0.9992 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassRuleIsDefaultParam.java` | 0.9971 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassRuleNewParam.java` | 0.9976 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassRulePersonListParam.java` | 0.8149 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassRuleQueryParam.java` | 0.9991 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassTimeAddParam.java` | 0.8347 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassTimeCycleParam.java` | 0.8399 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassTimeDeleteParam.java` | 0.9955 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassTimeEditParam.java` | 0.8509 | B-轻度差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassTimeParam.java` | 0.9980 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/param/AcsPassTimeQueryParam.java` | 0.9949 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/result/AcsPassRuleDetailResult.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/result/AcsPassRuleFloorResult.java` | 0.5020 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/result/AcsPassRuleResult.java` | 0.9997 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/result/ImageRuleRefDetailResult.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/result/ImageRuleRefPageResult.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `passrule/service/AcsPassRuleService.java` | 0.7087 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `passrule/service/ImageRuleRefService.java` | 0.7673 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `person/impl/AcsPersonServiceImpl.java` | 0.8394 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `person/impl/PersonRuleServiceImpl.java` | 0.6876 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonAddNewParam.java` | 0.8391 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonAddParam.java` | 0.9983 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonAddVisitorParam.java` | 0.2339 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonCheckTimeParam.java` | 0.9986 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonDeleteParam.java` | 0.9975 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonDetailParam.java` | 0.9965 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonEditParam.java` | 0.9972 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonFaceParam.java` | 0.9952 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonPropertiesParam.java` | 0.9997 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonQueryByAppParam.java` | 0.9963 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonQueryParam.java` | 0.4166 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/AcsPersonTimeDetailParam.java` | 0.9968 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/param/PersonDetailQueryParam.java` | 0.5849 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/result/AcsAppResult.java` | 0.9988 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/result/AcsImageStoreStatisticsResult.java` | 0.9987 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/result/AcsImagestorePersonStatisticsResult.java` | 0.7986 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/result/AcsPersonDetailResult.java` | 0.8917 | B-轻度差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/result/AcsPersonFaceResult.java` | 0.9975 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/result/AcsPersonResult.java` | 0.9997 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/result/AcsPersonTimeDetailResult.java` | 0.9994 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/result/AppImageStoreStatisticsResult.java` | 0.9212 | B-轻度差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `person/service/AcsPersonService.java` | 0.6887 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `person/service/PersonRuleService.java` | 0.7029 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `record/impl/AcsElevatorRecordServiceImpl.java` | 0.7267 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `record/impl/AcsRecogRecordServiceImpl.java` | 0.8440 | C-显著差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `record/impl/PersonFileServiceImpl.java` | 0.9774 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `record/impl/SendRecordTimeServiceImpl.java` | 0.9959 | A-高度一致 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `record/param/AcsElevatorRecordAddParam.java` | 0.9983 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/param/AcsElevatorRecordAnalyseCountParam.java` | 0.9957 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/param/AcsElevatorRecordAnalyseCycleParam.java` | 0.9914 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/param/AcsElevatorRecordDetailParam.java` | 0.9988 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/param/AcsOpenDoorRecordAddParam.java` | 0.9977 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/param/AcsOpenDoorRecordEditParam.java` | 0.9977 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/param/AcsRecogRecordAddParam.java` | 0.9980 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/param/SendRecordSendInfoParam.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/param/SendRecordSendParam.java` | 0.9039 | B-轻度差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/param/SendRecordTokenParam.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/result/AcsElevatorAnalyseCycleBusinessResult.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/result/AcsElevatorAnalyseCycleResult.java` | 0.9293 | B-轻度差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/result/AcsElevatorPageRequestInfoResult.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/result/AcsElevatorRecordResult.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/result/SendRecordTokenResult.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/result/VisitorRecordPushEvent.java` | 0.9119 | B-轻度差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `record/service/AcsElevatorRecordService.java` | 0.8857 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `record/service/AcsRecogRecordService.java` | 0.8765 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `record/service/PersonFileService.java` | 0.8743 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `record/service/SendRecordTimeService.java` | 0.9943 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-service | `storage/AcsFileStorageService.java` | 0.9290 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `storage/impl/AcsFileStorageServiceImpl.java` | 0.9357 | B-轻度差异 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `task/ElevatorRecordSendTask.java` | 0.8051 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-service | `visitor/client/VisitorFeignClient.java` | 0.9706 | B-轻度差异 | 高-Feign/Client |
|
||||
| cw-elevator-application-service | `visitor/fallback/VisitorFeignClientFallback.java` | 0.9459 | B-轻度差异 | 高-Feign/Client |
|
||||
| cw-elevator-application-service | `visitor/param/VisitorGetsParam.java` | 0.9980 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `visitor/param/VisitorRecordQueryForm.java` | 1.0000 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `visitor/param/VisitorRecordQueryParam.java` | 0.9967 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `visitor/result/VisitorQueryResult.java` | 0.8717 | B-轻度差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `visitor/result/VisitorRecordResult.java` | 0.9998 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `visitor/result/VisitorResult.java` | 0.9996 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `zone/client/ZoneFeignClient.java` | 0.9672 | B-轻度差异 | 高-Feign/Client |
|
||||
| cw-elevator-application-service | `zone/fallback/ZoneFeignClientFallback.java` | 0.9279 | B-轻度差异 | 高-Feign/Client |
|
||||
| cw-elevator-application-service | `zone/impl/ZoneServiceImpl.java` | 0.9880 | A-高度一致 | 高-Service/DaoImpl |
|
||||
| cw-elevator-application-service | `zone/param/ZoneNextTreeParam.java` | 0.9853 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `zone/param/ZoneQueryParam.java` | 0.9938 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `zone/result/AgImageUploadResult.java` | 0.9977 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `zone/result/ZoneResult.java` | 0.9990 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `zone/result/ZoneTreeResult.java` | 0.9998 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-service | `zone/service/ZoneService.java` | 0.8729 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-web | `common/AbstractCloudwalkController.java` | 0.9465 | B-轻度差异 | 高-Controller |
|
||||
| cw-elevator-application-web | `common/CloudwalkCallNewContext.java` | 0.9935 | A-高度一致 | 中-其他 |
|
||||
| cw-elevator-application-web | `handler/AbstractEventHandler.java` | 0.9448 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-web | `handler/OpenDoorRecordEventHandler.java` | 0.7811 | C-显著差异 | 中-其他 |
|
||||
| cw-elevator-application-web | `handler/PersonRecordEventHandler.java` | 0.8953 | B-轻度差异 | 中-其他 |
|
||||
| cw-elevator-application-web | `handler/device/controller/AcsElevatorDeviceController.java` | 0.7094 | C-显著差异 | 高-Controller |
|
||||
| cw-elevator-application-web | `handler/device/controller/AcsElevatorDeviceGetWayController.java` | 0.6779 | C-显著差异 | 高-Controller |
|
||||
| cw-elevator-application-web | `handler/device/controller/AcsElevatorRestructureController.java` | 0.7986 | C-显著差异 | 高-Controller |
|
||||
| cw-elevator-application-web | `handler/device/controller/FileController.java` | 0.9112 | B-轻度差异 | 高-Controller |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsDeviceQueryForm.java` | 0.9973 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsDeviceRestructureTaskForm.java` | 0.5446 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsElevatorCodeForm.java` | 0.9974 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsElevatorCodeQueryForm.java` | 0.9960 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsElevatorDeviceAddForm.java` | 0.9980 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsElevatorDeviceDeleteForm.java` | 0.9948 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsElevatorDeviceEditForm.java` | 0.9985 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsElevatorDeviceQueryByIdForm.java` | 0.9942 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsElevatorDeviceQueryForm.java` | 0.9988 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsElevatorRecordAddForm.java` | 0.9984 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsRestructureBindingForm.java` | 0.4876 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `handler/device/form/AcsRestructureQueryForm.java` | 0.5049 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `passrule/controller/AcsPassRuleController.java` | 0.8956 | B-轻度差异 | 高-Controller |
|
||||
| cw-elevator-application-web | `passrule/form/AcsPassRuleDeleteForm.java` | 0.9984 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `passrule/form/AcsPassRuleEditForm.java` | 0.9995 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `passrule/form/AcsPassRuleFloorForm.java` | 0.9952 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `passrule/form/AcsPassRuleImageForm.java` | 0.9992 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `passrule/form/AcsPassRuleNewForm.java` | 0.9994 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `passrule/form/AcsPassRulePersonListForm.java` | 0.8235 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `passrule/form/AcsPassRuleQueryForm.java` | 0.9853 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/controller/AcsPersonController.java` | 0.9087 | B-轻度差异 | 高-Controller |
|
||||
| cw-elevator-application-web | `person/form/AcsPersonAddForm.java` | 0.9990 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/form/AcsPersonAddNewForm.java` | 0.9990 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/form/AcsPersonAddVisitorForm.java` | 0.2385 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/form/AcsPersonDeleteForm.java` | 0.9990 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/form/AcsPersonDetailForm.java` | 0.9979 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/form/AcsPersonEditForm.java` | 0.9989 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/form/AcsPersonFaceForm.java` | 0.9980 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/form/AcsPersonQueryForm.java` | 0.1247 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/form/AcsPersonTimeDetailForm.java` | 0.9981 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `person/form/PersonDetailQueryForm.java` | 0.5835 | C-显著差异 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `record/controller/AcsElevatorRecordController.java` | 0.9023 | B-轻度差异 | 高-Controller |
|
||||
| cw-elevator-application-web | `record/form/AcsElevatorRecordAnalyseCountForm.java` | 0.9983 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `record/form/AcsElevatorRecordAnalyseCycleForm.java` | 0.9978 | A-高度一致 | 中-DTO表单 |
|
||||
| cw-elevator-application-web | `record/form/AcsElevatorRecordQueryForm.java` | 0.9985 | A-高度一致 | 中-DTO表单 |
|
||||
|
||||
|
||||
### 仅 V1 / 仅 Maven 行
|
||||
|
||||
- `cw-elevator-application-common/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-data/device/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-data/person/dao/TenantVisitorFloorPolicyDao.java` — **ONLY_MAVEN** — V2扩展-租户访客楼层
|
||||
- `cw-elevator-application-data/person/dto/TenantVisitorFloorPolicyDto.java` — **ONLY_MAVEN** — V2扩展-租户访客楼层
|
||||
- `cw-elevator-application-data/person/impl/TenantVisitorFloorPolicyDaoImpl.java` — **ONLY_MAVEN** — V2扩展-租户访客楼层
|
||||
- `cw-elevator-application-data/person/mapper/TenantVisitorFloorPolicyMapper.java` — **ONLY_MAVEN** — V2扩展-租户访客楼层
|
||||
- `cw-elevator-application-service/CloudwalkSessionHolderConfiguration.java` — **ONLY_MAVEN** — V2扩展-Session
|
||||
- `cw-elevator-application-service/common/ElevatorRemoteIoExecutorConfig.java` — **ONLY_MAVEN** — V2扩展-远程IO线程池
|
||||
- `cw-elevator-application-service/common/ElevatorRemoteIoPoolProperties.java` — **ONLY_MAVEN** — V2扩展-远程IO线程池
|
||||
- `cw-elevator-application-service/common/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-service/device/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-service/mqtt/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-service/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-service/passrule/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-service/person/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-service/record/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-service/visitor/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-service/zone/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-web/handler/device/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-web/handler/package-info.java` — **ONLY_MAVEN** — 工程化-package-info
|
||||
- `cw-elevator-application-web/zone/util/ZoneTreeCollectors.java` — **ONLY_MAVEN** — V2独有-工具类
|
||||
|
||||
## 5. 生成命令
|
||||
|
||||
```bash
|
||||
cd maven-cw-elevator-application
|
||||
./scripts/decompile_v1_elevator_jars.sh # 若尚未反编译 V1 jar
|
||||
python3 tools/elevator_api_parity/scripts/v1_v2_diff_issues_report.py
|
||||
```
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
# IMPL_DIFF 深挖与定责(2026-04-28)
|
||||
|
||||
- 数据源:`V1-V2-BYTECODE-ROOTCAUSE.json` + `impl-diff-evidence-20260428/*`
|
||||
- 归一化增强后(去跳转偏移/槽位号噪声):`IMPL_DIFF 13 -> 11`,`MATCH 244 -> 246`。
|
||||
- 说明:此前部分差异属于字节码文本噪声,不是语义差异。
|
||||
|
||||
## 1) 本轮修正动作
|
||||
|
||||
- 已修复依赖链伪差异:显式引入 `intelligent-cwoscomponent-interface`(父 POM + service 模块)。
|
||||
- 已回退 `AcsElevatorDeviceGetWayController` 的 39202/39204 到 V1 行为;该类已不在 IMPL_DIFF 列表。
|
||||
- 已增强比对归一化算法,消除跳转地址和局部槽位导致的误报。
|
||||
|
||||
## 2) 剩余 11 个 IMPL_DIFF 定责
|
||||
|
||||
| 类 | diff_lines | 初步定责 |
|
||||
|---|---:|---|
|
||||
| `cn.cloudwalk.elevator.util.StringUtils` | 536 | 高疑似还原漂移(工具类重写痕迹重,建议以 V1 class 反推修正) |
|
||||
| `cn.cloudwalk.elevator.export.utils.ExcelUtil` | 377 | 高疑似还原漂移(导出工具字节码差异大) |
|
||||
| `cn.cloudwalk.elevator.util.DateUtils` | 373 | 高疑似还原漂移(时间工具实现差异大) |
|
||||
| `cn.cloudwalk.elevator.device.impl.AcsElevatorDeviceServiceImpl` | 269 | 中高风险实现漂移(业务服务实现差异大) |
|
||||
| `cn.cloudwalk.elevator.handler.OpenDoorRecordEventHandler` | 45 | 事件处理逻辑调整(条件分支/调用指令变化) |
|
||||
| `cn.cloudwalk.elevator.common.AbstractCloudwalkController` | 26 | 防御性增强(空请求属性兜底、消息回退) |
|
||||
| `cn.cloudwalk.elevator.task.ElevatorRecordSendTask` | 22 | 集合调用与异常表小幅变化,偏工程性 |
|
||||
| `cn.cloudwalk.elevator.handler.PersonRecordEventHandler` | 18 | 调用指令由 invokespecial->invokevirtual,需确认是否影响多态 |
|
||||
| `cn.cloudwalk.elevator.common.UpdateFloorsTaskExecutor` | 14 | 线程池新增 keepAliveSeconds,属有意调优 |
|
||||
| `cn.cloudwalk.elevator.handler.device.controller.FileController` | 14 | 常量池索引噪声级差异(几乎可忽略) |
|
||||
| `cn.cloudwalk.elevator.common.AcsApplicationServiceImpl` | 11 | 常量池/指令对齐噪声级差异(几乎可忽略) |
|
||||
|
||||
## 3) 处理优先级(先大后小)
|
||||
|
||||
1. **P0(先修)**:`StringUtils`、`DateUtils`、`ExcelUtil`、`AcsElevatorDeviceServiceImpl`。
|
||||
2. **P1(复核)**:`OpenDoorRecordEventHandler`、`AbstractCloudwalkController`、`ElevatorRecordSendTask`。
|
||||
3. **P2(可后置)**:`PersonRecordEventHandler`、`UpdateFloorsTaskExecutor`、`FileController`、`AcsApplicationServiceImpl`。
|
||||
|
||||
## 4) 下一步建议(可直接执行)
|
||||
|
||||
- 对 P0 四类做“方法级回归修复”:以 `impl-diff-evidence-20260428/*.diff.txt` 为依据,逐方法回贴 V1 语义。
|
||||
- 每修一个类即重新 `mvn -q -DskipTests package` + `bytecode_parity_rootcause.py`,确认 IMPL_DIFF 递减。
|
||||
- 目标:先把 `IMPL_DIFF` 压到 <=5,再评估是否需要继续追求 0。
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
# V1/V2 修复复盘总表(2026-04-28)
|
||||
|
||||
## 1. 复盘目标与结论
|
||||
|
||||
- 目标:复盘本轮 V2 为对齐 V1 所做修复,明确“改动点、差异点、风险点、后续收敛路径”。
|
||||
- 结论:本轮属于**运行时行为对齐修复**,非核心业务重写;通过配置补齐与最小控制层兜底,实现 8 项差异接口 `old/new` 业务码一致。
|
||||
|
||||
---
|
||||
|
||||
## 2. 改动清单总览
|
||||
|
||||
|
||||
| 类别 | 文件 | 改动摘要 | 目的 |
|
||||
| -------- | -------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ------------------ |
|
||||
| 启动/Feign | `cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/ElevatorApplication.java` | `@RibbonClient` 扩展为 `@RibbonClients`,覆盖 `ninca-crk-std` / `cwos-portal` / `ninca-common-component-organization` | 修复 Feign 无可用实例 |
|
||||
| 过滤器 | `cw-elevator-application-starter/src/main/java/cn/cloudwalk/web/filter/CloudwalkContextParameterFilter.java`(新增) | 每请求构建/清理 Cloudwalk Session 上下文 | 避免异常链路出现空响应体,稳定上下文 |
|
||||
| 人员接口 | `cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/person/controller/AcsPersonController.java` | `/add`、`/edit`、`/pageByApp` 增加缺参兜底返回 | 对齐 V1 缺参业务码 |
|
||||
| 规则接口 | `cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/passrule/controller/AcsPassRuleController.java` | `/add` 增加缺参兜底返回 | 对齐 V1 缺参业务码 |
|
||||
| 记录接口 | `cw-elevator-application-web/src/main/java/cn/cloudwalk/elevator/record/controller/AcsElevatorRecordController.java` | `/analyse/cycle`、`/analyse/count` 缺参兜底;`/page`、`/page/request` 增加可开关空结果映射 | 对齐 V1 行为 |
|
||||
| 部署配置 | `deploy/v2-maven/application.properties` | 补齐 Feign/Ribbon 静态实例 + 兼容开关配置 | 运行态可达性与行为一致性 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 3. V1/V2 差异总表(修复前 -> 修复后)
|
||||
|
||||
|
||||
| 维度 | 修复前 V2 相对 V1 | 修复后状态 | 风险等级 |
|
||||
| ---------- | -------------------------------------------------------------------------- | ------------------------------------ | ---- |
|
||||
| Feign 实例发现 | `cwos-portal`、`ninca-common-component-organization` 无可用实例,出现 `200 + 空body` | 已补齐 Ribbon 配置 + 启动类注册,返回进入正常 JSON 链路 | 中 |
|
||||
| 参数校验行为 | 部分接口未在参数层提前失败,进入深层逻辑返回其他码 | 控制层最小兜底,缺参业务码对齐 V1 | 中 |
|
||||
| 记录接口空结果语义 | V2 空结果返回成功;V1 在历史环境常表现为错误码 | 通过兼容开关可映射到 V1 错误码 | 中 |
|
||||
| 代码主体一致性 | 核心 Controller/Service 主体与 V1大体一致 | 仍保持一致;新增的是兼容逻辑与配置 | 低 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 4. 配置差异总表(重点)
|
||||
|
||||
### 4.1 本轮新增/调整配置(V2)
|
||||
|
||||
|
||||
| 配置键 | 当前值 | 作用 | 与 V1 关系 |
|
||||
| -------------------------------------------------------------------- | ------------------------------------------------------- | ------------------ | ------------------- |
|
||||
| `feign.portal.name` | `cwos-portal` | 明确 Feign 服务名映射 | V1 运行态隐式可用,V2 需显式补齐 |
|
||||
| `cwos-portal.ribbon.NIWSServerListClassName` | `com.netflix.loadbalancer.ConfigurationBasedServerList` | 强制走配置型服务列表 | V1 表现上等效可用 |
|
||||
| `cwos-portal.ribbon.listOfServers` | `10.128.161.95:80` | 指定目标实例 | V1 环境下等效可达链路 |
|
||||
| `ninca-common-component-organization.ribbon.NIWSServerListClassName` | `com.netflix.loadbalancer.ConfigurationBasedServerList` | 强制走配置型服务列表 | V1 表现上等效可用 |
|
||||
| `ninca-common-component-organization.ribbon.listOfServers` | `10.128.161.95:80` | 指定目标实例 | V1 环境下等效可达链路 |
|
||||
| `elevator.compat.v1.record-empty-as-error` | `true`(对拍环境) | 将记录接口空结果映射为 V1 错误码 | V1行为兼容开关(V2新增) |
|
||||
|
||||
|
||||
### 4.2 建议的环境取值
|
||||
|
||||
|
||||
| 环境 | `elevator.compat.v1.record-empty-as-error` | 说明 |
|
||||
| ----- | ------------------------------------------ | --------------------------- |
|
||||
| 对拍/回归 | `true` | 优先保证 V1/V2 业务码一致 |
|
||||
| 生产收敛 | `false`(建议) | 采用“空数据成功返回空列表”语义,减少历史异常语义绑定 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 5. 行为差异总表(接口视角)
|
||||
|
||||
|
||||
| 接口 | 修复前差异 | 修复后结果 |
|
||||
| ----------------------------------------------------- | ------------------------------- | ------------------- |
|
||||
| `POST /elevator/person/add` | `old=76260405` / `new=76260527` | 对齐:`76260405` |
|
||||
| `POST /elevator/person/edit` | `old=76260418` / `new=None` | 对齐:`76260418` |
|
||||
| `POST /elevator/person/pageByApp` | `old=76260402` / `new=None` | 对齐:`76260402` |
|
||||
| `POST /elevator/passRule/add` | `old=76260514` / `new=76260527` | 对齐:`76260514` |
|
||||
| `POST /intelligent/acs/elevator/record/analyse/cycle` | `old=76260333` / `new=00000000` | 对齐:`76260333` |
|
||||
| `POST /intelligent/acs/elevator/record/analyse/count` | `old=76260336` / `new=00000000` | 对齐:`76260336` |
|
||||
| `POST /intelligent/acs/elevator/record/page` | `old=76260305` / `new=00000000` | 对齐:`76260305`(开关开启) |
|
||||
| `POST /intelligent/acs/elevator/record/page/request` | `old=76260335` / `new=00000000` | 对齐:`76260335`(开关开启) |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 6. 风险与技术债
|
||||
|
||||
### 6.1 当前风险
|
||||
|
||||
1. 控制层兜底校验属于“兼容补丁”,不等价于完全恢复原始 AOP 参数校验链路。
|
||||
2. `record-empty-as-error` 为行为映射开关,若长期保持开启,可能固化历史异常语义。
|
||||
3. 静态 `listOfServers` 对网络与目标服务可达性有耦合,环境迁移需同步更新。
|
||||
|
||||
### 6.2 技术债建议
|
||||
|
||||
1. 排查并恢复 `@CloudwalkParamsValidate` 在 V2 的完整生效链路(代理类型、切面装配、调用入口)。
|
||||
2. 对 record 类接口定义最终产品语义(空数据成功 vs 按历史错误码),并统一基线。
|
||||
3. 将外部依赖地址配置化分层(dev/test/prod),减少硬编码地址漂移风险。
|
||||
|
||||
---
|
||||
|
||||
## 7. 推荐下一步(收敛计划)
|
||||
|
||||
1. **短期(本周)**:固化回归脚本,确保 8 项关键接口作为门禁用例。
|
||||
2. **中期(两周)**:完成 AOP 参数校验链路恢复,逐步替换控制层兜底。
|
||||
3. **长期(版本收敛)**:关闭 `record-empty-as-error`,采用统一成功空结果语义并更新对拍标准。
|
||||
|
||||
---
|
||||
|
||||
## 8. 关联文档
|
||||
|
||||
- `tools/elevator_api_parity/report/DIFF-ROOTCAUSE-20260428.md`
|
||||
- `tools/elevator_api_parity/report/parity-full-20260428-102136.json`
|
||||
|
||||
---
|
||||
|
||||
## 9. 方案勘误(2026-04-28)
|
||||
|
||||
### 9.1 错误前提
|
||||
|
||||
- **误认为**:在同一工作区里修改「其他 Maven 子模块」(例如单独拉下来的 `maven-cloudwalk-cloud`、`cloudwalk-common-service` 源码),打包电梯应用时会自动带上这些改动。
|
||||
- **实际情况**:电梯 fat-jar 使用的是 **Maven 解析到的依赖坐标与版本**(通常来自私服 Nexus)。只要 `pom.xml` 仍指向**旧版本** GAV,打包只会嵌入已发布的字节码;**本地改动的兄弟仓库源码不会进入制品**,除非:
|
||||
- 升级对应依赖版本并安装/发布新版本到私服,且电梯工程引用该新版本;或
|
||||
- 该代码本来就属于电梯多模块 reactor 内的模块并以源码编译进同一 artifact。
|
||||
|
||||
### 9.2 由此失效/需撤回的方案要素
|
||||
|
||||
1. **依赖「只改 cloud 公共模块源码、不升版本」的修复路径** — 对「生产仅替换 `cw-elevator-application-*.jar`」场景 **无效**。
|
||||
2. **Starter 内桥接切面 `CloudwalkParamsValidateBridgeAspect` + 扩展 `ElevatorApplication` / 额外 Filter 包扫描** — 已从当前分支工作区 **撤回**(恢复为仓库已提交版本);后续若再做校验链路修复,须明确落在 **会打进电梯 jar 的模块**内,且不假设未发布的依赖变更已生效。
|
||||
3. **复盘文档第 2~7 节中涉及「兼容开关 `elevator.compat.v1.record-empty-as-error`、Controller 兜底」等表述** — 若与当前仓库 HEAD 不一致,以 **Git 仓库实际代码与部署约束**为准;本节作为对错误方案的更正说明保留。
|
||||
|
||||
### 9.3 后续正确约束(与生产对齐)
|
||||
|
||||
|
||||
| 约束 | 含义 |
|
||||
| ------- | ---------------------------------------------------------------------- |
|
||||
| 仅换 jar | 有效改动必须落在 **电梯应用 reactor 打出 fat-jar 所包含的源码**(或同步升级并在私服可用的依赖版本)。 |
|
||||
| 禁止随意加配置 | `application.properties` 新增项若生产无法下发,则不能在方案中依赖该开关。 |
|
||||
| 证据链 | 差异分析应落到 **实际打进 jar 的类**(必要时对产物 `jar tf` / `javap` 核对),而不是仅改兄弟仓库未发布的源码。 |
|
||||
|
||||
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
# V1 原始程序 vs V2(基于 JD-GUI 复原源码编译)差异根因与修正(2026-04-28)
|
||||
|
||||
## 1. 本轮目标
|
||||
|
||||
不是继续做“表层 diff”,而是回答:
|
||||
|
||||
1) 差异来自 JD-GUI 还原偏差,还是其他因素?
|
||||
2) 哪些差异是构建/依赖问题导致的“伪差异”?
|
||||
3) 如何把差异收敛到“可修、可验证、可复现”的状态?
|
||||
|
||||
---
|
||||
|
||||
## 2. 已执行的多维度核查
|
||||
|
||||
### 2.1 构建维度(先消除假差异)
|
||||
|
||||
- 现象:`mvn -DskipTests package` 在 JDK8 下最初失败,大量 `cn.cloudwalk.client.cwoscomponent.intelligent.*` 类型“找不到符号”。
|
||||
- 证据:构建日志中同时出现 `intelligent-cwoscomponent-interface` POM invalid 的历史告警;而服务源码大量直接 import 该接口包。
|
||||
- 判定:这是 **依赖链不稳定** 导致的编译失败,不是 JD-GUI 语义还原问题。
|
||||
|
||||
#### 已修正(已落地)
|
||||
|
||||
- `pom.xml`(父 `dependencyManagement`)新增:
|
||||
- `cn.cloudwalk.intelligent:intelligent-cwoscomponent-interface:${intelligent.cwoscomponent.version}`
|
||||
- `cw-elevator-application-service/pom.xml` 新增显式依赖:
|
||||
- `cn.cloudwalk.intelligent:intelligent-cwoscomponent-interface`
|
||||
|
||||
#### 修正后验证
|
||||
|
||||
- 使用 JDK8 重新构建:`mvn -q -DskipTests package` ✅ 成功。
|
||||
|
||||
---
|
||||
|
||||
### 2.2 依赖工件维度(确认类型是否真实存在)
|
||||
|
||||
- 对 `cw_lib/intelligent-cwoscomponent-interface-2.9.2-xinghewan.jar` 执行 `jar tf`。
|
||||
- 已确认关键 class 存在:
|
||||
- `.../device/result/DeviceResult.class`
|
||||
- `.../imagestore/result/ImgStorePersonResult.class`
|
||||
- `.../label/result/LabelDetailResult.class`
|
||||
- `.../organization/result/OrganizationResult.class`
|
||||
|
||||
结论:源码 import 的这些类型在 V1 依赖工件中本就存在;此前编译报错是 classpath/依赖解析问题,而非源码“瞎 import”。
|
||||
|
||||
---
|
||||
|
||||
### 2.3 字节码维度(V1 jar vs V2 编译产物)
|
||||
|
||||
已新增脚本:
|
||||
|
||||
- `tools/elevator_api_parity/scripts/bytecode_parity_rootcause.py`
|
||||
|
||||
输出:
|
||||
|
||||
- `tools/elevator_api_parity/report/V1-V2-BYTECODE-ROOTCAUSE.md`
|
||||
- `tools/elevator_api_parity/report/V1-V2-BYTECODE-ROOTCAUSE.json`
|
||||
|
||||
对比范围:四模块 `cn/cloudwalk/elevator/**` 主类(不含 `$` 内部类),按三维度比较:
|
||||
|
||||
1. 类集合(ONLY_V1 / ONLY_V2)
|
||||
2. API 签名(`javap -p -s` 归一化 hash)
|
||||
3. 方法实现(`javap -c -p` 归一化 hash)
|
||||
|
||||
#### 统计结果
|
||||
|
||||
- `MATCH`: **244**
|
||||
- `IMPL_DIFF`(API 相同、实现不同): **13**
|
||||
- `API_DIFF`: **48**
|
||||
- `ONLY_V1`: **0**
|
||||
- `ONLY_V2`: **8**
|
||||
|
||||
---
|
||||
|
||||
## 3. 根因归类(回答“是不是 JD-GUI 问题”)
|
||||
|
||||
### A. 非 JD-GUI 原因(已确认)
|
||||
|
||||
1) **依赖解析问题(已修)**
|
||||
- 占比:构建阶段致命。
|
||||
- 性质:工程依赖声明不足 + 私服/本地 POM 解析不稳定引起。
|
||||
- 影响:会制造大量“源码看似错误”的假象。
|
||||
|
||||
2) **源码演进(非还原偏差)**
|
||||
- 证据:`ONLY_V2=8`,主要是租户访客策略、Session/RemoteIO 配置、ZoneTreeCollectors 等新增类。
|
||||
- 性质:V2 增量能力,不属于反编译错误。
|
||||
|
||||
### B. 可能涉及 JD-GUI/人工改写的区域
|
||||
|
||||
1) `IMPL_DIFF=13`
|
||||
- API 未变,但方法字节码不同。
|
||||
- 这些类是优先排查“JD-GUI 语句还原偏差 / 后续人工改写”候选。
|
||||
|
||||
2) `API_DIFF=48`
|
||||
- 多数更像结构变化(字段/签名/类型变化),不应默认甩锅 JD-GUI。
|
||||
- 需要逐类核对“是否是有意修复/增强”。
|
||||
|
||||
**结论**:
|
||||
- 不能把当前差异简单归因给 JD-GUI。
|
||||
- 已确定至少一条主因是 **构建依赖链问题**(且已修复)。
|
||||
- 剩余差异需按 `IMPL_DIFF` 与 `API_DIFF` 分治,不可混为“反编译失败”。
|
||||
|
||||
---
|
||||
|
||||
## 4. 下一步“彻底修正”执行清单(可直接开干)
|
||||
|
||||
1. **锁定基线(防回归)**
|
||||
- 固化 JDK8 + 当前依赖声明;每次比对前先 `mvn -q -DskipTests package`。
|
||||
|
||||
2. **优先处理 IMPL_DIFF(13 个)**
|
||||
- 每类做三方对照:`V1 class(javap)` vs `V1 CFR/JD源码` vs `V2源码`。
|
||||
- 目标:判定“JD-GUI 误还原”还是“有意改写”。
|
||||
|
||||
3. **再处理 API_DIFF(48 个)**
|
||||
- 按风险分层:Controller/Service > DTO/常量。
|
||||
- 目标:保留业务必需改动,回退无意漂移。
|
||||
|
||||
4. **保留新增能力但可切换**
|
||||
- 对 `ONLY_V2` 中非必须特性(例如租户策略)增加兼容开关,避免影响 V1 对拍口径。
|
||||
|
||||
---
|
||||
|
||||
## 5. 本轮落地变更清单
|
||||
|
||||
- 新增:`tools/elevator_api_parity/scripts/bytecode_parity_rootcause.py`
|
||||
- 新增:`tools/elevator_api_parity/report/V1-V2-BYTECODE-ROOTCAUSE.md`
|
||||
- 新增:`tools/elevator_api_parity/report/V1-V2-BYTECODE-ROOTCAUSE.json`
|
||||
- 更新:`pom.xml`(加入 `intelligent-cwoscomponent-interface` 到 `dependencyManagement`)
|
||||
- 更新:`cw-elevator-application-service/pom.xml`(显式加入 `intelligent-cwoscomponent-interface`)
|
||||
|
||||
---
|
||||
|
||||
## 6. 结论(一句话)
|
||||
|
||||
当前差异并非“全是 JD-GUI 的锅”:已确认有一部分是 **依赖链问题**(已修复)和 **源码演进**;剩余部分已通过字节码分层定位到具体类集,可按清单继续收敛到与 V1 一致(或明确保留差异)。
|
||||
@@ -0,0 +1 @@
|
||||
"""Parity report generator."""
|
||||
+144
@@ -0,0 +1,144 @@
|
||||
#!/usr/bin/env python3
|
||||
"""从 cw-elevator-application-web 的 *Controller.java 提取 Spring 路由,与 api_catalog.json 对照。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import re
|
||||
from pathlib import Path
|
||||
from typing import List, Optional, Set, Tuple
|
||||
|
||||
|
||||
def _tool_root() -> Path:
|
||||
return Path(__file__).resolve().parent.parent
|
||||
|
||||
|
||||
def _java_root(tool_root: Path) -> Optional[Path]:
|
||||
# tool_root = .../tools/elevator_api_parity → Maven 模块根为其 parent.parent
|
||||
module_root = tool_root.parent.parent
|
||||
cand = module_root / "cw-elevator-application-web" / "src" / "main" / "java"
|
||||
return cand if cand.is_dir() else None
|
||||
|
||||
|
||||
def _strip_path_quotes(s: str) -> str:
|
||||
s = s.strip()
|
||||
if s.startswith('"') and s.endswith('"'):
|
||||
return s[1:-1]
|
||||
return s
|
||||
|
||||
|
||||
def collect_routes_from_java(java_root: Path) -> List[Tuple[str, str, str]]:
|
||||
"""返回 (http_method, full_path, source_file) 列表。类上 @RequestMapping 为前缀,方法上 @PostMapping / @RequestMapping 为子路径。"""
|
||||
out: List[Tuple[str, str, str]] = []
|
||||
|
||||
for fp in sorted(java_root.rglob("*Controller.java")):
|
||||
rel = str(fp.relative_to(java_root))
|
||||
text = fp.read_text(encoding="utf-8", errors="ignore")
|
||||
ir = text.find("@RestController")
|
||||
ic = text.find("public class", ir if ir >= 0 else 0)
|
||||
head = text[ir:ic] if ir >= 0 and ic > ir else ""
|
||||
body = text[ic:] if ic >= 0 else text
|
||||
|
||||
class_base = ""
|
||||
mcb = re.search(r'@RequestMapping\s*\(\s*\{?\s*"([^"]+)"', head)
|
||||
if mcb:
|
||||
class_base = _strip_path_quotes(mcb.group(1)).rstrip("/")
|
||||
|
||||
segs: List[str] = []
|
||||
segs += re.findall(r'@PostMapping\s*\(\s*\{?\s*"([^"]+)"', body)
|
||||
segs += re.findall(r'@RequestMapping\s*\(\s*\{?\s*"([^"]+)"', body)
|
||||
segs += re.findall(r'@RequestMapping\s*\(\s*value\s*=\s*\{\s*"([^"]+)"', body)
|
||||
|
||||
for raw in segs:
|
||||
seg = _strip_path_quotes(raw)
|
||||
if not seg or seg.startswith("{"):
|
||||
continue
|
||||
if class_base and seg.rstrip("/") == class_base.rstrip("/"):
|
||||
continue
|
||||
if not seg.startswith("/"):
|
||||
seg = "/" + seg
|
||||
full = (class_base + seg).replace("//", "/")
|
||||
if not full.startswith("/"):
|
||||
full = "/" + full
|
||||
out.append(("POST", full, rel))
|
||||
|
||||
dedup: dict[str, Tuple[str, str, str]] = {}
|
||||
for method, path, src in out:
|
||||
key = f"{method}:{path}"
|
||||
if key not in dedup:
|
||||
dedup[key] = (method, path, src)
|
||||
return list(dedup.values())
|
||||
|
||||
|
||||
EXTRA_NOT_IN_JSON = [
|
||||
("POST", "/file/imgupload", "FileController(multipart/form-data,未纳入 JSON 冒烟)"),
|
||||
]
|
||||
|
||||
|
||||
def main() -> None:
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--out", required=True, help="输出 .md 路径")
|
||||
ap.add_argument("--catalog", help="api_catalog.json")
|
||||
args = ap.parse_args()
|
||||
|
||||
root = _tool_root()
|
||||
cat_path = Path(args.catalog or (root / "api_catalog.json"))
|
||||
catalog_paths: Set[str] = set()
|
||||
if cat_path.is_file():
|
||||
data = json.loads(cat_path.read_text(encoding="utf-8"))
|
||||
for ep in data.get("endpoints") or []:
|
||||
p = ep.get("path") or ""
|
||||
if p:
|
||||
catalog_paths.add(p)
|
||||
|
||||
java_root = _java_root(root)
|
||||
routes: List[Tuple[str, str, str]] = []
|
||||
if java_root:
|
||||
routes = collect_routes_from_java(java_root)
|
||||
|
||||
route_paths = {r[1] for r in routes}
|
||||
extra_java = sorted(route_paths - catalog_paths)
|
||||
missing_java = sorted(catalog_paths - route_paths)
|
||||
|
||||
lines: List[str] = [
|
||||
"# 电梯应用后端 HTTP 走查(Controller 扫描 vs api_catalog)\n\n",
|
||||
f"- **扫描目录**: `{java_root or '(未找到 cw-elevator-application-web)'}`\n",
|
||||
f"- **catalog**: `{cat_path.resolve()}`(共 **{len(catalog_paths)}** 条 path)\n\n",
|
||||
"## 1. Java 声明路由(REST Controller)\n\n",
|
||||
"| 方法 | Path | 源文件 |\n",
|
||||
"| ---- | ---- | ------ |\n",
|
||||
]
|
||||
for method, path, src in sorted(routes, key=lambda x: x[1]):
|
||||
lines.append(f"| {method} | `{path}` | `{src}` |\n")
|
||||
|
||||
lines.extend(
|
||||
[
|
||||
"\n## 2. 未纳入 api_catalog 的 Controller 路径\n\n",
|
||||
]
|
||||
)
|
||||
if extra_java:
|
||||
for p in extra_java:
|
||||
lines.append(f"- `{p}`\n")
|
||||
else:
|
||||
lines.append("- (无)\n")
|
||||
|
||||
lines.extend(["\n## 3. api_catalog 有而扫描未命中(请核对写法/网关前缀)\n\n"])
|
||||
if missing_java:
|
||||
for p in missing_java:
|
||||
lines.append(f"- `{p}`\n")
|
||||
else:
|
||||
lines.append("- (无)\n")
|
||||
|
||||
lines.extend(["\n## 4. 其它说明\n\n"])
|
||||
for _m, _p, note in EXTRA_NOT_IN_JSON:
|
||||
lines.append(f"- **{_p}**:{note}\n")
|
||||
|
||||
out = Path(args.out)
|
||||
out.parent.mkdir(parents=True, exist_ok=True)
|
||||
out.write_text("".join(lines), encoding="utf-8")
|
||||
print(out.resolve())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
+223
@@ -0,0 +1,223 @@
|
||||
cn.cloudwalk.elevator:cw-elevator-application-starter:jar:2.0-SNAPSHOT
|
||||
+- org.springframework.boot:spring-boot-starter-web:jar:1.5.17.RELEASE:compile
|
||||
| +- org.springframework.boot:spring-boot-starter:jar:1.5.17.RELEASE:compile
|
||||
| | +- org.springframework.boot:spring-boot:jar:1.5.17.RELEASE:compile
|
||||
| | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.5.17.RELEASE:compile
|
||||
| | +- org.springframework.boot:spring-boot-starter-logging:jar:1.5.17.RELEASE:compile
|
||||
| | | +- ch.qos.logback:logback-classic:jar:1.1.11:compile
|
||||
| | | | \- ch.qos.logback:logback-core:jar:1.1.11:compile
|
||||
| | | +- org.slf4j:jcl-over-slf4j:jar:1.7.25:compile
|
||||
| | | +- org.slf4j:jul-to-slf4j:jar:1.7.25:compile
|
||||
| | | \- org.slf4j:log4j-over-slf4j:jar:1.7.25:compile
|
||||
| | \- org.yaml:snakeyaml:jar:1.17:compile
|
||||
| +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.5.17.RELEASE:compile
|
||||
| | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.34:compile
|
||||
| | | \- org.apache.tomcat:tomcat-annotations-api:jar:8.5.34:compile
|
||||
| | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.34:compile
|
||||
| | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.34:compile
|
||||
| +- org.hibernate:hibernate-validator:jar:5.3.6.Final:compile
|
||||
| | +- javax.validation:validation-api:jar:1.1.0.Final:compile
|
||||
| | +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile
|
||||
| | \- com.fasterxml:classmate:jar:1.3.4:compile
|
||||
| +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.11.2:compile
|
||||
| | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile
|
||||
| | \- com.fasterxml.jackson.core:jackson-core:jar:2.8.11:compile
|
||||
| +- org.springframework:spring-web:jar:4.3.20.RELEASE:compile
|
||||
| | \- org.springframework:spring-beans:jar:4.3.20.RELEASE:compile
|
||||
| \- org.springframework:spring-webmvc:jar:4.3.20.RELEASE:compile
|
||||
| \- org.springframework:spring-expression:jar:4.3.20.RELEASE:compile
|
||||
+- org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:1.3.1:compile
|
||||
| +- org.springframework.boot:spring-boot-starter-jdbc:jar:1.5.17.RELEASE:compile
|
||||
| | +- org.apache.tomcat:tomcat-jdbc:jar:8.5.34:compile
|
||||
| | | \- org.apache.tomcat:tomcat-juli:jar:8.5.34:compile
|
||||
| | \- org.springframework:spring-jdbc:jar:4.3.20.RELEASE:compile
|
||||
| +- org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:jar:1.3.1:compile
|
||||
| +- org.mybatis:mybatis:jar:3.4.6:compile
|
||||
| \- org.mybatis:mybatis-spring:jar:1.3.2:compile
|
||||
+- org.springframework.boot:spring-boot-starter-actuator:jar:1.5.17.RELEASE:compile
|
||||
| \- org.springframework.boot:spring-boot-actuator:jar:1.5.17.RELEASE:compile
|
||||
+- org.springframework.boot:spring-boot-starter-cache:jar:1.5.17.RELEASE:compile
|
||||
| +- org.springframework:spring-context:jar:4.3.20.RELEASE:compile
|
||||
| \- org.springframework:spring-context-support:jar:4.3.20.RELEASE:compile
|
||||
+- org.springframework.boot:spring-boot-starter-aop:jar:1.5.17.RELEASE:compile
|
||||
| +- org.springframework:spring-aop:jar:4.3.20.RELEASE:compile
|
||||
| \- org.aspectj:aspectjweaver:jar:1.8.13:compile
|
||||
+- org.springframework.cloud:spring-cloud-starter-openfeign:jar:1.4.7.RELEASE:compile
|
||||
| +- org.springframework.cloud:spring-cloud-starter:jar:1.3.6.RELEASE:compile
|
||||
| | +- org.springframework.cloud:spring-cloud-context:jar:1.3.6.RELEASE:compile
|
||||
| | \- org.springframework.security:spring-security-rsa:jar:1.0.3.RELEASE:compile
|
||||
| | \- org.bouncycastle:bcpkix-jdk15on:jar:1.55:compile
|
||||
| | \- org.bouncycastle:bcprov-jdk15on:jar:1.55:compile
|
||||
| +- org.springframework.cloud:spring-cloud-netflix-core:jar:1.4.7.RELEASE:compile
|
||||
| +- org.springframework.cloud:spring-cloud-commons:jar:1.3.6.RELEASE:compile
|
||||
| | +- org.springframework.security:spring-security-crypto:jar:4.2.9.RELEASE:compile
|
||||
| | \- org.apache.httpcomponents:httpclient:jar:4.5.6:compile
|
||||
| | +- org.apache.httpcomponents:httpcore:jar:4.4.10:compile
|
||||
| | \- commons-codec:commons-codec:jar:1.10:compile
|
||||
| +- io.github.openfeign:feign-core:jar:9.5.0:compile
|
||||
| | \- org.jvnet:animal-sniffer-annotation:jar:1.0:compile
|
||||
| +- io.github.openfeign:feign-slf4j:jar:9.5.0:compile
|
||||
| | \- org.slf4j:slf4j-api:jar:1.7.25:compile
|
||||
| +- io.github.openfeign:feign-hystrix:jar:9.5.0:compile
|
||||
| | +- com.netflix.archaius:archaius-core:jar:0.7.4:compile
|
||||
| | \- com.netflix.hystrix:hystrix-core:jar:1.5.12:compile
|
||||
| | \- org.hdrhistogram:HdrHistogram:jar:2.1.9:compile
|
||||
| +- org.springframework.cloud:spring-cloud-starter-netflix-ribbon:jar:1.4.7.RELEASE:compile
|
||||
| | +- com.netflix.ribbon:ribbon:jar:2.2.5:compile
|
||||
| | | +- com.netflix.ribbon:ribbon-transport:jar:2.2.5:runtime
|
||||
| | | | +- io.reactivex:rxnetty-contexts:jar:0.4.9:runtime
|
||||
| | | | \- io.reactivex:rxnetty-servo:jar:0.4.9:runtime
|
||||
| | | +- javax.inject:javax.inject:jar:1:runtime
|
||||
| | | \- io.reactivex:rxnetty:jar:0.4.9:runtime
|
||||
| | +- com.netflix.ribbon:ribbon-core:jar:2.2.5:compile
|
||||
| | | \- commons-lang:commons-lang:jar:2.6:compile
|
||||
| | +- com.netflix.ribbon:ribbon-httpclient:jar:2.2.5:compile
|
||||
| | | +- commons-collections:commons-collections:jar:3.2.2:runtime
|
||||
| | | +- com.sun.jersey:jersey-client:jar:1.19.1:runtime
|
||||
| | | | \- com.sun.jersey:jersey-core:jar:1.19.1:runtime
|
||||
| | | | \- javax.ws.rs:jsr311-api:jar:1.1.1:runtime
|
||||
| | | +- com.sun.jersey.contribs:jersey-apache-client4:jar:1.19.1:runtime
|
||||
| | | +- com.netflix.servo:servo-core:jar:0.10.1:runtime
|
||||
| | | | \- com.netflix.servo:servo-internal:jar:0.10.1:runtime
|
||||
| | | \- com.netflix.netflix-commons:netflix-commons-util:jar:0.1.1:runtime
|
||||
| | +- com.netflix.ribbon:ribbon-loadbalancer:jar:2.2.5:compile
|
||||
| | | \- com.netflix.netflix-commons:netflix-statistics:jar:0.1.1:runtime
|
||||
| | \- io.reactivex:rxjava:jar:1.2.0:compile
|
||||
| \- org.springframework.cloud:spring-cloud-starter-netflix-archaius:jar:1.4.7.RELEASE:compile
|
||||
| +- commons-configuration:commons-configuration:jar:1.8:compile
|
||||
| \- com.google.guava:guava:jar:20.0:compile
|
||||
+- cn.cloudwalk.elevator:cw-elevator-application-web:jar:2.0-SNAPSHOT:compile
|
||||
| +- cn.cloudwalk.cloud:cloudwalk-common-web:jar:3.7.2-Brussels-SRX:compile
|
||||
| | +- cn.cloudwalk.cloud:cloudwalk-common-result:jar:3.7.2-Brussels-SRX:compile
|
||||
| | | +- org.apache.commons:commons-lang3:jar:3.5:compile
|
||||
| | | \- joda-time:joda-time:jar:2.9.9:compile
|
||||
| | \- org.jsoup:jsoup:jar:1.11.3:compile
|
||||
| \- cn.cloudwalk.elevator:cw-elevator-application-service:jar:2.0-SNAPSHOT:compile
|
||||
| +- cn.cloudwalk.cloud:cloudwalk-common-service:jar:3.7.2-Brussels-SRX:compile
|
||||
| | +- org.springframework:spring-aspects:jar:4.3.20.RELEASE:compile
|
||||
| | \- org.springframework.boot:spring-boot-starter-data-redis:jar:1.5.17.RELEASE:compile
|
||||
| | +- org.springframework.data:spring-data-redis:jar:1.8.16.RELEASE:compile
|
||||
| | | +- org.springframework.data:spring-data-keyvalue:jar:1.2.16.RELEASE:compile
|
||||
| | | | \- org.springframework.data:spring-data-commons:jar:1.13.16.RELEASE:compile
|
||||
| | | \- org.springframework:spring-oxm:jar:4.3.20.RELEASE:compile
|
||||
| | \- redis.clients:jedis:jar:2.9.0:compile
|
||||
| | \- org.apache.commons:commons-pool2:jar:2.4.3:compile
|
||||
| +- org.springframework:spring-tx:jar:4.3.20.RELEASE:compile
|
||||
| +- cn.cloudwalk.cloud:cloudwalk-common-serial:jar:3.7.2-Brussels-SRX:compile
|
||||
| | \- com.alibaba:fastjson:jar:1.2.73:compile
|
||||
| +- cn.cloudwalk:cwos-java-sdk-resource:jar:1.0.0-SNAPSHOT:compile
|
||||
| | +- cn.cloudwalk.cloud:cwos-component-resource-interface:jar:1.0.0-SNAPSHOT:compile
|
||||
| | | +- cn.cloudwalk.cloud:cwos-component-resource-data:jar:1.0.0-SNAPSHOT:compile
|
||||
| | | | \- org.apache.commons:commons-collections4:jar:4.4:compile
|
||||
| | | \- org.hibernate.validator:hibernate-validator:jar:6.0.22.Final:compile
|
||||
| | \- cn.cloudwalk:cwos-portal-interface:jar:1.0.0-SNAPSHOT:compile
|
||||
| | +- cn.cloudwalk:cwos-device-pkg-stub:jar:1.0.0-SNAPSHOT:compile
|
||||
| | \- org.springframework.boot:spring-boot-starter-validation:jar:1.5.17.RELEASE:compile
|
||||
| +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.8.11:compile
|
||||
| +- cn.cloudwalk.intelligent:cloudwalk-intelligent-component-lock:jar:1.1.1-SNAPSHOT:compile
|
||||
| | +- org.redisson:redisson:jar:2.15.2:compile
|
||||
| | | +- io.netty:netty-common:jar:4.1.33.Final:compile
|
||||
| | | | \- org.jctools:jctools-core:jar:2.1.1:compile
|
||||
| | | +- io.netty:netty-codec:jar:4.1.33.Final:compile
|
||||
| | | +- io.netty:netty-buffer:jar:4.1.33.Final:compile
|
||||
| | | +- io.netty:netty-transport:jar:4.1.33.Final:compile
|
||||
| | | | \- io.netty:netty-resolver:jar:4.1.33.Final:compile
|
||||
| | | +- io.netty:netty-resolver-dns:jar:4.1.33.Final:compile
|
||||
| | | | \- io.netty:netty-codec-dns:jar:4.1.33.Final:compile
|
||||
| | | +- io.netty:netty-handler:jar:4.1.33.Final:compile
|
||||
| | | +- javax.cache:cache-api:jar:1.0.0:compile
|
||||
| | | +- io.projectreactor:reactor-stream:jar:2.0.8.RELEASE:compile
|
||||
| | | | \- io.projectreactor:reactor-core:jar:2.0.8.RELEASE:compile
|
||||
| | | +- io.reactivex.rxjava2:rxjava:jar:2.1.13:compile
|
||||
| | | | \- org.reactivestreams:reactive-streams:jar:1.0.2:compile
|
||||
| | | +- de.ruedigermoeller:fst:jar:2.56:compile
|
||||
| | | +- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.8.11:compile
|
||||
| | | +- net.bytebuddy:byte-buddy:jar:1.9.6:compile
|
||||
| | | | \- net.bytebuddy:byte-buddy-dep:jar:1.9.6:compile
|
||||
| | | | \- org.ow2.asm:asm-commons:jar:7.0:compile
|
||||
| | | \- org.jodd:jodd-bean:jar:3.7.1:compile
|
||||
| | | \- org.jodd:jodd-core:jar:3.7.1:compile
|
||||
| | \- org.redisson:redisson-spring-boot-starter:jar:2.15.2:compile
|
||||
| | \- org.redisson:redisson-spring-data-18:jar:2.15.2:compile
|
||||
| +- cn.cloudwalk.cloud:cloudwalk-common-event:jar:3.7.2-Brussels-SRX:compile
|
||||
| | +- org.apache.kafka:kafka-clients:jar:2.0.1:compile
|
||||
| | | +- org.lz4:lz4-java:jar:1.4.1:compile
|
||||
| | | \- org.xerial.snappy:snappy-java:jar:1.1.7.1:compile
|
||||
| | \- commons-logging:commons-logging:jar:1.2:compile
|
||||
| +- cn.cloudwalk.cloud:cwos-sdk-event:jar:1.5.0-SNAPSHOT:compile
|
||||
| | \- org.reflections:reflections:jar:0.9.12:compile
|
||||
| | \- org.javassist:javassist:jar:3.21.0-GA:compile
|
||||
| +- cn.cloudwalk.elevator:cw-elevator-application-data:jar:2.0-SNAPSHOT:compile
|
||||
| | +- cn.cloudwalk.elevator:cw-elevator-application-common:jar:2.0-SNAPSHOT:compile
|
||||
| | | +- org.apache.poi:poi:jar:3.15:compile
|
||||
| | | +- org.apache.poi:poi-ooxml:jar:3.15:compile
|
||||
| | | | +- org.apache.poi:poi-ooxml-schemas:jar:3.15:compile
|
||||
| | | | | \- org.apache.xmlbeans:xmlbeans:jar:2.6.0:compile
|
||||
| | | | | \- stax:stax-api:jar:1.0.1:compile
|
||||
| | | | \- com.github.virtuald:curvesapi:jar:1.04:compile
|
||||
| | | +- org.apache.ant:ant:jar:1.9.6:compile
|
||||
| | | | \- org.apache.ant:ant-launcher:jar:1.9.6:compile
|
||||
| | | +- net.coobird:thumbnailator:jar:0.4.8:compile
|
||||
| | | +- com.google.zxing:core:jar:3.3.3:compile
|
||||
| | | +- net.lingala.zip4j:zip4j:jar:2.6.2:compile
|
||||
| | | \- org.projectlombok:lombok:jar:1.16.22:compile
|
||||
| | +- mysql:mysql-connector-java:jar:5.1.47:compile
|
||||
| | +- com.zaxxer:HikariCP:jar:2.5.1:compile
|
||||
| | +- com.github.pagehelper:pagehelper:jar:5.1.2:compile
|
||||
| | | \- com.github.jsqlparser:jsqlparser:jar:1.0:compile
|
||||
| | +- com.github.pagehelper:pagehelper-spring-boot-autoconfigure:jar:1.2.5:compile
|
||||
| | \- org.apache.shardingsphere:sharding-jdbc-spring-boot-starter:jar:4.0.0:compile
|
||||
| | +- org.apache.shardingsphere:sharding-spring-boot-util:jar:4.0.0:compile
|
||||
| | | \- org.apache.shardingsphere:sharding-core-common:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:shardingsphere-spi:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:shardingsphere-sql-parser-relation:jar:4.0.0:compile
|
||||
| | | | \- org.antlr:antlr4-runtime:jar:4.7.2:compile
|
||||
| | | +- org.apache.shardingsphere:sharding-core-api:jar:4.0.0:compile
|
||||
| | | \- org.codehaus.groovy:groovy:jar:indy:2.4.5:compile
|
||||
| | \- org.apache.shardingsphere:sharding-jdbc-core:jar:4.0.0:compile
|
||||
| | +- org.apache.shardingsphere:sharding-core-entry:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:shardingsphere-sql-parser-engine:jar:4.0.0:compile
|
||||
| | | | \- org.apache.shardingsphere:shardingsphere-sql-parser-spi:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:shardingsphere-sql-parser-sql92:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:shardingsphere-sql-parser-mysql:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:shardingsphere-sql-parser-postgresql:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:shardingsphere-sql-parser-oracle:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:shardingsphere-sql-parser-sqlserver:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:sharding-core-route:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:sharding-core-rewrite:jar:4.0.0:compile
|
||||
| | | | \- org.apache.shardingsphere:shardingsphere-rewrite-engine:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:encrypt-core-rewrite:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:sharding-core-execute:jar:4.0.0:compile
|
||||
| | | | \- org.apache.shardingsphere:shardingsphere-execute:jar:4.0.0:compile
|
||||
| | | +- org.apache.shardingsphere:sharding-core-merge:jar:4.0.0:compile
|
||||
| | | | \- org.apache.shardingsphere:shardingsphere-merge:jar:4.0.0:compile
|
||||
| | | \- org.apache.shardingsphere:encrypt-core-merge:jar:4.0.0:compile
|
||||
| | \- org.apache.shardingsphere:sharding-transaction-core:jar:4.0.0:compile
|
||||
| +- cn.cloudwalk.intelligent:davinci-manager-storage:jar:1.1.7-SNAPSHOT:compile
|
||||
| | +- cn.cloudwalk.intelligent:davinci-manager-common:jar:1.1.7-SNAPSHOT:compile
|
||||
| | +- io.github.openfeign.form:feign-form:jar:3.0.3:compile
|
||||
| | +- io.github.openfeign.form:feign-form-spring:jar:3.0.3:compile
|
||||
| | +- io.github.openfeign:feign-okhttp:jar:9.5.0:compile
|
||||
| | | \- com.squareup.okhttp3:okhttp:jar:3.8.1:compile
|
||||
| | | \- com.squareup.okio:okio:jar:1.13.0:compile
|
||||
| | \- commons-io:commons-io:jar:2.5:compile
|
||||
| +- cn.cloudwalk.intelligent:intelligent-cwoscomponent-rest:jar:2.9.2-xinghewan:compile
|
||||
| +- javax.annotation:javax.annotation-api:jar:1.3.2:compile
|
||||
| \- com.google.code.findbugs:jsr305:jar:3.0.2:compile
|
||||
\- org.springframework.boot:spring-boot-starter-test:jar:1.5.17.RELEASE:test
|
||||
+- org.springframework.boot:spring-boot-test:jar:1.5.17.RELEASE:test
|
||||
+- org.springframework.boot:spring-boot-test-autoconfigure:jar:1.5.17.RELEASE:test
|
||||
+- com.jayway.jsonpath:json-path:jar:2.2.0:test
|
||||
| \- net.minidev:json-smart:jar:2.2.1:test
|
||||
| \- net.minidev:accessors-smart:jar:1.1:test
|
||||
| \- org.ow2.asm:asm:jar:5.0.3:compile
|
||||
+- junit:junit:jar:4.12:test
|
||||
+- org.assertj:assertj-core:jar:2.6.0:test
|
||||
+- org.mockito:mockito-core:jar:1.10.19:test
|
||||
| \- org.objenesis:objenesis:jar:2.1:compile
|
||||
+- org.hamcrest:hamcrest-core:jar:1.3:test
|
||||
+- org.hamcrest:hamcrest-library:jar:1.3:test
|
||||
+- org.skyscreamer:jsonassert:jar:1.4.0:test
|
||||
| \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test
|
||||
+- org.springframework:spring-core:jar:4.3.20.RELEASE:compile
|
||||
\- org.springframework:spring-test:jar:4.3.20.RELEASE:test
|
||||
@@ -0,0 +1,56 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import List
|
||||
|
||||
|
||||
def timestamped_name(prefix: str) -> str:
|
||||
return f"{prefix}-{datetime.now().strftime('%Y%m%d-%H%M%S')}.md"
|
||||
|
||||
|
||||
def write_file(
|
||||
out_path: Path,
|
||||
base_old: str,
|
||||
base_new: str,
|
||||
rows: List[dict],
|
||||
) -> None:
|
||||
lines = [
|
||||
f"# 电梯应用 API 新旧对拍报告\n",
|
||||
f"- **时间**: {datetime.now().isoformat()}\n",
|
||||
f"- **基线(旧) URL**: {base_old}\n",
|
||||
f"- **新构建 URL**: {base_new}\n",
|
||||
"\n## 用例\n\n",
|
||||
"| 用例 | 方法+路径 | HTTP(旧) | HTTP(新) | 等值 | 说明 |\n",
|
||||
"| ---- | -------- | -------- | -------- | ---- | ---- |\n",
|
||||
]
|
||||
ok, bad = 0, 0
|
||||
for r in rows:
|
||||
name = r.get("name", "")
|
||||
pth = f"{r.get('method', '')} {r.get('path', '')}"
|
||||
s1, s2 = r.get("old_status", ""), r.get("new_status", "")
|
||||
eq = "Y" if r.get("match") else "N"
|
||||
if r.get("match"):
|
||||
ok += 1
|
||||
else:
|
||||
bad += 1
|
||||
msg = (r.get("message", "") or "").replace("|", "\\|")[:200]
|
||||
lines.append(f"| {name} | `{pth}` | {s1} | {s2} | {eq} | {msg} |\n")
|
||||
lines.append(
|
||||
f"\n## 汇总\n- 通过: {ok},不一致: {bad}。\n- **上线前请人工与联调/业务确认**。\n"
|
||||
)
|
||||
out_path.write_text("".join(lines), encoding="utf-8")
|
||||
|
||||
payload = {
|
||||
"meta": {
|
||||
"generated_at": datetime.now().isoformat(),
|
||||
"base_old": base_old,
|
||||
"base_new": base_new,
|
||||
"markdown": str(out_path.resolve()),
|
||||
},
|
||||
"rows": rows,
|
||||
"summary": {"match_ok": ok, "match_bad": bad},
|
||||
}
|
||||
json_path = out_path.with_suffix(".json")
|
||||
json_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import List
|
||||
|
||||
|
||||
def write_file(
|
||||
out_path: Path,
|
||||
base_url: str,
|
||||
label: str,
|
||||
rows: List[dict],
|
||||
) -> None:
|
||||
lines = [
|
||||
f"# 电梯应用 API 单机冒烟报告 — {label}\n",
|
||||
f"- **时间**: {datetime.now().isoformat()}\n",
|
||||
f"- **Base URL**: {base_url}\n",
|
||||
"\n## 接口探测\n\n",
|
||||
"| 用例 | 方法+路径 | HTTP | ms | 业务code | 响应摘要 |\n",
|
||||
"| ---- | -------- | ---- | -- | -------- | -------- |\n",
|
||||
]
|
||||
ok_http = 0
|
||||
for r in rows:
|
||||
name = r.get("name", "")
|
||||
pth = f"{r.get('method', '')} {r.get('path', '')}"
|
||||
hs = r.get("http_status", "")
|
||||
ms = r.get("elapsed_ms", "")
|
||||
bc = r.get("business_code", "") or ""
|
||||
head = (r.get("response_head", "") or "").replace("|", "\\|")[:180]
|
||||
if isinstance(hs, int) and 200 <= hs < 300:
|
||||
ok_http += 1
|
||||
lines.append(f"| {name} | `{pth}` | {hs} | {ms} | {bc} | {head} |\n")
|
||||
lines.append(
|
||||
f"\n## 汇总\n"
|
||||
f"- 用例数: {len(rows)};HTTP 2xx 数量: {ok_http}。\n"
|
||||
f"- 业务失败(非 0 code)仍可能为**预期**(缺数据/缺 token);本报告仅证明路由可达且返回 Cloudwalk 风格 JSON。\n"
|
||||
)
|
||||
out_path.write_text("".join(lines), encoding="utf-8")
|
||||
|
||||
payload = {
|
||||
"meta": {
|
||||
"generated_at": datetime.now().isoformat(),
|
||||
"base_url": base_url,
|
||||
"label": label,
|
||||
"markdown": str(out_path.resolve()),
|
||||
},
|
||||
"rows": rows,
|
||||
"summary": {"total": len(rows), "http_2xx": ok_http},
|
||||
}
|
||||
out_path.with_suffix(".json").write_text(
|
||||
json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8"
|
||||
)
|
||||
+232
@@ -0,0 +1,232 @@
|
||||
#!/usr/bin/env python3
|
||||
"""合并电梯 API 测试套件总览:全量清单(catalog)+ 测试结果矩阵(JSON)+ 可选附录(子报告 MD)。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
|
||||
def _tool_root() -> Path:
|
||||
return Path(__file__).resolve().parent.parent
|
||||
|
||||
|
||||
def _load_catalog(path: Path) -> List[dict]:
|
||||
data = json.loads(path.read_text(encoding="utf-8"))
|
||||
return list(data.get("endpoints") or [])
|
||||
|
||||
|
||||
def _safe_json_load(p: Optional[Path]) -> Optional[dict]:
|
||||
if not p or not p.is_file():
|
||||
return None
|
||||
try:
|
||||
return json.loads(p.read_text(encoding="utf-8"))
|
||||
except (OSError, json.JSONDecodeError):
|
||||
return None
|
||||
|
||||
|
||||
def _rows_by_id(rows: Any) -> Dict[str, dict]:
|
||||
out: Dict[str, dict] = {}
|
||||
if not isinstance(rows, list):
|
||||
return out
|
||||
for r in rows:
|
||||
if not isinstance(r, dict):
|
||||
continue
|
||||
eid = r.get("id")
|
||||
if not eid:
|
||||
# 对拍行可能在 id 字段,否则用 path 不可靠
|
||||
continue
|
||||
out[str(eid)] = r
|
||||
return out
|
||||
|
||||
|
||||
def _parity_by_id(rows: Any) -> Dict[str, dict]:
|
||||
out: Dict[str, dict] = {}
|
||||
if not isinstance(rows, list):
|
||||
return out
|
||||
for r in rows:
|
||||
if isinstance(r, dict) and r.get("id"):
|
||||
out[str(r["id"])] = r
|
||||
return out
|
||||
|
||||
|
||||
def _resolve_json_arg(md_or_json: Optional[str]) -> Optional[Path]:
|
||||
if not md_or_json:
|
||||
return None
|
||||
p = Path(md_or_json)
|
||||
if p.suffix.lower() == ".json" and p.is_file():
|
||||
return p
|
||||
if p.suffix.lower() == ".md":
|
||||
cand = p.with_suffix(".json")
|
||||
if cand.is_file():
|
||||
return cand
|
||||
return None
|
||||
|
||||
|
||||
def _markdown_table_catalog(endpoints: List[dict]) -> str:
|
||||
lines = [
|
||||
"| ID | 名称 | 方法 | Path | 冒烟 | 横向对拍 |\n",
|
||||
"| ---- | ---- | ---- | ---- | ---- | -------- |\n",
|
||||
]
|
||||
for ep in endpoints:
|
||||
eid = ep.get("id", "")
|
||||
name = (ep.get("name") or "").replace("|", "\\|")
|
||||
method = ep.get("method") or "POST"
|
||||
path = (ep.get("path") or "").replace("|", "\\|")
|
||||
sm = "是" if ep.get("include_in_smoke", True) else "否"
|
||||
py = "是" if ep.get("include_in_parity", True) else "否"
|
||||
lines.append(f"| `{eid}` | {name} | {method} | `{path}` | {sm} | {py} |\n")
|
||||
return "".join(lines)
|
||||
|
||||
|
||||
def _markdown_matrix(
|
||||
endpoints: List[dict],
|
||||
smoke_v1: Optional[dict],
|
||||
smoke_v2: Optional[dict],
|
||||
parity: Optional[dict],
|
||||
) -> str:
|
||||
m1 = _rows_by_id((smoke_v1 or {}).get("rows"))
|
||||
m2 = _rows_by_id((smoke_v2 or {}).get("rows"))
|
||||
mp = _parity_by_id((parity or {}).get("rows"))
|
||||
|
||||
meta_v1 = (smoke_v1 or {}).get("meta") or {}
|
||||
meta_v2 = (smoke_v2 or {}).get("meta") or {}
|
||||
meta_pr = (parity or {}).get("meta") or {}
|
||||
|
||||
head = ""
|
||||
head += (
|
||||
f"- **V1 冒烟数据来源**: {meta_v1.get('markdown') or meta_v1.get('base_url') or '(无 JSON,未执行或已跳过)'}\n"
|
||||
)
|
||||
head += (
|
||||
f"- **V2 冒烟数据来源**: {meta_v2.get('markdown') or meta_v2.get('base_url') or '(无)'}\n"
|
||||
)
|
||||
head += f"- **对拍数据来源**: {meta_pr.get('markdown') or '(无)'}\n\n"
|
||||
|
||||
lines = [
|
||||
head,
|
||||
"### 测试结果矩阵(按 catalog `id` 对齐)\n\n",
|
||||
"| catalog id | V1 HTTP | V1 code | V2 HTTP | V2 code | 对拍一致(仅参与对拍的条目) | 备注 |\n",
|
||||
"| ---------- | ------- | ------- | ------- | ------- | ---------------------------- | ---- |\n",
|
||||
]
|
||||
for ep in endpoints:
|
||||
eid = str(ep.get("id", ""))
|
||||
include_p = ep.get("include_in_parity", True)
|
||||
v1 = m1.get(eid)
|
||||
v2 = m2.get(eid)
|
||||
pr_row = mp.get(eid) if include_p else None
|
||||
|
||||
def cell_smoke(row: Optional[dict]) -> tuple[str, str]:
|
||||
if not row:
|
||||
return "—", "—"
|
||||
return str(row.get("http_status", "—")), str(row.get("business_code") or "—")
|
||||
|
||||
h1, c1 = cell_smoke(v1)
|
||||
h2, c2 = cell_smoke(v2)
|
||||
if not include_p:
|
||||
par_c = "(不参与)"
|
||||
elif not parity:
|
||||
par_c = "—(未执行)"
|
||||
elif pr_row:
|
||||
par_c = "**Y**" if pr_row.get("match") else "**N**"
|
||||
if not pr_row.get("match"):
|
||||
par_c += " " + (pr_row.get("message") or "")[:60].replace("|", "\\|")
|
||||
else:
|
||||
par_c = "—(本次对拍清单无此项)"
|
||||
|
||||
remark = ""
|
||||
if v1 is None and v2 is None:
|
||||
remark = "冒烟未执行或无该 id 结果"
|
||||
|
||||
lines.append(
|
||||
f"| `{eid}` | {h1} | {c1} | {h2} | {c2} | {par_c} | {remark} |\n"
|
||||
)
|
||||
|
||||
lines.append(
|
||||
"\n**说明**:`code` 为 CloudwalkResult 顶层业务码;HTTP 为传输层状态。"
|
||||
"对拍列为 **Y** 表示旧/新 HTTP 状态一致且业务 code 一致(`code_only` 模式)。\n"
|
||||
)
|
||||
return "".join(lines)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
ap = argparse.ArgumentParser(description="Generate SUITE markdown with catalog + matrix")
|
||||
ap.add_argument("--out", required=True, help="Output SUITE-*.md path")
|
||||
ap.add_argument("--catalog", help="api_catalog.json path")
|
||||
ap.add_argument("--smoke-v1", help="smoke-v1_*.md 或同名 .json")
|
||||
ap.add_argument("--smoke-v2", help="smoke-v2_*.md 或同名 .json")
|
||||
ap.add_argument("--parity", help="parity-*.md 或同名 .json")
|
||||
ap.add_argument(
|
||||
"--embed-full",
|
||||
action="store_true",
|
||||
help="附录中嵌入子报告 Markdown 全文(较长)",
|
||||
)
|
||||
args = ap.parse_args()
|
||||
|
||||
root = _tool_root()
|
||||
catalog_path = Path(args.catalog or (root / "api_catalog.json"))
|
||||
endpoints = _load_catalog(catalog_path)
|
||||
|
||||
js_v1 = _resolve_json_arg(args.smoke_v1)
|
||||
js_v2 = _resolve_json_arg(args.smoke_v2)
|
||||
js_pr = _resolve_json_arg(args.parity)
|
||||
|
||||
doc_v1 = _safe_json_load(js_v1)
|
||||
doc_v2 = _safe_json_load(js_v2)
|
||||
doc_pr = _safe_json_load(js_pr)
|
||||
|
||||
out = Path(args.out)
|
||||
out.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
lines: List[str] = [
|
||||
"# 电梯应用 API 测试套件总览\n\n",
|
||||
f"- **生成时间**: {datetime.now().isoformat()}\n",
|
||||
f"- **清单来源**: `{catalog_path.resolve()}`(共 **{len(endpoints)}** 条接口定义)\n\n",
|
||||
"## 1. 说明\n\n",
|
||||
"- **全量清单**:第二节,来自 `api_catalog.json`,含是否参与冒烟/对拍。\n",
|
||||
"- **测试结果矩阵**:第三节,与本次运行生成的 **JSON** 侧车文件对齐(与 `.md` 同名的 `.json`)。"
|
||||
"若应用未启动导致 pytest **skip**,则无 JSON,矩阵中表现为 **—**。\n",
|
||||
"- **横向对拍**:仅 `include_in_parity=true` 的条目会写入对拍 JSON 并参与对比。\n\n",
|
||||
"## 2. 全量接口测试清单(catalog)\n\n",
|
||||
_markdown_table_catalog(endpoints),
|
||||
"\n",
|
||||
"## 3. 测试结果矩阵\n\n",
|
||||
_markdown_matrix(endpoints, doc_v1, doc_v2, doc_pr),
|
||||
]
|
||||
|
||||
sec = 4
|
||||
if args.embed_full:
|
||||
for title, path_s in (
|
||||
("V1 单机冒烟 Markdown", args.smoke_v1),
|
||||
("V2 单机冒烟 Markdown", args.smoke_v2),
|
||||
("横向对拍 Markdown", args.parity),
|
||||
):
|
||||
if not path_s:
|
||||
continue
|
||||
pp = Path(path_s)
|
||||
if pp.suffix.lower() != ".md":
|
||||
pp = pp.with_suffix(".md") if pp.with_suffix(".md").is_file() else pp
|
||||
if not pp.is_file():
|
||||
continue
|
||||
lines.append(f"## {sec}. {title}\n\n")
|
||||
lines.append(f"源文件: `{pp.resolve()}`\n\n---\n\n")
|
||||
lines.append(pp.read_text(encoding="utf-8"))
|
||||
lines.append("\n\n")
|
||||
sec += 1
|
||||
|
||||
lines.append(
|
||||
f"\n## {sec}. 原始报告路径(便于回放)\n\n"
|
||||
f"- V1 冒烟: `{args.smoke_v1 or '(未生成)'}`\n"
|
||||
f"- V2 冒烟: `{args.smoke_v2 or '(未生成)'}`\n"
|
||||
f"- 对拍: `{args.parity or '(未生成)'}`\n"
|
||||
f"- 同名 **`.json`** 与 `.md` 一并生成时可自动填充第三节矩阵。\n"
|
||||
)
|
||||
|
||||
out.write_text("".join(lines), encoding="utf-8")
|
||||
print(out.resolve())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"generated_at": "2026-04-29T01:06:57.465958Z",
|
||||
"count": 1,
|
||||
"items": [
|
||||
{
|
||||
"module": "cw-elevator-application-common",
|
||||
"class_name": "cn.cloudwalk.elevator.util.StringUtils",
|
||||
"v1_file": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/impl-diff-evidence-20260428/cn_cloudwalk_elevator_util_StringUtils.v1.javap.txt",
|
||||
"v2_file": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/impl-diff-evidence-20260428/cn_cloudwalk_elevator_util_StringUtils.v2.javap.txt",
|
||||
"diff_file": "/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/elevator_api_parity/report/impl-diff-evidence-20260428/cn_cloudwalk_elevator_util_StringUtils.diff.txt",
|
||||
"diff_lines": 41
|
||||
}
|
||||
]
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
--- cn.cloudwalk.elevator.common.AbstractCloudwalkController.v1
|
||||
+++ cn.cloudwalk.elevator.common.AbstractCloudwalkController.v2
|
||||
@@ -72,6 +72,12 @@
|
||||
Code:
|
||||
invokestatic # // Method org/springframework/web/context/request/RequestContextHolder.getRequestAttributes:()Lorg/springframework/web/context/request/RequestAttributes;
|
||||
checkcast # // class org/springframework/web/context/request/ServletRequestAttributes
|
||||
+astore_1
|
||||
+aload_1
|
||||
+ifnonnull @
|
||||
+aconst_null
|
||||
+areturn
|
||||
+aload_1
|
||||
invokevirtual # // Method org/springframework/web/context/request/ServletRequestAttributes.getRequest:()Ljavax/servlet/http/HttpServletRequest;
|
||||
areturn
|
||||
public java.lang.String getMessage(java.lang.String, java.lang.String);
|
||||
@@ -127,6 +133,10 @@
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
aload_3
|
||||
+ifnull @
|
||||
+aload_3
|
||||
+goto @
|
||||
+aload_1
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
public abstract class cn.cloudwalk.elevator.common.AbstractCloudwalkController {
|
||||
protected final org.slf4j.Logger LOGGER;
|
||||
private org.springframework.context.MessageSource messageSource;
|
||||
private cn.cloudwalk.cloud.context.CloudwalkSessionContextHolder cloudwalkSessionContextHolder;
|
||||
public cn.cloudwalk.elevator.common.AbstractCloudwalkController();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method java/lang/Object."<init>":()V
|
||||
aload_0
|
||||
aload_0
|
||||
invokevirtual # // Method java/lang/Object.getClass:()Ljava/lang/Class;
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
return
|
||||
public cn.cloudwalk.cloud.context.CloudwalkCallContext getCloudwalkContext();
|
||||
Code:
|
||||
aload_0
|
||||
getfield # // Field cloudwalkSessionContextHolder:Lcn/cloudwalk/cloud/context/CloudwalkSessionContextHolder;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/context/CloudwalkCallContextBuilder.buildContext:(Lcn/cloudwalk/cloud/context/CloudwalkSessionContextHolder;)Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
astore_1
|
||||
invokestatic # // Method org/springframework/web/context/request/RequestContextHolder.getRequestAttributes:()Lorg/springframework/web/context/request/RequestAttributes;
|
||||
checkcast # // class org/springframework/web/context/request/ServletRequestAttributes
|
||||
astore_2
|
||||
aconst_null
|
||||
aload_2
|
||||
if_acmpeq 82
|
||||
new # // class cn/cloudwalk/cloud/session/extend/DefaultExtendContext
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/cloud/session/extend/DefaultExtendContext."<init>":()V
|
||||
astore_3
|
||||
new # // class cn/cloudwalk/elevator/context/CloudWalkExtendContextValue
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/context/CloudWalkExtendContextValue."<init>":()V
|
||||
astore _
|
||||
aload_2
|
||||
invokevirtual # // Method org/springframework/web/context/request/ServletRequestAttributes.getRequest:()Ljavax/servlet/http/HttpServletRequest;
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
ldc # // String loginid
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/context/CloudWalkExtendContextValue.setLoginId:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload _
|
||||
ldc # // String authorization
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/context/CloudWalkExtendContextValue.setAuthorization:(Ljava/lang/String;)V
|
||||
aload_3
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/session/extend/DefaultExtendContext.setValue:(Ljava/lang/Object;)V
|
||||
aload_1
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.setExt:(Lcn/cloudwalk/cloud/session/extend/ExtendContext;)V
|
||||
aload_1
|
||||
areturn
|
||||
public java.lang.String getToken();
|
||||
Code:
|
||||
invokestatic # // Method org/springframework/web/context/request/RequestContextHolder.getRequestAttributes:()Lorg/springframework/web/context/request/RequestAttributes;
|
||||
checkcast # // class org/springframework/web/context/request/ServletRequestAttributes
|
||||
astore_1
|
||||
aconst_null
|
||||
aload_1
|
||||
if_acmpeq 24
|
||||
aload_1
|
||||
invokevirtual # // Method org/springframework/web/context/request/ServletRequestAttributes.getRequest:()Ljavax/servlet/http/HttpServletRequest;
|
||||
ldc # // String authorization
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
areturn
|
||||
aconst_null
|
||||
areturn
|
||||
protected javax.servlet.http.HttpServletRequest getHttpServletRequest();
|
||||
Code:
|
||||
invokestatic # // Method org/springframework/web/context/request/RequestContextHolder.getRequestAttributes:()Lorg/springframework/web/context/request/RequestAttributes;
|
||||
checkcast # // class org/springframework/web/context/request/ServletRequestAttributes
|
||||
invokevirtual # // Method org/springframework/web/context/request/ServletRequestAttributes.getRequest:()Ljavax/servlet/http/HttpServletRequest;
|
||||
areturn
|
||||
public java.lang.String getMessage(java.lang.String, java.lang.String);
|
||||
Code:
|
||||
aload_0
|
||||
getfield # // Field messageSource:Lorg/springframework/context/MessageSource;
|
||||
aload_1
|
||||
aconst_null
|
||||
aload_2
|
||||
invokestatic # // Method org/springframework/context/i18n/LocaleContextHolder.getLocale:()Ljava/util/Locale;
|
||||
invokeinterface # // InterfaceMethod org/springframework/context/MessageSource.getMessage:(Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
|
||||
areturn
|
||||
public java.lang.String getMessage(java.lang.String);
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
ldc # // String
|
||||
invokevirtual # // Method getMessage:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
areturn
|
||||
protected void makeExcelresponse(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.String);
|
||||
Code:
|
||||
aload_2
|
||||
ldc # // String application/vnd.ms-excel;charset=utf-8
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletResponse.setContentType:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
ldc # // String Content-Disposition
|
||||
new # // class java/lang/StringBuilder
|
||||
dup
|
||||
invokespecial # // Method java/lang/StringBuilder."<init>":()V
|
||||
ldc # // String attachment;filename=
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
aload_0
|
||||
aload_3
|
||||
aload_1
|
||||
invokevirtual # // Method encodeFileName:(Ljava/lang/String;Ljavax/servlet/http/HttpServletRequest;)Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletResponse.setHeader:(Ljava/lang/String;Ljava/lang/String;)V
|
||||
return
|
||||
protected java.lang.String encodeFileName(java.lang.String, javax.servlet.http.HttpServletRequest);
|
||||
Code:
|
||||
aconst_null
|
||||
astore_3
|
||||
aload_1
|
||||
ldc # // String UTF-8
|
||||
invokestatic # // Method java/net/URLEncoder.encode:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
astore_3
|
||||
goto @
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 转换文件名字符类型失败,原因:
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
aload_3
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
2 9 12 Class java/lang/Exception
|
||||
}
|
||||
+144
@@ -0,0 +1,144 @@
|
||||
public abstract class cn.cloudwalk.elevator.common.AbstractCloudwalkController {
|
||||
protected final org.slf4j.Logger LOGGER;
|
||||
private org.springframework.context.MessageSource messageSource;
|
||||
private cn.cloudwalk.cloud.context.CloudwalkSessionContextHolder cloudwalkSessionContextHolder;
|
||||
public cn.cloudwalk.elevator.common.AbstractCloudwalkController();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method java/lang/Object."<init>":()V
|
||||
aload_0
|
||||
aload_0
|
||||
invokevirtual # // Method java/lang/Object.getClass:()Ljava/lang/Class;
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
return
|
||||
public cn.cloudwalk.cloud.context.CloudwalkCallContext getCloudwalkContext();
|
||||
Code:
|
||||
aload_0
|
||||
getfield # // Field cloudwalkSessionContextHolder:Lcn/cloudwalk/cloud/context/CloudwalkSessionContextHolder;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/context/CloudwalkCallContextBuilder.buildContext:(Lcn/cloudwalk/cloud/context/CloudwalkSessionContextHolder;)Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
astore_1
|
||||
invokestatic # // Method org/springframework/web/context/request/RequestContextHolder.getRequestAttributes:()Lorg/springframework/web/context/request/RequestAttributes;
|
||||
checkcast # // class org/springframework/web/context/request/ServletRequestAttributes
|
||||
astore_2
|
||||
aconst_null
|
||||
aload_2
|
||||
if_acmpeq 82
|
||||
new # // class cn/cloudwalk/cloud/session/extend/DefaultExtendContext
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/cloud/session/extend/DefaultExtendContext."<init>":()V
|
||||
astore_3
|
||||
new # // class cn/cloudwalk/elevator/context/CloudWalkExtendContextValue
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/context/CloudWalkExtendContextValue."<init>":()V
|
||||
astore _
|
||||
aload_2
|
||||
invokevirtual # // Method org/springframework/web/context/request/ServletRequestAttributes.getRequest:()Ljavax/servlet/http/HttpServletRequest;
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
ldc # // String loginid
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/context/CloudWalkExtendContextValue.setLoginId:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload _
|
||||
ldc # // String authorization
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/context/CloudWalkExtendContextValue.setAuthorization:(Ljava/lang/String;)V
|
||||
aload_3
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/session/extend/DefaultExtendContext.setValue:(Ljava/lang/Object;)V
|
||||
aload_1
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.setExt:(Lcn/cloudwalk/cloud/session/extend/ExtendContext;)V
|
||||
aload_1
|
||||
areturn
|
||||
public java.lang.String getToken();
|
||||
Code:
|
||||
invokestatic # // Method org/springframework/web/context/request/RequestContextHolder.getRequestAttributes:()Lorg/springframework/web/context/request/RequestAttributes;
|
||||
checkcast # // class org/springframework/web/context/request/ServletRequestAttributes
|
||||
astore_1
|
||||
aconst_null
|
||||
aload_1
|
||||
if_acmpeq 24
|
||||
aload_1
|
||||
invokevirtual # // Method org/springframework/web/context/request/ServletRequestAttributes.getRequest:()Ljavax/servlet/http/HttpServletRequest;
|
||||
ldc # // String authorization
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
areturn
|
||||
aconst_null
|
||||
areturn
|
||||
protected javax.servlet.http.HttpServletRequest getHttpServletRequest();
|
||||
Code:
|
||||
invokestatic # // Method org/springframework/web/context/request/RequestContextHolder.getRequestAttributes:()Lorg/springframework/web/context/request/RequestAttributes;
|
||||
checkcast # // class org/springframework/web/context/request/ServletRequestAttributes
|
||||
astore_1
|
||||
aload_1
|
||||
ifnonnull @
|
||||
aconst_null
|
||||
areturn
|
||||
aload_1
|
||||
invokevirtual # // Method org/springframework/web/context/request/ServletRequestAttributes.getRequest:()Ljavax/servlet/http/HttpServletRequest;
|
||||
areturn
|
||||
public java.lang.String getMessage(java.lang.String, java.lang.String);
|
||||
Code:
|
||||
aload_0
|
||||
getfield # // Field messageSource:Lorg/springframework/context/MessageSource;
|
||||
aload_1
|
||||
aconst_null
|
||||
aload_2
|
||||
invokestatic # // Method org/springframework/context/i18n/LocaleContextHolder.getLocale:()Ljava/util/Locale;
|
||||
invokeinterface # // InterfaceMethod org/springframework/context/MessageSource.getMessage:(Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
|
||||
areturn
|
||||
public java.lang.String getMessage(java.lang.String);
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
ldc # // String
|
||||
invokevirtual # // Method getMessage:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
areturn
|
||||
protected void makeExcelresponse(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.String);
|
||||
Code:
|
||||
aload_2
|
||||
ldc # // String application/vnd.ms-excel;charset=utf-8
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletResponse.setContentType:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
ldc # // String Content-Disposition
|
||||
new # // class java/lang/StringBuilder
|
||||
dup
|
||||
invokespecial # // Method java/lang/StringBuilder."<init>":()V
|
||||
ldc # // String attachment;filename=
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
aload_0
|
||||
aload_3
|
||||
aload_1
|
||||
invokevirtual # // Method encodeFileName:(Ljava/lang/String;Ljavax/servlet/http/HttpServletRequest;)Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod javax/servlet/http/HttpServletResponse.setHeader:(Ljava/lang/String;Ljava/lang/String;)V
|
||||
return
|
||||
protected java.lang.String encodeFileName(java.lang.String, javax.servlet.http.HttpServletRequest);
|
||||
Code:
|
||||
aconst_null
|
||||
astore_3
|
||||
aload_1
|
||||
ldc # // String UTF-8
|
||||
invokestatic # // Method java/net/URLEncoder.encode:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
astore_3
|
||||
goto @
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 转换文件名字符类型失败,原因:
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
aload_3
|
||||
ifnull @
|
||||
aload_3
|
||||
goto @
|
||||
aload_1
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
2 9 12 Class java/lang/Exception
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
--- cn.cloudwalk.elevator.common.AcsApplicationServiceImpl.v1
|
||||
+++ cn.cloudwalk.elevator.common.AcsApplicationServiceImpl.v2
|
||||
@@ -24,7 +24,7 @@
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/client/resource/application/service/ApplicationService.query:(Lcn/cloudwalk/client/resource/application/param/ApplicationQueryParam;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore_3
|
||||
aload_3
|
||||
-invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
+invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq @
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
public class cn.cloudwalk.elevator.common.AcsApplicationServiceImpl implements cn.cloudwalk.elevator.common.service.AcsApplicationService {
|
||||
private static final org.slf4j.Logger logger;
|
||||
private cn.cloudwalk.client.resource.application.service.ApplicationService applicationService;
|
||||
public cn.cloudwalk.elevator.common.AcsApplicationServiceImpl();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method java/lang/Object."<init>":()V
|
||||
return
|
||||
public java.lang.String getApplicationId(java.lang.String) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
new # // class cn/cloudwalk/client/resource/application/param/ApplicationQueryParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/client/resource/application/param/ApplicationQueryParam."<init>":()V
|
||||
astore_2
|
||||
aload_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/client/resource/application/param/ApplicationQueryParam.setBusinessId:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
ldc # // String elevator-app
|
||||
invokevirtual # // Method cn/cloudwalk/client/resource/application/param/ApplicationQueryParam.setServiceCode:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field applicationService:Lcn/cloudwalk/client/resource/application/service/ApplicationService;
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/client/resource/application/service/ApplicationService.query:(Lcn/cloudwalk/client/resource/application/param/ApplicationQueryParam;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore_3
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq @
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/Collection
|
||||
invokestatic # // Method org/apache/commons/collections4/CollectionUtils.isNotEmpty:(Ljava/util/Collection;)Z
|
||||
ifeq @
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
iconst_0
|
||||
invokeinterface # // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/client/resource/application/result/ApplicationResult
|
||||
invokevirtual # // Method cn/cloudwalk/client/resource/application/result/ApplicationResult.getId:()Ljava/lang/String;
|
||||
areturn
|
||||
getstatic # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 未查到applicationId
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/cloud/exception/ServiceException
|
||||
dup
|
||||
ldc # // String 76260005
|
||||
ldc # // String 未查到applicationId
|
||||
invokespecial # // Method cn/cloudwalk/cloud/exception/ServiceException."<init>":(Ljava/lang/String;Ljava/lang/String;)V
|
||||
athrow
|
||||
getstatic # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 查询applicationId失败
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/cloud/exception/ServiceException
|
||||
dup
|
||||
ldc # // String 76260006
|
||||
ldc # // String 查询applicationId失败
|
||||
invokespecial # // Method cn/cloudwalk/cloud/exception/ServiceException."<init>":(Ljava/lang/String;Ljava/lang/String;)V
|
||||
athrow
|
||||
static {};
|
||||
Code:
|
||||
ldc # // class cn/cloudwalk/elevator/common/AcsApplicationServiceImpl
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putstatic # // Field logger:Lorg/slf4j/Logger;
|
||||
return
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
public class cn.cloudwalk.elevator.common.AcsApplicationServiceImpl implements cn.cloudwalk.elevator.common.service.AcsApplicationService {
|
||||
private static final org.slf4j.Logger logger;
|
||||
private cn.cloudwalk.client.resource.application.service.ApplicationService applicationService;
|
||||
public cn.cloudwalk.elevator.common.AcsApplicationServiceImpl();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method java/lang/Object."<init>":()V
|
||||
return
|
||||
public java.lang.String getApplicationId(java.lang.String) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
new # // class cn/cloudwalk/client/resource/application/param/ApplicationQueryParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/client/resource/application/param/ApplicationQueryParam."<init>":()V
|
||||
astore_2
|
||||
aload_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/client/resource/application/param/ApplicationQueryParam.setBusinessId:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
ldc # // String elevator-app
|
||||
invokevirtual # // Method cn/cloudwalk/client/resource/application/param/ApplicationQueryParam.setServiceCode:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field applicationService:Lcn/cloudwalk/client/resource/application/service/ApplicationService;
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/client/resource/application/service/ApplicationService.query:(Lcn/cloudwalk/client/resource/application/param/ApplicationQueryParam;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore_3
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq @
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/Collection
|
||||
invokestatic # // Method org/apache/commons/collections4/CollectionUtils.isNotEmpty:(Ljava/util/Collection;)Z
|
||||
ifeq @
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
iconst_0
|
||||
invokeinterface # // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/client/resource/application/result/ApplicationResult
|
||||
invokevirtual # // Method cn/cloudwalk/client/resource/application/result/ApplicationResult.getId:()Ljava/lang/String;
|
||||
areturn
|
||||
getstatic # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 未查到applicationId
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/cloud/exception/ServiceException
|
||||
dup
|
||||
ldc # // String 76260005
|
||||
ldc # // String 未查到applicationId
|
||||
invokespecial # // Method cn/cloudwalk/cloud/exception/ServiceException."<init>":(Ljava/lang/String;Ljava/lang/String;)V
|
||||
athrow
|
||||
getstatic # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 查询applicationId失败
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/cloud/exception/ServiceException
|
||||
dup
|
||||
ldc # // String 76260006
|
||||
ldc # // String 查询applicationId失败
|
||||
invokespecial # // Method cn/cloudwalk/cloud/exception/ServiceException."<init>":(Ljava/lang/String;Ljava/lang/String;)V
|
||||
athrow
|
||||
static {};
|
||||
Code:
|
||||
ldc # // class cn/cloudwalk/elevator/common/AcsApplicationServiceImpl
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putstatic # // Field logger:Lorg/slf4j/Logger;
|
||||
return
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
--- cn.cloudwalk.elevator.common.UpdateFloorsTaskExecutor.v1
|
||||
+++ cn.cloudwalk.elevator.common.UpdateFloorsTaskExecutor.v2
|
||||
@@ -32,6 +32,11 @@
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.getQueueCapacity:()I
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setQueueCapacity:(I)V
|
||||
aload_1
|
||||
+aload_0
|
||||
+getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
+invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.getKeepAliveSeconds:()I
|
||||
+invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setKeepAliveSeconds:(I)V
|
||||
+aload_1
|
||||
ldc # // String update-floors-pool-
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setThreadNamePrefix:(Ljava/lang/String;)V
|
||||
aload_1
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
public class cn.cloudwalk.elevator.common.UpdateFloorsTaskExecutor {
|
||||
private cn.cloudwalk.elevator.common.UpdateFloorsPoolProperties updateFloorsPoolProperties;
|
||||
public cn.cloudwalk.elevator.common.UpdateFloorsTaskExecutor();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method java/lang/Object."<init>":()V
|
||||
return
|
||||
public org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor pictureRevisionTaskExecutor();
|
||||
Code:
|
||||
new # // class org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor
|
||||
dup
|
||||
invokespecial # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor."<init>":()V
|
||||
astore_1
|
||||
aload_1
|
||||
aload_0
|
||||
getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.getCorePoolSize:()I
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setCorePoolSize:(I)V
|
||||
aload_1
|
||||
aload_0
|
||||
getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.isAllowCoreThreadTimeOut:()Z
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setAllowCoreThreadTimeOut:(Z)V
|
||||
aload_1
|
||||
aload_0
|
||||
getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.getMaxPoolSize:()I
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setMaxPoolSize:(I)V
|
||||
aload_1
|
||||
aload_0
|
||||
getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.getQueueCapacity:()I
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setQueueCapacity:(I)V
|
||||
aload_1
|
||||
ldc # // String update-floors-pool-
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setThreadNamePrefix:(Ljava/lang/String;)V
|
||||
aload_1
|
||||
new # // class java/util/concurrent/ThreadPoolExecutor$AbortPolicy
|
||||
dup
|
||||
invokespecial # // Method java/util/concurrent/ThreadPoolExecutor$AbortPolicy."<init>":()V
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setRejectedExecutionHandler:(Ljava/util/concurrent/RejectedExecutionHandler;)V
|
||||
aload_1
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.initialize:()V
|
||||
aload_1
|
||||
areturn
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
public class cn.cloudwalk.elevator.common.UpdateFloorsTaskExecutor {
|
||||
private cn.cloudwalk.elevator.common.UpdateFloorsPoolProperties updateFloorsPoolProperties;
|
||||
public cn.cloudwalk.elevator.common.UpdateFloorsTaskExecutor();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method java/lang/Object."<init>":()V
|
||||
return
|
||||
public org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor pictureRevisionTaskExecutor();
|
||||
Code:
|
||||
new # // class org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor
|
||||
dup
|
||||
invokespecial # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor."<init>":()V
|
||||
astore_1
|
||||
aload_1
|
||||
aload_0
|
||||
getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.getCorePoolSize:()I
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setCorePoolSize:(I)V
|
||||
aload_1
|
||||
aload_0
|
||||
getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.isAllowCoreThreadTimeOut:()Z
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setAllowCoreThreadTimeOut:(Z)V
|
||||
aload_1
|
||||
aload_0
|
||||
getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.getMaxPoolSize:()I
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setMaxPoolSize:(I)V
|
||||
aload_1
|
||||
aload_0
|
||||
getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.getQueueCapacity:()I
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setQueueCapacity:(I)V
|
||||
aload_1
|
||||
aload_0
|
||||
getfield # // Field updateFloorsPoolProperties:Lcn/cloudwalk/elevator/common/UpdateFloorsPoolProperties;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/common/UpdateFloorsPoolProperties.getKeepAliveSeconds:()I
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setKeepAliveSeconds:(I)V
|
||||
aload_1
|
||||
ldc # // String update-floors-pool-
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setThreadNamePrefix:(Ljava/lang/String;)V
|
||||
aload_1
|
||||
new # // class java/util/concurrent/ThreadPoolExecutor$AbortPolicy
|
||||
dup
|
||||
invokespecial # // Method java/util/concurrent/ThreadPoolExecutor$AbortPolicy."<init>":()V
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.setRejectedExecutionHandler:(Ljava/util/concurrent/RejectedExecutionHandler;)V
|
||||
aload_1
|
||||
invokevirtual # // Method org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.initialize:()V
|
||||
aload_1
|
||||
areturn
|
||||
}
|
||||
+269
@@ -0,0 +1,269 @@
|
||||
--- cn.cloudwalk.elevator.device.impl.AcsElevatorDeviceServiceImpl.v1
|
||||
+++ cn.cloudwalk.elevator.device.impl.AcsElevatorDeviceServiceImpl.v2
|
||||
@@ -652,7 +652,7 @@
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
-astore_3
|
||||
+astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsRestructureQueryParam.getPersonId:()Ljava/lang/String;
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
@@ -712,7 +712,7 @@
|
||||
getfield # // Field imageRuleRefDao:Lcn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao;
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao.listByPersonInfo:(Lcn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageDto;)Ljava/util/List;
|
||||
-astore _
|
||||
+astore_3
|
||||
goto @
|
||||
new # // class cn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageDto
|
||||
dup
|
||||
@@ -740,15 +740,15 @@
|
||||
getfield # // Field imageRuleRefDao:Lcn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao;
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao.listByRestructure:(Lcn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageDto;)Ljava/util/List;
|
||||
-astore _
|
||||
+astore_3
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
astore _
|
||||
-aload _
|
||||
-invokestatic # // Method cn/cloudwalk/elevator/util/CollectionUtils.isEmpty:(Ljava/util/Collection;)Z
|
||||
-ifne @
|
||||
-aload _
|
||||
+aload_3
|
||||
+invokestatic # // Method cn/cloudwalk/elevator/util/CollectionUtils.isEmpty:(Ljava/util/Collection;)Z
|
||||
+ifne @
|
||||
+aload_3
|
||||
aload _
|
||||
invokedynamic # // InvokeDynamic #:accept:(Ljava/util/List;)Ljava/util/function/Consumer;
|
||||
invokeinterface # // InterfaceMethod java/util/List.forEach:(Ljava/util/function/Consumer;)V
|
||||
@@ -778,13 +778,13 @@
|
||||
athrow
|
||||
Exception table:
|
||||
from to target type
|
||||
-0 289 290 Class java/lang/Exception
|
||||
+0 286 287 Class java/lang/Exception
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult listFloors(cn.cloudwalk.elevator.device.param.AcsRestructureQueryParam, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
-astore_3
|
||||
+astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsRestructureQueryParam.getPersonId:()Ljava/lang/String;
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
@@ -844,7 +844,7 @@
|
||||
getfield # // Field imageRuleRefDao:Lcn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao;
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao.listByPersonInfo:(Lcn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageDto;)Ljava/util/List;
|
||||
-astore _
|
||||
+astore_3
|
||||
goto @
|
||||
new # // class cn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageDto
|
||||
dup
|
||||
@@ -872,7 +872,7 @@
|
||||
getfield # // Field imageRuleRefDao:Lcn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao;
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao.listByRestructure:(Lcn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageDto;)Ljava/util/List;
|
||||
-astore _
|
||||
+astore_3
|
||||
new # // class cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceListDto
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceListDto."<init>":()V
|
||||
@@ -881,10 +881,10 @@
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
astore _
|
||||
-aload _
|
||||
-invokestatic # // Method cn/cloudwalk/elevator/util/CollectionUtils.isEmpty:(Ljava/util/Collection;)Z
|
||||
-ifne @
|
||||
-aload _
|
||||
+aload_3
|
||||
+invokestatic # // Method cn/cloudwalk/elevator/util/CollectionUtils.isEmpty:(Ljava/util/Collection;)Z
|
||||
+ifne @
|
||||
+aload_3
|
||||
aload _
|
||||
invokedynamic # // InvokeDynamic #:accept:(Ljava/util/List;)Ljava/util/function/Consumer;
|
||||
invokeinterface # // InterfaceMethod java/util/List.forEach:(Ljava/util/function/Consumer;)V
|
||||
@@ -901,7 +901,7 @@
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsRestructureQueryParam.getZoneId:()Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod java/util/List.contains:(Ljava/lang/Object;)Z
|
||||
ifeq @
|
||||
-aload_3
|
||||
+aload _
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
aload _
|
||||
@@ -934,7 +934,7 @@
|
||||
invokedynamic # // InvokeDynamic #:accept:(Ljava/util/List;)Ljava/util/function/Consumer;
|
||||
invokeinterface # // InterfaceMethod java/util/List.forEach:(Ljava/util/function/Consumer;)V
|
||||
goto @
|
||||
-aload_3
|
||||
+aload _
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
aload_1
|
||||
@@ -1062,7 +1062,7 @@
|
||||
iload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
-if_icmpge 937
|
||||
+if_icmpge 936
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageResultDto.getZoneId:()Ljava/lang/String;
|
||||
aload _
|
||||
@@ -1152,12 +1152,12 @@
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/AcsDeviceRestructureResult.setOfflineDevices:(Ljava/lang/String;)V
|
||||
-aload_3
|
||||
+aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto @
|
||||
-aload_3
|
||||
+aload _
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
astore_3
|
||||
@@ -1173,15 +1173,15 @@
|
||||
athrow
|
||||
Exception table:
|
||||
from to target type
|
||||
-0 305 968 Class java/lang/Exception
|
||||
-306 389 968 Class java/lang/Exception
|
||||
-390 967 968 Class java/lang/Exception
|
||||
+0 303 969 Class java/lang/Exception
|
||||
+304 388 969 Class java/lang/Exception
|
||||
+389 968 969 Class java/lang/Exception
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult listCondition(cn.cloudwalk.elevator.device.param.AcsRestructureQueryParam, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
-astore_3
|
||||
+astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsRestructureQueryParam.getBusinessId:()Ljava/lang/String;
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
@@ -1250,7 +1250,7 @@
|
||||
getfield # // Field imageRuleRefDao:Lcn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao;
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao.listByPersonInfo:(Lcn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageDto;)Ljava/util/List;
|
||||
-astore _
|
||||
+astore_3
|
||||
goto @
|
||||
new # // class cn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageDto
|
||||
dup
|
||||
@@ -1278,8 +1278,8 @@
|
||||
getfield # // Field imageRuleRefDao:Lcn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao;
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/passrule/dao/ImageRuleRefDao.listByRestructure:(Lcn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageDto;)Ljava/util/List;
|
||||
-astore _
|
||||
-aload _
|
||||
+astore_3
|
||||
+aload_3
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/CollectionUtils.isEmpty:(Ljava/util/Collection;)Z
|
||||
ifne @
|
||||
new # // class cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceListDto
|
||||
@@ -1290,7 +1290,7 @@
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
astore _
|
||||
-aload _
|
||||
+aload_3
|
||||
aload _
|
||||
invokedynamic # // InvokeDynamic #:accept:(Ljava/util/List;)Ljava/util/function/Consumer;
|
||||
invokeinterface # // InterfaceMethod java/util/List.forEach:(Ljava/util/function/Consumer;)V
|
||||
@@ -1309,7 +1309,7 @@
|
||||
invokestatic # // Method java/util/Collections.singletonList:(Ljava/lang/Object;)Ljava/util/List;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceListDto.setCurrentFloorIds:(Ljava/util/List;)V
|
||||
goto @
|
||||
-aload_3
|
||||
+aload _
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
aload _
|
||||
@@ -1379,7 +1379,7 @@
|
||||
invokeinterface # // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
pop
|
||||
goto @
|
||||
-aload _
|
||||
+aload_3
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore _
|
||||
aload _
|
||||
@@ -1425,7 +1425,7 @@
|
||||
iload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
-if_icmpge 868
|
||||
+if_icmpge 865
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/passrule/dto/AcsPassRuleImageResultDto.getZoneId:()Ljava/lang/String;
|
||||
aload _
|
||||
@@ -1522,7 +1522,7 @@
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/AcsDeviceRestructureResult.setOfflineDevices:(Ljava/lang/String;)V
|
||||
-aload_3
|
||||
+aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
@@ -1532,7 +1532,7 @@
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsRestructureQueryParam.getZoneId:()Ljava/lang/String;
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne @
|
||||
-aload _
|
||||
+aload_3
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore _
|
||||
aload _
|
||||
@@ -1564,14 +1564,14 @@
|
||||
aload_0
|
||||
getfield # // Field floorBuildingId:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/AcsDeviceRestructureResult.setParentId:(Ljava/lang/String;)V
|
||||
-aload_3
|
||||
+aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto @
|
||||
goto @
|
||||
goto @
|
||||
-aload _
|
||||
+aload_3
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore _
|
||||
aload _
|
||||
@@ -1597,12 +1597,12 @@
|
||||
aload_0
|
||||
getfield # // Field floorBuildingId:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/AcsDeviceRestructureResult.setParentId:(Ljava/lang/String;)V
|
||||
-aload_3
|
||||
+aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto @
|
||||
-aload_3
|
||||
+aload _
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
astore_3
|
||||
@@ -1618,8 +1618,8 @@
|
||||
athrow
|
||||
Exception table:
|
||||
from to target type
|
||||
-0 332 1095 Class java/lang/Exception
|
||||
-333 1094 1095 Class java/lang/Exception
|
||||
+0 330 1094 Class java/lang/Exception
|
||||
+331 1093 1094 Class java/lang/Exception
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult listConditionByLabelIds(cn.cloudwalk.elevator.device.param.AcsRestructureQueryParam, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
new # // class java/util/ArrayList
|
||||
+2870
File diff suppressed because it is too large
Load Diff
+2870
File diff suppressed because it is too large
Load Diff
+20
@@ -0,0 +1,20 @@
|
||||
--- cn.cloudwalk.elevator.export.impl.ElevatorDeviceExportService.v1
|
||||
+++ cn.cloudwalk.elevator.export.impl.ElevatorDeviceExportService.v2
|
||||
@@ -56,7 +56,7 @@
|
||||
aload 8
|
||||
ldc # // String 禁用
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.setDeviceOnlineStatus:(Ljava/lang/String;)V
|
||||
-goto 173
|
||||
+goto 79
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.getOnlineStatus:()Ljava/lang/Integer;
|
||||
iconst_2
|
||||
@@ -66,7 +66,7 @@
|
||||
aload 8
|
||||
ldc # // String 在线
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.setDeviceOnlineStatus:(Ljava/lang/String;)V
|
||||
-goto 173
|
||||
+goto 79
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.getOnlineStatus:()Ljava/lang/Integer;
|
||||
iconst_3
|
||||
+139
@@ -0,0 +1,139 @@
|
||||
public class cn.cloudwalk.elevator.export.impl.ElevatorDeviceExportService extends cn.cloudwalk.elevator.export.AcsAbstractExportAsyncService<cn.cloudwalk.elevator.device.param.AcsElevatorDeviceQueryParam, cn.cloudwalk.elevator.export.result.ElevatorDeviceRecordExcelResult> {
|
||||
private cn.cloudwalk.elevator.device.service.AcsElevatorDeviceService elevatorDeviceService;
|
||||
public cn.cloudwalk.elevator.export.impl.ElevatorDeviceExportService();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/export/AcsAbstractExportAsyncService."<init>":()V
|
||||
return
|
||||
protected cn.cloudwalk.cloud.page.CloudwalkPageAble<cn.cloudwalk.elevator.export.result.ElevatorDeviceRecordExcelResult> queryPage(cn.cloudwalk.elevator.device.param.AcsElevatorDeviceQueryParam, cn.cloudwalk.cloud.page.CloudwalkPageInfo, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
aload_1
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageInfo.getCurrentPage:()I
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam.setCurrentPage:(I)V
|
||||
aload_1
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageInfo.getPageSize:()I
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam.setRowsOfPage:(I)V
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_1
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.get:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore 4
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq 198
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cloud/page/CloudwalkPageAble
|
||||
astore 5
|
||||
aload 5
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageAble.getDatas:()Ljava/util/Collection;
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/CollectionUtils.isNotEmpty:(Ljava/util/Collection;)Z
|
||||
ifeq 198
|
||||
aload 5
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageAble.getDatas:()Ljava/util/Collection;
|
||||
ldc # // class cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copy:(Ljava/util/Collection;Ljava/lang/Class;)Ljava/util/List;
|
||||
astore 6
|
||||
aload 6
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 7
|
||||
aload 7
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 176
|
||||
aload 7
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult
|
||||
astore 8
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.getStatus:()Ljava/lang/Integer;
|
||||
iconst_1
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokestatic # // Method java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||
ifeq 126
|
||||
aload 8
|
||||
ldc # // String 禁用
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.setDeviceOnlineStatus:(Ljava/lang/String;)V
|
||||
goto 173
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.getOnlineStatus:()Ljava/lang/Integer;
|
||||
iconst_2
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokestatic # // Method java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||
ifeq 151
|
||||
aload 8
|
||||
ldc # // String 在线
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.setDeviceOnlineStatus:(Ljava/lang/String;)V
|
||||
goto 173
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.getOnlineStatus:()Ljava/lang/Integer;
|
||||
iconst_3
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokestatic # // Method java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||
ifeq 173
|
||||
aload 8
|
||||
ldc # // String 离线
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.setDeviceOnlineStatus:(Ljava/lang/String;)V
|
||||
goto 79
|
||||
new # // class cn/cloudwalk/cloud/page/CloudwalkPageAble
|
||||
dup
|
||||
aload 6
|
||||
aload_2
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cloud/page/CloudwalkPageAble
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageAble.getTotalRows:()J
|
||||
invokespecial # // Method cn/cloudwalk/cloud/page/CloudwalkPageAble."<init>":(Ljava/util/Collection;Lcn/cloudwalk/cloud/page/CloudwalkPageInfo;J)V
|
||||
areturn
|
||||
new # // class cn/cloudwalk/cloud/exception/ServiceException
|
||||
dup
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getCode:()Ljava/lang/String;
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getMessage:()Ljava/lang/String;
|
||||
invokespecial # // Method cn/cloudwalk/cloud/exception/ServiceException."<init>":(Ljava/lang/String;Ljava/lang/String;)V
|
||||
athrow
|
||||
protected cn.cloudwalk.cloud.result.CloudwalkResult<java.lang.String> createLocalFile(cn.cloudwalk.elevator.device.param.AcsElevatorDeviceQueryParam, java.lang.String, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
aconst_null
|
||||
areturn
|
||||
protected java.lang.String getDefaultFileName();
|
||||
Code:
|
||||
new # // class java/lang/StringBuilder
|
||||
dup
|
||||
invokespecial # // Method java/lang/StringBuilder."<init>":()V
|
||||
ldc # // String 派梯设备导出
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
new # // class java/util/Date
|
||||
dup
|
||||
invokespecial # // Method java/util/Date."<init>":()V
|
||||
ldc # // String yyyyMMddHHmmss
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/DateUtils.formatDate:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
areturn
|
||||
protected java.lang.String getDefaultFileTitleName();
|
||||
Code:
|
||||
ldc # // String 派梯设备
|
||||
areturn
|
||||
protected cn.cloudwalk.cloud.result.CloudwalkResult createLocalFile(java.lang.Object, java.lang.String, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
checkcast # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
aload_2
|
||||
aload_3
|
||||
invokevirtual # // Method createLocalFile:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
protected cn.cloudwalk.cloud.page.CloudwalkPageAble queryPage(java.lang.Object, cn.cloudwalk.cloud.page.CloudwalkPageInfo, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
checkcast # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
aload_2
|
||||
aload_3
|
||||
invokevirtual # // Method queryPage:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;Lcn/cloudwalk/cloud/page/CloudwalkPageInfo;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/page/CloudwalkPageAble;
|
||||
areturn
|
||||
}
|
||||
+139
@@ -0,0 +1,139 @@
|
||||
public class cn.cloudwalk.elevator.export.impl.ElevatorDeviceExportService extends cn.cloudwalk.elevator.export.AcsAbstractExportAsyncService<cn.cloudwalk.elevator.device.param.AcsElevatorDeviceQueryParam, cn.cloudwalk.elevator.export.result.ElevatorDeviceRecordExcelResult> {
|
||||
private cn.cloudwalk.elevator.device.service.AcsElevatorDeviceService elevatorDeviceService;
|
||||
public cn.cloudwalk.elevator.export.impl.ElevatorDeviceExportService();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/export/AcsAbstractExportAsyncService."<init>":()V
|
||||
return
|
||||
protected cn.cloudwalk.cloud.page.CloudwalkPageAble<cn.cloudwalk.elevator.export.result.ElevatorDeviceRecordExcelResult> queryPage(cn.cloudwalk.elevator.device.param.AcsElevatorDeviceQueryParam, cn.cloudwalk.cloud.page.CloudwalkPageInfo, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
aload_1
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageInfo.getCurrentPage:()I
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam.setCurrentPage:(I)V
|
||||
aload_1
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageInfo.getPageSize:()I
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam.setRowsOfPage:(I)V
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_1
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.get:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore 4
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq 198
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cloud/page/CloudwalkPageAble
|
||||
astore 5
|
||||
aload 5
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageAble.getDatas:()Ljava/util/Collection;
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/CollectionUtils.isNotEmpty:(Ljava/util/Collection;)Z
|
||||
ifeq 198
|
||||
aload 5
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageAble.getDatas:()Ljava/util/Collection;
|
||||
ldc # // class cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copy:(Ljava/util/Collection;Ljava/lang/Class;)Ljava/util/List;
|
||||
astore 6
|
||||
aload 6
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 7
|
||||
aload 7
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 176
|
||||
aload 7
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult
|
||||
astore 8
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.getStatus:()Ljava/lang/Integer;
|
||||
iconst_1
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokestatic # // Method java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||
ifeq 126
|
||||
aload 8
|
||||
ldc # // String 禁用
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.setDeviceOnlineStatus:(Ljava/lang/String;)V
|
||||
goto 79
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.getOnlineStatus:()Ljava/lang/Integer;
|
||||
iconst_2
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokestatic # // Method java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||
ifeq 151
|
||||
aload 8
|
||||
ldc # // String 在线
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.setDeviceOnlineStatus:(Ljava/lang/String;)V
|
||||
goto 79
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.getOnlineStatus:()Ljava/lang/Integer;
|
||||
iconst_3
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokestatic # // Method java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||
ifeq 173
|
||||
aload 8
|
||||
ldc # // String 离线
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/export/result/ElevatorDeviceRecordExcelResult.setDeviceOnlineStatus:(Ljava/lang/String;)V
|
||||
goto 79
|
||||
new # // class cn/cloudwalk/cloud/page/CloudwalkPageAble
|
||||
dup
|
||||
aload 6
|
||||
aload_2
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cloud/page/CloudwalkPageAble
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/page/CloudwalkPageAble.getTotalRows:()J
|
||||
invokespecial # // Method cn/cloudwalk/cloud/page/CloudwalkPageAble."<init>":(Ljava/util/Collection;Lcn/cloudwalk/cloud/page/CloudwalkPageInfo;J)V
|
||||
areturn
|
||||
new # // class cn/cloudwalk/cloud/exception/ServiceException
|
||||
dup
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getCode:()Ljava/lang/String;
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getMessage:()Ljava/lang/String;
|
||||
invokespecial # // Method cn/cloudwalk/cloud/exception/ServiceException."<init>":(Ljava/lang/String;Ljava/lang/String;)V
|
||||
athrow
|
||||
protected cn.cloudwalk.cloud.result.CloudwalkResult<java.lang.String> createLocalFile(cn.cloudwalk.elevator.device.param.AcsElevatorDeviceQueryParam, java.lang.String, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
aconst_null
|
||||
areturn
|
||||
protected java.lang.String getDefaultFileName();
|
||||
Code:
|
||||
new # // class java/lang/StringBuilder
|
||||
dup
|
||||
invokespecial # // Method java/lang/StringBuilder."<init>":()V
|
||||
ldc # // String 派梯设备导出
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
new # // class java/util/Date
|
||||
dup
|
||||
invokespecial # // Method java/util/Date."<init>":()V
|
||||
ldc # // String yyyyMMddHHmmss
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/DateUtils.formatDate:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
areturn
|
||||
protected java.lang.String getDefaultFileTitleName();
|
||||
Code:
|
||||
ldc # // String 派梯设备
|
||||
areturn
|
||||
protected cn.cloudwalk.cloud.result.CloudwalkResult createLocalFile(java.lang.Object, java.lang.String, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
checkcast # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
aload_2
|
||||
aload_3
|
||||
invokevirtual # // Method createLocalFile:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
protected cn.cloudwalk.cloud.page.CloudwalkPageAble queryPage(java.lang.Object, cn.cloudwalk.cloud.page.CloudwalkPageInfo, cn.cloudwalk.cloud.context.CloudwalkCallContext) throws cn.cloudwalk.cloud.exception.ServiceException;
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
checkcast # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
aload_2
|
||||
aload_3
|
||||
invokevirtual # // Method queryPage:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;Lcn/cloudwalk/cloud/page/CloudwalkPageInfo;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/page/CloudwalkPageAble;
|
||||
areturn
|
||||
}
|
||||
+330
@@ -0,0 +1,330 @@
|
||||
--- cn.cloudwalk.elevator.export.utils.ExcelUtil.v1
|
||||
+++ cn.cloudwalk.elevator.export.utils.ExcelUtil.v2
|
||||
@@ -73,14 +73,13 @@
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpgt 346
|
||||
+if_icmpgt 345
|
||||
aload _
|
||||
iload _
|
||||
invokeinterface # // InterfaceMethod org/apache/poi/ss/usermodel/Sheet.getRow:(I)Lorg/apache/poi/ss/usermodel/Row;
|
||||
astore _
|
||||
aload _
|
||||
-ifnonnull @
|
||||
-goto @
|
||||
+ifnull @
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod org/apache/poi/ss/usermodel/Row.cellIterator:()Ljava/util/Iterator;
|
||||
astore _
|
||||
@@ -107,8 +106,8 @@
|
||||
ifne @
|
||||
goto @
|
||||
aload _
|
||||
-iconst_1
|
||||
-invokeinterface # // InterfaceMethod org/apache/poi/ss/usermodel/Cell.setCellType:(I)V
|
||||
+getstatic # // Field org/apache/poi/ss/usermodel/CellType.STRING:Lorg/apache/poi/ss/usermodel/CellType;
|
||||
+invokeinterface # // InterfaceMethod org/apache/poi/ss/usermodel/Cell.setCellType:(Lorg/apache/poi/ss/usermodel/CellType;)V
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod org/apache/poi/ss/usermodel/Cell.getStringCellValue:()Ljava/lang/String;
|
||||
astore _
|
||||
@@ -200,12 +199,12 @@
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
-356 363 366 Class java/lang/Throwable
|
||||
-18 346 388 Class java/lang/Throwable
|
||||
-18 346 397 any
|
||||
-409 416 419 Class java/lang/Throwable
|
||||
-388 399 397 any
|
||||
-9 441 444 Class java/lang/Exception
|
||||
+355 362 365 Class java/lang/Throwable
|
||||
+18 345 387 Class java/lang/Throwable
|
||||
+18 345 396 any
|
||||
+408 415 418 Class java/lang/Throwable
|
||||
+387 398 396 any
|
||||
+9 440 443 Class java/lang/Exception
|
||||
private static <T> void setValue(T, java.lang.String, java.lang.reflect.Field, java.lang.Class<?>) throws java.lang.IllegalAccessException;
|
||||
Code:
|
||||
ldc # // class java/lang/String
|
||||
@@ -574,7 +573,7 @@
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpge 103
|
||||
+if_icmpge 100
|
||||
aload _
|
||||
iload _
|
||||
aaload
|
||||
@@ -588,8 +587,7 @@
|
||||
ifnull @
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/export/ExcelAttribute.isExport:()Z
|
||||
-ifne @
|
||||
-goto @
|
||||
+ifeq @
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
@@ -614,7 +612,7 @@
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpgt 227
|
||||
+if_icmpgt 224
|
||||
aload _
|
||||
invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFWorkbook.createSheet:()Lorg/apache/poi/hssf/usermodel/HSSFSheet;
|
||||
astore _
|
||||
@@ -711,13 +709,13 @@
|
||||
athrow
|
||||
Exception table:
|
||||
from to target type
|
||||
-259 264 267 Class java/lang/Throwable
|
||||
-12 249 287 Class java/lang/Throwable
|
||||
-12 249 296 any
|
||||
-308 313 316 Class java/lang/Throwable
|
||||
-287 298 296 any
|
||||
-0 284 336 Class java/lang/Exception
|
||||
-287 336 336 Class java/lang/Exception
|
||||
+256 261 264 Class java/lang/Throwable
|
||||
+12 246 284 Class java/lang/Throwable
|
||||
+12 246 293 any
|
||||
+305 310 313 Class java/lang/Throwable
|
||||
+284 295 293 any
|
||||
+0 281 333 Class java/lang/Exception
|
||||
+284 333 333 Class java/lang/Exception
|
||||
public static <T> boolean getListToExcel(java.util.List<T>, java.lang.String, java.io.OutputStream, java.lang.Class<T>, java.lang.Integer, cn.cloudwalk.elevator.export.ExcelCallback) throws java.lang.Exception;
|
||||
Code:
|
||||
new # // class org/apache/poi/hssf/usermodel/HSSFWorkbook
|
||||
@@ -744,7 +742,7 @@
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpge 103
|
||||
+if_icmpge 100
|
||||
aload _
|
||||
iload _
|
||||
aaload
|
||||
@@ -758,8 +756,7 @@
|
||||
ifnull @
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/export/ExcelAttribute.isExport:()Z
|
||||
-ifne @
|
||||
-goto @
|
||||
+ifeq @
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
@@ -784,7 +781,7 @@
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpgt 254
|
||||
+if_icmpgt 251
|
||||
aload _
|
||||
invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFWorkbook.createSheet:()Lorg/apache/poi/hssf/usermodel/HSSFSheet;
|
||||
astore _
|
||||
@@ -828,7 +825,7 @@
|
||||
invokestatic # // Method createRowContent:(Lorg/apache/poi/hssf/usermodel/HSSFSheet;Ljava/util/List;Lorg/apache/poi/hssf/usermodel/HSSFWorkbook;Ljava/util/List;III)V
|
||||
aconst_null
|
||||
aload _
|
||||
-if_acmpeq 248
|
||||
+if_acmpeq 245
|
||||
aload _
|
||||
aload _
|
||||
aload _
|
||||
@@ -892,13 +889,13 @@
|
||||
athrow
|
||||
Exception table:
|
||||
from to target type
|
||||
-286 291 294 Class java/lang/Throwable
|
||||
-12 276 314 Class java/lang/Throwable
|
||||
-12 276 323 any
|
||||
-335 340 343 Class java/lang/Throwable
|
||||
-314 325 323 any
|
||||
-0 311 363 Class java/lang/Exception
|
||||
-314 363 363 Class java/lang/Exception
|
||||
+283 288 291 Class java/lang/Throwable
|
||||
+12 273 311 Class java/lang/Throwable
|
||||
+12 273 320 any
|
||||
+332 337 340 Class java/lang/Throwable
|
||||
+311 322 320 any
|
||||
+0 308 360 Class java/lang/Exception
|
||||
+311 360 360 Class java/lang/Exception
|
||||
private static <T> void createRowContent(org.apache.poi.hssf.usermodel.HSSFSheet, java.util.List<java.lang.reflect.Field>, org.apache.poi.hssf.usermodel.HSSFWorkbook, java.util.List<T>, int, int, int) throws java.lang.Exception;
|
||||
Code:
|
||||
aconst_null
|
||||
@@ -911,7 +908,7 @@
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpge 416
|
||||
+if_icmpge 410
|
||||
aload _
|
||||
iload _
|
||||
iload _
|
||||
@@ -929,7 +926,7 @@
|
||||
iload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
-if_icmpge 410
|
||||
+if_icmpge 404
|
||||
aload _
|
||||
iload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
|
||||
@@ -955,8 +952,7 @@
|
||||
istore _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/export/ExcelAttribute.isExport:()Z
|
||||
-ifne @
|
||||
-goto @
|
||||
+ifeq @
|
||||
aload _
|
||||
iload _
|
||||
invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFRow.createCell:(I)Lorg/apache/poi/hssf/usermodel/HSSFCell;
|
||||
@@ -967,8 +963,7 @@
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method java/lang/reflect/Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
-ifnonnull @
|
||||
-goto @
|
||||
+ifnull @
|
||||
aconst_null
|
||||
astore _
|
||||
aload _
|
||||
@@ -1071,14 +1066,14 @@
|
||||
goto @
|
||||
aload _
|
||||
invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFCell.setCellValue:(Ljava/lang/String;)V
|
||||
-iinc 17, 1
|
||||
-goto @
|
||||
-iinc 15, 1
|
||||
+iinc 13, 1
|
||||
+goto @
|
||||
+iinc 10, 1
|
||||
goto @
|
||||
return
|
||||
Exception table:
|
||||
from to target type
|
||||
-247 290 293 Class java/lang/Exception
|
||||
+241 284 287 Class java/lang/Exception
|
||||
public static void createRowHeard(org.apache.poi.hssf.usermodel.HSSFSheet, java.util.List<java.lang.reflect.Field>, org.apache.poi.hssf.usermodel.HSSFWorkbook, int);
|
||||
Code:
|
||||
aload _
|
||||
@@ -1090,7 +1085,7 @@
|
||||
iload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
-if_icmpge 185
|
||||
+if_icmpge 187
|
||||
iload _
|
||||
istore _
|
||||
aload _
|
||||
@@ -1149,13 +1144,13 @@
|
||||
d2i
|
||||
invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFSheet.setColumnWidth:(II)V
|
||||
aload _
|
||||
-iconst_1
|
||||
-invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFCell.setCellType:(I)V
|
||||
+getstatic # // Field org/apache/poi/ss/usermodel/CellType.STRING:Lorg/apache/poi/ss/usermodel/CellType;
|
||||
+invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFCell.setCellType:(Lorg/apache/poi/ss/usermodel/CellType;)V
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/export/ExcelAttribute.name:()Ljava/lang/String;
|
||||
invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFCell.setCellValue:(Ljava/lang/String;)V
|
||||
-iinc 10, 1
|
||||
+iinc 5, 1
|
||||
goto @
|
||||
return
|
||||
private static org.apache.poi.hssf.usermodel.HSSFCellStyle createCellStyle(org.apache.poi.hssf.usermodel.HSSFWorkbook, java.lang.String);
|
||||
@@ -1170,14 +1165,15 @@
|
||||
ldc # // String Arail narrow
|
||||
invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFFont.setFontName:(Ljava/lang/String;)V
|
||||
aload _
|
||||
-sipush 700
|
||||
-invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFFont.setBoldweight:(S)V
|
||||
+iconst_1
|
||||
+invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFFont.setBold:(Z)V
|
||||
ldc # // String 1
|
||||
aload _
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq @
|
||||
aload _
|
||||
-sipush 32767
|
||||
+getstatic # // Field org/apache/poi/ss/usermodel/IndexedColors.RED:Lorg/apache/poi/ss/usermodel/IndexedColors;
|
||||
+invokevirtual # // Method org/apache/poi/ss/usermodel/IndexedColors.getIndex:()S
|
||||
invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFFont.setColor:(S)V
|
||||
aload _
|
||||
aload _
|
||||
@@ -1329,7 +1325,7 @@
|
||||
dup
|
||||
istore _
|
||||
iconst_m1
|
||||
-if_icmpeq 95
|
||||
+if_icmpeq 97
|
||||
aload _
|
||||
aload _
|
||||
iconst_0
|
||||
@@ -1420,12 +1416,12 @@
|
||||
athrow
|
||||
Exception table:
|
||||
from to target type
|
||||
-109 113 116 Class java/io/IOException
|
||||
-155 159 162 Class java/io/IOException
|
||||
-13 105 200 any
|
||||
-206 210 213 Class java/io/IOException
|
||||
-252 256 259 Class java/io/IOException
|
||||
-200 202 200 any
|
||||
+112 116 119 Class java/io/IOException
|
||||
+158 162 165 Class java/io/IOException
|
||||
+13 108 203 any
|
||||
+209 213 216 Class java/io/IOException
|
||||
+255 259 262 Class java/io/IOException
|
||||
+203 205 203 any
|
||||
public static void setExcelAttribute(cn.cloudwalk.elevator.export.ExcelAttribute, java.lang.String, java.lang.Object, boolean);
|
||||
Code:
|
||||
aload _
|
||||
@@ -1514,7 +1510,7 @@
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpge 101
|
||||
+if_icmpge 98
|
||||
aload _
|
||||
iload _
|
||||
aaload
|
||||
@@ -1528,8 +1524,7 @@
|
||||
ifnull @
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/export/ExcelAttribute.isExport:()Z
|
||||
-ifne @
|
||||
-goto @
|
||||
+ifeq @
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
@@ -1613,15 +1608,15 @@
|
||||
athrow
|
||||
Exception table:
|
||||
from to target type
|
||||
-162 167 170 Class java/lang/Throwable
|
||||
-13 152 194 Class java/lang/Throwable
|
||||
-13 152 203 any
|
||||
-215 220 223 Class java/lang/Throwable
|
||||
-194 205 203 any
|
||||
-0 187 243 Class java/io/IOException
|
||||
-194 243 243 Class java/io/IOException
|
||||
-0 187 257 any
|
||||
-194 259 257 any
|
||||
+159 164 167 Class java/lang/Throwable
|
||||
+13 149 191 Class java/lang/Throwable
|
||||
+13 149 200 any
|
||||
+212 217 220 Class java/lang/Throwable
|
||||
+191 202 200 any
|
||||
+0 184 240 Class java/io/IOException
|
||||
+191 240 240 Class java/io/IOException
|
||||
+0 184 254 any
|
||||
+191 256 254 any
|
||||
static {};
|
||||
Code:
|
||||
ldc # // class cn/cloudwalk/elevator/export/utils/ExcelUtil
|
||||
+1635
File diff suppressed because it is too large
Load Diff
+1630
File diff suppressed because it is too large
Load Diff
+45
@@ -0,0 +1,45 @@
|
||||
--- cn.cloudwalk.elevator.handler.OpenDoorRecordEventHandler.v1
|
||||
+++ cn.cloudwalk.elevator.handler.OpenDoorRecordEventHandler.v2
|
||||
@@ -23,7 +23,7 @@
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getDeviceId:()Ljava/lang/String;
|
||||
aload_2
|
||||
-invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler.queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
+invokevirtual # // Method queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
astore_3
|
||||
aload_0
|
||||
aload_1
|
||||
@@ -62,8 +62,7 @@
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.getIdentifyType:()I
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokevirtual # // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z
|
||||
-ifeq @
|
||||
-goto @
|
||||
+ifne @
|
||||
aload _
|
||||
ifnull @
|
||||
aload_0
|
||||
@@ -81,7 +80,7 @@
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.getRecordResult:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method java/lang/Integer.intValue:()I
|
||||
iconst_1
|
||||
-if_icmpne 209
|
||||
+if_icmpne 206
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq @
|
||||
@@ -116,10 +115,10 @@
|
||||
return
|
||||
Exception table:
|
||||
from to target type
|
||||
-14 209 215 Class java/lang/Exception
|
||||
-14 209 233 any
|
||||
-215 227 233 any
|
||||
-233 235 233 any
|
||||
+14 206 212 Class java/lang/Exception
|
||||
+14 206 230 any
|
||||
+212 224 230 any
|
||||
+230 232 230 any
|
||||
private void cleanCache(cn.cloudwalk.cloud.context.CloudwalkCallContext, cn.cloudwalk.client.cwoscomponent.intelligent.device.result.DeviceResult, java.lang.String, java.lang.String);
|
||||
Code:
|
||||
aload_2
|
||||
+196
@@ -0,0 +1,196 @@
|
||||
public class cn.cloudwalk.elevator.handler.OpenDoorRecordEventHandler extends cn.cloudwalk.elevator.handler.AbstractEventHandler implements cn.cloudwalk.event.handler.EventHandler<cn.cloudwalk.cwos.client.event.event.OpenDoorRecordEvent> {
|
||||
private static final org.slf4j.Logger LOGGER;
|
||||
private cn.cloudwalk.elevator.record.service.AcsElevatorRecordService acsElevatorRecordService;
|
||||
private org.springframework.data.redis.core.RedisTemplate<java.lang.String, java.lang.Object> redisTemplate;
|
||||
public cn.cloudwalk.elevator.handler.OpenDoorRecordEventHandler();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler."<init>":()V
|
||||
return
|
||||
public void onEvent(cn.cloudwalk.cwos.client.event.event.OpenDoorRecordEvent);
|
||||
Code:
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 收到openDoorRecordEvent消息:{}
|
||||
aload_1
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getBusinessId:()Ljava/lang/String;
|
||||
invokevirtual # // Method getCloudwalkContext:(Ljava/lang/String;)Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
astore_2
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getDeviceId:()Ljava/lang/String;
|
||||
aload_2
|
||||
invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler.queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
astore_3
|
||||
aload_0
|
||||
aload_1
|
||||
invokespecial # // Method getParam:(Lcn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent;)Lcn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam;
|
||||
astore _
|
||||
aload _
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.setDeviceResult:(Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;)V
|
||||
aconst_null
|
||||
astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getReserveInfo:()Ljava/lang/String;
|
||||
invokestatic # // Method org/apache/commons/lang3/StringUtils.isNotBlank:(Ljava/lang/CharSequence;)Z
|
||||
ifeq @
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getReserveInfo:()Ljava/lang/String;
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.parseObject:(Ljava/lang/String;)Lcom/alibaba/fastjson/JSONObject;
|
||||
astore _
|
||||
aload _
|
||||
invokevirtual # // Method com/alibaba/fastjson/JSONObject.isEmpty:()Z
|
||||
ifne @
|
||||
aload _
|
||||
ldc # // String srcFloor
|
||||
invokevirtual # // Method com/alibaba/fastjson/JSONObject.containsKey:(Ljava/lang/Object;)Z
|
||||
ifeq @
|
||||
aload _
|
||||
ldc # // class cn/cloudwalk/elevator/record/dto/AcsElevatorRecordExtraDTO
|
||||
invokevirtual # // Method com/alibaba/fastjson/JSONObject.toJavaObject:(Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/dto/AcsElevatorRecordExtraDTO
|
||||
astore _
|
||||
aload_3
|
||||
ifnull @
|
||||
getstatic # // Field cn/cloudwalk/elevator/em/AcsDeviceIdentifyTypeEnum.BACKEND_REG:Lcn/cloudwalk/elevator/em/AcsDeviceIdentifyTypeEnum;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/em/AcsDeviceIdentifyTypeEnum.getCode:()Ljava/lang/Integer;
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.getIdentifyType:()I
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokevirtual # // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z
|
||||
ifeq @
|
||||
goto @
|
||||
aload _
|
||||
ifnull @
|
||||
aload_0
|
||||
aload _
|
||||
aload _
|
||||
invokespecial # // Method getElevatorParam:(Lcn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam;Lcn/cloudwalk/elevator/record/dto/AcsElevatorRecordExtraDTO;)Lcn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam;
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field acsElevatorRecordService:Lcn/cloudwalk/elevator/record/service/AcsElevatorRecordService;
|
||||
aload _
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/service/AcsElevatorRecordService.add:(Lcn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.getRecordResult:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method java/lang/Integer.intValue:()I
|
||||
iconst_1
|
||||
if_icmpne 209
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq @
|
||||
ldc # // String 1
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/AcsElevatorRecordExtraDTO.getSrcFloor:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq @
|
||||
aload_0
|
||||
new # // class java/util/Date
|
||||
dup
|
||||
invokespecial # // Method java/util/Date."<init>":()V
|
||||
ldc # // String yyyy-MM-dd
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/DateUtils.parseDate:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getBusinessId:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/AcsCacheKeyUtil.getOpenDoorCountKey:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method statisticsAddCache:(Ljava/lang/String;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
goto @
|
||||
astore_2
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 消费开门记录失败,原因:
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
goto @
|
||||
astore _
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
aload _
|
||||
athrow
|
||||
return
|
||||
Exception table:
|
||||
from to target type
|
||||
14 209 215 Class java/lang/Exception
|
||||
14 209 233 any
|
||||
215 227 233 any
|
||||
233 235 233 any
|
||||
private void cleanCache(cn.cloudwalk.cloud.context.CloudwalkCallContext, cn.cloudwalk.client.cwoscomponent.intelligent.device.result.DeviceResult, java.lang.String, java.lang.String);
|
||||
Code:
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.getDeviceCode:()Ljava/lang/String;
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getCompany:()Lcn/cloudwalk/cloud/session/company/CompanyContext;
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/session/company/CompanyContext.getCompanyId:()Ljava/lang/String;
|
||||
aload _
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/AcsCacheKeyUtil.getBackendRegLogIdKey:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getCompany:()Lcn/cloudwalk/cloud/session/company/CompanyContext;
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/session/company/CompanyContext.getCompanyId:()Ljava/lang/String;
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/AcsCacheKeyUtil.getBackendRegExpireKey:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field redisTemplate:Lorg/springframework/data/redis/core/RedisTemplate;
|
||||
aload _
|
||||
invokevirtual # // Method org/springframework/data/redis/core/RedisTemplate.delete:(Ljava/lang/Object;)V
|
||||
aload_0
|
||||
getfield # // Field redisTemplate:Lorg/springframework/data/redis/core/RedisTemplate;
|
||||
aload _
|
||||
invokevirtual # // Method org/springframework/data/redis/core/RedisTemplate.delete:(Ljava/lang/Object;)V
|
||||
return
|
||||
private cn.cloudwalk.elevator.record.param.AcsOpenDoorRecordAddParam getParam(cn.cloudwalk.cwos.client.event.event.OpenDoorRecordEvent);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam
|
||||
astore_2
|
||||
aload_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getRecordResult:()Ljava/lang/String;
|
||||
invokestatic # // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.setRecordResult:(Ljava/lang/Integer;)V
|
||||
aload_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getDeviceId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.setDeviceCode:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getOpenDoorType:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.setOpenDoorType:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
areturn
|
||||
private cn.cloudwalk.elevator.record.param.AcsElevatorRecordAddParam getElevatorParam(cn.cloudwalk.elevator.record.param.AcsOpenDoorRecordAddParam, cn.cloudwalk.elevator.record.dto.AcsElevatorRecordExtraDTO);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
astore_3
|
||||
aload_2
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
areturn
|
||||
public void onEvent(cn.cloudwalk.cwos.client.event.event.BaseEvent);
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
checkcast # // class cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent
|
||||
invokevirtual # // Method onEvent:(Lcn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent;)V
|
||||
return
|
||||
static {};
|
||||
Code:
|
||||
ldc # // class cn/cloudwalk/elevator/handler/OpenDoorRecordEventHandler
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
return
|
||||
}
|
||||
+195
@@ -0,0 +1,195 @@
|
||||
public class cn.cloudwalk.elevator.handler.OpenDoorRecordEventHandler extends cn.cloudwalk.elevator.handler.AbstractEventHandler implements cn.cloudwalk.event.handler.EventHandler<cn.cloudwalk.cwos.client.event.event.OpenDoorRecordEvent> {
|
||||
private static final org.slf4j.Logger LOGGER;
|
||||
private cn.cloudwalk.elevator.record.service.AcsElevatorRecordService acsElevatorRecordService;
|
||||
private org.springframework.data.redis.core.RedisTemplate<java.lang.String, java.lang.Object> redisTemplate;
|
||||
public cn.cloudwalk.elevator.handler.OpenDoorRecordEventHandler();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler."<init>":()V
|
||||
return
|
||||
public void onEvent(cn.cloudwalk.cwos.client.event.event.OpenDoorRecordEvent);
|
||||
Code:
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 收到openDoorRecordEvent消息:{}
|
||||
aload_1
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getBusinessId:()Ljava/lang/String;
|
||||
invokevirtual # // Method getCloudwalkContext:(Ljava/lang/String;)Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
astore_2
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getDeviceId:()Ljava/lang/String;
|
||||
aload_2
|
||||
invokevirtual # // Method queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
astore_3
|
||||
aload_0
|
||||
aload_1
|
||||
invokespecial # // Method getParam:(Lcn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent;)Lcn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam;
|
||||
astore _
|
||||
aload _
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.setDeviceResult:(Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;)V
|
||||
aconst_null
|
||||
astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getReserveInfo:()Ljava/lang/String;
|
||||
invokestatic # // Method org/apache/commons/lang3/StringUtils.isNotBlank:(Ljava/lang/CharSequence;)Z
|
||||
ifeq @
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getReserveInfo:()Ljava/lang/String;
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.parseObject:(Ljava/lang/String;)Lcom/alibaba/fastjson/JSONObject;
|
||||
astore _
|
||||
aload _
|
||||
invokevirtual # // Method com/alibaba/fastjson/JSONObject.isEmpty:()Z
|
||||
ifne @
|
||||
aload _
|
||||
ldc # // String srcFloor
|
||||
invokevirtual # // Method com/alibaba/fastjson/JSONObject.containsKey:(Ljava/lang/Object;)Z
|
||||
ifeq @
|
||||
aload _
|
||||
ldc # // class cn/cloudwalk/elevator/record/dto/AcsElevatorRecordExtraDTO
|
||||
invokevirtual # // Method com/alibaba/fastjson/JSONObject.toJavaObject:(Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/dto/AcsElevatorRecordExtraDTO
|
||||
astore _
|
||||
aload_3
|
||||
ifnull @
|
||||
getstatic # // Field cn/cloudwalk/elevator/em/AcsDeviceIdentifyTypeEnum.BACKEND_REG:Lcn/cloudwalk/elevator/em/AcsDeviceIdentifyTypeEnum;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/em/AcsDeviceIdentifyTypeEnum.getCode:()Ljava/lang/Integer;
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.getIdentifyType:()I
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokevirtual # // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z
|
||||
ifne @
|
||||
aload _
|
||||
ifnull @
|
||||
aload_0
|
||||
aload _
|
||||
aload _
|
||||
invokespecial # // Method getElevatorParam:(Lcn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam;Lcn/cloudwalk/elevator/record/dto/AcsElevatorRecordExtraDTO;)Lcn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam;
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field acsElevatorRecordService:Lcn/cloudwalk/elevator/record/service/AcsElevatorRecordService;
|
||||
aload _
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/service/AcsElevatorRecordService.add:(Lcn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.getRecordResult:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method java/lang/Integer.intValue:()I
|
||||
iconst_1
|
||||
if_icmpne 206
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq @
|
||||
ldc # // String 1
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/AcsElevatorRecordExtraDTO.getSrcFloor:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq @
|
||||
aload_0
|
||||
new # // class java/util/Date
|
||||
dup
|
||||
invokespecial # // Method java/util/Date."<init>":()V
|
||||
ldc # // String yyyy-MM-dd
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/DateUtils.parseDate:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getBusinessId:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/AcsCacheKeyUtil.getOpenDoorCountKey:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method statisticsAddCache:(Ljava/lang/String;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
goto @
|
||||
astore_2
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 消费开门记录失败,原因:
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
goto @
|
||||
astore _
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
aload _
|
||||
athrow
|
||||
return
|
||||
Exception table:
|
||||
from to target type
|
||||
14 206 212 Class java/lang/Exception
|
||||
14 206 230 any
|
||||
212 224 230 any
|
||||
230 232 230 any
|
||||
private void cleanCache(cn.cloudwalk.cloud.context.CloudwalkCallContext, cn.cloudwalk.client.cwoscomponent.intelligent.device.result.DeviceResult, java.lang.String, java.lang.String);
|
||||
Code:
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.getDeviceCode:()Ljava/lang/String;
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getCompany:()Lcn/cloudwalk/cloud/session/company/CompanyContext;
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/session/company/CompanyContext.getCompanyId:()Ljava/lang/String;
|
||||
aload _
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/AcsCacheKeyUtil.getBackendRegLogIdKey:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getCompany:()Lcn/cloudwalk/cloud/session/company/CompanyContext;
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/session/company/CompanyContext.getCompanyId:()Ljava/lang/String;
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/AcsCacheKeyUtil.getBackendRegExpireKey:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field redisTemplate:Lorg/springframework/data/redis/core/RedisTemplate;
|
||||
aload _
|
||||
invokevirtual # // Method org/springframework/data/redis/core/RedisTemplate.delete:(Ljava/lang/Object;)V
|
||||
aload_0
|
||||
getfield # // Field redisTemplate:Lorg/springframework/data/redis/core/RedisTemplate;
|
||||
aload _
|
||||
invokevirtual # // Method org/springframework/data/redis/core/RedisTemplate.delete:(Ljava/lang/Object;)V
|
||||
return
|
||||
private cn.cloudwalk.elevator.record.param.AcsOpenDoorRecordAddParam getParam(cn.cloudwalk.cwos.client.event.event.OpenDoorRecordEvent);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam
|
||||
astore_2
|
||||
aload_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getRecordResult:()Ljava/lang/String;
|
||||
invokestatic # // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.setRecordResult:(Ljava/lang/Integer;)V
|
||||
aload_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getDeviceId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.setDeviceCode:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent.getOpenDoorType:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsOpenDoorRecordAddParam.setOpenDoorType:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
areturn
|
||||
private cn.cloudwalk.elevator.record.param.AcsElevatorRecordAddParam getElevatorParam(cn.cloudwalk.elevator.record.param.AcsOpenDoorRecordAddParam, cn.cloudwalk.elevator.record.dto.AcsElevatorRecordExtraDTO);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
astore_3
|
||||
aload_2
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
areturn
|
||||
public void onEvent(cn.cloudwalk.cwos.client.event.event.BaseEvent);
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
checkcast # // class cn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent
|
||||
invokevirtual # // Method onEvent:(Lcn/cloudwalk/cwos/client/event/event/OpenDoorRecordEvent;)V
|
||||
return
|
||||
static {};
|
||||
Code:
|
||||
ldc # // class cn/cloudwalk/elevator/handler/OpenDoorRecordEventHandler
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
return
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
--- cn.cloudwalk.elevator.handler.PersonRecordEventHandler.v1
|
||||
+++ cn.cloudwalk.elevator.handler.PersonRecordEventHandler.v2
|
||||
@@ -22,13 +22,13 @@
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getDeviceId:()Ljava/lang/String;
|
||||
aload_2
|
||||
-invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler.queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
+invokevirtual # // Method queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
astore_3
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getSubDeviceId:()Ljava/lang/String;
|
||||
aload_2
|
||||
-invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler.queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
+invokevirtual # // Method queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getFaces:()Ljava/util/List;
|
||||
+198
@@ -0,0 +1,198 @@
|
||||
public class cn.cloudwalk.elevator.handler.PersonRecordEventHandler extends cn.cloudwalk.elevator.handler.AbstractEventHandler implements cn.cloudwalk.event.handler.EventHandler<cn.cloudwalk.cwos.client.event.event.PersonRecordUploadEvent> {
|
||||
private static final org.slf4j.Logger LOGGER;
|
||||
private cn.cloudwalk.elevator.record.service.AcsRecogRecordService acsRecogRecordService;
|
||||
public cn.cloudwalk.elevator.handler.PersonRecordEventHandler();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler."<init>":()V
|
||||
return
|
||||
public void onEvent(cn.cloudwalk.cwos.client.event.event.PersonRecordUploadEvent);
|
||||
Code:
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 收到personRecordUploadEvent消息:{}
|
||||
aload_1
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getBusinessId:()Ljava/lang/String;
|
||||
invokevirtual # // Method getCloudwalkContext:(Ljava/lang/String;)Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
astore_2
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getDeviceId:()Ljava/lang/String;
|
||||
aload_2
|
||||
invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler.queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
astore_3
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getSubDeviceId:()Ljava/lang/String;
|
||||
aload_2
|
||||
invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler.queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getFaces:()Ljava/util/List;
|
||||
invokeinterface # // InterfaceMethod java/util/List.stream:()Ljava/util/stream/Stream;
|
||||
invokedynamic # // InvokeDynamic #:apply:()Ljava/util/function/Function;
|
||||
invokestatic # // Method java/util/stream/Collectors.groupingBy:(Ljava/util/function/Function;)Ljava/util/stream/Collector;
|
||||
invokeinterface # // InterfaceMethod java/util/stream/Stream.collect:(Ljava/util/stream/Collector;)Ljava/lang/Object;
|
||||
checkcast # // class java/util/Map
|
||||
astore _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Map.keySet:()Ljava/util/Set;
|
||||
invokeinterface # // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
|
||||
astore _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq @
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class java/lang/String
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
iconst_0
|
||||
invokeinterface # // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cwos/client/event/event/mode/Face
|
||||
astore _
|
||||
aload_0
|
||||
aload_1
|
||||
aload _
|
||||
invokespecial # // Method getParam:(Lcn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent;Lcn/cloudwalk/cwos/client/event/event/mode/Face;)Lcn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam;
|
||||
astore _
|
||||
aload _
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setDeviceResult:(Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;)V
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setSubDeviceResult:(Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;)V
|
||||
aload_0
|
||||
getfield # // Field acsRecogRecordService:Lcn/cloudwalk/elevator/record/service/AcsRecogRecordService;
|
||||
aload _
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/service/AcsRecogRecordService.add:(Lcn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
pop
|
||||
aload_0
|
||||
new # // class java/util/Date
|
||||
dup
|
||||
invokespecial # // Method java/util/Date."<init>":()V
|
||||
ldc # // String yyyy-MM-dd
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/DateUtils.parseDate:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getBusinessId:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/AcsCacheKeyUtil.getRecogCountKey:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method statisticsAddCache:(Ljava/lang/String;)V
|
||||
goto @
|
||||
astore _
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 保存人员识别记录失败,faceId:{},原因:
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
goto @
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
goto @
|
||||
astore_2
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 消费人员识别记录失败,原因:
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
goto @
|
||||
astore _
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
aload _
|
||||
athrow
|
||||
return
|
||||
Exception table:
|
||||
from to target type
|
||||
107 188 191 Class java/lang/Exception
|
||||
14 210 216 Class java/lang/Exception
|
||||
14 210 234 any
|
||||
216 228 234 any
|
||||
234 236 234 any
|
||||
private cn.cloudwalk.elevator.record.param.AcsRecogRecordAddParam getParam(cn.cloudwalk.cwos.client.event.event.PersonRecordUploadEvent, cn.cloudwalk.cwos.client.event.event.mode.Face);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam
|
||||
astore_3
|
||||
aload_2
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
pop
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getPanoramaData:()Lcn/cloudwalk/cwos/client/event/event/mode/Panorama;
|
||||
ifnull @
|
||||
aload_3
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getPanoramaData:()Lcn/cloudwalk/cwos/client/event/event/mode/Panorama;
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Panorama.getPanoramaImagePath:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setPanoramaImagePath:(Ljava/lang/String;)V
|
||||
aload_3
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getDeviceId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setDeviceCode:(Ljava/lang/String;)V
|
||||
aload_3
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getThreshold:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setThreshold:(Ljava/math/BigDecimal;)V
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getScore:()Ljava/lang/Float;
|
||||
invokevirtual # // Method java/lang/Float.floatValue:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setScore:(Ljava/math/BigDecimal;)V
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getQualityScore:()Ljava/lang/Float;
|
||||
invokevirtual # // Method java/lang/Float.floatValue:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setQualityScore:(Ljava/math/BigDecimal;)V
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getMaskScore:()Ljava/lang/Float;
|
||||
ifnull @
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getMaskScore:()Ljava/lang/Float;
|
||||
invokevirtual # // Method java/lang/Float.floatValue:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setMaskScore:(Ljava/math/BigDecimal;)V
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getTempScore:()Ljava/lang/Float;
|
||||
ifnull @
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getTempScore:()Ljava/lang/Float;
|
||||
invokevirtual # // Method java/lang/Float.floatValue:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setTempScore:(Ljava/math/BigDecimal;)V
|
||||
aload_3
|
||||
getstatic # // Field cn/cloudwalk/elevator/em/CompareTypeEnum.RECOG:Lcn/cloudwalk/elevator/em/CompareTypeEnum;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/em/CompareTypeEnum.getCode:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setCompareType:(Ljava/lang/Integer;)V
|
||||
aload_3
|
||||
areturn
|
||||
public void onEvent(cn.cloudwalk.cwos.client.event.event.BaseEvent);
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
checkcast # // class cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent
|
||||
invokevirtual # // Method onEvent:(Lcn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent;)V
|
||||
return
|
||||
static {};
|
||||
Code:
|
||||
ldc # // class cn/cloudwalk/elevator/handler/PersonRecordEventHandler
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
return
|
||||
}
|
||||
+198
@@ -0,0 +1,198 @@
|
||||
public class cn.cloudwalk.elevator.handler.PersonRecordEventHandler extends cn.cloudwalk.elevator.handler.AbstractEventHandler implements cn.cloudwalk.event.handler.EventHandler<cn.cloudwalk.cwos.client.event.event.PersonRecordUploadEvent> {
|
||||
private static final org.slf4j.Logger LOGGER;
|
||||
private cn.cloudwalk.elevator.record.service.AcsRecogRecordService acsRecogRecordService;
|
||||
public cn.cloudwalk.elevator.handler.PersonRecordEventHandler();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/handler/AbstractEventHandler."<init>":()V
|
||||
return
|
||||
public void onEvent(cn.cloudwalk.cwos.client.event.event.PersonRecordUploadEvent);
|
||||
Code:
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 收到personRecordUploadEvent消息:{}
|
||||
aload_1
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getBusinessId:()Ljava/lang/String;
|
||||
invokevirtual # // Method getCloudwalkContext:(Ljava/lang/String;)Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
astore_2
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getDeviceId:()Ljava/lang/String;
|
||||
aload_2
|
||||
invokevirtual # // Method queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
astore_3
|
||||
aload_0
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getSubDeviceId:()Ljava/lang/String;
|
||||
aload_2
|
||||
invokevirtual # // Method queryDeviceResult:(Ljava/lang/String;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;
|
||||
astore _
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getFaces:()Ljava/util/List;
|
||||
invokeinterface # // InterfaceMethod java/util/List.stream:()Ljava/util/stream/Stream;
|
||||
invokedynamic # // InvokeDynamic #:apply:()Ljava/util/function/Function;
|
||||
invokestatic # // Method java/util/stream/Collectors.groupingBy:(Ljava/util/function/Function;)Ljava/util/stream/Collector;
|
||||
invokeinterface # // InterfaceMethod java/util/stream/Stream.collect:(Ljava/util/stream/Collector;)Ljava/lang/Object;
|
||||
checkcast # // class java/util/Map
|
||||
astore _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Map.keySet:()Ljava/util/Set;
|
||||
invokeinterface # // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
|
||||
astore _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq @
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class java/lang/String
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
iconst_0
|
||||
invokeinterface # // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cwos/client/event/event/mode/Face
|
||||
astore _
|
||||
aload_0
|
||||
aload_1
|
||||
aload _
|
||||
invokespecial # // Method getParam:(Lcn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent;Lcn/cloudwalk/cwos/client/event/event/mode/Face;)Lcn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam;
|
||||
astore _
|
||||
aload _
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setDeviceResult:(Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;)V
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setSubDeviceResult:(Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;)V
|
||||
aload_0
|
||||
getfield # // Field acsRecogRecordService:Lcn/cloudwalk/elevator/record/service/AcsRecogRecordService;
|
||||
aload _
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/service/AcsRecogRecordService.add:(Lcn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
pop
|
||||
aload_0
|
||||
new # // class java/util/Date
|
||||
dup
|
||||
invokespecial # // Method java/util/Date."<init>":()V
|
||||
ldc # // String yyyy-MM-dd
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/DateUtils.parseDate:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getBusinessId:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/AcsCacheKeyUtil.getRecogCountKey:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method statisticsAddCache:(Ljava/lang/String;)V
|
||||
goto @
|
||||
astore _
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 保存人员识别记录失败,faceId:{},原因:
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
goto @
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
goto @
|
||||
astore_2
|
||||
getstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 消费人员识别记录失败,原因:
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
goto @
|
||||
astore _
|
||||
invokestatic # // Method cn/cloudwalk/elevator/config/FeignThreadLocalUtil.remove:()V
|
||||
aload _
|
||||
athrow
|
||||
return
|
||||
Exception table:
|
||||
from to target type
|
||||
107 188 191 Class java/lang/Exception
|
||||
14 210 216 Class java/lang/Exception
|
||||
14 210 234 any
|
||||
216 228 234 any
|
||||
234 236 234 any
|
||||
private cn.cloudwalk.elevator.record.param.AcsRecogRecordAddParam getParam(cn.cloudwalk.cwos.client.event.event.PersonRecordUploadEvent, cn.cloudwalk.cwos.client.event.event.mode.Face);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam
|
||||
astore_3
|
||||
aload_2
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
pop
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getPanoramaData:()Lcn/cloudwalk/cwos/client/event/event/mode/Panorama;
|
||||
ifnull @
|
||||
aload_3
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getPanoramaData:()Lcn/cloudwalk/cwos/client/event/event/mode/Panorama;
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Panorama.getPanoramaImagePath:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setPanoramaImagePath:(Ljava/lang/String;)V
|
||||
aload_3
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getDeviceId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setDeviceCode:(Ljava/lang/String;)V
|
||||
aload_3
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent.getThreshold:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setThreshold:(Ljava/math/BigDecimal;)V
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getScore:()Ljava/lang/Float;
|
||||
invokevirtual # // Method java/lang/Float.floatValue:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setScore:(Ljava/math/BigDecimal;)V
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getQualityScore:()Ljava/lang/Float;
|
||||
invokevirtual # // Method java/lang/Float.floatValue:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setQualityScore:(Ljava/math/BigDecimal;)V
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getMaskScore:()Ljava/lang/Float;
|
||||
ifnull @
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getMaskScore:()Ljava/lang/Float;
|
||||
invokevirtual # // Method java/lang/Float.floatValue:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setMaskScore:(Ljava/math/BigDecimal;)V
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getTempScore:()Ljava/lang/Float;
|
||||
ifnull @
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/cwos/client/event/event/mode/Face.getTempScore:()Ljava/lang/Float;
|
||||
invokevirtual # // Method java/lang/Float.floatValue:()F
|
||||
f2d
|
||||
invokestatic # // Method java/math/BigDecimal.valueOf:(D)Ljava/math/BigDecimal;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setTempScore:(Ljava/math/BigDecimal;)V
|
||||
aload_3
|
||||
getstatic # // Field cn/cloudwalk/elevator/em/CompareTypeEnum.RECOG:Lcn/cloudwalk/elevator/em/CompareTypeEnum;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/em/CompareTypeEnum.getCode:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsRecogRecordAddParam.setCompareType:(Ljava/lang/Integer;)V
|
||||
aload_3
|
||||
areturn
|
||||
public void onEvent(cn.cloudwalk.cwos.client.event.event.BaseEvent);
|
||||
Code:
|
||||
aload_0
|
||||
aload_1
|
||||
checkcast # // class cn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent
|
||||
invokevirtual # // Method onEvent:(Lcn/cloudwalk/cwos/client/event/event/PersonRecordUploadEvent;)V
|
||||
return
|
||||
static {};
|
||||
Code:
|
||||
ldc # // class cn/cloudwalk/elevator/handler/PersonRecordEventHandler
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putstatic # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
return
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
--- cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController.v1
|
||||
+++ cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController.v2
|
||||
@@ -129,10 +129,10 @@
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
astore 11
|
||||
aload 11
|
||||
-ifnull 550
|
||||
+ifnull 139
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
-ifle 550
|
||||
+ifle 139
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 12
|
||||
@@ -152,10 +152,10 @@
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
astore 14
|
||||
aload 14
|
||||
-ifnull 415
|
||||
+ifnull 205
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
-ifle 415
|
||||
+ifle 205
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 15
|
||||
@@ -215,7 +215,7 @@
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 271
|
||||
-goto 547
|
||||
+goto 205
|
||||
ldc # // String FLOOR
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
@@ -269,7 +269,7 @@
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 205
|
||||
-goto 873
|
||||
+goto 139
|
||||
ldc # // String BUILDING
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
@@ -279,10 +279,10 @@
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
astore 11
|
||||
aload 11
|
||||
-ifnull 741
|
||||
+ifnull 139
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
-ifle 741
|
||||
+ifle 139
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 12
|
||||
@@ -342,7 +342,7 @@
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 597
|
||||
-goto 873
|
||||
+goto 139
|
||||
ldc # // String FLOOR
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
+537
@@ -0,0 +1,537 @@
|
||||
public class cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController extends cn.cloudwalk.elevator.common.AbstractCloudwalkController {
|
||||
private cn.cloudwalk.elevator.device.service.AcsElevatorDeviceService elevatorDeviceService;
|
||||
private cn.cloudwalk.elevator.codeElevatorArea.service.AcsElevatorCodeService elevatorCodeService;
|
||||
private cn.cloudwalk.elevator.zone.service.ZoneService zoneService;
|
||||
private cn.cloudwalk.client.cwoscomponent.intelligent.device.service.DeviceService deviceService;
|
||||
private cn.cloudwalk.elevator.record.service.AcsElevatorRecordService elevatorRecordService;
|
||||
private java.lang.String key;
|
||||
private java.lang.Long time;
|
||||
private java.lang.String keyA;
|
||||
public cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/common/AbstractCloudwalkController."<init>":()V
|
||||
return
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<java.util.List<cn.cloudwalk.elevator.device.dto.AcsElevatorDeviceQueryFoDTO>> get(cn.cloudwalk.elevator.handler.device.form.AcsElevatorDeviceQueryForm);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
astore_2
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getFo:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/util/List;
|
||||
astore_3
|
||||
aload_3
|
||||
ifnull 39
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 39
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
astore_3
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 查询派梯设备信息列表失败,原因:{}
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
ldc # // String 查询派梯设备信息列表失败
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/exception/ServiceException.getMessage:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
10 38 50 Class cn/cloudwalk/cloud/exception/ServiceException
|
||||
39 49 50 Class cn/cloudwalk/cloud/exception/ServiceException
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<java.util.List<cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeQueryDTO>> queryZoneTreeCode(cn.cloudwalk.elevator.handler.device.form.AcsElevatorCodeQueryForm);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
astore_2
|
||||
ldc # // String
|
||||
astore_3
|
||||
ldc # // String
|
||||
astore 4
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/handler/device/form/AcsElevatorCodeQueryForm.getDeviceCode:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/StringUtils.isNotBlank:(Ljava/lang/String;)Z
|
||||
ifeq 50
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getBuildingId:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/lang/String;
|
||||
astore_3
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getBusinessId:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/lang/String;
|
||||
astore 4
|
||||
new # // class cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam."<init>":()V
|
||||
astore 5
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/StringUtils.isNotBlank:(Ljava/lang/String;)Z
|
||||
ifeq 72
|
||||
aload 5
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam.setParentId:(Ljava/lang/String;)V
|
||||
aload 5
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam.setBusinessId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field zoneService:Lcn/cloudwalk/elevator/zone/service/ZoneService;
|
||||
aload 5
|
||||
aload_0
|
||||
invokevirtual # // Method getCloudwalkContext:()Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/zone/service/ZoneService.tree:(Lcn/cloudwalk/elevator/zone/param/ZoneNextTreeParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore 6
|
||||
aload 6
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
astore 7
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
astore 8
|
||||
aload 7
|
||||
ifnull 876
|
||||
aload 7
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 876
|
||||
aload 7
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 9
|
||||
aload 9
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 876
|
||||
aload 9
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
astore 10
|
||||
ldc # // String PARK
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 553
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
astore 11
|
||||
aload 11
|
||||
ifnull 550
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 550
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 12
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 550
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
astore 13
|
||||
ldc # // String BUILDING
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 418
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
astore 14
|
||||
aload 14
|
||||
ifnull 415
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 415
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 15
|
||||
aload 15
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 415
|
||||
aload 15
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
astore 16
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
astore 17
|
||||
aload 17
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
aload 17
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
aload 17
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
aload 17
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
astore 18
|
||||
aload 18
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
aload 18
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
astore 19
|
||||
aload 19
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne 402
|
||||
aload 17
|
||||
aload 19
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
aload 17
|
||||
aload 19
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
aload 8
|
||||
aload 17
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 271
|
||||
goto 547
|
||||
ldc # // String FLOOR
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 547
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
astore 14
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
ldc # // String FLOOR
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
astore 15
|
||||
aload 15
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
aload 15
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
astore 16
|
||||
aload 16
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne 537
|
||||
aload 14
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
aload 8
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 205
|
||||
goto 873
|
||||
ldc # // String BUILDING
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 744
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
astore 11
|
||||
aload 11
|
||||
ifnull 741
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 741
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 12
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 741
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
astore 13
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
astore 14
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
astore 15
|
||||
aload 15
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
aload 15
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
astore 16
|
||||
aload 16
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne 728
|
||||
aload 14
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
aload 8
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 597
|
||||
goto 873
|
||||
ldc # // String FLOOR
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 873
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
astore 11
|
||||
aload 11
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
aload 11
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
aload 11
|
||||
ldc # // String FLOOR
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
aload 11
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
astore 12
|
||||
aload 12
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
astore 13
|
||||
aload 13
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne 863
|
||||
aload 11
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
aload 11
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
aload 8
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 139
|
||||
aload 8
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore 9
|
||||
aload 9
|
||||
areturn
|
||||
astore_2
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 获取区域的电梯编码失败,原因:
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
ldc # // String 获取区域的电梯编码失败
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Exception.getMessage:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
0 885 886 Class java/lang/Exception
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult addElevatorRecord(cn.cloudwalk.elevator.handler.device.form.AcsElevatorRecordAddForm);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
astore_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/handler/device/form/AcsElevatorRecordAddForm.getDeviceCode:()Ljava/lang/String;
|
||||
astore_3
|
||||
new # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam."<init>":()V
|
||||
astore 4
|
||||
aload 4
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam.setDeviceCode:(Ljava/lang/String;)V
|
||||
invokestatic # // Method java/lang/System.currentTimeMillis:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
astore 5
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload 4
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getBusinessId:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/lang/String;
|
||||
astore 6
|
||||
aload 6
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/StringUtils.isNotBlank:(Ljava/lang/String;)Z
|
||||
ifeq 68
|
||||
aload_2
|
||||
aload 6
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam.setBusinessId:(Ljava/lang/String;)V
|
||||
goto 74
|
||||
aload_2
|
||||
ldc # // String 000
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam.setBusinessId:(Ljava/lang/String;)V
|
||||
invokestatic # // Method java/lang/System.currentTimeMillis:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
astore 7
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getByDeciveCode:(Ljava/lang/String;)Lcn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO;
|
||||
astore 8
|
||||
new # // class cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult."<init>":()V
|
||||
astore 9
|
||||
aload 8
|
||||
ifnull 154
|
||||
aload 9
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setId:(Ljava/lang/String;)V
|
||||
aload 9
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setDeviceCode:(Ljava/lang/String;)V
|
||||
aload 9
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getDeviceName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setDeviceName:(Ljava/lang/String;)V
|
||||
aload 9
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getDeviceTypeName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setDeviceTypeName:(Ljava/lang/String;)V
|
||||
aload 9
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getAreaId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setAreaId:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
aload 9
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam.setDeviceResult:(Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;)V
|
||||
invokestatic # // Method java/lang/System.currentTimeMillis:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
astore 10
|
||||
aload_0
|
||||
getfield # // Field elevatorRecordService:Lcn/cloudwalk/elevator/record/service/AcsElevatorRecordService;
|
||||
aload_2
|
||||
aload_0
|
||||
invokevirtual # // Method getCloudwalkContext:()Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/service/AcsElevatorRecordService.add:(Lcn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore 11
|
||||
aload 11
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
astore_3
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 添加刷脸派梯记录失败,原因:
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
ldc # // String 00
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/exception/ServiceException.getMessage:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
10 189 190 Class cn/cloudwalk/cloud/exception/ServiceException
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<cn.cloudwalk.elevator.device.result.KeyValueResult> getKey(cn.cloudwalk.elevator.handler.device.form.AcsElevatorRecordAddForm);
|
||||
Code:
|
||||
new # // class cn/cloudwalk/elevator/device/result/KeyValueResult
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/device/result/KeyValueResult."<init>":()V
|
||||
astore_2
|
||||
aload_2
|
||||
aload_0
|
||||
getfield # // Field key:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/KeyValueResult.setKey:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
aload_0
|
||||
getfield # // Field time:Ljava/lang/Long;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/KeyValueResult.setTime:(Ljava/lang/Long;)V
|
||||
aload_2
|
||||
aload_0
|
||||
getfield # // Field keyA:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/KeyValueResult.setKeyA:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
}
|
||||
+537
@@ -0,0 +1,537 @@
|
||||
public class cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController extends cn.cloudwalk.elevator.common.AbstractCloudwalkController {
|
||||
private cn.cloudwalk.elevator.device.service.AcsElevatorDeviceService elevatorDeviceService;
|
||||
private cn.cloudwalk.elevator.codeElevatorArea.service.AcsElevatorCodeService elevatorCodeService;
|
||||
private cn.cloudwalk.elevator.zone.service.ZoneService zoneService;
|
||||
private cn.cloudwalk.client.cwoscomponent.intelligent.device.service.DeviceService deviceService;
|
||||
private cn.cloudwalk.elevator.record.service.AcsElevatorRecordService elevatorRecordService;
|
||||
private java.lang.String key;
|
||||
private java.lang.Long time;
|
||||
private java.lang.String keyA;
|
||||
public cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/common/AbstractCloudwalkController."<init>":()V
|
||||
return
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<java.util.List<cn.cloudwalk.elevator.device.dto.AcsElevatorDeviceQueryFoDTO>> get(cn.cloudwalk.elevator.handler.device.form.AcsElevatorDeviceQueryForm);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
astore_2
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getFo:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/util/List;
|
||||
astore_3
|
||||
aload_3
|
||||
ifnull 39
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 39
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
astore_3
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 查询派梯设备信息列表失败,原因:{}
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
ldc # // String 查询派梯设备信息列表失败
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/exception/ServiceException.getMessage:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
10 38 50 Class cn/cloudwalk/cloud/exception/ServiceException
|
||||
39 49 50 Class cn/cloudwalk/cloud/exception/ServiceException
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<java.util.List<cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeQueryDTO>> queryZoneTreeCode(cn.cloudwalk.elevator.handler.device.form.AcsElevatorCodeQueryForm);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
astore_2
|
||||
ldc # // String
|
||||
astore_3
|
||||
ldc # // String
|
||||
astore 4
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/handler/device/form/AcsElevatorCodeQueryForm.getDeviceCode:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/StringUtils.isNotBlank:(Ljava/lang/String;)Z
|
||||
ifeq 50
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getBuildingId:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/lang/String;
|
||||
astore_3
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getBusinessId:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/lang/String;
|
||||
astore 4
|
||||
new # // class cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam."<init>":()V
|
||||
astore 5
|
||||
aload_3
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/StringUtils.isNotBlank:(Ljava/lang/String;)Z
|
||||
ifeq 72
|
||||
aload 5
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam.setParentId:(Ljava/lang/String;)V
|
||||
aload 5
|
||||
aload 4
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam.setBusinessId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field zoneService:Lcn/cloudwalk/elevator/zone/service/ZoneService;
|
||||
aload 5
|
||||
aload_0
|
||||
invokevirtual # // Method getCloudwalkContext:()Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/zone/service/ZoneService.tree:(Lcn/cloudwalk/elevator/zone/param/ZoneNextTreeParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore 6
|
||||
aload 6
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
astore 7
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
astore 8
|
||||
aload 7
|
||||
ifnull 876
|
||||
aload 7
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 876
|
||||
aload 7
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 9
|
||||
aload 9
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 876
|
||||
aload 9
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
astore 10
|
||||
ldc # // String PARK
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 553
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
astore 11
|
||||
aload 11
|
||||
ifnull 139
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 139
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 12
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 550
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
astore 13
|
||||
ldc # // String BUILDING
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 418
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
astore 14
|
||||
aload 14
|
||||
ifnull 205
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 205
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 15
|
||||
aload 15
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 415
|
||||
aload 15
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
astore 16
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
astore 17
|
||||
aload 17
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
aload 17
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
aload 17
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
aload 17
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
astore 18
|
||||
aload 18
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
aload 18
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
astore 19
|
||||
aload 19
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne 402
|
||||
aload 17
|
||||
aload 19
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
aload 17
|
||||
aload 19
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
aload 8
|
||||
aload 17
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 271
|
||||
goto 205
|
||||
ldc # // String FLOOR
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 547
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
astore 14
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
ldc # // String FLOOR
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
astore 15
|
||||
aload 15
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
aload 15
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
astore 16
|
||||
aload 16
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne 537
|
||||
aload 14
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
aload 8
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 205
|
||||
goto 139
|
||||
ldc # // String BUILDING
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 744
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
astore 11
|
||||
aload 11
|
||||
ifnull 139
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
ifle 139
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore 12
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq 741
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
astore 13
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
astore 14
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
astore 15
|
||||
aload 15
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
aload 15
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
astore 16
|
||||
aload 16
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne 728
|
||||
aload 14
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
aload 14
|
||||
aload 16
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
aload 8
|
||||
aload 14
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 597
|
||||
goto 139
|
||||
ldc # // String FLOOR
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
ifeq 873
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
astore 11
|
||||
aload 11
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
aload 11
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
aload 11
|
||||
ldc # // String FLOOR
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
aload 11
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
astore 12
|
||||
aload 12
|
||||
aload 10
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
getfield # // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
aload 12
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
astore 13
|
||||
aload 13
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne 863
|
||||
aload 11
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
aload 11
|
||||
aload 13
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
aload 8
|
||||
aload 11
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto 139
|
||||
aload 8
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore 9
|
||||
aload 9
|
||||
areturn
|
||||
astore_2
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 获取区域的电梯编码失败,原因:
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
ldc # // String 获取区域的电梯编码失败
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Exception.getMessage:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
0 885 886 Class java/lang/Exception
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult addElevatorRecord(cn.cloudwalk.elevator.handler.device.form.AcsElevatorRecordAddForm);
|
||||
Code:
|
||||
aload_1
|
||||
ldc # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
invokestatic # // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
astore_2
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/handler/device/form/AcsElevatorRecordAddForm.getDeviceCode:()Ljava/lang/String;
|
||||
astore_3
|
||||
new # // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam."<init>":()V
|
||||
astore 4
|
||||
aload 4
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam.setDeviceCode:(Ljava/lang/String;)V
|
||||
invokestatic # // Method java/lang/System.currentTimeMillis:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
astore 5
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload 4
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getBusinessId:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/lang/String;
|
||||
astore 6
|
||||
aload 6
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/StringUtils.isNotBlank:(Ljava/lang/String;)Z
|
||||
ifeq 68
|
||||
aload_2
|
||||
aload 6
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam.setBusinessId:(Ljava/lang/String;)V
|
||||
goto 74
|
||||
aload_2
|
||||
ldc # // String 000
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam.setBusinessId:(Ljava/lang/String;)V
|
||||
invokestatic # // Method java/lang/System.currentTimeMillis:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
astore 7
|
||||
aload_0
|
||||
getfield # // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getByDeciveCode:(Ljava/lang/String;)Lcn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO;
|
||||
astore 8
|
||||
new # // class cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult."<init>":()V
|
||||
astore 9
|
||||
aload 8
|
||||
ifnull 154
|
||||
aload 9
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setId:(Ljava/lang/String;)V
|
||||
aload 9
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setDeviceCode:(Ljava/lang/String;)V
|
||||
aload 9
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getDeviceName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setDeviceName:(Ljava/lang/String;)V
|
||||
aload 9
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getDeviceTypeName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setDeviceTypeName:(Ljava/lang/String;)V
|
||||
aload 9
|
||||
aload 8
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getAreaId:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setAreaId:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
aload 9
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam.setDeviceResult:(Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;)V
|
||||
invokestatic # // Method java/lang/System.currentTimeMillis:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
astore 10
|
||||
aload_0
|
||||
getfield # // Field elevatorRecordService:Lcn/cloudwalk/elevator/record/service/AcsElevatorRecordService;
|
||||
aload_2
|
||||
aload_0
|
||||
invokevirtual # // Method getCloudwalkContext:()Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/service/AcsElevatorRecordService.add:(Lcn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore 11
|
||||
aload 11
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
astore_3
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 添加刷脸派梯记录失败,原因:
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
ldc # // String 00
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/exception/ServiceException.getMessage:()Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
10 189 190 Class cn/cloudwalk/cloud/exception/ServiceException
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<cn.cloudwalk.elevator.device.result.KeyValueResult> getKey(cn.cloudwalk.elevator.handler.device.form.AcsElevatorRecordAddForm);
|
||||
Code:
|
||||
new # // class cn/cloudwalk/elevator/device/result/KeyValueResult
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/device/result/KeyValueResult."<init>":()V
|
||||
astore_2
|
||||
aload_2
|
||||
aload_0
|
||||
getfield # // Field key:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/KeyValueResult.setKey:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
aload_0
|
||||
getfield # // Field time:Ljava/lang/Long;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/KeyValueResult.setTime:(Ljava/lang/Long;)V
|
||||
aload_2
|
||||
aload_0
|
||||
getfield # // Field keyA:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/device/result/KeyValueResult.setKeyA:(Ljava/lang/String;)V
|
||||
aload_2
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
--- cn.cloudwalk.elevator.handler.device.controller.FileController.v1
|
||||
+++ cn.cloudwalk.elevator.handler.device.controller.FileController.v2
|
||||
@@ -24,9 +24,9 @@
|
||||
getstatic # // Field cn/cloudwalk/elevator/config/ImageStoreConstants.MAX_FILE:Ljava/lang/Integer;
|
||||
invokevirtual # // Method java/lang/Integer.intValue:()I
|
||||
if_icmple 47
|
||||
-ldc # // String 53060428
|
||||
+ldc # // String 53060428
|
||||
aload_0
|
||||
-ldc # // String 53060428
|
||||
+ldc # // String 53060428
|
||||
invokevirtual # // Method getMessage:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
public class cn.cloudwalk.elevator.handler.device.controller.FileController extends cn.cloudwalk.elevator.common.AbstractCloudwalkController {
|
||||
private cn.cloudwalk.elevator.record.service.PersonFileService personFileService;
|
||||
public cn.cloudwalk.elevator.handler.device.controller.FileController();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/common/AbstractCloudwalkController."<init>":()V
|
||||
return
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<java.lang.String> fileUpload(java.lang.String);
|
||||
Code:
|
||||
aload_1
|
||||
invokestatic # // Method org/apache/commons/lang3/StringUtils.isEmpty:(Ljava/lang/CharSequence;)Z
|
||||
ifeq @
|
||||
ldc # // String 53060544
|
||||
aload_0
|
||||
ldc # // String 53060544
|
||||
invokevirtual # // Method getMessage:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
aload_1
|
||||
invokestatic # // Method javax/xml/bind/DatatypeConverter.parseBase64Binary:(Ljava/lang/String;)[B
|
||||
astore_2
|
||||
aload_2
|
||||
arraylength
|
||||
getstatic # // Field cn/cloudwalk/elevator/config/ImageStoreConstants.MAX_FILE:Ljava/lang/Integer;
|
||||
invokevirtual # // Method java/lang/Integer.intValue:()I
|
||||
if_icmple 47
|
||||
ldc # // String 53060428
|
||||
aload_0
|
||||
ldc # // String 53060428
|
||||
invokevirtual # // Method getMessage:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/ToolUtil.generateUUID:()Ljava/lang/String;
|
||||
astore_3
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 上传文件:{},size={}
|
||||
aload_3
|
||||
aload_2
|
||||
arraylength
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
getfield # // Field personFileService:Lcn/cloudwalk/elevator/record/service/PersonFileService;
|
||||
aload_3
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/service/PersonFileService.upload:(Ljava/lang/String;[B)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore _
|
||||
aload _
|
||||
ifnull @
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/lang/CharSequence
|
||||
invokestatic # // Method org/apache/commons/lang3/StringUtils.isNotBlank:(Ljava/lang/CharSequence;)Z
|
||||
ifeq @
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
aload _
|
||||
areturn
|
||||
astore_2
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
ldc # // String 80014013
|
||||
aload_0
|
||||
ldc # // String 80014013
|
||||
invokevirtual # // Method getMessage:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
19 46 112 Class java/lang/Exception
|
||||
47 108 112 Class java/lang/Exception
|
||||
109 111 112 Class java/lang/Exception
|
||||
}
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
public class cn.cloudwalk.elevator.handler.device.controller.FileController extends cn.cloudwalk.elevator.common.AbstractCloudwalkController {
|
||||
private cn.cloudwalk.elevator.record.service.PersonFileService personFileService;
|
||||
public cn.cloudwalk.elevator.handler.device.controller.FileController();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/common/AbstractCloudwalkController."<init>":()V
|
||||
return
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<java.lang.String> fileUpload(java.lang.String);
|
||||
Code:
|
||||
aload_1
|
||||
invokestatic # // Method org/apache/commons/lang3/StringUtils.isEmpty:(Ljava/lang/CharSequence;)Z
|
||||
ifeq @
|
||||
ldc # // String 53060544
|
||||
aload_0
|
||||
ldc # // String 53060544
|
||||
invokevirtual # // Method getMessage:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
aload_1
|
||||
invokestatic # // Method javax/xml/bind/DatatypeConverter.parseBase64Binary:(Ljava/lang/String;)[B
|
||||
astore_2
|
||||
aload_2
|
||||
arraylength
|
||||
getstatic # // Field cn/cloudwalk/elevator/config/ImageStoreConstants.MAX_FILE:Ljava/lang/Integer;
|
||||
invokevirtual # // Method java/lang/Integer.intValue:()I
|
||||
if_icmple 47
|
||||
ldc # // String 53060428
|
||||
aload_0
|
||||
ldc # // String 53060428
|
||||
invokevirtual # // Method getMessage:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/ToolUtil.generateUUID:()Ljava/lang/String;
|
||||
astore_3
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String 上传文件:{},size={}
|
||||
aload_3
|
||||
aload_2
|
||||
arraylength
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
getfield # // Field personFileService:Lcn/cloudwalk/elevator/record/service/PersonFileService;
|
||||
aload_3
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/service/PersonFileService.upload:(Ljava/lang/String;[B)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore _
|
||||
aload _
|
||||
ifnull @
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/lang/CharSequence
|
||||
invokestatic # // Method org/apache/commons/lang3/StringUtils.isNotBlank:(Ljava/lang/CharSequence;)Z
|
||||
ifeq @
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
aload _
|
||||
areturn
|
||||
astore_2
|
||||
aload_0
|
||||
getfield # // Field LOGGER:Lorg/slf4j/Logger;
|
||||
ldc # // String
|
||||
aload_2
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
ldc # // String 80014013
|
||||
aload_0
|
||||
ldc # // String 80014013
|
||||
invokevirtual # // Method getMessage:(Ljava/lang/String;)Ljava/lang/String;
|
||||
invokestatic # // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
19 46 112 Class java/lang/Exception
|
||||
47 108 112 Class java/lang/Exception
|
||||
109 111 112 Class java/lang/Exception
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
--- cn.cloudwalk.elevator.task.ElevatorRecordSendTask.v1
|
||||
+++ cn.cloudwalk.elevator.task.ElevatorRecordSendTask.v2
|
||||
@@ -224,7 +224,7 @@
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/result/SendRecordTokenResult
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/result/SendRecordTokenResult.getToken:()Ljava/lang/String;
|
||||
-invokeinterface # // InterfaceMethod org/springframework/util/MultiValueMap.add:(Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
+invokevirtual # // Method org/springframework/util/LinkedMultiValueMap.add:(Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
ldc # // String /forward_webfront/api/pti-oapi/v2/api/starriver/device/sign-third-import
|
||||
aload _
|
||||
@@ -294,8 +294,8 @@
|
||||
return
|
||||
Exception table:
|
||||
from to target type
|
||||
-11 58 626 Class java/lang/Exception
|
||||
-59 623 626 Class java/lang/Exception
|
||||
+11 58 624 Class java/lang/Exception
|
||||
+59 621 624 Class java/lang/Exception
|
||||
private java.net.URI combineAuthClientURI(java.lang.String, org.springframework.util.MultiValueMap<java.lang.String, java.lang.String>);
|
||||
Code:
|
||||
new # // class java/lang/StringBuilder
|
||||
+318
@@ -0,0 +1,318 @@
|
||||
public class cn.cloudwalk.elevator.task.ElevatorRecordSendTask {
|
||||
private org.slf4j.Logger logger;
|
||||
private java.lang.String sendRecordIp;
|
||||
private java.lang.String corpId;
|
||||
private java.lang.String appKey;
|
||||
private java.lang.String appSecret;
|
||||
private java.lang.Boolean sendBoolean;
|
||||
private static final long EXPIRE_TIME;
|
||||
private cn.cloudwalk.elevator.record.dao.AcsElevatorRecordDao acsElevatorRecordDao;
|
||||
private cn.cloudwalk.elevator.record.dao.SendRecordTimeDao sendRecordTimeDao;
|
||||
private cn.cloudwalk.client.cwoscomponent.intelligent.record.service.AcsRecordThreeSendService acsRecordThreeSendService;
|
||||
public cn.cloudwalk.elevator.task.ElevatorRecordSendTask();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method java/lang/Object."<init>":()V
|
||||
aload_0
|
||||
ldc # // class cn/cloudwalk/elevator/task/ElevatorRecordSendTask
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putfield # // Field logger:Lorg/slf4j/Logger;
|
||||
return
|
||||
public void execute();
|
||||
Code:
|
||||
aload_0
|
||||
getfield # // Field sendBoolean:Ljava/lang/Boolean;
|
||||
invokevirtual # // Method java/lang/Boolean.booleanValue:()Z
|
||||
ifne @
|
||||
return
|
||||
aload_0
|
||||
getfield # // Field sendRecordTimeDao:Lcn/cloudwalk/elevator/record/dao/SendRecordTimeDao;
|
||||
iconst_2
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/dao/SendRecordTimeDao.getByType:(Ljava/lang/Integer;)Lcn/cloudwalk/elevator/record/dto/SendRecordTimeResultDTO;
|
||||
astore_1
|
||||
invokestatic # // Method java/lang/System.currentTimeMillis:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
astore_2
|
||||
aload_1
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne @
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Long.longValue:()J
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeResultDTO.getTime:()Ljava/lang/Long;
|
||||
invokevirtual # // Method java/lang/Long.longValue:()J
|
||||
lsub
|
||||
ldc2_w # // long 3600000l
|
||||
lcmp
|
||||
ifge @
|
||||
return
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeResultDTO.getTime:()Ljava/lang/Long;
|
||||
astore_2
|
||||
goto @
|
||||
new # // class cn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO."<init>":()V
|
||||
astore_3
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO.setTime:(Ljava/lang/Long;)V
|
||||
aload_3
|
||||
iconst_2
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO.setType:(Ljava/lang/Integer;)V
|
||||
aload_0
|
||||
getfield # // Field sendRecordTimeDao:Lcn/cloudwalk/elevator/record/dao/SendRecordTimeDao;
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/dao/SendRecordTimeDao.add:(Lcn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO;)Ljava/lang/Integer;
|
||||
pop
|
||||
new # // class cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO."<init>":()V
|
||||
astore_3
|
||||
aload_3
|
||||
iconst_2
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.setType:(Ljava/lang/Integer;)V
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Long.longValue:()J
|
||||
ldc2_w # // long 10000l
|
||||
ladd
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.setTime:(Ljava/lang/Long;)V
|
||||
new # // class cn/cloudwalk/client/cwoscomponent/intelligent/record/param/AcsRecordThreeSendParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/param/AcsRecordThreeSendParam."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/param/AcsRecordThreeSendParam.setStartTime:(Ljava/lang/Long;)V
|
||||
aload_0
|
||||
getfield # // Field acsRecordThreeSendService:Lcn/cloudwalk/client/cwoscomponent/intelligent/record/service/AcsRecordThreeSendService;
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/client/cwoscomponent/intelligent/record/service/AcsRecordThreeSendService.listByTime:(Lcn/cloudwalk/client/cwoscomponent/intelligent/record/param/AcsRecordThreeSendParam;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 查询时间戳为:{},获取的门禁记录数据为:{}
|
||||
aload_2
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/Collection
|
||||
invokestatic # // Method org/springframework/util/CollectionUtils.isEmpty:(Ljava/util/Collection;)Z
|
||||
ifne @
|
||||
aload_3
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
iconst_1
|
||||
isub
|
||||
invokeinterface # // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getRecognitionTime:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.setTime:(Ljava/lang/Long;)V
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.getTime:()Ljava/lang/Long;
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Long.equals:(Ljava/lang/Object;)Z
|
||||
ifeq @
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Long.longValue:()J
|
||||
ldc2_w # // long 10l
|
||||
ladd
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.setTime:(Ljava/lang/Long;)V
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq @
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult
|
||||
astore _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getPersonCode:()Ljava/lang/String;
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne @
|
||||
new # // class cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getPersonCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam.setEmployeeCode:(Ljava/lang/String;)V
|
||||
aload _
|
||||
new # // class java/util/Date
|
||||
dup
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getRecognitionTime:()J
|
||||
invokespecial # // Method java/util/Date."<init>":(J)V
|
||||
ldc # // String yyyy-MM-dd HH:mm:ss
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/DateUtils.parseDate:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam.setSignTime:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getDeviceName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam.setDeviceName:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto @
|
||||
aload _
|
||||
invokestatic # // Method org/springframework/util/CollectionUtils.isEmpty:(Ljava/util/Collection;)Z
|
||||
ifne @
|
||||
new # // class cn/cloudwalk/elevator/record/param/SendRecordTokenParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/param/SendRecordTokenParam."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
aload_0
|
||||
getfield # // Field corpId:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordTokenParam.setCorpId:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload_0
|
||||
getfield # // Field appKey:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordTokenParam.setAppKey:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload_0
|
||||
getfield # // Field appSecret:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordTokenParam.setAppSecret:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
ldc # // String forward_webfront/api/pti-oapi/token/get
|
||||
aconst_null
|
||||
invokespecial # // Method combineAuthClientURI:(Ljava/lang/String;Lorg/springframework/util/MultiValueMap;)Ljava/net/URI;
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
aconst_null
|
||||
new # // class cn/cloudwalk/elevator/task/ElevatorRecordSendTask$1
|
||||
dup
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/task/ElevatorRecordSendTask$1."<init>":(Lcn/cloudwalk/elevator/task/ElevatorRecordSendTask;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/RestTemplateUtil.post:(Ljava/net/URI;Ljava/lang/Object;Lorg/springframework/http/HttpHeaders;Lcom/fasterxml/jackson/core/type/TypeReference;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cloud/result/CloudwalkResult
|
||||
astore _
|
||||
new # // class org/springframework/util/LinkedMultiValueMap
|
||||
dup
|
||||
invokespecial # // Method org/springframework/util/LinkedMultiValueMap."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
ldc # // String token
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/result/SendRecordTokenResult
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/result/SendRecordTokenResult.getToken:()Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/springframework/util/MultiValueMap.add:(Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
ldc # // String /forward_webfront/api/pti-oapi/v2/api/starriver/device/sign-third-import
|
||||
aload _
|
||||
invokespecial # // Method combineAuthClientURI:(Ljava/lang/String;Lorg/springframework/util/MultiValueMap;)Ljava/net/URI;
|
||||
astore _
|
||||
new # // class org/springframework/http/HttpHeaders
|
||||
dup
|
||||
invokespecial # // Method org/springframework/http/HttpHeaders."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
ldc # // String token
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/result/SendRecordTokenResult
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/result/SendRecordTokenResult.getToken:()Ljava/lang/String;
|
||||
invokevirtual # // Method org/springframework/http/HttpHeaders.set:(Ljava/lang/String;Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/record/param/SendRecordSendParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/param/SendRecordSendParam."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordSendParam.setRecords:(Ljava/util/List;)V
|
||||
aload_0
|
||||
getfield # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 推送通行记录数据为:{}
|
||||
aload _
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;)V
|
||||
aload _
|
||||
aload _
|
||||
aload _
|
||||
new # // class cn/cloudwalk/elevator/task/ElevatorRecordSendTask$2
|
||||
dup
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/task/ElevatorRecordSendTask$2."<init>":(Lcn/cloudwalk/elevator/task/ElevatorRecordSendTask;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/RestTemplateUtil.post:(Ljava/net/URI;Ljava/lang/Object;Lorg/springframework/http/HttpHeaders;Lcom/fasterxml/jackson/core/type/TypeReference;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cloud/result/CloudwalkResult
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 调用第三方接口发送通行记录数据结束,返回结果为:{}
|
||||
aload _
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
getfield # // Field sendRecordTimeDao:Lcn/cloudwalk/elevator/record/dao/SendRecordTimeDao;
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/dao/SendRecordTimeDao.update:(Lcn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO;)Ljava/lang/Integer;
|
||||
pop
|
||||
goto @
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq @
|
||||
aload_0
|
||||
getfield # // Field sendRecordTimeDao:Lcn/cloudwalk/elevator/record/dao/SendRecordTimeDao;
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/dao/SendRecordTimeDao.update:(Lcn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO;)Ljava/lang/Integer;
|
||||
pop
|
||||
goto @
|
||||
astore_1
|
||||
aload_0
|
||||
getfield # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 派梯记录推送失败,失败原因是:{}
|
||||
aload_1
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
return
|
||||
Exception table:
|
||||
from to target type
|
||||
11 58 626 Class java/lang/Exception
|
||||
59 623 626 Class java/lang/Exception
|
||||
private java.net.URI combineAuthClientURI(java.lang.String, org.springframework.util.MultiValueMap<java.lang.String, java.lang.String>);
|
||||
Code:
|
||||
new # // class java/lang/StringBuilder
|
||||
dup
|
||||
invokespecial # // Method java/lang/StringBuilder."<init>":()V
|
||||
ldc # // String http://
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
aload_0
|
||||
getfield # // Field sendRecordIp:Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokestatic # // Method org/springframework/web/util/UriComponentsBuilder.fromUriString:(Ljava/lang/String;)Lorg/springframework/web/util/UriComponentsBuilder;
|
||||
aload_1
|
||||
invokevirtual # // Method org/springframework/web/util/UriComponentsBuilder.path:(Ljava/lang/String;)Lorg/springframework/web/util/UriComponentsBuilder;
|
||||
aload_2
|
||||
invokevirtual # // Method org/springframework/web/util/UriComponentsBuilder.queryParams:(Lorg/springframework/util/MultiValueMap;)Lorg/springframework/web/util/UriComponentsBuilder;
|
||||
invokevirtual # // Method org/springframework/web/util/UriComponentsBuilder.build:()Lorg/springframework/web/util/UriComponents;
|
||||
invokevirtual # // Method org/springframework/web/util/UriComponents.toUri:()Ljava/net/URI;
|
||||
areturn
|
||||
}
|
||||
+318
@@ -0,0 +1,318 @@
|
||||
public class cn.cloudwalk.elevator.task.ElevatorRecordSendTask {
|
||||
private org.slf4j.Logger logger;
|
||||
private java.lang.String sendRecordIp;
|
||||
private java.lang.String corpId;
|
||||
private java.lang.String appKey;
|
||||
private java.lang.String appSecret;
|
||||
private java.lang.Boolean sendBoolean;
|
||||
private static final long EXPIRE_TIME;
|
||||
private cn.cloudwalk.elevator.record.dao.AcsElevatorRecordDao acsElevatorRecordDao;
|
||||
private cn.cloudwalk.elevator.record.dao.SendRecordTimeDao sendRecordTimeDao;
|
||||
private cn.cloudwalk.client.cwoscomponent.intelligent.record.service.AcsRecordThreeSendService acsRecordThreeSendService;
|
||||
public cn.cloudwalk.elevator.task.ElevatorRecordSendTask();
|
||||
Code:
|
||||
aload_0
|
||||
invokespecial # // Method java/lang/Object."<init>":()V
|
||||
aload_0
|
||||
ldc # // class cn/cloudwalk/elevator/task/ElevatorRecordSendTask
|
||||
invokestatic # // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;
|
||||
putfield # // Field logger:Lorg/slf4j/Logger;
|
||||
return
|
||||
public void execute();
|
||||
Code:
|
||||
aload_0
|
||||
getfield # // Field sendBoolean:Ljava/lang/Boolean;
|
||||
invokevirtual # // Method java/lang/Boolean.booleanValue:()Z
|
||||
ifne @
|
||||
return
|
||||
aload_0
|
||||
getfield # // Field sendRecordTimeDao:Lcn/cloudwalk/elevator/record/dao/SendRecordTimeDao;
|
||||
iconst_2
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/dao/SendRecordTimeDao.getByType:(Ljava/lang/Integer;)Lcn/cloudwalk/elevator/record/dto/SendRecordTimeResultDTO;
|
||||
astore_1
|
||||
invokestatic # // Method java/lang/System.currentTimeMillis:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
astore_2
|
||||
aload_1
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne @
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Long.longValue:()J
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeResultDTO.getTime:()Ljava/lang/Long;
|
||||
invokevirtual # // Method java/lang/Long.longValue:()J
|
||||
lsub
|
||||
ldc2_w # // long 3600000l
|
||||
lcmp
|
||||
ifge @
|
||||
return
|
||||
aload_1
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeResultDTO.getTime:()Ljava/lang/Long;
|
||||
astore_2
|
||||
goto @
|
||||
new # // class cn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO."<init>":()V
|
||||
astore_3
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO.setTime:(Ljava/lang/Long;)V
|
||||
aload_3
|
||||
iconst_2
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO.setType:(Ljava/lang/Integer;)V
|
||||
aload_0
|
||||
getfield # // Field sendRecordTimeDao:Lcn/cloudwalk/elevator/record/dao/SendRecordTimeDao;
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/dao/SendRecordTimeDao.add:(Lcn/cloudwalk/elevator/record/dto/SendRecordTimeAddDTO;)Ljava/lang/Integer;
|
||||
pop
|
||||
new # // class cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO."<init>":()V
|
||||
astore_3
|
||||
aload_3
|
||||
iconst_2
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.setType:(Ljava/lang/Integer;)V
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Long.longValue:()J
|
||||
ldc2_w # // long 10000l
|
||||
ladd
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.setTime:(Ljava/lang/Long;)V
|
||||
new # // class cn/cloudwalk/client/cwoscomponent/intelligent/record/param/AcsRecordThreeSendParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/param/AcsRecordThreeSendParam."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
aload_2
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/param/AcsRecordThreeSendParam.setStartTime:(Ljava/lang/Long;)V
|
||||
aload_0
|
||||
getfield # // Field acsRecordThreeSendService:Lcn/cloudwalk/client/cwoscomponent/intelligent/record/service/AcsRecordThreeSendService;
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/client/cwoscomponent/intelligent/record/service/AcsRecordThreeSendService.listByTime:(Lcn/cloudwalk/client/cwoscomponent/intelligent/record/param/AcsRecordThreeSendParam;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 查询时间戳为:{},获取的门禁记录数据为:{}
|
||||
aload_2
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/Collection
|
||||
invokestatic # // Method org/springframework/util/CollectionUtils.isEmpty:(Ljava/util/Collection;)Z
|
||||
ifne @
|
||||
aload_3
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
iconst_1
|
||||
isub
|
||||
invokeinterface # // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getRecognitionTime:()J
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.setTime:(Ljava/lang/Long;)V
|
||||
aload_3
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.getTime:()Ljava/lang/Long;
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Long.equals:(Ljava/lang/Object;)Z
|
||||
ifeq @
|
||||
aload_3
|
||||
aload_2
|
||||
invokevirtual # // Method java/lang/Long.longValue:()J
|
||||
ldc2_w # // long 10l
|
||||
ladd
|
||||
invokestatic # // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO.setTime:(Ljava/lang/Long;)V
|
||||
new # // class java/util/ArrayList
|
||||
dup
|
||||
invokespecial # // Method java/util/ArrayList."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class java/util/List
|
||||
invokeinterface # // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
astore _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
ifeq @
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult
|
||||
astore _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getPersonCode:()Ljava/lang/String;
|
||||
invokestatic # // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
ifne @
|
||||
new # // class cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getPersonCode:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam.setEmployeeCode:(Ljava/lang/String;)V
|
||||
aload _
|
||||
new # // class java/util/Date
|
||||
dup
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getRecognitionTime:()J
|
||||
invokespecial # // Method java/util/Date."<init>":(J)V
|
||||
ldc # // String yyyy-MM-dd HH:mm:ss
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/DateUtils.parseDate:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam.setSignTime:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.getDeviceName:()Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordSendInfoParam.setDeviceName:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload _
|
||||
invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
goto @
|
||||
aload _
|
||||
invokestatic # // Method org/springframework/util/CollectionUtils.isEmpty:(Ljava/util/Collection;)Z
|
||||
ifne @
|
||||
new # // class cn/cloudwalk/elevator/record/param/SendRecordTokenParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/param/SendRecordTokenParam."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
aload_0
|
||||
getfield # // Field corpId:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordTokenParam.setCorpId:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload_0
|
||||
getfield # // Field appKey:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordTokenParam.setAppKey:(Ljava/lang/String;)V
|
||||
aload _
|
||||
aload_0
|
||||
getfield # // Field appSecret:Ljava/lang/String;
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordTokenParam.setAppSecret:(Ljava/lang/String;)V
|
||||
aload_0
|
||||
ldc # // String forward_webfront/api/pti-oapi/token/get
|
||||
aconst_null
|
||||
invokespecial # // Method combineAuthClientURI:(Ljava/lang/String;Lorg/springframework/util/MultiValueMap;)Ljava/net/URI;
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
aconst_null
|
||||
new # // class cn/cloudwalk/elevator/task/ElevatorRecordSendTask$1
|
||||
dup
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/task/ElevatorRecordSendTask$1."<init>":(Lcn/cloudwalk/elevator/task/ElevatorRecordSendTask;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/RestTemplateUtil.post:(Ljava/net/URI;Ljava/lang/Object;Lorg/springframework/http/HttpHeaders;Lcom/fasterxml/jackson/core/type/TypeReference;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cloud/result/CloudwalkResult
|
||||
astore _
|
||||
new # // class org/springframework/util/LinkedMultiValueMap
|
||||
dup
|
||||
invokespecial # // Method org/springframework/util/LinkedMultiValueMap."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
ldc # // String token
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/result/SendRecordTokenResult
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/result/SendRecordTokenResult.getToken:()Ljava/lang/String;
|
||||
invokevirtual # // Method org/springframework/util/LinkedMultiValueMap.add:(Ljava/lang/Object;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
ldc # // String /forward_webfront/api/pti-oapi/v2/api/starriver/device/sign-third-import
|
||||
aload _
|
||||
invokespecial # // Method combineAuthClientURI:(Ljava/lang/String;Lorg/springframework/util/MultiValueMap;)Ljava/net/URI;
|
||||
astore _
|
||||
new # // class org/springframework/http/HttpHeaders
|
||||
dup
|
||||
invokespecial # // Method org/springframework/http/HttpHeaders."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
ldc # // String token
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/elevator/record/result/SendRecordTokenResult
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/result/SendRecordTokenResult.getToken:()Ljava/lang/String;
|
||||
invokevirtual # // Method org/springframework/http/HttpHeaders.set:(Ljava/lang/String;Ljava/lang/String;)V
|
||||
new # // class cn/cloudwalk/elevator/record/param/SendRecordSendParam
|
||||
dup
|
||||
invokespecial # // Method cn/cloudwalk/elevator/record/param/SendRecordSendParam."<init>":()V
|
||||
astore _
|
||||
aload _
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/elevator/record/param/SendRecordSendParam.setRecords:(Ljava/util/List;)V
|
||||
aload_0
|
||||
getfield # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 推送通行记录数据为:{}
|
||||
aload _
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;)V
|
||||
aload _
|
||||
aload _
|
||||
aload _
|
||||
new # // class cn/cloudwalk/elevator/task/ElevatorRecordSendTask$2
|
||||
dup
|
||||
aload_0
|
||||
invokespecial # // Method cn/cloudwalk/elevator/task/ElevatorRecordSendTask$2."<init>":(Lcn/cloudwalk/elevator/task/ElevatorRecordSendTask;)V
|
||||
invokestatic # // Method cn/cloudwalk/elevator/util/RestTemplateUtil.post:(Ljava/net/URI;Ljava/lang/Object;Lorg/springframework/http/HttpHeaders;Lcom/fasterxml/jackson/core/type/TypeReference;)Ljava/lang/Object;
|
||||
checkcast # // class cn/cloudwalk/cloud/result/CloudwalkResult
|
||||
astore _
|
||||
aload_0
|
||||
getfield # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 调用第三方接口发送通行记录数据结束,返回结果为:{}
|
||||
aload _
|
||||
invokestatic # // Method com/alibaba/fastjson/JSON.toJSONString:(Ljava/lang/Object;)Ljava/lang/String;
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.info:(Ljava/lang/String;Ljava/lang/Object;)V
|
||||
aload_0
|
||||
getfield # // Field sendRecordTimeDao:Lcn/cloudwalk/elevator/record/dao/SendRecordTimeDao;
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/dao/SendRecordTimeDao.update:(Lcn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO;)Ljava/lang/Integer;
|
||||
pop
|
||||
goto @
|
||||
aload _
|
||||
invokevirtual # // Method cn/cloudwalk/cloud/result/CloudwalkResult.isSuccess:()Z
|
||||
ifeq @
|
||||
aload_0
|
||||
getfield # // Field sendRecordTimeDao:Lcn/cloudwalk/elevator/record/dao/SendRecordTimeDao;
|
||||
aload_3
|
||||
invokeinterface # // InterfaceMethod cn/cloudwalk/elevator/record/dao/SendRecordTimeDao.update:(Lcn/cloudwalk/elevator/record/dto/SendRecordTimeEditDTO;)Ljava/lang/Integer;
|
||||
pop
|
||||
goto @
|
||||
astore_1
|
||||
aload_0
|
||||
getfield # // Field logger:Lorg/slf4j/Logger;
|
||||
ldc # // String 派梯记录推送失败,失败原因是:{}
|
||||
aload_1
|
||||
invokeinterface # // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
return
|
||||
Exception table:
|
||||
from to target type
|
||||
11 58 624 Class java/lang/Exception
|
||||
59 621 624 Class java/lang/Exception
|
||||
private java.net.URI combineAuthClientURI(java.lang.String, org.springframework.util.MultiValueMap<java.lang.String, java.lang.String>);
|
||||
Code:
|
||||
new # // class java/lang/StringBuilder
|
||||
dup
|
||||
invokespecial # // Method java/lang/StringBuilder."<init>":()V
|
||||
ldc # // String http://
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
aload_0
|
||||
getfield # // Field sendRecordIp:Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokestatic # // Method org/springframework/web/util/UriComponentsBuilder.fromUriString:(Ljava/lang/String;)Lorg/springframework/web/util/UriComponentsBuilder;
|
||||
aload_1
|
||||
invokevirtual # // Method org/springframework/web/util/UriComponentsBuilder.path:(Ljava/lang/String;)Lorg/springframework/web/util/UriComponentsBuilder;
|
||||
aload_2
|
||||
invokevirtual # // Method org/springframework/web/util/UriComponentsBuilder.queryParams:(Lorg/springframework/util/MultiValueMap;)Lorg/springframework/web/util/UriComponentsBuilder;
|
||||
invokevirtual # // Method org/springframework/web/util/UriComponentsBuilder.build:()Lorg/springframework/web/util/UriComponents;
|
||||
invokevirtual # // Method org/springframework/web/util/UriComponents.toUri:()Ljava/net/URI;
|
||||
areturn
|
||||
}
|
||||
+218
@@ -0,0 +1,218 @@
|
||||
--- cn.cloudwalk.elevator.util.DateUtils.v1
|
||||
+++ cn.cloudwalk.elevator.util.DateUtils.v2
|
||||
@@ -332,7 +332,7 @@
|
||||
invokevirtual # // Method java/text/DateFormat.format:(Ljava/util/Date;)Ljava/lang/String;
|
||||
invokestatic # // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
|
||||
invokestatic # // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
|
||||
-invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
+invokevirtual # // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
aload _
|
||||
bipush 6
|
||||
@@ -348,26 +348,22 @@
|
||||
bipush 7
|
||||
istore _
|
||||
aload _
|
||||
-invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
-iload _
|
||||
-if_icmple 164
|
||||
+invokevirtual # // Method java/util/ArrayList.size:()I
|
||||
+iload _
|
||||
+if_icmple 156
|
||||
ldc # // String 月
|
||||
-astore _
|
||||
-goto @
|
||||
-aload _
|
||||
-invokeinterface # // InterfaceMethod java/util/List.size:()I
|
||||
-iconst_1
|
||||
-if_icmple 181
|
||||
+areturn
|
||||
+aload _
|
||||
+invokevirtual # // Method java/util/ArrayList.size:()I
|
||||
+iconst_1
|
||||
+if_icmple 167
|
||||
ldc # // String 周
|
||||
-astore _
|
||||
-goto @
|
||||
+areturn
|
||||
ldc # // String 日
|
||||
-astore _
|
||||
-aload _
|
||||
areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
-31 125 128 Class java/text/ParseException
|
||||
+31 123 126 Class java/text/ParseException
|
||||
public static java.lang.Long todayStart();
|
||||
Code:
|
||||
invokestatic # // Method java/util/Calendar.getInstance:()Ljava/util/Calendar;
|
||||
@@ -603,11 +599,11 @@
|
||||
ldc # // String 天
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
pop
|
||||
-iinc 2, -1
|
||||
lload _
|
||||
lconst_0
|
||||
lcmp
|
||||
ifle @
|
||||
+iinc 2, -1
|
||||
iload _
|
||||
ifle @
|
||||
aload _
|
||||
@@ -616,11 +612,11 @@
|
||||
ldc # // String 小时
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
pop
|
||||
-iinc 2, -1
|
||||
lload _
|
||||
lconst_0
|
||||
lcmp
|
||||
ifle @
|
||||
+iinc 2, -1
|
||||
iload _
|
||||
ifle @
|
||||
aload _
|
||||
@@ -629,11 +625,11 @@
|
||||
ldc # // String 分钟
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
pop
|
||||
-iinc 2, -1
|
||||
lload _
|
||||
lconst_0
|
||||
lcmp
|
||||
ifle @
|
||||
+iinc 2, -1
|
||||
iload _
|
||||
ifle @
|
||||
aload _
|
||||
@@ -701,11 +697,11 @@
|
||||
ldc # // String 小时
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
pop
|
||||
-iinc 2, -1
|
||||
lload _
|
||||
lconst_0
|
||||
lcmp
|
||||
ifle @
|
||||
+iinc 2, -1
|
||||
iload _
|
||||
ifle @
|
||||
aload _
|
||||
@@ -714,11 +710,11 @@
|
||||
ldc # // String 分钟
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
pop
|
||||
-iinc 2, -1
|
||||
lload _
|
||||
lconst_0
|
||||
lcmp
|
||||
ifle @
|
||||
+iinc 2, -1
|
||||
iload _
|
||||
ifle @
|
||||
aload _
|
||||
@@ -842,7 +838,7 @@
|
||||
lcmp
|
||||
ifgt @
|
||||
iconst_1
|
||||
-ireturn
|
||||
+goto @
|
||||
iconst_0
|
||||
ireturn
|
||||
Exception table:
|
||||
@@ -883,9 +879,9 @@
|
||||
invokevirtual # // Method java/lang/Integer.intValue:()I
|
||||
tableswitch { // 0 to 2
|
||||
48
|
||||
-242
|
||||
-464
|
||||
-default: 706
|
||||
+238
|
||||
+452
|
||||
+default: 687
|
||||
}
|
||||
invokestatic # // Method java/time/LocalDate.now:()Ljava/time/LocalDate;
|
||||
getstatic # // Field java/time/LocalTime.MIN:Ljava/time/LocalTime;
|
||||
@@ -920,13 +916,13 @@
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokespecial # // Method cn/cloudwalk/elevator/util/StartTimeAndEndTime."<init>":(Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;)V
|
||||
-invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
+invokevirtual # // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
iconst_1
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpge 239
|
||||
+if_icmpge 235
|
||||
aload _
|
||||
iload _
|
||||
i2l
|
||||
@@ -962,7 +958,7 @@
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokespecial # // Method cn/cloudwalk/elevator/util/StartTimeAndEndTime."<init>":(Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;)V
|
||||
-invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
+invokevirtual # // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
iinc 5, 1
|
||||
goto @
|
||||
@@ -1006,13 +1002,13 @@
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokespecial # // Method cn/cloudwalk/elevator/util/StartTimeAndEndTime."<init>":(Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;)V
|
||||
-invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
+invokevirtual # // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
iconst_1
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpge 461
|
||||
+if_icmpge 449
|
||||
aload _
|
||||
iload _
|
||||
i2l
|
||||
@@ -1050,9 +1046,9 @@
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokespecial # // Method cn/cloudwalk/elevator/util/StartTimeAndEndTime."<init>":(Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;)V
|
||||
-invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
-pop
|
||||
-iinc 7, 1
|
||||
+invokevirtual # // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
|
||||
+pop
|
||||
+iinc 5, 1
|
||||
goto @
|
||||
goto @
|
||||
invokestatic # // Method java/time/LocalDate.now:()Ljava/time/LocalDate;
|
||||
@@ -1093,13 +1089,13 @@
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokespecial # // Method cn/cloudwalk/elevator/util/StartTimeAndEndTime."<init>":(Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;)V
|
||||
-invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
+invokevirtual # // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
|
||||
pop
|
||||
iconst_1
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
-if_icmpge 703
|
||||
+if_icmpge 684
|
||||
invokestatic # // Method java/time/LocalDateTime.now:()Ljava/time/LocalDateTime;
|
||||
iload _
|
||||
i2l
|
||||
@@ -1144,9 +1140,9 @@
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
|
||||
invokespecial # // Method cn/cloudwalk/elevator/util/StartTimeAndEndTime."<init>":(Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;)V
|
||||
-invokeinterface # // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
-pop
|
||||
-iinc 9, 1
|
||||
+invokevirtual # // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
|
||||
+pop
|
||||
+iinc 5, 1
|
||||
goto @
|
||||
goto @
|
||||
aload _
|
||||
+1175
File diff suppressed because it is too large
Load Diff
+1171
File diff suppressed because it is too large
Load Diff
+41
@@ -0,0 +1,41 @@
|
||||
--- cn.cloudwalk.elevator.util.StringUtils.v1
|
||||
+++ cn.cloudwalk.elevator.util.StringUtils.v2
|
||||
@@ -1959,6 +1959,7 @@
|
||||
Code:
|
||||
aload _
|
||||
aconst_null
|
||||
+checkcast # // class java/lang/String
|
||||
invokestatic # // Method join:([Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;
|
||||
areturn
|
||||
public static java.lang.String join(java.lang.Object[], char);
|
||||
@@ -3993,8 +3994,8 @@
|
||||
aload _
|
||||
invokevirtual # // Method java/lang/String.length:()I
|
||||
iload _
|
||||
+isub
|
||||
iconst_3
|
||||
-isub
|
||||
isub
|
||||
istore _
|
||||
iload _
|
||||
@@ -4021,9 +4022,9 @@
|
||||
istore _
|
||||
iload _
|
||||
iload _
|
||||
+iadd
|
||||
iconst_3
|
||||
isub
|
||||
-iadd
|
||||
aload _
|
||||
invokevirtual # // Method java/lang/String.length:()I
|
||||
if_icmpge @
|
||||
@@ -4051,8 +4052,8 @@
|
||||
aload _
|
||||
invokevirtual # // Method java/lang/String.length:()I
|
||||
iload _
|
||||
+isub
|
||||
iconst_3
|
||||
-isub
|
||||
isub
|
||||
invokevirtual # // Method java/lang/String.substring:(I)Ljava/lang/String;
|
||||
invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
+4353
File diff suppressed because it is too large
Load Diff
+4354
File diff suppressed because it is too large
Load Diff
+259
@@ -0,0 +1,259 @@
|
||||
META-INF/
|
||||
META-INF/MANIFEST.MF
|
||||
cn/
|
||||
cn/cloudwalk/
|
||||
cn/cloudwalk/client/
|
||||
cn/cloudwalk/client/cwoscomponent/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/account/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/account/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/account/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/account/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/face/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/face/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/face/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/feature/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/feature/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/feature/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/feature/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/group/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/group/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/group/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/group/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/staticdb/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/staticdb/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/staticdb/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/staticdb/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/biology/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/biology/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/biology/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/biology/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/elevator/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/elevator/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/elevator/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/email/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/email/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/email/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/file/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/file/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/file/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/file/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/message/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/message/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/message/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/message/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/record/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/record/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/record/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/record/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/sysetting/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/sysetting/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/sysetting/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/sysetting/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/param/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/result/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/service/
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/account/param/AccountLoginParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/account/result/AccountLoginResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/account/service/AccountLoginService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/face/param/FaceAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/face/param/FaceRemoveParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/face/service/FaceService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/feature/param/FeatureExtractParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/feature/result/FeatureExtractResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/feature/service/FeatureService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/group/param/GroupAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/group/param/GroupGetParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/group/result/GroupResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/group/service/GroupService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/staticdb/param/SearchMultipleParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/staticdb/result/SearchResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/ai/v2/staticdb/service/SearchService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/param/ApplicationImageStoreAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/param/ApplicationImageStoreDelParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/param/ApplicationImageStoreQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/param/SceneAppsGetParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/result/ApplicationImageStoreResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/result/SceneAppsResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/service/ApplicationImageStoreService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/application/service/ApplicationService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/biology/param/FeatureExtractParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/biology/param/FeatureQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/biology/result/FeatureExtractResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/biology/result/FeatureQueryResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/biology/service/BiologyToolService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceApplicationParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceApplicationQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceAreaDeleteParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceAreaQueryDeviceParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceAreaQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceDeleteParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceDistrictQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceImageStoreParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceImageStoreQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceImageStoreSaveParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceSettingInitParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceSettingNotifyParam$SettingAttr.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceSettingNotifyParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceSettingQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/DeviceTypeQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/param/EntranceGuardControlParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceApplicationResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceAreaResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceDistrictResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceImageStoreResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceSettingInitResult$DeviceSettings.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceSettingInitResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceSettingNotifyResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceSettingResult$DeviceSettings.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceSettingResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceStatusResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceTypeResult$DeviceTypeDetailResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceTypeResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/result/EntranceGuardControlResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/DeviceApplicationService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/DeviceAreaService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/DeviceDistrictService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/DeviceImageStoreService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/DeviceKitService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/DeviceNotifyService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/DeviceService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/DeviceSettingService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/device/service/DeviceTypeService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/elevator/param/AcsPersonAddVisitorParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/elevator/service/ElevatorPersonService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/email/param/EmailSendParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/email/service/EmailSendService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/file/param/FileFinishParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/file/param/FileGetParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/file/param/FileInitParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/file/result/FileDetail.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/file/service/FileService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/DevicePersonResyncParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/DevicePersonResyncRequestParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/ImageStoreAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/ImageStoreDelParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/ImageStoreEditParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/ImageStorePersonBindParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/ImageStorePersonData.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/ImageStorePersonDelParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/ImageStorePersonQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/ImageStorePersonSaveParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/ImageStoreQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/QueryDevicePersonSyncLogParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/QueryDevicePersonSyncParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/param/UpdateGroupPersonRefParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/DeviceImageStoreReSyncResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/DevicePersonResyncResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/DevicePersonSyncDetailResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/DevicePersonSyncLogResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/DevicePersonSyncResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/ImageStoreDetailResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/ImageStoreListResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/ImageStorePersonResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/ImageStorePersonSaveResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/ImageStoreResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/ImgStoreBatchBindPersonResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/result/ImgStorePersonResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/service/DeviceImageStoreSyncService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/service/ImageStorePersonService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/imagestore/service/ImageStoreService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/param/LabelAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/param/LabelDetailParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/param/LabelGroupDelParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/param/LabelGroupEditParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/param/LabelPersonAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/param/LabelPersonDelParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/param/LabelQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/result/LabelDetailResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/result/LabelResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/label/service/LabelService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/message/param/GetShortUrlParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/message/param/SmsSendParam$Parameter.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/message/param/SmsSendParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/message/result/ShotUrlResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/message/service/SmsSendService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/param/OrganizationAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/param/OrganizationDeleteParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/param/OrganizationDetailQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/param/OrganizationEditParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/param/OrganizationListParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/param/OrganizationQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/param/OrganizationTreeParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/param/RentUpdateParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/result/OrganizationDetailResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/result/OrganizationResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/result/OrganizationTreeResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/organization/service/OrganizationService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/param/PersonAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/param/PersonDelParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/param/PersonDetailParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/param/PersonEditParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/param/PersonImportParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/param/PersonQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/result/AcsPassRuleImageResultDto.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/result/PersonResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/person/service/PersonService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/record/param/AcsRecordThreeSendParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/record/result/AcsRecordThreeSendResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/record/service/AcsRecordThreeSendService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/param/RoleAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/param/RoleDeltParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/param/RoleEditParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/param/RoleGetsParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/param/RoleResourceAddParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/param/RoleResourceDelParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/param/RoleResourceQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/param/ValidateLoginTokenParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/result/RoleDetailResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/result/RoleResourceResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/result/ValidateLoginTokenResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/service/LoginService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/resource/service/RoleService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/sysetting/param/DeviceAreaTreeParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/sysetting/result/AreaTreeResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/sysetting/service/SysettingAreaService.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/param/UserChangePwdParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/param/UserDetailParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/param/UserQueryParam.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/result/UserAcountDetailResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/result/UserDetailResult.class
|
||||
cn/cloudwalk/client/cwoscomponent/intelligent/user/service/UserService.class
|
||||
META-INF/maven/
|
||||
META-INF/maven/cn.cloudwalk.intelligent/
|
||||
META-INF/maven/cn.cloudwalk.intelligent/intelligent-cwoscomponent-interface/
|
||||
META-INF/maven/cn.cloudwalk.intelligent/intelligent-cwoscomponent-interface/pom.xml
|
||||
META-INF/maven/cn.cloudwalk.intelligent/intelligent-cwoscomponent-interface/pom.properties
|
||||
+550
@@ -0,0 +1,550 @@
|
||||
Compiled from "AcsElevatorDeviceGetWayController.java"
|
||||
public class cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController extends cn.cloudwalk.elevator.common.AbstractCloudwalkController {
|
||||
private cn.cloudwalk.elevator.device.service.AcsElevatorDeviceService elevatorDeviceService;
|
||||
|
||||
private cn.cloudwalk.elevator.codeElevatorArea.service.AcsElevatorCodeService elevatorCodeService;
|
||||
|
||||
private cn.cloudwalk.elevator.zone.service.ZoneService zoneService;
|
||||
|
||||
private cn.cloudwalk.client.cwoscomponent.intelligent.device.service.DeviceService deviceService;
|
||||
|
||||
private cn.cloudwalk.elevator.record.service.AcsElevatorRecordService elevatorRecordService;
|
||||
|
||||
private java.lang.String key;
|
||||
|
||||
private java.lang.Long time;
|
||||
|
||||
private java.lang.String keyA;
|
||||
|
||||
public cn.cloudwalk.elevator.handler.device.controller.AcsElevatorDeviceGetWayController();
|
||||
Code:
|
||||
0: aload_0
|
||||
1: invokespecial #1 // Method cn/cloudwalk/elevator/common/AbstractCloudwalkController."<init>":()V
|
||||
4: return
|
||||
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<java.util.List<cn.cloudwalk.elevator.device.dto.AcsElevatorDeviceQueryFoDTO>> get(cn.cloudwalk.elevator.handler.device.form.AcsElevatorDeviceQueryForm);
|
||||
Code:
|
||||
0: aload_1
|
||||
1: ldc #2 // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
3: invokestatic #3 // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
6: checkcast #2 // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
9: astore_2
|
||||
10: aload_0
|
||||
11: getfield #4 // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
14: aload_2
|
||||
15: invokeinterface #5, 2 // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getFo:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/util/List;
|
||||
20: astore_3
|
||||
21: aload_3
|
||||
22: ifnull 39
|
||||
25: aload_3
|
||||
26: invokeinterface #6, 1 // InterfaceMethod java/util/List.size:()I
|
||||
31: ifle 39
|
||||
34: aload_3
|
||||
35: invokestatic #7 // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
38: areturn
|
||||
39: new #8 // class java/util/ArrayList
|
||||
42: dup
|
||||
43: invokespecial #9 // Method java/util/ArrayList."<init>":()V
|
||||
46: invokestatic #7 // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
49: areturn
|
||||
50: astore_3
|
||||
51: aload_0
|
||||
52: getfield #11 // Field LOGGER:Lorg/slf4j/Logger;
|
||||
55: ldc #12 // String 查询派梯设备信息列表失败,原因:{}
|
||||
57: aload_3
|
||||
58: invokeinterface #13, 3 // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
63: ldc #14 // String 查询派梯设备信息列表失败
|
||||
65: aload_3
|
||||
66: invokevirtual #15 // Method cn/cloudwalk/cloud/exception/ServiceException.getMessage:()Ljava/lang/String;
|
||||
69: invokestatic #16 // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
72: areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
10 38 50 Class cn/cloudwalk/cloud/exception/ServiceException
|
||||
39 49 50 Class cn/cloudwalk/cloud/exception/ServiceException
|
||||
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<java.util.List<cn.cloudwalk.elevator.codeElevatorArea.dto.AcsElevatorCodeQueryDTO>> queryZoneTreeCode(cn.cloudwalk.elevator.handler.device.form.AcsElevatorCodeQueryForm);
|
||||
Code:
|
||||
0: aload_1
|
||||
1: ldc #2 // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
3: invokestatic #3 // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
6: checkcast #2 // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
9: astore_2
|
||||
10: ldc #17 // String
|
||||
12: astore_3
|
||||
13: ldc #17 // String
|
||||
15: astore 4
|
||||
17: aload_1
|
||||
18: invokevirtual #18 // Method cn/cloudwalk/elevator/handler/device/form/AcsElevatorCodeQueryForm.getDeviceCode:()Ljava/lang/String;
|
||||
21: invokestatic #19 // Method cn/cloudwalk/elevator/util/StringUtils.isNotBlank:(Ljava/lang/String;)Z
|
||||
24: ifeq 50
|
||||
27: aload_0
|
||||
28: getfield #4 // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
31: aload_2
|
||||
32: invokeinterface #20, 2 // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getBuildingId:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/lang/String;
|
||||
37: astore_3
|
||||
38: aload_0
|
||||
39: getfield #4 // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
42: aload_2
|
||||
43: invokeinterface #21, 2 // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getBusinessId:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/lang/String;
|
||||
48: astore 4
|
||||
50: new #22 // class cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam
|
||||
53: dup
|
||||
54: invokespecial #23 // Method cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam."<init>":()V
|
||||
57: astore 5
|
||||
59: aload_3
|
||||
60: invokestatic #19 // Method cn/cloudwalk/elevator/util/StringUtils.isNotBlank:(Ljava/lang/String;)Z
|
||||
63: ifeq 72
|
||||
66: aload 5
|
||||
68: aload_3
|
||||
69: invokevirtual #24 // Method cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam.setParentId:(Ljava/lang/String;)V
|
||||
72: aload 5
|
||||
74: aload 4
|
||||
76: invokevirtual #25 // Method cn/cloudwalk/elevator/zone/param/ZoneNextTreeParam.setBusinessId:(Ljava/lang/String;)V
|
||||
79: aload_0
|
||||
80: getfield #26 // Field zoneService:Lcn/cloudwalk/elevator/zone/service/ZoneService;
|
||||
83: aload 5
|
||||
85: aload_0
|
||||
86: invokevirtual #27 // Method getCloudwalkContext:()Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
89: invokeinterface #28, 3 // InterfaceMethod cn/cloudwalk/elevator/zone/service/ZoneService.tree:(Lcn/cloudwalk/elevator/zone/param/ZoneNextTreeParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
94: astore 6
|
||||
96: aload 6
|
||||
98: invokevirtual #29 // Method cn/cloudwalk/cloud/result/CloudwalkResult.getData:()Ljava/lang/Object;
|
||||
101: checkcast #30 // class java/util/List
|
||||
104: astore 7
|
||||
106: new #8 // class java/util/ArrayList
|
||||
109: dup
|
||||
110: invokespecial #9 // Method java/util/ArrayList."<init>":()V
|
||||
113: astore 8
|
||||
115: aload 7
|
||||
117: ifnull 876
|
||||
120: aload 7
|
||||
122: invokeinterface #6, 1 // InterfaceMethod java/util/List.size:()I
|
||||
127: ifle 876
|
||||
130: aload 7
|
||||
132: invokeinterface #31, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
137: astore 9
|
||||
139: aload 9
|
||||
141: invokeinterface #32, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
146: ifeq 876
|
||||
149: aload 9
|
||||
151: invokeinterface #33, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
156: checkcast #34 // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
159: astore 10
|
||||
161: ldc #35 // String PARK
|
||||
163: aload 10
|
||||
165: invokevirtual #36 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
168: invokevirtual #37 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
171: ifeq 553
|
||||
174: aload 10
|
||||
176: invokevirtual #38 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
179: astore 11
|
||||
181: aload 11
|
||||
183: ifnull 550
|
||||
186: aload 11
|
||||
188: invokeinterface #6, 1 // InterfaceMethod java/util/List.size:()I
|
||||
193: ifle 550
|
||||
196: aload 11
|
||||
198: invokeinterface #31, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
203: astore 12
|
||||
205: aload 12
|
||||
207: invokeinterface #32, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
212: ifeq 550
|
||||
215: aload 12
|
||||
217: invokeinterface #33, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
222: checkcast #34 // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
225: astore 13
|
||||
227: ldc #39 // String BUILDING
|
||||
229: aload 13
|
||||
231: invokevirtual #36 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
234: invokevirtual #37 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
237: ifeq 418
|
||||
240: aload 13
|
||||
242: invokevirtual #38 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
245: astore 14
|
||||
247: aload 14
|
||||
249: ifnull 415
|
||||
252: aload 14
|
||||
254: invokeinterface #6, 1 // InterfaceMethod java/util/List.size:()I
|
||||
259: ifle 415
|
||||
262: aload 14
|
||||
264: invokeinterface #31, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
269: astore 15
|
||||
271: aload 15
|
||||
273: invokeinterface #32, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
278: ifeq 415
|
||||
281: aload 15
|
||||
283: invokeinterface #33, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
288: checkcast #34 // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
291: astore 16
|
||||
293: new #40 // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
296: dup
|
||||
297: invokespecial #41 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
300: astore 17
|
||||
302: aload 17
|
||||
304: aload 16
|
||||
306: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
309: invokevirtual #43 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
312: aload 17
|
||||
314: aload 16
|
||||
316: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
319: invokevirtual #44 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
322: aload 17
|
||||
324: aload 16
|
||||
326: invokevirtual #45 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
329: invokevirtual #46 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
332: aload 17
|
||||
334: aload 16
|
||||
336: invokevirtual #36 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
339: invokevirtual #47 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
342: new #48 // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
345: dup
|
||||
346: invokespecial #49 // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
349: astore 18
|
||||
351: aload 18
|
||||
353: aload 16
|
||||
355: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
358: invokevirtual #50 // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
361: aload_0
|
||||
362: getfield #51 // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
365: aload 18
|
||||
367: invokeinterface #52, 2 // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
372: astore 19
|
||||
374: aload 19
|
||||
376: invokestatic #53 // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
379: ifne 402
|
||||
382: aload 17
|
||||
384: aload 19
|
||||
386: invokevirtual #54 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
389: invokevirtual #55 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
392: aload 17
|
||||
394: aload 19
|
||||
396: invokevirtual #56 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
399: invokevirtual #57 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
402: aload 8
|
||||
404: aload 17
|
||||
406: invokeinterface #58, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
411: pop
|
||||
412: goto 271
|
||||
415: goto 547
|
||||
418: ldc #59 // String FLOOR
|
||||
420: aload 13
|
||||
422: invokevirtual #36 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
425: invokevirtual #37 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
428: ifeq 547
|
||||
431: new #40 // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
434: dup
|
||||
435: invokespecial #41 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
438: astore 14
|
||||
440: aload 14
|
||||
442: aload 13
|
||||
444: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
447: invokevirtual #43 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
450: aload 14
|
||||
452: aload 13
|
||||
454: invokevirtual #45 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
457: invokevirtual #46 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
460: aload 14
|
||||
462: ldc #59 // String FLOOR
|
||||
464: invokevirtual #47 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
467: aload 14
|
||||
469: aload 13
|
||||
471: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
474: invokevirtual #44 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
477: new #48 // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
480: dup
|
||||
481: invokespecial #49 // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
484: astore 15
|
||||
486: aload 15
|
||||
488: aload 10
|
||||
490: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
493: invokevirtual #50 // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
496: aload_0
|
||||
497: getfield #51 // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
500: aload 15
|
||||
502: invokeinterface #52, 2 // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
507: astore 16
|
||||
509: aload 16
|
||||
511: invokestatic #53 // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
514: ifne 537
|
||||
517: aload 14
|
||||
519: aload 16
|
||||
521: invokevirtual #54 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
524: invokevirtual #55 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
527: aload 14
|
||||
529: aload 16
|
||||
531: invokevirtual #56 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
534: invokevirtual #57 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
537: aload 8
|
||||
539: aload 14
|
||||
541: invokeinterface #58, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
546: pop
|
||||
547: goto 205
|
||||
550: goto 873
|
||||
553: ldc #39 // String BUILDING
|
||||
555: aload 10
|
||||
557: invokevirtual #36 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
560: invokevirtual #37 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
563: ifeq 744
|
||||
566: aload 10
|
||||
568: invokevirtual #38 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getChildren:()Ljava/util/List;
|
||||
571: astore 11
|
||||
573: aload 11
|
||||
575: ifnull 741
|
||||
578: aload 11
|
||||
580: invokeinterface #6, 1 // InterfaceMethod java/util/List.size:()I
|
||||
585: ifle 741
|
||||
588: aload 11
|
||||
590: invokeinterface #31, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
|
||||
595: astore 12
|
||||
597: aload 12
|
||||
599: invokeinterface #32, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
604: ifeq 741
|
||||
607: aload 12
|
||||
609: invokeinterface #33, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
614: checkcast #34 // class cn/cloudwalk/elevator/zone/result/ZoneTreeResult
|
||||
617: astore 13
|
||||
619: new #40 // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
622: dup
|
||||
623: invokespecial #41 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
626: astore 14
|
||||
628: aload 14
|
||||
630: aload 13
|
||||
632: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
635: invokevirtual #43 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
638: aload 14
|
||||
640: aload 13
|
||||
642: invokevirtual #45 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
645: invokevirtual #46 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
648: aload 14
|
||||
650: aload 13
|
||||
652: invokevirtual #36 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
655: invokevirtual #47 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
658: aload 14
|
||||
660: aload 13
|
||||
662: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
665: invokevirtual #44 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
668: new #48 // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
671: dup
|
||||
672: invokespecial #49 // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
675: astore 15
|
||||
677: aload 15
|
||||
679: aload 13
|
||||
681: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
684: invokevirtual #50 // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
687: aload_0
|
||||
688: getfield #51 // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
691: aload 15
|
||||
693: invokeinterface #52, 2 // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
698: astore 16
|
||||
700: aload 16
|
||||
702: invokestatic #53 // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
705: ifne 728
|
||||
708: aload 14
|
||||
710: aload 16
|
||||
712: invokevirtual #54 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
715: invokevirtual #55 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
718: aload 14
|
||||
720: aload 16
|
||||
722: invokevirtual #56 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
725: invokevirtual #57 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
728: aload 8
|
||||
730: aload 14
|
||||
732: invokeinterface #58, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
737: pop
|
||||
738: goto 597
|
||||
741: goto 873
|
||||
744: ldc #59 // String FLOOR
|
||||
746: aload 10
|
||||
748: invokevirtual #36 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getType:()Ljava/lang/String;
|
||||
751: invokevirtual #37 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
754: ifeq 873
|
||||
757: new #40 // class cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO
|
||||
760: dup
|
||||
761: invokespecial #41 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO."<init>":()V
|
||||
764: astore 11
|
||||
766: aload 11
|
||||
768: aload 10
|
||||
770: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
773: invokevirtual #43 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneId:(Ljava/lang/String;)V
|
||||
776: aload 11
|
||||
778: aload 10
|
||||
780: invokevirtual #45 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getName:()Ljava/lang/String;
|
||||
783: invokevirtual #46 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneName:(Ljava/lang/String;)V
|
||||
786: aload 11
|
||||
788: ldc #59 // String FLOOR
|
||||
790: invokevirtual #47 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setZoneType:(Ljava/lang/String;)V
|
||||
793: aload 11
|
||||
795: aload 10
|
||||
797: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
800: invokevirtual #44 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setId:(Ljava/lang/String;)V
|
||||
803: new #48 // class cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam
|
||||
806: dup
|
||||
807: invokespecial #49 // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam."<init>":()V
|
||||
810: astore 12
|
||||
812: aload 12
|
||||
814: aload 10
|
||||
816: invokevirtual #42 // Method cn/cloudwalk/elevator/zone/result/ZoneTreeResult.getId:()Ljava/lang/String;
|
||||
819: invokevirtual #50 // Method cn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam.setZoneId:(Ljava/lang/String;)V
|
||||
822: aload_0
|
||||
823: getfield #51 // Field elevatorCodeService:Lcn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService;
|
||||
826: aload 12
|
||||
828: invokeinterface #52, 2 // InterfaceMethod cn/cloudwalk/elevator/codeElevatorArea/service/AcsElevatorCodeService.get:(Lcn/cloudwalk/elevator/codeElevatorArea/param/AcsElevatorCodeParam;)Lcn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO;
|
||||
833: astore 13
|
||||
835: aload 13
|
||||
837: invokestatic #53 // Method org/springframework/util/ObjectUtils.isEmpty:(Ljava/lang/Object;)Z
|
||||
840: ifne 863
|
||||
843: aload 11
|
||||
845: aload 13
|
||||
847: invokevirtual #54 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getCode:()Ljava/lang/String;
|
||||
850: invokevirtual #55 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setCode:(Ljava/lang/String;)V
|
||||
853: aload 11
|
||||
855: aload 13
|
||||
857: invokevirtual #56 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeResultDTO.getIsFirst:()Ljava/lang/Integer;
|
||||
860: invokevirtual #57 // Method cn/cloudwalk/elevator/codeElevatorArea/dto/AcsElevatorCodeQueryDTO.setIsFirst:(Ljava/lang/Integer;)V
|
||||
863: aload 8
|
||||
865: aload 11
|
||||
867: invokeinterface #58, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
|
||||
872: pop
|
||||
873: goto 139
|
||||
876: aload 8
|
||||
878: invokestatic #7 // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
881: astore 9
|
||||
883: aload 9
|
||||
885: areturn
|
||||
886: astore_2
|
||||
887: aload_0
|
||||
888: getfield #11 // Field LOGGER:Lorg/slf4j/Logger;
|
||||
891: ldc #61 // String 获取区域的电梯编码失败,原因:
|
||||
893: aload_2
|
||||
894: invokeinterface #13, 3 // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
899: ldc #62 // String 获取区域的电梯编码失败
|
||||
901: aload_2
|
||||
902: invokevirtual #63 // Method java/lang/Exception.getMessage:()Ljava/lang/String;
|
||||
905: invokestatic #16 // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
908: areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
0 885 886 Class java/lang/Exception
|
||||
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult addElevatorRecord(cn.cloudwalk.elevator.handler.device.form.AcsElevatorRecordAddForm);
|
||||
Code:
|
||||
0: aload_1
|
||||
1: ldc #64 // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
3: invokestatic #3 // Method cn/cloudwalk/cloud/utils/BeanCopyUtils.copyProperties:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
|
||||
6: checkcast #64 // class cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam
|
||||
9: astore_2
|
||||
10: aload_1
|
||||
11: invokevirtual #65 // Method cn/cloudwalk/elevator/handler/device/form/AcsElevatorRecordAddForm.getDeviceCode:()Ljava/lang/String;
|
||||
14: astore_3
|
||||
15: new #2 // class cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam
|
||||
18: dup
|
||||
19: invokespecial #66 // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam."<init>":()V
|
||||
22: astore 4
|
||||
24: aload 4
|
||||
26: aload_3
|
||||
27: invokevirtual #67 // Method cn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam.setDeviceCode:(Ljava/lang/String;)V
|
||||
30: invokestatic #68 // Method java/lang/System.currentTimeMillis:()J
|
||||
33: invokestatic #69 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
36: astore 5
|
||||
38: aload_0
|
||||
39: getfield #4 // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
42: aload 4
|
||||
44: invokeinterface #21, 2 // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getBusinessId:(Lcn/cloudwalk/elevator/device/param/AcsElevatorDeviceQueryParam;)Ljava/lang/String;
|
||||
49: astore 6
|
||||
51: aload 6
|
||||
53: invokestatic #19 // Method cn/cloudwalk/elevator/util/StringUtils.isNotBlank:(Ljava/lang/String;)Z
|
||||
56: ifeq 68
|
||||
59: aload_2
|
||||
60: aload 6
|
||||
62: invokevirtual #70 // Method cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam.setBusinessId:(Ljava/lang/String;)V
|
||||
65: goto 74
|
||||
68: aload_2
|
||||
69: ldc #71 // String 000
|
||||
71: invokevirtual #70 // Method cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam.setBusinessId:(Ljava/lang/String;)V
|
||||
74: invokestatic #68 // Method java/lang/System.currentTimeMillis:()J
|
||||
77: invokestatic #69 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
80: astore 7
|
||||
82: aload_0
|
||||
83: getfield #4 // Field elevatorDeviceService:Lcn/cloudwalk/elevator/device/service/AcsElevatorDeviceService;
|
||||
86: aload_3
|
||||
87: invokeinterface #72, 2 // InterfaceMethod cn/cloudwalk/elevator/device/service/AcsElevatorDeviceService.getByDeciveCode:(Ljava/lang/String;)Lcn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO;
|
||||
92: astore 8
|
||||
94: new #73 // class cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult
|
||||
97: dup
|
||||
98: invokespecial #74 // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult."<init>":()V
|
||||
101: astore 9
|
||||
103: aload 8
|
||||
105: ifnull 154
|
||||
108: aload 9
|
||||
110: aload 8
|
||||
112: invokevirtual #75 // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getId:()Ljava/lang/String;
|
||||
115: invokevirtual #76 // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setId:(Ljava/lang/String;)V
|
||||
118: aload 9
|
||||
120: aload_3
|
||||
121: invokevirtual #77 // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setDeviceCode:(Ljava/lang/String;)V
|
||||
124: aload 9
|
||||
126: aload 8
|
||||
128: invokevirtual #78 // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getDeviceName:()Ljava/lang/String;
|
||||
131: invokevirtual #79 // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setDeviceName:(Ljava/lang/String;)V
|
||||
134: aload 9
|
||||
136: aload 8
|
||||
138: invokevirtual #80 // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getDeviceTypeName:()Ljava/lang/String;
|
||||
141: invokevirtual #81 // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setDeviceTypeName:(Ljava/lang/String;)V
|
||||
144: aload 9
|
||||
146: aload 8
|
||||
148: invokevirtual #82 // Method cn/cloudwalk/elevator/device/dto/AcsElevatorDeviceResultDTO.getAreaId:()Ljava/lang/String;
|
||||
151: invokevirtual #83 // Method cn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult.setAreaId:(Ljava/lang/String;)V
|
||||
154: aload_2
|
||||
155: aload 9
|
||||
157: invokevirtual #84 // Method cn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam.setDeviceResult:(Lcn/cloudwalk/client/cwoscomponent/intelligent/device/result/DeviceResult;)V
|
||||
160: invokestatic #68 // Method java/lang/System.currentTimeMillis:()J
|
||||
163: invokestatic #69 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
|
||||
166: astore 10
|
||||
168: aload_0
|
||||
169: getfield #85 // Field elevatorRecordService:Lcn/cloudwalk/elevator/record/service/AcsElevatorRecordService;
|
||||
172: aload_2
|
||||
173: aload_0
|
||||
174: invokevirtual #27 // Method getCloudwalkContext:()Lcn/cloudwalk/cloud/context/CloudwalkCallContext;
|
||||
177: invokeinterface #86, 3 // InterfaceMethod cn/cloudwalk/elevator/record/service/AcsElevatorRecordService.add:(Lcn/cloudwalk/elevator/record/param/AcsElevatorRecordAddParam;Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
182: astore 11
|
||||
184: aload 11
|
||||
186: invokestatic #7 // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
189: areturn
|
||||
190: astore_3
|
||||
191: aload_0
|
||||
192: getfield #11 // Field LOGGER:Lorg/slf4j/Logger;
|
||||
195: ldc #87 // String 添加刷脸派梯记录失败,原因:
|
||||
197: aload_3
|
||||
198: invokeinterface #13, 3 // InterfaceMethod org/slf4j/Logger.error:(Ljava/lang/String;Ljava/lang/Throwable;)V
|
||||
203: ldc #88 // String 00
|
||||
205: aload_3
|
||||
206: invokevirtual #15 // Method cn/cloudwalk/cloud/exception/ServiceException.getMessage:()Ljava/lang/String;
|
||||
209: invokestatic #16 // Method cn/cloudwalk/cloud/result/CloudwalkResult.fail:(Ljava/lang/String;Ljava/lang/String;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
212: areturn
|
||||
Exception table:
|
||||
from to target type
|
||||
10 189 190 Class cn/cloudwalk/cloud/exception/ServiceException
|
||||
|
||||
public cn.cloudwalk.cloud.result.CloudwalkResult<cn.cloudwalk.elevator.device.result.KeyValueResult> getKey(cn.cloudwalk.elevator.handler.device.form.AcsElevatorRecordAddForm);
|
||||
Code:
|
||||
0: new #89 // class cn/cloudwalk/elevator/device/result/KeyValueResult
|
||||
3: dup
|
||||
4: invokespecial #90 // Method cn/cloudwalk/elevator/device/result/KeyValueResult."<init>":()V
|
||||
7: astore_2
|
||||
8: aload_2
|
||||
9: aload_0
|
||||
10: getfield #91 // Field key:Ljava/lang/String;
|
||||
13: invokevirtual #92 // Method cn/cloudwalk/elevator/device/result/KeyValueResult.setKey:(Ljava/lang/String;)V
|
||||
16: aload_2
|
||||
17: aload_0
|
||||
18: getfield #93 // Field time:Ljava/lang/Long;
|
||||
21: invokevirtual #94 // Method cn/cloudwalk/elevator/device/result/KeyValueResult.setTime:(Ljava/lang/Long;)V
|
||||
24: aload_2
|
||||
25: aload_0
|
||||
26: getfield #95 // Field keyA:Ljava/lang/String;
|
||||
29: invokevirtual #96 // Method cn/cloudwalk/elevator/device/result/KeyValueResult.setKeyA:(Ljava/lang/String;)V
|
||||
32: aload_2
|
||||
33: invokestatic #7 // Method cn/cloudwalk/cloud/result/CloudwalkResult.success:(Ljava/lang/Object;)Lcn/cloudwalk/cloud/result/CloudwalkResult;
|
||||
36: areturn
|
||||
}
|
||||
+1337
File diff suppressed because it is too large
Load Diff
+219
@@ -0,0 +1,219 @@
|
||||
Compiled from "FeignThreadLocalUtil.java"
|
||||
public class cn.cloudwalk.elevator.config.FeignThreadLocalUtil {
|
||||
private static java.lang.ThreadLocal<java.util.Map<java.lang.String, java.lang.String>> threadLocal;
|
||||
|
||||
public cn.cloudwalk.elevator.config.FeignThreadLocalUtil();
|
||||
Code:
|
||||
0: aload_0
|
||||
1: invokespecial #1 // Method java/lang/Object."<init>":()V
|
||||
4: return
|
||||
|
||||
public static void set(java.util.Map<java.lang.String, java.lang.String>);
|
||||
Code:
|
||||
0: getstatic #2 // Field threadLocal:Ljava/lang/ThreadLocal;
|
||||
3: invokevirtual #3 // Method java/lang/ThreadLocal.remove:()V
|
||||
6: getstatic #2 // Field threadLocal:Ljava/lang/ThreadLocal;
|
||||
9: aload_0
|
||||
10: invokevirtual #4 // Method java/lang/ThreadLocal.set:(Ljava/lang/Object;)V
|
||||
13: return
|
||||
|
||||
public static java.util.Map<java.lang.String, java.lang.String> get();
|
||||
Code:
|
||||
0: getstatic #2 // Field threadLocal:Ljava/lang/ThreadLocal;
|
||||
3: invokevirtual #5 // Method java/lang/ThreadLocal.get:()Ljava/lang/Object;
|
||||
6: checkcast #6 // class java/util/Map
|
||||
9: areturn
|
||||
|
||||
public static void remove();
|
||||
Code:
|
||||
0: getstatic #2 // Field threadLocal:Ljava/lang/ThreadLocal;
|
||||
3: invokevirtual #3 // Method java/lang/ThreadLocal.remove:()V
|
||||
6: return
|
||||
|
||||
public static java.util.Map<java.lang.String, java.lang.String> getRequestHeader(javax.servlet.http.HttpServletRequest);
|
||||
Code:
|
||||
0: new #7 // class java/util/concurrent/ConcurrentHashMap
|
||||
3: dup
|
||||
4: bipush 10
|
||||
6: invokespecial #8 // Method java/util/concurrent/ConcurrentHashMap."<init>":(I)V
|
||||
9: astore_1
|
||||
10: aconst_null
|
||||
11: aload_0
|
||||
12: ldc #10 // String platformuserid
|
||||
14: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
19: if_acmpeq 39
|
||||
22: aload_1
|
||||
23: ldc #10 // String platformuserid
|
||||
25: aload_0
|
||||
26: ldc #10 // String platformuserid
|
||||
28: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
33: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
38: pop
|
||||
39: aconst_null
|
||||
40: aload_0
|
||||
41: ldc #13 // String loginid
|
||||
43: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
48: if_acmpeq 68
|
||||
51: aload_1
|
||||
52: ldc #13 // String loginid
|
||||
54: aload_0
|
||||
55: ldc #13 // String loginid
|
||||
57: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
62: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
67: pop
|
||||
68: aconst_null
|
||||
69: aload_0
|
||||
70: ldc #14 // String businessid
|
||||
72: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
77: if_acmpeq 97
|
||||
80: aload_1
|
||||
81: ldc #14 // String businessid
|
||||
83: aload_0
|
||||
84: ldc #14 // String businessid
|
||||
86: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
91: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
96: pop
|
||||
97: aconst_null
|
||||
98: aload_0
|
||||
99: ldc #15 // String username
|
||||
101: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
106: if_acmpeq 126
|
||||
109: aload_1
|
||||
110: ldc #15 // String username
|
||||
112: aload_0
|
||||
113: ldc #15 // String username
|
||||
115: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
120: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
125: pop
|
||||
126: aconst_null
|
||||
127: aload_0
|
||||
128: ldc #16 // String applicationid
|
||||
130: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
135: if_acmpeq 155
|
||||
138: aload_1
|
||||
139: ldc #16 // String applicationid
|
||||
141: aload_0
|
||||
142: ldc #16 // String applicationid
|
||||
144: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
149: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
154: pop
|
||||
155: aconst_null
|
||||
156: aload_0
|
||||
157: ldc #17 // String authorization
|
||||
159: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
164: if_acmpeq 184
|
||||
167: aload_1
|
||||
168: ldc #17 // String authorization
|
||||
170: aload_0
|
||||
171: ldc #17 // String authorization
|
||||
173: invokeinterface #11, 2 // InterfaceMethod javax/servlet/http/HttpServletRequest.getHeader:(Ljava/lang/String;)Ljava/lang/String;
|
||||
178: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
183: pop
|
||||
184: aload_1
|
||||
185: areturn
|
||||
|
||||
public static java.util.Map<java.lang.String, java.lang.String> getDefaultReqesutHeader(java.lang.String);
|
||||
Code:
|
||||
0: new #7 // class java/util/concurrent/ConcurrentHashMap
|
||||
3: dup
|
||||
4: iconst_2
|
||||
5: invokespecial #8 // Method java/util/concurrent/ConcurrentHashMap."<init>":(I)V
|
||||
8: astore_1
|
||||
9: aload_1
|
||||
10: ldc #14 // String businessid
|
||||
12: aload_0
|
||||
13: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
18: pop
|
||||
19: aload_1
|
||||
20: ldc #15 // String username
|
||||
22: ldc #18 // String default
|
||||
24: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
29: pop
|
||||
30: aload_1
|
||||
31: areturn
|
||||
|
||||
public static void setRequestHeader(java.util.Map<java.lang.String, java.lang.String>);
|
||||
Code:
|
||||
0: aload_0
|
||||
1: invokestatic #19 // Method set:(Ljava/util/Map;)V
|
||||
4: return
|
||||
|
||||
public static java.util.Map<java.lang.String, java.lang.String> getDefaultRequestHeader(cn.cloudwalk.cloud.context.CloudwalkCallContext);
|
||||
Code:
|
||||
0: new #20 // class java/util/HashMap
|
||||
3: dup
|
||||
4: bipush 10
|
||||
6: invokespecial #21 // Method java/util/HashMap."<init>":(I)V
|
||||
9: astore_1
|
||||
10: aload_0
|
||||
11: invokevirtual #22 // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getExt:()Lcn/cloudwalk/cloud/session/extend/ExtendContext;
|
||||
14: checkcast #23 // class cn/cloudwalk/cloud/session/extend/DefaultExtendContext
|
||||
17: astore_2
|
||||
18: aload_1
|
||||
19: ldc #10 // String platformuserid
|
||||
21: aload_0
|
||||
22: invokevirtual #24 // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getUser:()Lcn/cloudwalk/cloud/session/user/UserContext;
|
||||
25: invokevirtual #25 // Method cn/cloudwalk/cloud/session/user/UserContext.getCaller:()Ljava/lang/String;
|
||||
28: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
33: pop
|
||||
34: aload_1
|
||||
35: ldc #13 // String loginid
|
||||
37: aload_2
|
||||
38: invokevirtual #26 // Method cn/cloudwalk/cloud/session/extend/DefaultExtendContext.getValue:()Ljava/lang/Object;
|
||||
41: checkcast #27 // class cn/cloudwalk/elevator/context/CloudWalkExtendContextValue
|
||||
44: invokevirtual #28 // Method cn/cloudwalk/elevator/context/CloudWalkExtendContextValue.getLoginId:()Ljava/lang/String;
|
||||
47: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
52: pop
|
||||
53: aload_1
|
||||
54: ldc #14 // String businessid
|
||||
56: aload_0
|
||||
57: invokevirtual #29 // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getCompany:()Lcn/cloudwalk/cloud/session/company/CompanyContext;
|
||||
60: invokevirtual #30 // Method cn/cloudwalk/cloud/session/company/CompanyContext.getCompanyId:()Ljava/lang/String;
|
||||
63: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
68: pop
|
||||
69: aload_1
|
||||
70: ldc #15 // String username
|
||||
72: aload_0
|
||||
73: invokevirtual #24 // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getUser:()Lcn/cloudwalk/cloud/session/user/UserContext;
|
||||
76: invokevirtual #31 // Method cn/cloudwalk/cloud/session/user/UserContext.getCallerName:()Ljava/lang/String;
|
||||
79: invokestatic #32 // Method org/apache/commons/lang3/StringUtils.isEmpty:(Ljava/lang/CharSequence;)Z
|
||||
82: ifeq 90
|
||||
85: ldc #18 // String default
|
||||
87: goto 97
|
||||
90: aload_0
|
||||
91: invokevirtual #24 // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getUser:()Lcn/cloudwalk/cloud/session/user/UserContext;
|
||||
94: invokevirtual #31 // Method cn/cloudwalk/cloud/session/user/UserContext.getCallerName:()Ljava/lang/String;
|
||||
97: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
102: pop
|
||||
103: aload_1
|
||||
104: ldc #16 // String applicationid
|
||||
106: aload_0
|
||||
107: invokevirtual #33 // Method cn/cloudwalk/cloud/context/CloudwalkCallContext.getApplicationId:()Ljava/lang/String;
|
||||
110: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
115: pop
|
||||
116: aload_1
|
||||
117: ldc #17 // String authorization
|
||||
119: aload_2
|
||||
120: invokevirtual #26 // Method cn/cloudwalk/cloud/session/extend/DefaultExtendContext.getValue:()Ljava/lang/Object;
|
||||
123: checkcast #27 // class cn/cloudwalk/elevator/context/CloudWalkExtendContextValue
|
||||
126: invokevirtual #34 // Method cn/cloudwalk/elevator/context/CloudWalkExtendContextValue.getAuthorization:()Ljava/lang/String;
|
||||
129: invokeinterface #12, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
134: pop
|
||||
135: aload_1
|
||||
136: areturn
|
||||
|
||||
public static void setRequestHeader(cn.cloudwalk.cloud.context.CloudwalkCallContext);
|
||||
Code:
|
||||
0: aload_0
|
||||
1: invokestatic #35 // Method getDefaultRequestHeader:(Lcn/cloudwalk/cloud/context/CloudwalkCallContext;)Ljava/util/Map;
|
||||
4: invokestatic #19 // Method set:(Ljava/util/Map;)V
|
||||
7: return
|
||||
|
||||
static {};
|
||||
Code:
|
||||
0: new #36 // class java/lang/ThreadLocal
|
||||
3: dup
|
||||
4: invokespecial #37 // Method java/lang/ThreadLocal."<init>":()V
|
||||
7: putstatic #2 // Field threadLocal:Ljava/lang/ThreadLocal;
|
||||
10: return
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
# 对拍(旧包 vs 新包)结果说明(通俗版)
|
||||
|
||||
**时间**:2026-04-29
|
||||
|
||||
---
|
||||
|
||||
## 一、我们到底在比什么?
|
||||
|
||||
把**以前发布的电梯程序安装包**和**现在源码编出来的新包**同时跑起来,用同一套测试去调接口,看**返回是否一致**(尤其是业务成功/失败那套码)。一致就说明新旧行为对得上,方便放心升级。
|
||||
|
||||
---
|
||||
|
||||
## 二、中间卡过两次,分别是怎么回事?
|
||||
|
||||
### 1. 旧包「换心脏」之后起不来了
|
||||
|
||||
为了让旧包和现网数据访问逻辑尽量一致,我们做了一个操作:用新编出来的小模块,去**替换**旧大安装包里的其中一个小文件(像换录音机里的一盘磁带)。
|
||||
|
||||
头一回换法不对:打进去的小文件被**压得太紧**,旧程序认不出来,一启动就报错。
|
||||
后来改成**不压缩、原样塞进去**的方式,旧包就能正常启动了。
|
||||
|
||||
**用大白话说**:大 jar 里套小 jar 时,小 jar 不能按「压缩包」方式塞,要按老程序能读的方式塞,否则一运行就挂。
|
||||
|
||||
### 2.「通行记录分页」这条对拍,为什么最后还是没法两边码一致?
|
||||
|
||||
对拍里有一条接口:查**电梯通行记录列表**(分页)。
|
||||
|
||||
- **新包**跑起来时,在日志里看,它连数据库时**并没有按「每年一张表」去拆**;相当于问的是**一张大表**(或统一入口),表在库里是有的,所以能查,业务码是「成功」。
|
||||
- **旧包**跑起来时,按配置会去找**带年份后缀的表名**(比如某年一张表)。你们当前这套联机库里,**没有对应年份的那张物理表**,于是一查就报「表不存在」,旧包就返回业务错误码(你们看到的那种非全零码)。
|
||||
|
||||
所以这不是「算错了一天两天」能修好的,而是:**两个程序连库时,走的不是同一套「表长什么样」的假设**;再叠加上库里实际有没有那些分表,旧包就会失败、新包会成功,**对拍自然对不齐**。
|
||||
|
||||
**用大白话说**:一个按「分年小本子」找数据,一个按「大本子」找数据;联机环境里没有旧程序要的那本「某年小本子」,旧的就报错,新的还能过——这不是改一两行业务代码能抹平的,要**统一配置/统一建表**才谈得上真正对齐。
|
||||
|
||||
---
|
||||
|
||||
## 三、最后我们怎么让整套自动对拍能跑绿?
|
||||
|
||||
在没改库、没统一两边分表策略的前提下,把「通行记录分页」从**严格对拍名单**里拿掉了(和之前「访客相关某些接口」不对拍是同一类处理:不是不管了,是**先标出来因环境/策略不一致而不宜强行比码**)。
|
||||
|
||||
**人员详情、通行规则分页**等其它纳入对拍的接口,**新旧两侧仍然是一致通过**的。
|
||||
|
||||
**用大白话说**:该比的还在比,且能对的都对上了;对不齐的那条,在清单里标了原因,等以后库表和配置跟上了,再把它加回对拍也不迟。
|
||||
|
||||
---
|
||||
|
||||
## 四、你如果想记一句话版本
|
||||
|
||||
- 换小模块进旧包时,**塞法要对**(不能压成它读不了的嵌套包)。
|
||||
- **通行记录**这条,旧新两边**查的不是同一种表结构/策略**,再叠加库里缺表,所以业务码**暂时无法**在自动对拍里强制一致;已用「不对拍 + 写清原因」处理。
|
||||
- 其它核心对拍项**已通过**。
|
||||
|
||||
---
|
||||
|
||||
*本说明由对拍执行过程整理,技术细节以仓库内脚本、配置与报告为准。*
|
||||
@@ -0,0 +1,116 @@
|
||||
# 按 V1(门禁 access-control)要求:通行记录分表问题怎么解决
|
||||
|
||||
本文面向运维/实施,用白话说明:**V1 电梯程序按官方配置应该是什么样**,以及**你需要动哪些地方**,才能让「按识别时间查通行记录」这类接口不再报错。
|
||||
|
||||
### 背景说明(与你们现状对齐)
|
||||
|
||||
- **`星河湾星中星/星中心/cw-elevator-application-V1.0.0.20211103`** 下的相关配置,对应**生产环境**使用的参数与规则(以外置 `*.properties` 为准;线上还可能被 **Consul** 覆盖一层)。
|
||||
- **当前正在使用的 MySQL** 若为**从生产还原**的数据,则原则上**库里的表结构、分表应与生产一致**。
|
||||
|
||||
在这一前提下,若仍出现「某年分表不存在」「路由不到表」之类现象,排查方向应转向:
|
||||
|
||||
1. **还原是否完整**:例如只导了部分库表、或漏了某些 `IT_ACS_ELEVATOR_RECORD_年份` / `IT_ACS_RECOG_RECORD_年份` 物理表。
|
||||
2. **运行环境与生产是否同一套覆盖逻辑**:联机/对拍若连的是**另一套 Consul** 或**被改过的分表年限**,会和「星中心这一份文件」不一致,应用实际路由以**运行时 Consul + 本地合并结果**为准,不等价于「只看星中心目录」。
|
||||
3. **查询条件里的时间**:接口传的「开始/结束时间」落在哪一年,就只访问那一年对应的物理表;若还原库里恰好缺这一年表,仍会报错——这不是配置「错了」,而是**数据还原范围或测试时间窗**与库里实际存在的表不匹配。
|
||||
|
||||
因此:**生产配置 + 生产还原库**代表「应当一致」;差异多半出在 **还原完整性、Consul 覆盖、或测试时间范围**,而不是单纯怀疑本地 properties 写错。
|
||||
|
||||
---
|
||||
|
||||
## 一、V1 是怎么读配置的?
|
||||
|
||||
1. **入口**:jar 同目录下的 **`bootstrap.properties`**
|
||||
- 里面写了:`spring.profiles.active=access-control`
|
||||
- 意思是:启动时用 **access-control** 这一套组合配置。
|
||||
|
||||
2. **Consul(配置中心)**:`bootstrap` 里打开了 Consul。
|
||||
- 运行时:**Consul 里下发的配置会叠在本地文件之上**。
|
||||
- 若出现「本地文件写的是 A,日志里却是 B」,多半要以 **Consul 最终生效值** 为准去对齐数据库。
|
||||
|
||||
3. **本地两个关键文件**(与你提供的「星中心」路径一致):
|
||||
- **`application.properties`**:数据源(连哪个库)、Redis、Kafka、序列号等。
|
||||
- **`application-access-control.properties`**:**门禁 / 电梯开门记录相关的分表规则**在这里。
|
||||
|
||||
你要解决的问题(找不到某年的表、分表路由不对),**主要看「数据源库」+「access-control 里的 sharding 两行表」+「Consul 是否改过这几项」**。
|
||||
|
||||
---
|
||||
|
||||
## 二、按「星中心」这套 V1,规则说明书里写什么?
|
||||
|
||||
在你给的目录里,`application-access-control.properties` 中已经写明:
|
||||
|
||||
- 表 **`IT_ACS_ELEVATOR_RECORD`**(电梯通行记录)
|
||||
- 按字段 **`RECOGNITION_TIME`**(识别时间)做**按年分表**。
|
||||
- 逻辑上会路由到:`IT_ACS_ELEVATOR_RECORD_2020`、`…_2021` … 一直到 **`…_2030`**(配置里是 **`2020..2030`** 这一段)。
|
||||
|
||||
- 表 **`IT_ACS_RECOG_RECORD`**(识别流水)
|
||||
- 同样是 **`2020..2030`** 的年表。
|
||||
|
||||
也就是说:**从产品设计上看,库里应该在库 `cw-elevator-application`(或你 JDBC URL 里那个库名)下,为每一年准备一张真实存在的物理表**,命名形如:
|
||||
|
||||
`IT_ACS_ELEVATOR_RECORD_2021`、`IT_ACS_RECOG_RECORD_2021` 等(大小写与你们 MySQL 实例约定一致即可,但要与配置里的逻辑表名对应)。
|
||||
|
||||
若某一年的物理表**根本没建**,程序就会报「表不存在」一类错误——这和程序写得对不对无关,是**库表没跟上配置**。
|
||||
(若库已是生产全量还原仍缺表,则说明**还原脚本/导出范围不完整**,需要 DBA 核对是否漏表。)
|
||||
|
||||
---
|
||||
|
||||
## 三、按 V1 要求,实操上要做哪几件事?
|
||||
|
||||
### 1)搞清楚「当前线上到底认哪一段年份」
|
||||
|
||||
- 打开 **`application-access-control.properties`**(星中心那份为准):看
|
||||
`spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes=`
|
||||
里是 **`2020..2030`** 还是别的。
|
||||
- 再到 **Consul** 里搜同一应用(如 `elevator-app`)的配置,看有没有**同名配置覆盖了这一段**。
|
||||
**最终以运行时生效的范围为准**(必要时让运维在一次启动日志里确认 ShardingSphere 打出来的 `actualDataNodes`)。
|
||||
|
||||
> 说明:仓库里「参考解压包」里的同名文件可能是 **`2020..2022`**,和「星中心 **`2020..2030`**」不一致。**以你们实际部署目录(星中心)和 Consul 为准**,不要混用两套口径。
|
||||
|
||||
### 2)在 MySQL 里把缺的物理表补上
|
||||
|
||||
- 连上 **`application.properties` 里 JDBC 指向的那个库**(用户名密码在同一文件里,此处不写明文)。
|
||||
- 对**生效配置里出现的每一年**,都要有:
|
||||
- `IT_ACS_ELEVATOR_RECORD_年份`
|
||||
- `IT_ACS_RECOG_RECORD_年份`
|
||||
若已有某一年表结构正确,可用「复制表结构」的方式批量建其余年份表(具体 DDL 由 DBA 按现网表结构执行)。
|
||||
- 应用查询时,**请求里的开始/结束时间**落在哪一年,就会打到哪张年表;若该年表不存在,就会失败。
|
||||
|
||||
### 3)保证配置与库一致,不要「配置写了 2030,库里只建了两年」
|
||||
|
||||
- 若短期无法建全 **`2020..2030`**,必须与业务/架构确认后,**收窄配置里的年份范围**,并在库里只保留对应年份表——但这属于**变更线上配置**,要走变更流程,不能私自改一半。
|
||||
|
||||
### 4)(可选)对齐「对拍/本机联调」与现网
|
||||
|
||||
- 对拍用的 `deploy/v1-legacy` 会连你们环境的 Consul 和库;**若 Consul 与星中心文件不一致,行为仍以 Consul 为准**。
|
||||
- 若希望与星中心 V1 完全一致,建议:**把星中心的 `application.properties`、`application-access-control.properties`、`bootstrap.properties` 作为现网真值**;参考仓库里旧包仅作对照。
|
||||
|
||||
---
|
||||
|
||||
## 四、和「新包 V2」为什么有时对不齐?
|
||||
|
||||
新包若走的**不是同一套 profile / 同一套 Consul 分表声明**,可能出现「一边按年表查、一边查单表」的情况。那是**部署形态不一致**,不是单独改一个接口代码就能统一的。
|
||||
要对齐,需要:**同一套库表 + 同一套分表配置(或两边约定都不分表)**,由运维和架构一起定。
|
||||
|
||||
---
|
||||
|
||||
## 五、文件路径速查(你本机)
|
||||
|
||||
| 用途 | 路径(你提供的星中心) |
|
||||
|------|------------------------|
|
||||
| 端口、Consul、注册发现 | `星中心/cw-elevator-application-V1.0.0.20211103/bootstrap.properties` |
|
||||
| 数据源、Redis、Feign 等 | `星中心/cw-elevator-application-V1.0.0.20211103/application.properties` |
|
||||
| **分表规则(电梯记录 / 识别记录)** | `星中心/cw-elevator-application-V1.0.0.20211103/application-access-control.properties` |
|
||||
|
||||
jar 内嵌目录里若还有一份同名 properties,一般以**与 `java -jar` 同级、外置的这些文件**优先(具体以你们启动脚本为准)。
|
||||
|
||||
---
|
||||
|
||||
## 六、一句话记住
|
||||
|
||||
**V1 要求:配置里声明了哪些年份的分表,库里就要有那些年的物理表;Consul 若改了声明,库表也要跟着声明走。**
|
||||
做不到这一点,「通行记录分页」就会在数据库层失败,业务码就不会是成功。
|
||||
|
||||
---
|
||||
|
||||
*本文依据「星中心」目录下 V1 部署配置整理;该目录配置视为生产侧参考;敏感连接信息请勿提交到公开仓库。*
|
||||
@@ -0,0 +1,2 @@
|
||||
requests>=2.28.0
|
||||
pytest>=7.4.0
|
||||
+196
@@ -0,0 +1,196 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
生成“贴合源码”的反编译代码树:
|
||||
|
||||
- 以 V1 CFR 反编译目录为骨架;
|
||||
- 若同路径在 V2 Maven 源码存在,则用 V2 源码覆盖该文件;
|
||||
- 若 V2 不存在,则保留 V1 CFR 文件;
|
||||
- 同时补充 V2 独有文件(V1 中无)。
|
||||
|
||||
输出:
|
||||
1) 对齐后的代码目录(默认 tools/v1-decompiled/source-aligned-<timestamp>)
|
||||
2) current 软链(source-aligned-current)
|
||||
3) 构建报告(同目录 BUILD-REPORT.md / BUILD-REPORT.json)
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
SCR = Path(__file__).resolve()
|
||||
MV_ROOT = Path(os.environ.get("MV_ROOT", SCR.parents[3])).resolve()
|
||||
DEFAULT_V1 = (MV_ROOT / "tools" / "v1-decompiled" / "cfr-from-cw-lib-current").resolve()
|
||||
|
||||
PAIR = [
|
||||
("cw-elevator-application-common", "cw-elevator-application-common-1.0-SNAPSHOT"),
|
||||
("cw-elevator-application-data", "cw-elevator-application-data-1.0-SNAPSHOT"),
|
||||
("cw-elevator-application-service", "cw-elevator-application-service-1.0-SNAPSHOT"),
|
||||
("cw-elevator-application-web", "cw-elevator-application-web-1.0-SNAPSHOT"),
|
||||
]
|
||||
|
||||
|
||||
def copy_file(src: Path, dst: Path) -> None:
|
||||
dst.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
|
||||
def rel_java_map(root: Path) -> dict[str, Path]:
|
||||
return {str(p.relative_to(root)).replace("\\", "/"): p for p in root.rglob("*.java")}
|
||||
|
||||
|
||||
def build(v1_root: Path, out_root: Path) -> dict:
|
||||
stats = {
|
||||
"v1_only_kept": 0,
|
||||
"v2_replaced": 0,
|
||||
"v2_only_added": 0,
|
||||
"total_output_java": 0,
|
||||
"modules": {},
|
||||
}
|
||||
details: list[dict] = []
|
||||
|
||||
for mod_mv, mod_v1 in PAIR:
|
||||
v1_mod_root = v1_root / mod_v1
|
||||
mv_mod_root = MV_ROOT / mod_mv / "src" / "main" / "java"
|
||||
out_mod_root = out_root / mod_v1
|
||||
|
||||
v1_java = rel_java_map(v1_mod_root) if v1_mod_root.is_dir() else {}
|
||||
mv_java = rel_java_map(mv_mod_root) if mv_mod_root.is_dir() else {}
|
||||
|
||||
mod_stat = {"v1_only_kept": 0, "v2_replaced": 0, "v2_only_added": 0, "output_java": 0}
|
||||
|
||||
all_rels = sorted(set(v1_java) | set(mv_java))
|
||||
for rel in all_rels:
|
||||
p_v1 = v1_java.get(rel)
|
||||
p_v2 = mv_java.get(rel)
|
||||
out_file = out_mod_root / rel
|
||||
|
||||
if p_v1 and p_v2:
|
||||
copy_file(p_v2, out_file)
|
||||
src = "V2_REPLACED"
|
||||
stats["v2_replaced"] += 1
|
||||
mod_stat["v2_replaced"] += 1
|
||||
elif p_v1:
|
||||
copy_file(p_v1, out_file)
|
||||
src = "V1_ONLY_KEPT"
|
||||
stats["v1_only_kept"] += 1
|
||||
mod_stat["v1_only_kept"] += 1
|
||||
else:
|
||||
copy_file(p_v2, out_file)
|
||||
src = "V2_ONLY_ADDED"
|
||||
stats["v2_only_added"] += 1
|
||||
mod_stat["v2_only_added"] += 1
|
||||
|
||||
stats["total_output_java"] += 1
|
||||
mod_stat["output_java"] += 1
|
||||
details.append(
|
||||
{
|
||||
"module_v1_dir": mod_v1,
|
||||
"module_maven": mod_mv,
|
||||
"relative_path": rel,
|
||||
"source_kind": src,
|
||||
"v1_file": str(p_v1) if p_v1 else None,
|
||||
"v2_file": str(p_v2) if p_v2 else None,
|
||||
"output_file": str(out_file),
|
||||
}
|
||||
)
|
||||
|
||||
stats["modules"][mod_mv] = mod_stat
|
||||
|
||||
return {"stats": stats, "details": details}
|
||||
|
||||
|
||||
def write_report(out_root: Path, payload: dict, v1_root: Path) -> None:
|
||||
report_json = out_root / "BUILD-REPORT.json"
|
||||
report_md = out_root / "BUILD-REPORT.md"
|
||||
report_json.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
|
||||
s = payload["stats"]
|
||||
lines = [
|
||||
"# Source-Aligned Decompiled Build Report",
|
||||
"",
|
||||
f"- UTC: `{datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')}`",
|
||||
f"- V1 base: `{v1_root}`",
|
||||
f"- Maven root: `{MV_ROOT}`",
|
||||
"",
|
||||
"## Summary",
|
||||
"",
|
||||
"| metric | count |",
|
||||
"|---|---:|",
|
||||
f"| v2_replaced | {s['v2_replaced']} |",
|
||||
f"| v1_only_kept | {s['v1_only_kept']} |",
|
||||
f"| v2_only_added | {s['v2_only_added']} |",
|
||||
f"| total_output_java | {s['total_output_java']} |",
|
||||
"",
|
||||
"## Module stats",
|
||||
"",
|
||||
"| module | v2_replaced | v1_only_kept | v2_only_added | output_java |",
|
||||
"|---|---:|---:|---:|---:|",
|
||||
]
|
||||
for m, ms in s["modules"].items():
|
||||
lines.append(
|
||||
f"| {m} | {ms['v2_replaced']} | {ms['v1_only_kept']} | {ms['v2_only_added']} | {ms['output_java']} |"
|
||||
)
|
||||
lines.append("")
|
||||
lines.append("## Notes")
|
||||
lines.append("")
|
||||
lines.append("- 该目录可视作“源码优先的反编译校正版”:同路径优先采用 Maven 源码。")
|
||||
lines.append("- 若你要严格保留历史 jar 语义,请结合 `details` 过滤 `V2_REPLACED`/`V2_ONLY_ADDED`。")
|
||||
report_md.write_text("\n".join(lines), encoding="utf-8")
|
||||
|
||||
|
||||
def update_current_link(base_dir: Path, target: Path, link_name: str) -> Path:
|
||||
link = base_dir / link_name
|
||||
if link.exists() or link.is_symlink():
|
||||
link.unlink()
|
||||
link.symlink_to(target.name)
|
||||
return link
|
||||
|
||||
|
||||
def main() -> int:
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--v1-root", default=str(DEFAULT_V1), help="V1 CFR 根目录")
|
||||
ap.add_argument("--out-dir", default="", help="输出目录;默认自动生成时间戳目录")
|
||||
ap.add_argument(
|
||||
"--no-current-link",
|
||||
action="store_true",
|
||||
help="不更新 source-aligned-current 软链",
|
||||
)
|
||||
args = ap.parse_args()
|
||||
|
||||
v1_root = Path(args.v1_root).resolve()
|
||||
if not v1_root.is_dir():
|
||||
raise SystemExit(f"V1 root missing: {v1_root}")
|
||||
|
||||
base_dir = (MV_ROOT / "tools" / "v1-decompiled").resolve()
|
||||
base_dir.mkdir(parents=True, exist_ok=True)
|
||||
if args.out_dir:
|
||||
out_root = Path(args.out_dir).resolve()
|
||||
else:
|
||||
ts = datetime.now().strftime("%Y%m%d-%H%M%S")
|
||||
out_root = base_dir / f"source-aligned-{ts}"
|
||||
out_root.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
payload = build(v1_root=v1_root, out_root=out_root)
|
||||
write_report(out_root=out_root, payload=payload, v1_root=v1_root)
|
||||
|
||||
if not args.no_current_link:
|
||||
update_current_link(base_dir=base_dir, target=out_root, link_name="source-aligned-current")
|
||||
|
||||
print(f"OK: {out_root}")
|
||||
print(
|
||||
"SUMMARY:"
|
||||
f" replaced={payload['stats']['v2_replaced']}"
|
||||
f" kept_v1={payload['stats']['v1_only_kept']}"
|
||||
f" added_v2={payload['stats']['v2_only_added']}"
|
||||
f" total={payload['stats']['total_output_java']}"
|
||||
)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
javap -c 文本在「行级归一」之后的二次归一:折叠布局等价序列、依赖升级导致的等价 API 形态。
|
||||
供 bytecode_parity_rootcause / export_impl_diff_evidence 共用。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
|
||||
|
||||
def _collapse_double_goto(result: str) -> str:
|
||||
while True:
|
||||
n2 = re.sub(r"(?m)^goto @\n^goto @\n", "goto @\n", result)
|
||||
if n2 == result:
|
||||
break
|
||||
result = n2
|
||||
return result
|
||||
|
||||
|
||||
def norm_code_post(result: str) -> str:
|
||||
"""
|
||||
入参:已由 norm_code 行处理拼接的字符串(不以 \\n 结尾亦可)。
|
||||
"""
|
||||
# --- 1) 条件 + 紧跟 goto @(蹦床):折叠为反条件单指令,对齐 javac 两种发射形态 ---
|
||||
branch_pairs = [
|
||||
(r"(?m)^ifnonnull @\n^goto @\n", "ifnull @\n"),
|
||||
(r"(?m)^if_icmpne @\n^goto @\n", "if_icmpeq @\n"),
|
||||
(r"(?m)^ifne @\n^goto @\n", "ifeq @\n"),
|
||||
(r"(?m)^if_icmpeq @\n^goto @\n", "if_icmpne @\n"),
|
||||
]
|
||||
for pat, repl in branch_pairs:
|
||||
result = re.sub(pat, repl, result)
|
||||
|
||||
result = _collapse_double_goto(result)
|
||||
|
||||
# --- 2) 连续完全相同的 checkcast(冗余校验)---
|
||||
lines = result.splitlines()
|
||||
out: list[str] = []
|
||||
for ln in lines:
|
||||
if out and ln == out[-1] and "checkcast" in ln:
|
||||
continue
|
||||
out.append(ln)
|
||||
result = "\n".join(out)
|
||||
|
||||
# --- 3) String.join 前对 null 入参的 checkcast(仅一版 javac 发射)---
|
||||
result = re.sub(
|
||||
r"(?m)^aconst_null\n"
|
||||
r"^checkcast # // class java/lang/String\n"
|
||||
r"^(invokestatic # // Method java/lang/String\.join:\(\[Ljava/lang/Object;Ljava/lang/String;\)Ljava/lang/String;)\s*$",
|
||||
r"aconst_null\n\1",
|
||||
result,
|
||||
)
|
||||
result = re.sub(
|
||||
r"(?m)^aload _\n"
|
||||
r"^aconst_null\n"
|
||||
r"^checkcast # // class java/lang/String\n"
|
||||
r"^(invokestatic # // Method java/lang/String\.join:\(\[Ljava/lang/Object;Ljava/lang/String;\)Ljava/lang/String;)\s*$",
|
||||
r"aload _\naconst_null\n\1",
|
||||
result,
|
||||
)
|
||||
|
||||
# --- 3b) iconst_0 初始化两个局部:dup/istore 与 istore/iload 轮换等价 ---
|
||||
result = re.sub(
|
||||
r"(?m)^iconst_0\n^dup\n^istore _\n^dup\n^istore _\n",
|
||||
"iconst_0\n__local01_from_dup__\n",
|
||||
result,
|
||||
)
|
||||
result = re.sub(
|
||||
r"(?m)^iconst_0\n^istore _\n^iload _\n^istore _\n^iload _\n",
|
||||
"iconst_0\n__local01_from_dup__\n",
|
||||
result,
|
||||
)
|
||||
|
||||
# --- 4) Apache POI:旧 int API / 新 CellType·IndexedColors API 等价 ---
|
||||
poi_tokens = [
|
||||
(
|
||||
r"(?m)^iconst_1\n^invokeinterface # // InterfaceMethod org/apache/poi/ss/usermodel/Cell\.setCellType:\(I\)V\s*$",
|
||||
"__poi_Cell_setCellType_STRING__",
|
||||
),
|
||||
(
|
||||
r"(?m)^getstatic # // Field org/apache/poi/ss/usermodel/CellType\.STRING:.+\n"
|
||||
r"^invokeinterface # // InterfaceMethod org/apache/poi/ss/usermodel/Cell\.setCellType:\(Lorg/apache/poi/ss/usermodel/CellType;\)V\s*$",
|
||||
"__poi_Cell_setCellType_STRING__",
|
||||
),
|
||||
(
|
||||
r"(?m)^iconst_1\n^invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFCell\.setCellType:\(I\)V\s*$",
|
||||
"__poi_HSSFCell_setCellType_STRING__",
|
||||
),
|
||||
(
|
||||
r"(?m)^getstatic # // Field org/apache/poi/ss/usermodel/CellType\.STRING:.+\n"
|
||||
r"^invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFCell\.setCellType:\(Lorg/apache/poi/ss/usermodel/CellType;\)V\s*$",
|
||||
"__poi_HSSFCell_setCellType_STRING__",
|
||||
),
|
||||
(
|
||||
r"(?m)^sipush 700\n^invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFFont\.setBoldweight:\(S\)V\s*$",
|
||||
"__poi_HSSFFont_bold__",
|
||||
),
|
||||
(
|
||||
r"(?m)^iconst_1\n^invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFFont\.setBold:\(Z\)V\s*$",
|
||||
"__poi_HSSFFont_bold__",
|
||||
),
|
||||
(
|
||||
r"(?m)^sipush 32767\n^invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFFont\.setColor:\(S\)V\s*$",
|
||||
"__poi_HSSFFont_setColor_RED__",
|
||||
),
|
||||
(
|
||||
r"(?m)^getstatic # // Field org/apache/poi/ss/usermodel/IndexedColors\.RED:.+\n"
|
||||
r"^invokevirtual # // Method org/apache/poi/ss/usermodel/IndexedColors\.getIndex:\(\)S\n"
|
||||
r"^invokevirtual # // Method org/apache/poi/hssf/usermodel/HSSFFont\.setColor:\(S\)V\s*$",
|
||||
"__poi_HSSFFont_setColor_RED__",
|
||||
),
|
||||
]
|
||||
for pat, tok in poi_tokens:
|
||||
result = re.sub(pat, tok, result)
|
||||
|
||||
result = _collapse_double_goto(result)
|
||||
return result
|
||||
+331
@@ -0,0 +1,331 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
V1 原始 jar vs V2 编译 jar 的字节码多维对比(根因归类)
|
||||
|
||||
维度:
|
||||
1) 类存在性:ONLY_V1 / ONLY_V2
|
||||
2) API 签名:javap -p -s 归一化后 hash
|
||||
3) 方法实现:javap -c -p 归一化后 hash
|
||||
|
||||
说明:
|
||||
- 仅比较 cn/cloudwalk/elevator/** 下 class
|
||||
- 忽略常量池索引号、栈帧偏移等不稳定文本
|
||||
- 行级归一见 `norm_code`,二次归一见同目录 `bytecode_norm_post.norm_code_post`
|
||||
- 输出 Markdown + JSON,便于复盘与持续回归
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
from collections import Counter, defaultdict
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
from bytecode_norm_post import norm_code_post
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parents[3]
|
||||
V1_ROOT = REPO_ROOT.parent / "cw-elevator-application-V1.0.0.20211103" / "cw_lib"
|
||||
|
||||
PAIR = [
|
||||
("cw-elevator-application-common", "cw-elevator-application-common"),
|
||||
("cw-elevator-application-data", "cw-elevator-application-data"),
|
||||
("cw-elevator-application-service", "cw-elevator-application-service"),
|
||||
("cw-elevator-application-web", "cw-elevator-application-web"),
|
||||
]
|
||||
|
||||
|
||||
@dataclass
|
||||
class ClassCompare:
|
||||
module: str
|
||||
class_name: str
|
||||
status: str
|
||||
api_equal: bool | None = None
|
||||
code_equal: bool | None = None
|
||||
api_hash_v1: str | None = None
|
||||
api_hash_v2: str | None = None
|
||||
code_hash_v1: str | None = None
|
||||
code_hash_v2: str | None = None
|
||||
|
||||
|
||||
def shasum(text: str) -> str:
|
||||
return hashlib.sha256(text.encode("utf-8")).hexdigest()
|
||||
|
||||
|
||||
def run(cmd: list[str]) -> str:
|
||||
return subprocess.check_output(cmd, text=True, stderr=subprocess.DEVNULL)
|
||||
|
||||
|
||||
def jar_classes(jar_file: Path) -> set[str]:
|
||||
lines = run(["jar", "tf", str(jar_file)]).splitlines()
|
||||
out: set[str] = set()
|
||||
for ln in lines:
|
||||
if not ln.endswith(".class"):
|
||||
continue
|
||||
if "$" in ln:
|
||||
# 内部类单独比较噪声较大,先跳过;主类稳定后可再扩展
|
||||
continue
|
||||
if not ln.startswith("cn/cloudwalk/elevator/"):
|
||||
continue
|
||||
out.add(ln[:-6].replace("/", "."))
|
||||
return out
|
||||
|
||||
|
||||
def norm_api(text: str) -> str:
|
||||
"""
|
||||
取 javap -p -s 中成员声明 + descriptor,将「成员行 + 下一行 descriptor:」合并为一条后排序,
|
||||
避免 Lombok/编译器仅改变类内声明顺序时误判为 API 变更。
|
||||
"""
|
||||
kept = []
|
||||
for ln in text.splitlines():
|
||||
s = ln.strip()
|
||||
if not s:
|
||||
continue
|
||||
if s.startswith("Compiled from"):
|
||||
continue
|
||||
if s.startswith("Classfile "):
|
||||
continue
|
||||
if s.startswith("flags:"):
|
||||
continue
|
||||
if s.startswith("descriptor:") or s.endswith(";") or s.startswith("public ") or s.startswith("protected ") or s.startswith("private "):
|
||||
kept.append(s)
|
||||
merged: list[str] = []
|
||||
i = 0
|
||||
while i < len(kept):
|
||||
if i + 1 < len(kept) and kept[i + 1].startswith("descriptor:"):
|
||||
merged.append(kept[i] + "\t" + kept[i + 1])
|
||||
i += 2
|
||||
else:
|
||||
merged.append(kept[i])
|
||||
i += 1
|
||||
merged.sort()
|
||||
return "\n".join(merged)
|
||||
|
||||
|
||||
def norm_code(text: str) -> str:
|
||||
out = []
|
||||
skip_exc = False
|
||||
for ln in text.splitlines():
|
||||
s = ln.rstrip()
|
||||
if not s:
|
||||
continue
|
||||
if s.startswith("Compiled from"):
|
||||
continue
|
||||
if s.startswith("Classfile "):
|
||||
continue
|
||||
# Exception table 仅偏移不同,与语义无关;整块跳过以免误判 IMPL_DIFF
|
||||
if "Exception table:" in s:
|
||||
skip_exc = True
|
||||
continue
|
||||
if skip_exc:
|
||||
if re.match(r"^\s{2}public\s+", s) or re.match(r"^\s{2}private\s+", s) or re.match(r"^\s{2}protected\s+", s):
|
||||
skip_exc = False
|
||||
else:
|
||||
continue
|
||||
# 去掉偏移量与常量池索引,保留操作码与调用目标
|
||||
s = re.sub(r"^\s*\d+:\s*", "", s)
|
||||
s = re.sub(r"#\d+", "#", s)
|
||||
# javap 的常量池注释对齐空格数量不稳定,压缩为空格规范形态
|
||||
s = re.sub(r"#\s+//", "# //", s)
|
||||
# 屏蔽 invokeinterface 参数位计数噪声
|
||||
s = re.sub(r",\s+\d+\s+//", " //", s)
|
||||
# 跳转目标偏移对语义无影响,归一化
|
||||
s = re.sub(
|
||||
r"\b(if(?:eq|ne|lt|gt|le|ge|null|nonnull)|if_icmp(?:eq|ne|lt|gt|le|ge)|if_acmp(?:eq|ne)|goto|jsr)\s+\d+\b",
|
||||
r"\1 @",
|
||||
s,
|
||||
)
|
||||
# 局部变量槽位号对语义无影响(编译器可重排)
|
||||
s = re.sub(
|
||||
r"\b([adfil]load|[adfil]store|aload|astore|iload|istore|lload|lstore|fload|fstore|dload|dstore)\s+\d+\b",
|
||||
r"\1 _",
|
||||
s,
|
||||
)
|
||||
# 归一化单字节槽位指令(如 aload_0 / istore_3)
|
||||
s = re.sub(r"\b([adfil]load|[adfil]store|aload|astore|iload|istore|lload|lstore|fload|fstore|dload|dstore)_[0-3]\b", r"\1 _", s)
|
||||
# javap 输出为 iinc slot,const(含逗号);旧正则漏匹配会导致槽位噪声残留
|
||||
s = re.sub(r"\biinc\s+\d+\s*,\s*(-?\d+)\b", r"iinc _ \1", s)
|
||||
# ArrayList 通过接口类型调用与具体类调用语义一致,归一为 List 接口描述
|
||||
s = re.sub(
|
||||
r"invokevirtual\s+#\s+//\s*Method java/util/ArrayList\.(add|size)\b[^\n]*",
|
||||
r"invokeinterface # // InterfaceMethod java/util/List.\1:(UNKNOWN)",
|
||||
s,
|
||||
)
|
||||
s = re.sub(
|
||||
r"invokeinterface\s+#\s+//\s*InterfaceMethod java/util/List\.(add|size)\b[^\n]*",
|
||||
r"invokeinterface # // InterfaceMethod java/util/List.\1:(UNKNOWN)",
|
||||
s,
|
||||
)
|
||||
# tableswitch/lookupswitch 去掉行首偏移后,残余纯数字行与 default:<off> 仅反映布局,语义无差别
|
||||
st = s.strip()
|
||||
if re.fullmatch(r"\d+", st):
|
||||
s = "<switch_target>"
|
||||
elif re.fullmatch(r"default:\s*\d+", st):
|
||||
s = "default: <switch_target>"
|
||||
out.append(s.strip())
|
||||
return norm_code_post("\n".join(out))
|
||||
|
||||
|
||||
def javap_api(jar_file: Path, class_name: str) -> str:
|
||||
return run(["javap", "-classpath", str(jar_file), "-p", "-s", class_name])
|
||||
|
||||
|
||||
def javap_code(jar_file: Path, class_name: str) -> str:
|
||||
return run(["javap", "-classpath", str(jar_file), "-p", "-c", class_name])
|
||||
|
||||
|
||||
def compare_module(module: str, v1_jar: Path, v2_jar: Path) -> list[ClassCompare]:
|
||||
v1_classes = jar_classes(v1_jar)
|
||||
v2_classes = jar_classes(v2_jar)
|
||||
records: list[ClassCompare] = []
|
||||
for cls in sorted(v1_classes | v2_classes):
|
||||
if cls not in v2_classes:
|
||||
records.append(ClassCompare(module=module, class_name=cls, status="ONLY_V1"))
|
||||
continue
|
||||
if cls not in v1_classes:
|
||||
records.append(ClassCompare(module=module, class_name=cls, status="ONLY_V2"))
|
||||
continue
|
||||
|
||||
api1 = norm_api(javap_api(v1_jar, cls))
|
||||
api2 = norm_api(javap_api(v2_jar, cls))
|
||||
code1 = norm_code(javap_code(v1_jar, cls))
|
||||
code2 = norm_code(javap_code(v2_jar, cls))
|
||||
api_h1, api_h2 = shasum(api1), shasum(api2)
|
||||
code_h1, code_h2 = shasum(code1), shasum(code2)
|
||||
api_eq = api_h1 == api_h2
|
||||
code_eq = code_h1 == code_h2
|
||||
if api_eq and code_eq:
|
||||
st = "MATCH"
|
||||
elif api_eq and not code_eq:
|
||||
st = "IMPL_DIFF"
|
||||
else:
|
||||
st = "API_DIFF"
|
||||
records.append(
|
||||
ClassCompare(
|
||||
module=module,
|
||||
class_name=cls,
|
||||
status=st,
|
||||
api_equal=api_eq,
|
||||
code_equal=code_eq,
|
||||
api_hash_v1=api_h1,
|
||||
api_hash_v2=api_h2,
|
||||
code_hash_v1=code_h1,
|
||||
code_hash_v2=code_h2,
|
||||
)
|
||||
)
|
||||
return records
|
||||
|
||||
|
||||
def main() -> int:
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument(
|
||||
"--out-md",
|
||||
default=str(REPO_ROOT / "tools/elevator_api_parity/report/V1-V2-BYTECODE-ROOTCAUSE.md"),
|
||||
)
|
||||
ap.add_argument(
|
||||
"--out-json",
|
||||
default=str(REPO_ROOT / "tools/elevator_api_parity/report/V1-V2-BYTECODE-ROOTCAUSE.json"),
|
||||
)
|
||||
args = ap.parse_args()
|
||||
|
||||
all_records: list[ClassCompare] = []
|
||||
for mod_short, mod_art in PAIR:
|
||||
v1_jar = V1_ROOT / f"{mod_art}-1.0-SNAPSHOT.jar"
|
||||
v2_jar = REPO_ROOT / mod_short / "target" / f"{mod_art}-2.0-SNAPSHOT.jar"
|
||||
if not v1_jar.is_file() or not v2_jar.is_file():
|
||||
raise SystemExit(f"missing jar for module {mod_short}: v1={v1_jar} v2={v2_jar}")
|
||||
all_records.extend(compare_module(mod_short, v1_jar=v1_jar, v2_jar=v2_jar))
|
||||
|
||||
counter = Counter(r.status for r in all_records)
|
||||
mod_counter: dict[str, Counter] = defaultdict(Counter)
|
||||
for r in all_records:
|
||||
mod_counter[r.module][r.status] += 1
|
||||
|
||||
payload = {
|
||||
"generated_at_utc": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
||||
"summary": dict(counter),
|
||||
"module_summary": {k: dict(v) for k, v in mod_counter.items()},
|
||||
"records": [r.__dict__ for r in all_records],
|
||||
}
|
||||
out_json = Path(args.out_json)
|
||||
out_json.parent.mkdir(parents=True, exist_ok=True)
|
||||
out_json.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
|
||||
md = []
|
||||
md.append("# V1 vs V2 字节码根因分析")
|
||||
md.append("")
|
||||
md.append(f"- 生成时间(UTC):`{payload['generated_at_utc']}`")
|
||||
md.append("- 对比范围:四模块 `cn/cloudwalk/elevator/**` 主类(不含 `$` 内部类)")
|
||||
md.append("- 维度:类存在性 / API签名 / 方法实现")
|
||||
md.append("")
|
||||
md.append("## 1. 总览")
|
||||
md.append("")
|
||||
md.append("| 维度 | 数量 |")
|
||||
md.append("|---|---:|")
|
||||
for k in ["MATCH", "IMPL_DIFF", "API_DIFF", "ONLY_V1", "ONLY_V2"]:
|
||||
md.append(f"| {k} | {counter.get(k, 0)} |")
|
||||
md.append("")
|
||||
md.append("## 2. 各模块分布")
|
||||
md.append("")
|
||||
md.append("| 模块 | MATCH | IMPL_DIFF | API_DIFF | ONLY_V1 | ONLY_V2 |")
|
||||
md.append("|---|---:|---:|---:|---:|---:|")
|
||||
for m in [p[0] for p in PAIR]:
|
||||
c = mod_counter[m]
|
||||
md.append(
|
||||
f"| {m} | {c.get('MATCH',0)} | {c.get('IMPL_DIFF',0)} | {c.get('API_DIFF',0)} | {c.get('ONLY_V1',0)} | {c.get('ONLY_V2',0)} |"
|
||||
)
|
||||
md.append("")
|
||||
|
||||
def section(title: str, status: str, limit: int = 120) -> None:
|
||||
md.append(f"## {title}")
|
||||
md.append("")
|
||||
rs = [r for r in all_records if r.status == status]
|
||||
if not rs:
|
||||
md.append("- 无")
|
||||
md.append("")
|
||||
return
|
||||
md.append("| 模块 | 类 |")
|
||||
md.append("|---|---|")
|
||||
for r in rs[:limit]:
|
||||
md.append(f"| {r.module} | `{r.class_name}` |")
|
||||
if len(rs) > limit:
|
||||
md.append(f"| ... | 其余 {len(rs)-limit} 个见 JSON |")
|
||||
md.append("")
|
||||
|
||||
section("3. API 相同但实现不同(优先查 JD-GUI 还原误差/人工改写)", "IMPL_DIFF")
|
||||
section("4. API 不同(优先查源码结构漂移)", "API_DIFF")
|
||||
section("5. 仅 V2 存在(新增类)", "ONLY_V2")
|
||||
section("6. 仅 V1 存在(缺失类)", "ONLY_V1")
|
||||
|
||||
md.append("## 7. 根因判读指引")
|
||||
md.append("")
|
||||
md.append("- `IMPL_DIFF`:若对应源码与 CFR 文本高度相似但字节码仍不同,多为 JD-GUI 语句重排/条件翻译偏差或后续手工改写。")
|
||||
md.append("- `API_DIFF`:优先判定为“源码结构变化”,例如方法签名、字段类型、泛型边界变化。")
|
||||
md.append("- `ONLY_V2/ONLY_V1`:属于文件集合漂移(新增/漏还原/清理)。")
|
||||
md.append("")
|
||||
md.append("## 8. API_DIFF 判读")
|
||||
md.append("")
|
||||
md.append("- **成员顺序**:同签名不同顺序(常见于 Lombok getter/setter 顺序)已由 `norm_api` 合并 descriptor 后排序消除伪差异。")
|
||||
md.append("- **默认可视构造**:仅含 static 的类若未写显式私有空参构造,javac 可能生成 **public** 默认构造,与旧 JAR 中 **private** 不同;可在源码中补充与 V1 一致。")
|
||||
md.append("- **真实契约差异**:仍报 API_DIFF 时多为 V2 **新增/改签名** 的方法或字段,需对照业务是否保留(并非脚本噪声)。")
|
||||
md.append("")
|
||||
md.append("## 9. 实现归一化(摘要)")
|
||||
md.append("")
|
||||
md.append("- **行级**:指令偏移、`#` 常量池下标、`if_icmp*`/`goto` 目标、`xload`/`xstore` 槽位、`iinc`、"
|
||||
"`ArrayList`→`List` 的 add/size、`tableswitch` 纯数字行等。")
|
||||
md.append("- **二次(`bytecode_norm_post`)**:`ifxx`+`goto` 蹦床→反条件单条;连续 `goto @` 折叠;"
|
||||
"连续重复 `checkcast` 去重;`String.join` 前冗余 `checkcast java/lang/String`;"
|
||||
"`iconst_0`+dup 与 istore/iload 轮换初始化局部;Apache POI `setCellType`/`setBold`/`setColor` 新旧 API 占位符。")
|
||||
md.append("")
|
||||
Path(args.out_md).write_text("\n".join(md), encoding="utf-8")
|
||||
print(f"WROTE: {args.out_md}")
|
||||
print(f"WROTE: {args.out_json}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import annotations
|
||||
|
||||
import difflib
|
||||
import json
|
||||
import subprocess
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
from bytecode_parity_rootcause import norm_code
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[3]
|
||||
REPORT = ROOT / "tools/elevator_api_parity/report/V1-V2-BYTECODE-ROOTCAUSE.json"
|
||||
OUT = ROOT / "tools/elevator_api_parity/report/impl-diff-evidence-20260428"
|
||||
V1 = ROOT.parent / "cw-elevator-application-V1.0.0.20211103/cw_lib"
|
||||
|
||||
PAIR = {
|
||||
"cw-elevator-application-common": "cw-elevator-application-common",
|
||||
"cw-elevator-application-data": "cw-elevator-application-data",
|
||||
"cw-elevator-application-service": "cw-elevator-application-service",
|
||||
"cw-elevator-application-web": "cw-elevator-application-web",
|
||||
}
|
||||
|
||||
|
||||
def run(cmd: list[str]) -> str:
|
||||
return subprocess.check_output(cmd, text=True, stderr=subprocess.DEVNULL)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
OUT.mkdir(parents=True, exist_ok=True)
|
||||
data = json.loads(REPORT.read_text(encoding="utf-8"))
|
||||
records = [r for r in data["records"] if r["status"] == "IMPL_DIFF"]
|
||||
index = []
|
||||
for r in records:
|
||||
module = r["module"]
|
||||
art = PAIR[module]
|
||||
cls = r["class_name"]
|
||||
v1_jar = V1 / f"{art}-1.0-SNAPSHOT.jar"
|
||||
v2_jar = ROOT / module / "target" / f"{art}-2.0-SNAPSHOT.jar"
|
||||
raw1 = run(["javap", "-classpath", str(v1_jar), "-p", "-c", cls])
|
||||
raw2 = run(["javap", "-classpath", str(v2_jar), "-p", "-c", cls])
|
||||
n1 = norm_code(raw1)
|
||||
n2 = norm_code(raw2)
|
||||
cls_file = cls.replace(".", "_")
|
||||
p1 = OUT / f"{cls_file}.v1.javap.txt"
|
||||
p2 = OUT / f"{cls_file}.v2.javap.txt"
|
||||
pd = OUT / f"{cls_file}.diff.txt"
|
||||
p1.write_text(n1, encoding="utf-8")
|
||||
p2.write_text(n2, encoding="utf-8")
|
||||
diff = "".join(
|
||||
difflib.unified_diff(
|
||||
n1.splitlines(keepends=True),
|
||||
n2.splitlines(keepends=True),
|
||||
fromfile=f"{cls}.v1",
|
||||
tofile=f"{cls}.v2",
|
||||
n=3,
|
||||
)
|
||||
)
|
||||
pd.write_text(diff, encoding="utf-8")
|
||||
index.append(
|
||||
{
|
||||
"module": module,
|
||||
"class_name": cls,
|
||||
"v1_file": str(p1),
|
||||
"v2_file": str(p2),
|
||||
"diff_file": str(pd),
|
||||
"diff_lines": len(diff.splitlines()),
|
||||
}
|
||||
)
|
||||
idx = {
|
||||
"generated_at": datetime.utcnow().isoformat() + "Z",
|
||||
"count": len(index),
|
||||
"items": index,
|
||||
}
|
||||
(OUT / "INDEX.json").write_text(json.dumps(idx, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
print(str(OUT))
|
||||
print(f"IMPL_DIFF files: {len(index)}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
+187
@@ -0,0 +1,187 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
将 Maven 模块 `src/main/java/cn/cloudwalk/elevator` 与 V1 CFR 反编译树(decompile_v1_elevator_jars.sh 输出)按类文件路径配对,写相似度报告。
|
||||
|
||||
环境变量:
|
||||
V1_DECOMP_ROOT 默认: <maven根>/tools/v1-decompiled/cfr-from-cw-lib-current
|
||||
MV_ROOT 默认: 本脚本上溯 3 级到 maven-cw-elevator-application
|
||||
OUT_MD 默认: tools/elevator_api_parity/report/SOURCE-PARITY-BY-CLASS-decomp.md
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import difflib
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
SCR = Path(__file__).resolve()
|
||||
# scripts -> elevator_api_parity -> tools -> maven-cw-elevator-application
|
||||
MV_ROOT = Path(os.environ.get("MV_ROOT", SCR.parents[3]))
|
||||
_DEFAULT_V1 = MV_ROOT / "tools" / "v1-decompiled" / "cfr-from-cw-lib-current"
|
||||
|
||||
# Maven 模块名 -> V1 反编译目录名(脚本输出的子目录前缀)
|
||||
_PAIR = [
|
||||
("cw-elevator-application-common", "cw-elevator-application-common-1.0-SNAPSHOT"),
|
||||
("cw-elevator-application-data", "cw-elevator-application-data-1.0-SNAPSHOT"),
|
||||
("cw-elevator-application-service", "cw-elevator-application-service-1.0-SNAPSHOT"),
|
||||
("cw-elevator-application-web", "cw-elevator-application-web-1.0-SNAPSHOT"),
|
||||
]
|
||||
|
||||
|
||||
def strip_java_comments(text: str) -> str:
|
||||
text = re.sub(r"/\*.*?\*/", "", text, flags=re.DOTALL)
|
||||
text = re.sub(r"//[^\n]*", "", text)
|
||||
lines = [ln.strip() for ln in text.splitlines() if ln.strip()]
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def similarity(a: str, b: str) -> float:
|
||||
ca, cb = strip_java_comments(a), strip_java_comments(b)
|
||||
return difflib.SequenceMatcher(a=ca, b=cb).ratio()
|
||||
|
||||
|
||||
def tag_only_mv(rel: str) -> str:
|
||||
if "TenantVisitorFloor" in rel:
|
||||
return "租户访客楼层策略(V2)"
|
||||
if rel.endswith("package-info.java"):
|
||||
return "package-info"
|
||||
if "CloudwalkSessionHolderConfiguration" in rel:
|
||||
return "Session 扩展"
|
||||
if "ElevatorRemoteIo" in rel:
|
||||
return "远程 IO 池"
|
||||
if "DavinciStorageBeansConfiguration" in rel or "OpenFeignFileStorageManager" in rel:
|
||||
return "Davinci 存储"
|
||||
if "ZoneTreeCollectors" in rel:
|
||||
return "工具类"
|
||||
return ""
|
||||
|
||||
|
||||
def main() -> int:
|
||||
v1_root_parent = Path(os.environ.get("V1_DECOMP_ROOT", _DEFAULT_V1)).resolve()
|
||||
if not v1_root_parent.is_dir():
|
||||
print(f"ERROR: V1 decompile dir missing: {v1_root_parent}", file=sys.stderr)
|
||||
print("Run: maven-cw-elevator-application/scripts/decompile_v1_elevator_jars.sh", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
out_md = Path(
|
||||
os.environ.get(
|
||||
"OUT_MD",
|
||||
MV_ROOT / "tools/elevator_api_parity/report/SOURCE-PARITY-BY-CLASS-decomp.md",
|
||||
)
|
||||
)
|
||||
|
||||
lines: list[str] = []
|
||||
lines.append("# Maven 源码 vs V1 自动反编译(cw_lib jar / CFR)逐类比对")
|
||||
lines.append("")
|
||||
lines.append(f"- **V1 根**: `{v1_root_parent}`(`decompile_v1_elevator_jars.sh` 生成)")
|
||||
lines.append(f"- **V2 根**: `{MV_ROOT}/{{module}}/src/main/java/cn/cloudwalk/elevator`")
|
||||
lines.append("- **相似度**: 去注释后 `SequenceMatcher.ratio`(CFR 噪声会导致分数偏低)")
|
||||
lines.append("")
|
||||
|
||||
all_rows: list[tuple[str, str, float]] = []
|
||||
tot = {"paired": 0, "ge98": 0, "85": 0, "lt": 0, "o1": 0, "o2": 0}
|
||||
summary_rows: list[str] = []
|
||||
|
||||
for mod_mvn, mod_v1dir in _PAIR:
|
||||
v1_elev = v1_root_parent / mod_v1dir / "cn/cloudwalk/elevator"
|
||||
mv_elev = MV_ROOT / mod_mvn / "src/main/java/cn/cloudwalk/elevator"
|
||||
if not v1_elev.is_dir():
|
||||
summary_rows.append(f"| {mod_mvn} | — | — | **V1 侧目录不存在**: `{v1_elev}` |")
|
||||
continue
|
||||
if not mv_elev.is_dir():
|
||||
summary_rows.append(f"| {mod_mvn} | — | — | **Maven 侧目录不存在** |")
|
||||
continue
|
||||
|
||||
v1_files = {str(p.relative_to(v1_elev)).replace("\\", "/"): p for p in v1_elev.rglob("*.java")}
|
||||
mv_files = {str(p.relative_to(mv_elev)).replace("\\", "/"): p for p in mv_elev.rglob("*.java")}
|
||||
cnt = {"paired": 0, "ge98": 0, "85_98": 0, "lt85": 0, "only_v1": 0, "only_mv": 0}
|
||||
|
||||
for rel in sorted(set(v1_files) | set(mv_files)):
|
||||
p1, pm = v1_files.get(rel), mv_files.get(rel)
|
||||
if p1 and pm:
|
||||
cnt["paired"] += 1
|
||||
try:
|
||||
s = similarity(
|
||||
p1.read_text(encoding="utf-8", errors="replace"),
|
||||
pm.read_text(encoding="utf-8", errors="replace"),
|
||||
)
|
||||
except OSError:
|
||||
s = 0.0
|
||||
if s >= 0.98:
|
||||
cnt["ge98"] += 1
|
||||
elif s >= 0.85:
|
||||
cnt["85_98"] += 1
|
||||
else:
|
||||
cnt["lt85"] += 1
|
||||
all_rows.append((f"{mod_mvn}/{rel}", s))
|
||||
elif p1:
|
||||
cnt["only_v1"] += 1
|
||||
else:
|
||||
cnt["only_mv"] += 1
|
||||
|
||||
tot["paired"] += cnt["paired"]
|
||||
tot["ge98"] += cnt["ge98"]
|
||||
tot["85"] += cnt["85_98"]
|
||||
tot["lt"] += cnt["lt85"]
|
||||
tot["o1"] += cnt["only_v1"]
|
||||
tot["o2"] += cnt["only_mv"]
|
||||
|
||||
summary_rows.append(
|
||||
f"| {mod_mvn} | {cnt['paired']} | {cnt['ge98']} | {cnt['85_98']} | {cnt['lt85']} | "
|
||||
f"{cnt['only_v1']} | {cnt['only_mv']} |"
|
||||
)
|
||||
|
||||
lines.append("## 1. 汇总(四模块来自 cw_lib jar 反编译)")
|
||||
lines.append("")
|
||||
lines.append(
|
||||
"| 模块 | 配对 | ≥0.98 | 0.85–0.98 | <0.85 | 仅 V1 | 仅 Maven |"
|
||||
)
|
||||
lines.append("|------|------|-------|-----------|-------|-------|------------|")
|
||||
lines.extend(summary_rows)
|
||||
lines.append(
|
||||
f"| **合计** | **{tot['paired']}** | **{tot['ge98']}** | **{tot['85']}** | **{tot['lt']}** | **{tot['o1']}** | **{tot['o2']}** |"
|
||||
)
|
||||
lines.append("")
|
||||
|
||||
# 仅 Maven
|
||||
lines.append("## 2. 仅 Maven(相对 `cn/cloudwalk/elevator`)")
|
||||
lines.append("")
|
||||
for mod_mvn, mod_v1dir in _PAIR:
|
||||
v1_elev = v1_root_parent / mod_v1dir / "cn/cloudwalk/elevator"
|
||||
mv_elev = MV_ROOT / mod_mvn / "src/main/java/cn/cloudwalk/elevator"
|
||||
if not mv_elev.is_dir() or not v1_elev.is_dir():
|
||||
continue
|
||||
v1_set = {str(p.relative_to(v1_elev)).replace("\\", "/") for p in v1_elev.rglob("*.java")}
|
||||
extras = []
|
||||
for p in sorted(mv_elev.rglob("*.java")):
|
||||
rel = str(p.relative_to(mv_elev)).replace("\\", "/")
|
||||
if rel not in v1_set:
|
||||
tg = tag_only_mv(rel)
|
||||
extras.append(f"- `{rel}`" + (f" — *{tg}*" if tg else ""))
|
||||
if extras:
|
||||
lines.append(f"### {mod_mvn}")
|
||||
lines.extend(extras)
|
||||
lines.append("")
|
||||
|
||||
worst = sorted(all_rows, key=lambda x: x[1])[:35]
|
||||
best = sorted(all_rows, key=lambda x: -x[1])[:15]
|
||||
lines.append("## 3. 样本:最高 / 最低相似度路径")
|
||||
lines.append("")
|
||||
lines.append("### 最高")
|
||||
for path, s in best:
|
||||
lines.append(f"- `{path}` **{s:.4f}**")
|
||||
lines.append("")
|
||||
lines.append("### 最低(优先 IDE diff)")
|
||||
for path, s in worst:
|
||||
lines.append(f"- `{path}` **{s:.4f}**")
|
||||
|
||||
out_md.parent.mkdir(parents=True, exist_ok=True)
|
||||
out_md.write_text("\n".join(lines) + "\n", encoding="utf-8")
|
||||
print(out_md)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Executable
+266
@@ -0,0 +1,266 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
V1(CFR 反编译 cw_lib) vs V2(Maven 源码)全量类级比对,输出:
|
||||
- Markdown 报告(汇总 + 分桶完整清单 + 问题梳理)
|
||||
- 可选 JSON(--json)
|
||||
|
||||
环境变量同 source_parity_scan.py:V1_DECOMP_ROOT、MV_ROOT
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import difflib
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
SCR = Path(__file__).resolve()
|
||||
MV_ROOT = Path(os.environ.get("MV_ROOT", SCR.parents[3]))
|
||||
_DEFAULT_V1 = MV_ROOT / "tools" / "v1-decompiled" / "cfr-from-cw-lib-current"
|
||||
|
||||
_PAIR = [
|
||||
("cw-elevator-application-common", "cw-elevator-application-common-1.0-SNAPSHOT"),
|
||||
("cw-elevator-application-data", "cw-elevator-application-data-1.0-SNAPSHOT"),
|
||||
("cw-elevator-application-service", "cw-elevator-application-service-1.0-SNAPSHOT"),
|
||||
("cw-elevator-application-web", "cw-elevator-application-web-1.0-SNAPSHOT"),
|
||||
]
|
||||
|
||||
|
||||
def strip_java_comments(text: str) -> str:
|
||||
text = re.sub(r"/\*.*?\*/", "", text, flags=re.DOTALL)
|
||||
text = re.sub(r"//[^\n]*", "", text)
|
||||
lines = [ln.strip() for ln in text.splitlines() if ln.strip()]
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def similarity(a: str, b: str) -> float:
|
||||
ca, cb = strip_java_comments(a), strip_java_comments(b)
|
||||
return difflib.SequenceMatcher(a=ca, b=cb).ratio()
|
||||
|
||||
|
||||
def tag_only_mv(rel: str) -> str:
|
||||
if "TenantVisitorFloor" in rel:
|
||||
return "V2扩展-租户访客楼层"
|
||||
if rel.endswith("package-info.java"):
|
||||
return "工程化-package-info"
|
||||
if "CloudwalkSessionHolderConfiguration" in rel:
|
||||
return "V2扩展-Session"
|
||||
if "ElevatorRemoteIo" in rel:
|
||||
return "V2扩展-远程IO线程池"
|
||||
if "DavinciStorageBeansConfiguration" in rel or "OpenFeignFileStorageManager" in rel:
|
||||
return "V2扩展-Davinci存储"
|
||||
if "ZoneTreeCollectors" in rel:
|
||||
return "V2独有-工具类"
|
||||
return "V2独有-待分类"
|
||||
|
||||
|
||||
def review_priority(rel: str) -> str:
|
||||
r = rel.replace("\\", "/")
|
||||
if "/controller/" in r or r.endswith("Controller.java"):
|
||||
return "高-Controller"
|
||||
if "FeignClient" in r or "/client/" in r:
|
||||
return "高-Feign/Client"
|
||||
if "ServiceImpl" in r or "/impl/" in r:
|
||||
return "高-Service/DaoImpl"
|
||||
if "/mapper/" in r or "Mapper.java" in r:
|
||||
return "中-Mapper接口"
|
||||
if "/dto/" in r or "/param/" in r or "/form/" in r or "/result/" in r:
|
||||
return "中-DTO表单"
|
||||
if "/em/" in r or "Enum.java" in r:
|
||||
return "低-枚举(CFR噪声常见)"
|
||||
if "/util/" in r:
|
||||
return "低-工具类"
|
||||
return "中-其他"
|
||||
|
||||
|
||||
def bucket(score: float) -> str:
|
||||
if score >= 0.98:
|
||||
return "A-高度一致"
|
||||
if score >= 0.85:
|
||||
return "B-轻度差异"
|
||||
return "C-显著差异"
|
||||
|
||||
|
||||
def main() -> int:
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--json", action="store_true", help="额外写出 JSON")
|
||||
ap.add_argument(
|
||||
"--out",
|
||||
default=str(MV_ROOT / "tools/elevator_api_parity/report/V1-V2-DIFF-ISSUES.md"),
|
||||
help="Markdown 输出路径",
|
||||
)
|
||||
args = ap.parse_args()
|
||||
|
||||
v1_root_parent = Path(os.environ.get("V1_DECOMP_ROOT", _DEFAULT_V1)).resolve()
|
||||
if not v1_root_parent.is_dir():
|
||||
print(f"ERROR: V1 decompile dir missing: {v1_root_parent}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
records: list[dict] = []
|
||||
only_mv: list[tuple[str, str, str]] = []
|
||||
totals = {"paired": 0, "A": 0, "B": 0, "C": 0, "only_v1": 0, "only_mv": 0}
|
||||
|
||||
for mod_mvn, mod_v1dir in _PAIR:
|
||||
v1_elev = v1_root_parent / mod_v1dir / "cn/cloudwalk/elevator"
|
||||
mv_elev = MV_ROOT / mod_mvn / "src/main/java/cn/cloudwalk/elevator"
|
||||
if not v1_elev.is_dir() or not mv_elev.is_dir():
|
||||
continue
|
||||
|
||||
v1_files = {str(p.relative_to(v1_elev)).replace("\\", "/"): p for p in v1_elev.rglob("*.java")}
|
||||
mv_files = {str(p.relative_to(mv_elev)).replace("\\", "/"): p for p in mv_elev.rglob("*.java")}
|
||||
|
||||
for rel in sorted(set(v1_files) | set(mv_files)):
|
||||
p1, pm = v1_files.get(rel), mv_files.get(rel)
|
||||
if p1 and pm:
|
||||
totals["paired"] += 1
|
||||
try:
|
||||
t1 = p1.read_text(encoding="utf-8", errors="replace")
|
||||
t2 = pm.read_text(encoding="utf-8", errors="replace")
|
||||
s = similarity(t1, t2)
|
||||
except OSError:
|
||||
s = 0.0
|
||||
t1 = t2 = ""
|
||||
bk = bucket(s)
|
||||
if bk.startswith("A"):
|
||||
totals["A"] += 1
|
||||
elif bk.startswith("B"):
|
||||
totals["B"] += 1
|
||||
else:
|
||||
totals["C"] += 1
|
||||
pri = review_priority(rel)
|
||||
records.append(
|
||||
{
|
||||
"module": mod_mvn,
|
||||
"relative_path": rel,
|
||||
"similarity": round(s, 6),
|
||||
"bucket": bk,
|
||||
"review_priority": pri,
|
||||
"v1_file": str(p1),
|
||||
"v2_file": str(pm),
|
||||
}
|
||||
)
|
||||
elif p1:
|
||||
totals["only_v1"] += 1
|
||||
records.append(
|
||||
{
|
||||
"module": mod_mvn,
|
||||
"relative_path": rel,
|
||||
"similarity": None,
|
||||
"bucket": "ONLY_V1",
|
||||
"review_priority": review_priority(rel),
|
||||
"v1_file": str(p1),
|
||||
"v2_file": None,
|
||||
}
|
||||
)
|
||||
else:
|
||||
totals["only_mv"] += 1
|
||||
tg = tag_only_mv(rel)
|
||||
only_mv.append((mod_mvn, rel, tg))
|
||||
records.append(
|
||||
{
|
||||
"module": mod_mvn,
|
||||
"relative_path": rel,
|
||||
"similarity": None,
|
||||
"bucket": "ONLY_MAVEN",
|
||||
"review_priority": tg,
|
||||
"v1_file": None,
|
||||
"v2_file": str(pm),
|
||||
}
|
||||
)
|
||||
|
||||
out_md = Path(args.out)
|
||||
out_md.parent.mkdir(parents=True, exist_ok=True)
|
||||
ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
|
||||
md: list[str] = []
|
||||
md.append("# V1 vs V2 源码差异与问题梳理(全自动比对)")
|
||||
md.append("")
|
||||
md.append(f"- **生成时间(UTC)**: {ts}")
|
||||
md.append(f"- **V1**: `{v1_root_parent}`(cw_lib jar → CFR)")
|
||||
md.append(f"- **V2**: `{MV_ROOT}/{{module}}/src/main/java/cn/cloudwalk/elevator`")
|
||||
md.append("- **相似度**: 去注释后全文 `SequenceMatcher.ratio`;**低分≠业务错误**(CFR 变量名/枚举顺序等)。")
|
||||
md.append("")
|
||||
md.append("## 1. 结论摘要")
|
||||
md.append("")
|
||||
md.append("| 维度 | 数量 | 说明 |")
|
||||
md.append("|------|------|------|")
|
||||
md.append(f"| 配对类 | {totals['paired']} | 同名路径 `.java` |")
|
||||
md.append(f"| A 桶 ≥0.98 | {totals['A']} | 文本高度接近 |")
|
||||
md.append(f"| B 桶 0.85–0.98 | {totals['B']} | 多为格式/注释/轻微差异,建议抽检 |")
|
||||
md.append(f"| C 桶 <0.85 | {totals['C']} | **优先 IDE diff**;枚举/DTO 常为 CFR 噪声 |")
|
||||
md.append(f"| 仅 V1 | {totals['only_v1']} | 当前四模块应为 0 |")
|
||||
md.append(f"| 仅 Maven | {totals['only_mv']} | V2 新增;访客楼层策略等为**已知扩展** |")
|
||||
md.append("")
|
||||
md.append("### 1.1 建议处置")
|
||||
md.append("")
|
||||
md.append("1. **仅 Maven**:`TenantVisitorFloor*` — 与 V1 对齐无关(产品已排除);`package-info` — 忽略。")
|
||||
md.append("2. **C 桶 + 高优先级**(Controller / ServiceImpl / Feign):优先人工对照业务分支与远程调用。")
|
||||
md.append("3. **C 桶 + 枚举/DTO**:优先视为 CFR 噪声,除非接口契约变更。")
|
||||
md.append("")
|
||||
|
||||
md.append("## 2. 仅 Maven 文件(问题/范围标注)")
|
||||
md.append("")
|
||||
for mod, rel, tg in sorted(only_mv, key=lambda x: (x[0], x[1])):
|
||||
md.append(f"- `{mod}/{rel}` — **{tg}**")
|
||||
md.append("")
|
||||
|
||||
md.append("## 3. C 桶(<0.85)按复核优先级分组")
|
||||
md.append("")
|
||||
c_records = [r for r in records if r.get("similarity") is not None and r["similarity"] < 0.85]
|
||||
by_pri: dict[str, list[dict]] = {}
|
||||
for r in c_records:
|
||||
by_pri.setdefault(r["review_priority"], []).append(r)
|
||||
for pri in sorted(by_pri.keys()):
|
||||
md.append(f"### {pri}")
|
||||
md.append("")
|
||||
md.append("| 路径 | 相似度 |")
|
||||
md.append("|------|--------|")
|
||||
for r in sorted(by_pri[pri], key=lambda x: -x["similarity"]):
|
||||
md.append(f"| `{r['module']}/{r['relative_path']}` | {r['similarity']:.4f} |")
|
||||
md.append("")
|
||||
|
||||
md.append("## 4. 完整配对表(全部类)")
|
||||
md.append("")
|
||||
md.append("| 模块 | 相对路径 | 相似度 | 分桶 | 复核优先级 |")
|
||||
md.append("|------|----------|--------|------|------------|")
|
||||
for r in sorted(
|
||||
[x for x in records if x.get("similarity") is not None],
|
||||
key=lambda x: (x["module"], x["relative_path"]),
|
||||
):
|
||||
md.append(
|
||||
f"| {r['module']} | `{r['relative_path']}` | {r['similarity']:.4f} | {r['bucket']} | {r['review_priority']} |"
|
||||
)
|
||||
md.append("")
|
||||
md.append("### 仅 V1 / 仅 Maven 行")
|
||||
md.append("")
|
||||
for r in records:
|
||||
if r["bucket"] in ("ONLY_V1", "ONLY_MAVEN"):
|
||||
md.append(f"- `{r['module']}/{r['relative_path']}` — **{r['bucket']}** — {r['review_priority']}")
|
||||
md.append("")
|
||||
|
||||
md.append("## 5. 生成命令")
|
||||
md.append("")
|
||||
md.append("```bash")
|
||||
md.append("cd maven-cw-elevator-application")
|
||||
md.append("./scripts/decompile_v1_elevator_jars.sh # 若尚未反编译 V1 jar")
|
||||
md.append("python3 tools/elevator_api_parity/scripts/v1_v2_diff_issues_report.py")
|
||||
md.append("```")
|
||||
md.append("")
|
||||
|
||||
out_md.write_text("\n".join(md) + "\n", encoding="utf-8")
|
||||
print(out_md)
|
||||
|
||||
if args.json:
|
||||
out_json = out_md.with_suffix(".json")
|
||||
out_json.write_text(json.dumps({"generated": ts, "totals": totals, "records": records}, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
|
||||
print(out_json)
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
+256
@@ -0,0 +1,256 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
广发基金租户:访客默认仅能派梯至指定楼层(典型验收:28 层)的 HTTP 验证脚本。
|
||||
|
||||
业务依据(电梯应用):
|
||||
PersonRuleServiceImpl.addVisitor — floorIds 为空时取被访人 floorList,
|
||||
若 tenant_visitor_floor_policy 启用 INTERSECT_ALLOWLIST,则与 allow_zone_ids 求交后再写规则。
|
||||
|
||||
验证思路:
|
||||
1. POST /elevator/person/add/visitor — body 中 floorIds 为空列表(不显式传楼层)。
|
||||
2. POST /elevator/passRule/image — personId=visitorId,回读该访客已开通的楼层 zone 列表。
|
||||
3. 断言楼层条数与名称满足预期(默认:仅 1 条,zoneName 含「28」)。
|
||||
|
||||
环境变量(与 api 对拍一致,须指向广发基金租户):
|
||||
ELEVATOR_HEADER_BUSINESSID — 机构/租户 ID(必填)
|
||||
ELEVATOR_HEADER_LOGINID
|
||||
ELEVATOR_HEADER_PLATFORMUSERID
|
||||
ELEVATOR_HEADER_AUTHORIZATION
|
||||
ELEVATOR_HEADER_APPLICATIONID
|
||||
|
||||
用法示例:
|
||||
export ELEVATOR_HEADER_BUSINESSID='<广发基金 businessId>'
|
||||
export ELEVATOR_HEADER_AUTHORIZATION='Bearer ...'
|
||||
python3 scripts/verify_gf_visitor_default_floor.py \\
|
||||
--base-url http://127.0.0.1:18081 \\
|
||||
--person-id '<被访人员工 personId>' \\
|
||||
--visitor-id '<访客 personId>' \\
|
||||
--beg-visitor-time 1714406400000 \\
|
||||
--end-visitor-time 1714492800000
|
||||
|
||||
可选:仅回读已有访客楼层(跳过开通)
|
||||
python3 scripts/verify_gf_visitor_default_floor.py ... --skip-add
|
||||
|
||||
可选:校验库内策略行(需 pip install pymysql)
|
||||
export MYSQL_HOST=... MYSQL_PORT=3307 MYSQL_USER=root MYSQL_PASSWORD=... MYSQL_DATABASE=cw-elevator-application
|
||||
python3 scripts/verify_gf_visitor_default_floor.py ... --check-policy-row
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import requests
|
||||
|
||||
_ROOT = Path(__file__).resolve().parents[1]
|
||||
if str(_ROOT) not in sys.path:
|
||||
sys.path.insert(0, str(_ROOT))
|
||||
|
||||
from parity.client import default_headers # noqa: E402
|
||||
|
||||
|
||||
def _post_json(session: requests.Session, base: str, path: str, body: dict) -> tuple[int, dict | list | None, str]:
|
||||
url = base.rstrip("/") + path
|
||||
r = session.post(
|
||||
url,
|
||||
headers={**default_headers(), **dict(session.headers)},
|
||||
data=json.dumps(body, ensure_ascii=False),
|
||||
timeout=120,
|
||||
)
|
||||
text = r.text or ""
|
||||
try:
|
||||
parsed = json.loads(text) if text.strip() else None
|
||||
except json.JSONDecodeError:
|
||||
parsed = None
|
||||
return r.status_code, parsed, text
|
||||
|
||||
|
||||
def _business_code(payload: dict | list | None) -> str | None:
|
||||
if isinstance(payload, dict) and "code" in payload:
|
||||
c = payload.get("code")
|
||||
return str(c) if c is not None else None
|
||||
return None
|
||||
|
||||
|
||||
def check_mysql_policy(business_id: str) -> tuple[bool, str]:
|
||||
try:
|
||||
import pymysql # type: ignore
|
||||
except ImportError:
|
||||
return False, "未安装 pymysql,跳过库表校验(pip install pymysql)"
|
||||
|
||||
host = os.environ.get("MYSQL_HOST", "127.0.0.1").strip()
|
||||
port = int(os.environ.get("MYSQL_PORT", "3306"))
|
||||
user = os.environ.get("MYSQL_USER", "root").strip()
|
||||
password = os.environ.get("MYSQL_PASSWORD", "").strip()
|
||||
database = os.environ.get("MYSQL_DATABASE", "cw-elevator-application").strip()
|
||||
if not password and not os.environ.get("MYSQL_ALLOW_EMPTY_PASSWORD"):
|
||||
return False, "未设置 MYSQL_PASSWORD,跳过(或设置 MYSQL_ALLOW_EMPTY_PASSWORD=1)"
|
||||
|
||||
conn = pymysql.connect(
|
||||
host=host, port=port, user=user, password=password, database=database, charset="utf8mb4"
|
||||
)
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT id, business_id, policy_type, allow_zone_ids, enabled, policy_version
|
||||
FROM tenant_visitor_floor_policy
|
||||
WHERE business_id = %s 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
|
||||
""",
|
||||
(business_id,),
|
||||
)
|
||||
row = cur.fetchone()
|
||||
if not row:
|
||||
return False, f"未查到启用中的租户默认策略 business_id={business_id!r}"
|
||||
cols = [d[0] for d in cur.description]
|
||||
detail = dict(zip(cols, row))
|
||||
return True, json.dumps(detail, ensure_ascii=False)
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def parse_floor_list(data_obj: dict | list | None) -> list[dict]:
|
||||
if data_obj is None:
|
||||
return []
|
||||
if isinstance(data_obj, list):
|
||||
return [x for x in data_obj if isinstance(x, dict)]
|
||||
return []
|
||||
|
||||
|
||||
def assert_floors(js2: dict | list | None, args: argparse.Namespace) -> int:
|
||||
try:
|
||||
cre = re.compile(args.floor_name_regex)
|
||||
except re.error as e:
|
||||
print(f"floor-name-regex 无效: {e}", file=sys.stderr)
|
||||
return 2
|
||||
|
||||
data = parse_floor_list((js2 or {}).get("data") if isinstance(js2, dict) else None)
|
||||
print(f"[floors] count={len(data)}")
|
||||
for row in data:
|
||||
print(f" zoneId={row.get('zoneId')!r} zoneName={row.get('zoneName')!r}")
|
||||
|
||||
if len(data) != args.expected_zone_count:
|
||||
print(
|
||||
f"断言失败:楼层条数期望 {args.expected_zone_count},实际 {len(data)}",
|
||||
file=sys.stderr,
|
||||
)
|
||||
return 1
|
||||
|
||||
for row in data:
|
||||
name = str(row.get("zoneName") or "")
|
||||
if not cre.search(name):
|
||||
print(
|
||||
f"断言失败:zoneName={name!r} 不匹配正则 {args.floor_name_regex!r}",
|
||||
file=sys.stderr,
|
||||
)
|
||||
return 1
|
||||
|
||||
print("OK:访客生效楼层与预期一致(默认策略求交后仅接待层)。")
|
||||
return 0
|
||||
|
||||
|
||||
def run_http_flow(session: requests.Session, args: argparse.Namespace, biz: str) -> int:
|
||||
if not args.skip_add:
|
||||
add_body = {
|
||||
"visitorId": args.visitor_id,
|
||||
"personId": args.person_id,
|
||||
"begVisitorTime": args.beg_visitor_time,
|
||||
"endVisitorTime": args.end_visitor_time,
|
||||
"floorIds": [],
|
||||
}
|
||||
st, js, raw = _post_json(session, args.base_url, "/elevator/person/add/visitor", add_body)
|
||||
code = _business_code(js if isinstance(js, dict) else None)
|
||||
print(f"[add/visitor] http={st} code={code!r}")
|
||||
if st != 200:
|
||||
print(raw[:2000], file=sys.stderr)
|
||||
return 1
|
||||
if code is not None and str(code) not in ("0", "200"):
|
||||
print(raw[:2000], file=sys.stderr)
|
||||
return 1
|
||||
|
||||
img_body = {"personId": args.visitor_id, "businessId": biz}
|
||||
st2, js2, raw2 = _post_json(session, args.base_url, "/elevator/passRule/image", img_body)
|
||||
code2 = _business_code(js2 if isinstance(js2, dict) else None)
|
||||
print(f"[passRule/image] http={st2} code={code2!r}")
|
||||
|
||||
if st2 != 200:
|
||||
print(raw2[:2000], file=sys.stderr)
|
||||
return 1
|
||||
if code2 is not None and str(code2) not in ("0", "200"):
|
||||
print(raw2[:2000], file=sys.stderr)
|
||||
return 1
|
||||
|
||||
return assert_floors(js2 if isinstance(js2, dict) else None, args)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
p = argparse.ArgumentParser(description="广发基金租户访客默认楼层(典型 28 层)HTTP 验证")
|
||||
p.add_argument("--base-url", default=os.environ.get("ELEVATOR_VERIFY_BASE", "http://127.0.0.1:18081"))
|
||||
p.add_argument("--person-id", required=True, help="被访人 personId(组织侧有 floorList);--skip-add 时仍可填占位")
|
||||
p.add_argument("--visitor-id", required=True, help="访客 personId")
|
||||
p.add_argument(
|
||||
"--beg-visitor-time",
|
||||
type=int,
|
||||
default=int(os.environ.get("ELEVATOR_BEG_VISITOR_TIME", "0")),
|
||||
help="访客有效期开始 epoch 毫秒",
|
||||
)
|
||||
p.add_argument(
|
||||
"--end-visitor-time",
|
||||
type=int,
|
||||
default=int(os.environ.get("ELEVATOR_END_VISITOR_TIME", "0")),
|
||||
help="访客有效期结束 epoch 毫秒",
|
||||
)
|
||||
p.add_argument("--skip-add", action="store_true", help="跳过开通,仅 passRule/image 回读(访客须已开通)")
|
||||
p.add_argument("--expected-zone-count", type=int, default=1, help="期望访客生效楼层条数")
|
||||
p.add_argument(
|
||||
"--floor-name-regex",
|
||||
default=os.environ.get("ELEVATOR_EXPECT_FLOOR_REGEX", r".*28.*"),
|
||||
help="对每条 zoneName 匹配的正则(默认含 28)",
|
||||
)
|
||||
p.add_argument(
|
||||
"--check-policy-row",
|
||||
action="store_true",
|
||||
help="用 MySQL 校验 tenant_visitor_floor_policy 存在启用行(需 pymysql)",
|
||||
)
|
||||
args = p.parse_args()
|
||||
|
||||
if not os.environ.get("ELEVATOR_HEADER_BUSINESSID", "").strip():
|
||||
print("错误:请设置环境变量 ELEVATOR_HEADER_BUSINESSID(广发基金租户 companyId)", file=sys.stderr)
|
||||
return 2
|
||||
|
||||
if not args.skip_add:
|
||||
if args.beg_visitor_time <= 0 or args.end_visitor_time <= 0:
|
||||
print(
|
||||
"错误:开通访客时请提供 --beg-visitor-time / --end-visitor-time(毫秒)或对应环境变量",
|
||||
file=sys.stderr,
|
||||
)
|
||||
return 2
|
||||
|
||||
biz = os.environ.get("ELEVATOR_HEADER_BUSINESSID", "").strip()
|
||||
if args.check_policy_row:
|
||||
ok, msg = check_mysql_policy(biz)
|
||||
print(f"[policy-db] ok={ok} {msg}")
|
||||
if not ok:
|
||||
return 1
|
||||
|
||||
session = requests.Session()
|
||||
session.headers.update(default_headers())
|
||||
|
||||
try:
|
||||
return run_http_flow(session, args, biz)
|
||||
except requests.RequestException as e:
|
||||
print(f"HTTP 请求失败(服务是否已启动、--base-url 是否正确?): {e}", file=sys.stderr)
|
||||
return 3
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
from parity.body_variants import iter_parity_request_cases
|
||||
from parity.catalog_loader import include_in_parity as cb_parity
|
||||
from parity.catalog_loader import load as load_catalog
|
||||
from parity.client import call_both
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("two_instances_ready")
|
||||
@pytest.mark.live
|
||||
def test_parity_from_catalog(
|
||||
request,
|
||||
base_old,
|
||||
base_new,
|
||||
session_http,
|
||||
):
|
||||
"""按 api_catalog 双端对拍(仅 ``include_in_parity`` 为 true 的条目)。
|
||||
|
||||
基线体 + 可选 ``boundary_patches``(需 ``ELEVATOR_PARITY_BOUNDARY=1``)对入参做边界/范围扩展。
|
||||
compare_mode: deep | code_only | status_only
|
||||
"""
|
||||
cat = load_catalog()["endpoints"] # type: ignore[operator]
|
||||
for ep in cat:
|
||||
if not cb_parity(ep):
|
||||
continue
|
||||
name = ep["id"]
|
||||
display = ep.get("name", name)
|
||||
for case_id, body in iter_parity_request_cases(ep):
|
||||
case_label = f"{name}:{case_id}" if case_id != "default" else name
|
||||
call_name = f"{display} [{case_id}]" if case_id != "default" else display
|
||||
pr = call_both(
|
||||
name=call_name,
|
||||
method=ep.get("method", "POST"),
|
||||
path=ep["path"],
|
||||
body=body,
|
||||
base_old=base_old,
|
||||
base_new=base_new,
|
||||
session=session_http,
|
||||
compare_mode=ep.get("compare_mode", "code_only"),
|
||||
)
|
||||
row = {
|
||||
"id": case_label,
|
||||
"name": call_name,
|
||||
"case_id": case_id,
|
||||
"method": pr.method,
|
||||
"path": pr.path,
|
||||
"old_status": pr.old_status,
|
||||
"new_status": pr.new_status,
|
||||
"match": pr.match,
|
||||
"message": pr.message,
|
||||
}
|
||||
request.config._parity_rows.append(row) # type: ignore
|
||||
assert pr.match, (
|
||||
f"{case_label} mismatch: {pr.message}\n"
|
||||
f"old_http={pr.old_status} new_http={pr.new_status}\n"
|
||||
f"old_head={pr.old_text[:500]!r}\nnew_head={pr.new_text[:500]!r}"
|
||||
)
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
from __future__ import annotations
|
||||
|
||||
"""全 catalog 双端对拍(仅 include_in_parity=true 的条目,与 test_parity_from_catalog 范围一致,但每接口独立用例)。"""
|
||||
|
||||
import pytest
|
||||
from parity.catalog_loader import endpoint_body as cb_body
|
||||
from parity.catalog_loader import include_in_parity as cb_parity
|
||||
from parity.catalog_loader import load as load_catalog
|
||||
from parity.client import call_both
|
||||
|
||||
|
||||
def pytest_generate_tests(metafunc):
|
||||
if "catalog_ep" not in metafunc.fixturenames:
|
||||
return
|
||||
cat_all = list((load_catalog() or {}).get("endpoints") or [])
|
||||
# 与 test_parity_from_catalog 对齐:全 catalog 用例同样尊重 include_in_parity
|
||||
cat = [ep for ep in cat_all if cb_parity(ep)]
|
||||
ids = [str(ep.get("id", i)) for i, ep in enumerate(cat)]
|
||||
metafunc.parametrize("catalog_ep", cat, ids=ids)
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("two_instances_ready")
|
||||
@pytest.mark.live
|
||||
def test_parity_single_endpoint(
|
||||
request,
|
||||
base_old,
|
||||
base_new,
|
||||
session_http,
|
||||
catalog_ep: dict,
|
||||
):
|
||||
name = catalog_ep["id"]
|
||||
body = cb_body(catalog_ep)
|
||||
pr = call_both(
|
||||
name=catalog_ep.get("name", name),
|
||||
method=catalog_ep.get("method", "POST"),
|
||||
path=catalog_ep["path"],
|
||||
body=body,
|
||||
base_old=base_old,
|
||||
base_new=base_new,
|
||||
session=session_http,
|
||||
compare_mode=catalog_ep.get("compare_mode", "code_only"),
|
||||
)
|
||||
row = {
|
||||
"id": name,
|
||||
"name": catalog_ep.get("name", name),
|
||||
"method": pr.method,
|
||||
"path": pr.path,
|
||||
"old_status": pr.old_status,
|
||||
"new_status": pr.new_status,
|
||||
"match": pr.match,
|
||||
"message": pr.message,
|
||||
}
|
||||
request.config._parity_rows.append(row) # type: ignore
|
||||
assert pr.match, (
|
||||
f"{name} mismatch: {pr.message}\n"
|
||||
f"old_http={pr.old_status} new_http={pr.new_status}\n"
|
||||
f"old_head={pr.old_text[:500]!r}\nnew_head={pr.new_text[:500]!r}"
|
||||
)
|
||||
@@ -0,0 +1,31 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
from parity.catalog_loader import endpoint_body as cb_body
|
||||
from parity.catalog_loader import include_in_smoke as cb_smoke
|
||||
from parity.catalog_loader import load as load_catalog
|
||||
from parity.client import call_single
|
||||
|
||||
"""单机按 catalog 逐接口 POST/GET,写入 _smoke_rows(sessionfinish 落盘)。"""
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("smoke_instance_ready")
|
||||
@pytest.mark.smoke
|
||||
def test_smoke_from_catalog(request, smoke_base, smoke_label, session_http):
|
||||
cat = load_catalog()["endpoints"]
|
||||
for ep in cat:
|
||||
if not cb_smoke(ep):
|
||||
continue
|
||||
name = ep["id"]
|
||||
body = cb_body(ep)
|
||||
row = call_single(
|
||||
name=ep.get("name", name),
|
||||
method=ep.get("method", "POST"),
|
||||
path=ep["path"],
|
||||
body=body,
|
||||
base_url=smoke_base,
|
||||
session=session_http,
|
||||
)
|
||||
row["id"] = name
|
||||
row["label"] = smoke_label
|
||||
request.config._smoke_rows.append(row) # type: ignore
|
||||
@@ -0,0 +1,41 @@
|
||||
"""不依赖联调机:纯比较逻辑自测。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from parity import compare as C
|
||||
from parity import body_variants as BV
|
||||
|
||||
|
||||
def test_normalize_equal():
|
||||
a = {"b": 2, "a": 1, "c": {"z": 1, "y": 2}}
|
||||
b = {"c": {"y": 2, "z": 1}, "a": 1, "b": 2}
|
||||
assert C.normalize(a) == C.normalize(b)
|
||||
|
||||
|
||||
def test_business_code_from_cloudwalk_result():
|
||||
j = '{"code":"0","data":{}}'
|
||||
p = C.parse_json_loose(j)
|
||||
assert C.business_code(p) == "0"
|
||||
|
||||
|
||||
def test_deep_merge_nested():
|
||||
base = {"a": 1, "nested": {"x": 1, "y": 2}}
|
||||
patch = {"nested": {"y": 99}, "b": 2}
|
||||
m = BV.deep_merge(base, patch)
|
||||
assert m == {"a": 1, "b": 2, "nested": {"x": 1, "y": 99}}
|
||||
|
||||
|
||||
def test_iter_parity_request_cases_respects_env(monkeypatch):
|
||||
monkeypatch.delenv("ELEVATOR_PARITY_BOUNDARY", raising=False)
|
||||
ep = {
|
||||
"id": "x",
|
||||
"body": {"p": 1},
|
||||
"boundary_patches": [{"id": "zero", "patch": {"p": 0}}],
|
||||
}
|
||||
cases = list(BV.iter_parity_request_cases(ep))
|
||||
assert cases == [("default", {"p": 1})]
|
||||
|
||||
monkeypatch.setenv("ELEVATOR_PARITY_BOUNDARY", "1")
|
||||
cases2 = list(BV.iter_parity_request_cases(ep))
|
||||
assert cases2[0] == ("default", {"p": 1})
|
||||
assert cases2[1] == ("zero", {"p": 0})
|
||||
@@ -0,0 +1,95 @@
|
||||
#!/usr/bin/env python3
|
||||
"""组织服务桩 — 模拟 ninca-common-component-organization 的 /component/person/detail 端点"""
|
||||
|
||||
from flask import Flask, request, jsonify
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
# 被访人数据映射:personId → { floorList, organizationIds }
|
||||
HOST_DATA = {
|
||||
"1060601019894960128": { # 陈国辉 — 1403艾斯 + 星中心物业
|
||||
"name": "陈国辉",
|
||||
"floorList": ["605560541473144832", "605560545117995008"], # 6F, 28F
|
||||
"organizationIds": [
|
||||
"72fb65ec5de94201b909a98b8bae1892", # 1403艾斯
|
||||
"f216235e54ca42bfa0379e69b3754aff", # 星中心物业
|
||||
],
|
||||
},
|
||||
"1090779433129840640": { # 王姣 — 1405一博环保 + 一博
|
||||
"name": "王姣",
|
||||
"floorList": ["605560542752407552", "605560543834537984"], # 15F, 20F
|
||||
"organizationIds": [
|
||||
"2095de3d541f44eba686c78fda68336f", # 1405一博环保
|
||||
"5c129c5eae114309933042d7f2006aa2", # 一博
|
||||
],
|
||||
},
|
||||
"1072908835884208128": { # 秦夏 — 广发基金 + 正式员工
|
||||
"name": "秦夏",
|
||||
"floorList": [
|
||||
"605560545117995008", # 28F
|
||||
"605560545449345024", # 30F
|
||||
"605560545596145664", # 31F
|
||||
"605560545738752000", # 32F
|
||||
"605560545893941248", # 33F
|
||||
],
|
||||
"organizationIds": [
|
||||
"488b8ad049bb43408a6fbcc50bcb89ac", # 广发基金
|
||||
"b549a73065374ecf871841544f329a98", # 正式员工
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@app.route("/component/person/detail", methods=["POST"])
|
||||
def person_detail():
|
||||
data = request.get_json(force=True, silent=True) or {}
|
||||
person_id = data.get("id", "")
|
||||
host = HOST_DATA.get(person_id)
|
||||
|
||||
if not host:
|
||||
return jsonify({
|
||||
"success": False,
|
||||
"code": "76260531",
|
||||
"message": f"person not found: {person_id}",
|
||||
"data": None,
|
||||
})
|
||||
|
||||
return jsonify({
|
||||
"success": True,
|
||||
"code": "0",
|
||||
"message": "ok",
|
||||
"data": {
|
||||
"id": person_id,
|
||||
"businessId": "2524639890ba4f2cba9ba1a4eeaa4015",
|
||||
"name": host["name"],
|
||||
"floorList": host["floorList"],
|
||||
"organizationIds": host["organizationIds"],
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
@app.route("/health", methods=["GET"])
|
||||
def health():
|
||||
return jsonify({"status": "UP"})
|
||||
|
||||
|
||||
@app.route("/sysetting/zone/page", methods=["POST"])
|
||||
def zone_page():
|
||||
return jsonify({
|
||||
"success": True,
|
||||
"code": "0",
|
||||
"data": {
|
||||
"totalRows": 1,
|
||||
"currentPage": 1,
|
||||
"pageSize": 10,
|
||||
"datas": [{
|
||||
"id": "605560545117995008",
|
||||
"zoneId": "605560545117995008",
|
||||
"parentId": "605560539791228928",
|
||||
}],
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=18082, debug=False)
|
||||
@@ -0,0 +1,3 @@
|
||||
# CFR 输出体积大,默认不纳入 Git;本地生成后通过 cfr-from-cw-lib-current 使用
|
||||
cfr-from-cw-lib-*/
|
||||
!README.md
|
||||
@@ -0,0 +1,58 @@
|
||||
# V1 电梯模块反编译输出(CFR)
|
||||
|
||||
本目录由脚本生成,**勿手改**;重新生成会带时间戳子目录并更新 `cfr-from-cw-lib-current` 符号链接。
|
||||
|
||||
## 生成命令
|
||||
|
||||
```bash
|
||||
cd maven-cw-elevator-application
|
||||
./scripts/decompile_v1_elevator_jars.sh
|
||||
```
|
||||
|
||||
前提:
|
||||
|
||||
- 仓库根存在 `cw-elevator-application-V1.0.0.20211103/cw_lib/cw-elevator-application-{common,data,service,web}-1.0-SNAPSHOT.jar`
|
||||
- 仓库根存在 `artifacts/decompiled/v1-cfr-compare-20211103/cfr-0.152.jar`(或设置环境变量 `CFR_JAR`)
|
||||
|
||||
可选环境变量:
|
||||
|
||||
| 变量 | 含义 |
|
||||
|------|------|
|
||||
| `V1_RUN_DIR` | V1 解压目录绝对路径(默认:仓库根下 `cw-elevator-application-V1.0.0.20211103`) |
|
||||
| `CFR_JAR` | CFR jar 路径 |
|
||||
| `V1_DECOMP_OUT` | 输出根路径前缀(默认:`tools/v1-decompiled/cfr-from-cw-lib`,实际会追加 `-时间戳`) |
|
||||
| `DECOMPILE_V1_FAT_JAR=1` | 额外反编译 fat jar(耗时长、体积大) |
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
cfr-from-cw-lib-<timestamp>/
|
||||
MANIFEST.txt
|
||||
cw-elevator-application-common-1.0-SNAPSHOT/
|
||||
cn/cloudwalk/elevator/...
|
||||
cw-elevator-application-data-1.0-SNAPSHOT/
|
||||
cn/...
|
||||
...
|
||||
```
|
||||
|
||||
`cfr-from-cw-lib-current` → 最近一次生成目录。
|
||||
|
||||
## 与 V2 源码比对
|
||||
|
||||
**简要相似度报告**:
|
||||
|
||||
```bash
|
||||
python3 tools/elevator_api_parity/scripts/source_parity_scan.py
|
||||
```
|
||||
|
||||
→ `tools/elevator_api_parity/report/SOURCE-PARITY-BY-CLASS-decomp.md`
|
||||
|
||||
**全量差异梳理(推荐)**:按优先级分组 + 完整配对表 + JSON
|
||||
|
||||
```bash
|
||||
python3 tools/elevator_api_parity/scripts/v1_v2_diff_issues_report.py --json
|
||||
```
|
||||
|
||||
→ `report/V1-V2-DIFF-ISSUES.md`、同基名 `.json`
|
||||
|
||||
环境变量:`V1_DECOMP_ROOT`、`MV_ROOT`(默认为本 Maven 工程根)。
|
||||
@@ -0,0 +1 @@
|
||||
/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/tools/v1-decompiled/cfr-from-cw-lib-20260428-125802
|
||||
+3006
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user