diff --git a/maven-cw-elevator-application/deploy/README.md b/maven-cw-elevator-application/deploy/README.md index 70f2e29d..d4425f6c 100644 --- a/maven-cw-elevator-application/deploy/README.md +++ b/maven-cw-elevator-application/deploy/README.md @@ -1,12 +1,12 @@ # 电梯应用双版本同路径部署 -每个发行目录内 **JAR**、**`application.properties`**、**`bootstrap.properties`**(Consul)与 **`redis-override.properties`** 位于**同一目录**。`run.sh` 使用: +每个发行目录内 **JAR**、**`application.properties`**、**`application-access-control.properties`**(与生产 access-control 对齐)、**`bootstrap.properties`**(Consul)与 **`redis-override.properties`** 位于**同一目录**。`run.sh` 使用: ```bash ---spring.config.location=file:./application.properties,file:./redis-override.properties +--spring.config.location=file:./application.properties,file:./application-access-control.properties,file:./redis-override.properties ``` -(说明见下文:Boot 1.5 下 jar 内 `classpath:/application.properties` 往往最后生效,仅靠外置文件盖不住密码。) +(说明见下文:Boot 1.5 下 jar 内 `classpath:/application.properties` 往往最后生效,仅靠外置文件盖不住密码;**profile=access-control** 的分表与门禁业务参数以外置 **`application-access-control.properties`** 为准,内容已与 **`星中心/cw-elevator-application-V1.0.0.20211103/application-access-control.properties`** 同步。) ## 目录 @@ -15,7 +15,11 @@ | `v1-legacy/` | `cw-elevator-application-V1.0.0.20211103.jar` | **18080** | | `v2-maven/` | `cw-elevator-application-2.0.0.jar` | **18081** | -属性文件由历史包 `cw-elevator-application-V1.0.0.20211103/application.properties` 复制而来,仅在各自文件头部增加了 **注释** 与 **`server.port`**,便于双实例并行(对拍 / API 套件)。 +**`application.properties`**:在验证环境常用的 JDBC / Redis / Ribbon / Kafka / 端口等覆盖(数据库为生产还原时,请把 **jdbc-url、账号** 指到承载还原库的实例)。 + +**`application-access-control.properties`**:生产门禁侧参数(含 **ShardingSphere 分表 `2020..2030`**、门禁阈值、定时任务开关等),与 **星中心** 部署目录保持一致;更新时请从星中心同名文件覆盖后再提交。 + +属性文件最初由历史包 `cw-elevator-application-V1.0.0.20211103/application.properties` 演化而来;头部保留 **`server.port`**(18080 / 18081)便于双实例并行(对拍 / API 套件)。 ## 一次性同步 JAR @@ -71,7 +75,16 @@ fat JAR 的 `classpath:/application.properties` 会带内网旧 **host** 与 **p ## 修改配置 -直接编辑对应目录下的 **`application.properties`**(与 JAR 同路径),重启进程生效。 +直接编辑对应目录下的 **`application.properties`**、**`application-access-control.properties`**(与 JAR 同路径),重启进程生效。 +若 **Consul KV** 中存在同名 `spring.shardingsphere.*` 等键,**运行时仍以 Consul 覆盖为准**,需与库表、本地文件三方对齐后再做生产模拟。 + +## 生产模拟时还可对齐的项(按需) + +| 配置来源(星中心) | deploy 中对应位置 | 说明 | +|-------------------|------------------|------| +| `bootstrap.properties`(Consul / Dubbo) | `v1-legacy/bootstrap.properties` | 当前保留验证用 Consul 地址;生产 Consul host、Dubbo `zookeeper://...` 若需一致,在确认网络可达后按需合并(V2 构建一般不写 Dubbo)。 | +| `application.properties`(jdbc/redis/kafka) | 同上目录 `application.properties` + `redis-override.properties` | 还原库在哪台 MySQL、Redis 是否同生产,由你在本机改 URL/口令;**勿将生产口令提交到公开仓库**。 | +| `application-access-control.properties` | 已内置与星中心同内容 | 生产变更分表年限时,从星中心覆盖此文件。 | ## JDK 版本(避免 `InaccessibleObjectException` / CGLIB) diff --git a/maven-cw-elevator-application/deploy/v1-legacy/application-access-control.properties b/maven-cw-elevator-application/deploy/v1-legacy/application-access-control.properties new file mode 100644 index 00000000..d6cbf038 --- /dev/null +++ b/maven-cw-elevator-application/deploy/v1-legacy/application-access-control.properties @@ -0,0 +1,47 @@ +# 来源:星河湾星中星/星中心/cw-elevator-application-V1.0.0.20211103/application-access-control.properties(生产门禁 access-control 参数) +# profile=access-control 时与本目录 application.properties 合并加载;勿随意删减与分表相关项。 +# \u56FE\u7247\u524D\u7F00 +cloudwalk.elevator.common.relativePrefix=/cwos-portal/portal/fileManager/imgByPath?path= +# \u6570\u636E\u5E93sharding\u914D\u7F6E +spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes=ds0.IT_ACS_RECOG_RECORD_$->{2020..2030} +spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column=RECOGNITION_TIME +spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name=cn.cloudwalk.elevator.YearlyShardingAlgorithm +spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name=cn.cloudwalk.elevator.YearlyShardingAlgorithm +# \u7535\u68AF\u5F00\u95E8\u4E8B\u4EF6\u8868 +spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes=ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030} +spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column=RECOGNITION_TIME +spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name=cn.cloudwalk.elevator.YearlyShardingAlgorithm +spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name=cn.cloudwalk.elevator.YearlyShardingAlgorithm +spring.shardingsphere.sharding.binding-tables=IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD +# \u4EBA\u8138\u6293\u62CD\u8BC6\u522B\u9608\u503C +cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD=75 +# \u4EBA\u8138\u6BD4\u5BF9\u67E5\u8BE2\u8FC7\u6EE4\u9608\u503C +cloudwalk.access-control.common.face-compare-THRESHOLD=80 +# \u5B9A\u65F6\u4EFB\u52A1\u914D\u7F6E +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name=AcsRecordStatisticsByDayJob +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group=ACCESS-CONTROL_GROUP +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class=cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description=AcsRecordStatisticsByDay job is starting......... +## \u6BCF\u5929\u51CC\u66680\u70B910\u5206\u6267\u884C +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression=0 10 0 * * ? +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority=1 +# \u5F00\u95E8\u8BB0\u5F55\u63A8\u9001\u5F00\u5173\uFF1Atrue-\u5F00\uFF1Bfalse-\u5173\u3002\u9ED8\u8BA4\u4E3A\u5173 +cloudwalk.access-control.common.publish-opendoor-switch=false +# \u5F00\u95E8\u8BB0\u5F55\u63A8\u9001serviceCode +cloudwalk.access-control.common.publish-opendoor-service-code=access-control +# \u540E\u7AEF\u8BC6\u522B\u4E0B\u53D1\u5F00\u95E8\u6307\u4EE4\u76F8\u5173\u914D\u7F6E +# \u6293\u62CD\u65F6\u95F4\u5728\u591A\u4E45\u4E4B\u524D\u4E0D\u4E0B\u53D1\u5F00\u95E8\u6307\u4EE4\u3002\u9ED8\u8BA45\u5206\u949F\u3002\u5355\u4F4D\uFF1A\u6BEB\u79D2\u3002 +cloudwalk.access-control.common.face-capture-time-expired-milliseconds=300000 +# \u591A\u5C11\u6BEB\u79D2\u4EE5\u5185\u7684\u591A\u6761\u6293\u62CD\u8BB0\u5F55\u53EA\u4E0B\u53D1\u4E00\u6B21\u5F00\u95E8\u6307\u4EE4\u3002\u9ED8\u8BA43\u79D2\u3002\u5355\u4F4D\uFF1A\u6BEB\u79D2 +cloudwalk.access-control.common.face-capture-interval-milliseconds=3000 +# \u5F00\u95E8\u8BB0\u5F55\u8FC7\u671F\u65F6\u95F4\u3002\u591A\u5C11\u6BEB\u79D2\u4E4B\u540E\uFF0C\u672A\u4E0A\u62A5\u5F00\u95E8\u8BB0\u5F55\uFF0C\u5F00\u95E8\u8BB0\u5F55\u72B6\u6001\u66F4\u65B0\u4E3A\u5931\u8D25\u3002\u9ED8\u8BA410\u5206\u949F\u3002\u5355\u4F4D\uFF1A\u6BEB\u79D2 +cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds=600000 +# \u95E8\u7981\u63A7\u5236\u5668\u7C7B\u578B\u96C6\u5408 +cloudwalk.access-control.common.device-controller-array[0]=mqtt +# \u8BBE\u5907\u79CD\u7C7Bid\u96C6\u5408 +cloudwalk.access-control.common.device-category-array[0]=4 +cloudwalk.access-control.common.device-category-array[1]=5 +cloudwalk.access-control.common.device-category-array[2]=7 +cloudwalk.access-control.common.device-category-array[3]=2 +cloudwalk.access-control.common.device-category-array[4]=8 +cloudwalk.access-control.common.device-category-array[5]=11 diff --git a/maven-cw-elevator-application/deploy/v1-legacy/application.properties b/maven-cw-elevator-application/deploy/v1-legacy/application.properties index 5f2757c4..4f7e3aa1 100644 --- a/maven-cw-elevator-application/deploy/v1-legacy/application.properties +++ b/maven-cw-elevator-application/deploy/v1-legacy/application.properties @@ -1,4 +1,6 @@ # deploy/v1-legacy \uFF1A\u5386\u53F2\u5305 cw-elevator-application-V1.0.0.20211103.jar\uFF08\u540C\u76EE\u5F55\u542F\u52A8\uFF09 +# \u751F\u4EA7\u6A21\u62DF\uFF1Aaccess-control \u4E1A\u52A1/\u5206\u8868/\u95E8\u7981\u9608\u503C\u7B49\u89C1\u540C\u76EE\u5F55 application-access-control.properties +# \uFF08\u4E0E \u661F\u4E2D\u5FC3/cw-elevator-application-V1.0.0.20211103 \u5BF9\u9F50\uFF09\u3002\u672C\u6587\u4EF6\u4FDD\u7559\u7AEF\u53E3\u3001JDBC/Redis/Ribbon/Kafka \u7B49\u9A8C\u8BC1\u73AF\u5883\u8986\u76D6\u3002 server.port=18080 server.tomcat.uri-encoding=UTF-8 spring.application.name=elevator-app diff --git a/maven-cw-elevator-application/deploy/v1-legacy/run.sh b/maven-cw-elevator-application/deploy/v1-legacy/run.sh index d9ad243f..c067427c 100755 --- a/maven-cw-elevator-application/deploy/v1-legacy/run.sh +++ b/maven-cw-elevator-application/deploy/v1-legacy/run.sh @@ -27,6 +27,7 @@ done < <(_jdk8_open_flags "$JAVA") # classpath:/application.properties 最后加载会盖住外置 properties;用 merge-redis-json.sh 把 redis-override.properties # 转成 SPRING_APPLICATION_JSON(含 host/port/password),优先级高于 jar。 +# application-access-control.properties 与星中心生产门禁配置对齐,在 application 之后、redis-override 之前加载。 # 临时改密码:SPRING_REDIS_PASSWORD='其它' ./run.sh(含空字符串表示无密码) if ! command -v python3 >/dev/null 2>&1; then echo "需要 python3(deploy/merge-redis-json.sh)。请安装 python3。" >&2 @@ -39,4 +40,4 @@ fi export SPRING_APPLICATION_JSON="$("$MERGE" "$PWD/redis-override.properties")" # shellcheck disable=SC2086 exec "$JAVA" "${OPEN_FLAGS[@]}" ${ELEVATOR_JAVA_OPTS:-} -jar "$JAR" \ - --spring.config.location=file:./application.properties,file:./redis-override.properties + --spring.config.location=file:./application.properties,file:./application-access-control.properties,file:./redis-override.properties diff --git a/maven-cw-elevator-application/deploy/v2-maven/application-access-control.properties b/maven-cw-elevator-application/deploy/v2-maven/application-access-control.properties new file mode 100644 index 00000000..d6cbf038 --- /dev/null +++ b/maven-cw-elevator-application/deploy/v2-maven/application-access-control.properties @@ -0,0 +1,47 @@ +# 来源:星河湾星中星/星中心/cw-elevator-application-V1.0.0.20211103/application-access-control.properties(生产门禁 access-control 参数) +# profile=access-control 时与本目录 application.properties 合并加载;勿随意删减与分表相关项。 +# \u56FE\u7247\u524D\u7F00 +cloudwalk.elevator.common.relativePrefix=/cwos-portal/portal/fileManager/imgByPath?path= +# \u6570\u636E\u5E93sharding\u914D\u7F6E +spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.actual-data-nodes=ds0.IT_ACS_RECOG_RECORD_$->{2020..2030} +spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.sharding-column=RECOGNITION_TIME +spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.precise-algorithm-class-name=cn.cloudwalk.elevator.YearlyShardingAlgorithm +spring.shardingsphere.sharding.tables.IT_ACS_RECOG_RECORD.table-strategy.standard.range-algorithm-class-name=cn.cloudwalk.elevator.YearlyShardingAlgorithm +# \u7535\u68AF\u5F00\u95E8\u4E8B\u4EF6\u8868 +spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.actual-data-nodes=ds0.IT_ACS_ELEVATOR_RECORD_$->{2020..2030} +spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.sharding-column=RECOGNITION_TIME +spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.precise-algorithm-class-name=cn.cloudwalk.elevator.YearlyShardingAlgorithm +spring.shardingsphere.sharding.tables.IT_ACS_ELEVATOR_RECORD.table-strategy.standard.range-algorithm-class-name=cn.cloudwalk.elevator.YearlyShardingAlgorithm +spring.shardingsphere.sharding.binding-tables=IT_ACS_ELEVATOR_RECORD,IT_ACS_RECOG_RECORD +# \u4EBA\u8138\u6293\u62CD\u8BC6\u522B\u9608\u503C +cloudwalk.access-control.common.device-atrr-map.ACS_FACE_REG_THRESHOLD=75 +# \u4EBA\u8138\u6BD4\u5BF9\u67E5\u8BE2\u8FC7\u6EE4\u9608\u503C +cloudwalk.access-control.common.face-compare-THRESHOLD=80 +# \u5B9A\u65F6\u4EFB\u52A1\u914D\u7F6E +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.name=AcsRecordStatisticsByDayJob +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.group=ACCESS-CONTROL_GROUP +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.executable-class=cn.cloudwalk.service.ninca.accesscontrol.common.job.executable.AcsRecordStatisticsByDayJob +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.description=AcsRecordStatisticsByDay job is starting......... +## \u6BCF\u5929\u51CC\u66680\u70B910\u5206\u6267\u884C +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.cron-expression=0 10 0 * * ? +cloudwalk.access-control.schedual.jobs.AcsRecordStatisticsByDayJob.priority=1 +# \u5F00\u95E8\u8BB0\u5F55\u63A8\u9001\u5F00\u5173\uFF1Atrue-\u5F00\uFF1Bfalse-\u5173\u3002\u9ED8\u8BA4\u4E3A\u5173 +cloudwalk.access-control.common.publish-opendoor-switch=false +# \u5F00\u95E8\u8BB0\u5F55\u63A8\u9001serviceCode +cloudwalk.access-control.common.publish-opendoor-service-code=access-control +# \u540E\u7AEF\u8BC6\u522B\u4E0B\u53D1\u5F00\u95E8\u6307\u4EE4\u76F8\u5173\u914D\u7F6E +# \u6293\u62CD\u65F6\u95F4\u5728\u591A\u4E45\u4E4B\u524D\u4E0D\u4E0B\u53D1\u5F00\u95E8\u6307\u4EE4\u3002\u9ED8\u8BA45\u5206\u949F\u3002\u5355\u4F4D\uFF1A\u6BEB\u79D2\u3002 +cloudwalk.access-control.common.face-capture-time-expired-milliseconds=300000 +# \u591A\u5C11\u6BEB\u79D2\u4EE5\u5185\u7684\u591A\u6761\u6293\u62CD\u8BB0\u5F55\u53EA\u4E0B\u53D1\u4E00\u6B21\u5F00\u95E8\u6307\u4EE4\u3002\u9ED8\u8BA43\u79D2\u3002\u5355\u4F4D\uFF1A\u6BEB\u79D2 +cloudwalk.access-control.common.face-capture-interval-milliseconds=3000 +# \u5F00\u95E8\u8BB0\u5F55\u8FC7\u671F\u65F6\u95F4\u3002\u591A\u5C11\u6BEB\u79D2\u4E4B\u540E\uFF0C\u672A\u4E0A\u62A5\u5F00\u95E8\u8BB0\u5F55\uFF0C\u5F00\u95E8\u8BB0\u5F55\u72B6\u6001\u66F4\u65B0\u4E3A\u5931\u8D25\u3002\u9ED8\u8BA410\u5206\u949F\u3002\u5355\u4F4D\uFF1A\u6BEB\u79D2 +cloudwalk.access-control.common.face-capture-open-door-fail-milliseconds=600000 +# \u95E8\u7981\u63A7\u5236\u5668\u7C7B\u578B\u96C6\u5408 +cloudwalk.access-control.common.device-controller-array[0]=mqtt +# \u8BBE\u5907\u79CD\u7C7Bid\u96C6\u5408 +cloudwalk.access-control.common.device-category-array[0]=4 +cloudwalk.access-control.common.device-category-array[1]=5 +cloudwalk.access-control.common.device-category-array[2]=7 +cloudwalk.access-control.common.device-category-array[3]=2 +cloudwalk.access-control.common.device-category-array[4]=8 +cloudwalk.access-control.common.device-category-array[5]=11 diff --git a/maven-cw-elevator-application/deploy/v2-maven/application.properties b/maven-cw-elevator-application/deploy/v2-maven/application.properties index 3716e2fd..6f1acbb8 100644 --- a/maven-cw-elevator-application/deploy/v2-maven/application.properties +++ b/maven-cw-elevator-application/deploy/v2-maven/application.properties @@ -1,4 +1,6 @@ # deploy/v2-maven \uFF1Amaven \u6784\u5EFA cw-elevator-application-2.0.0.jar\uFF08\u540C\u76EE\u5F55\u542F\u52A8\uFF09 +# \u751F\u4EA7\u6A21\u62DF\uFF1Aaccess-control \u4E1A\u52A1/\u5206\u8868/\u95E8\u7981\u9608\u503C\u7B49\u89C1\u540C\u76EE\u5F55 application-access-control.properties +# \uFF08\u4E0E \u661F\u4E2D\u5FC3/cw-elevator-application-V1.0.0.20211103 \u5BF9\u9F50\uFF09\u3002\u672C\u6587\u4EF6\u4FDD\u7559\u7AEF\u53E3\u3001JDBC/Redis/Ribbon/Kafka \u7B49\u9A8C\u8BC1\u73AF\u5883\u8986\u76D6\u3002 server.port=18081 server.tomcat.uri-encoding=UTF-8 spring.application.name=elevator-app diff --git a/maven-cw-elevator-application/deploy/v2-maven/run.sh b/maven-cw-elevator-application/deploy/v2-maven/run.sh index e1571d45..609de0f8 100755 --- a/maven-cw-elevator-application/deploy/v2-maven/run.sh +++ b/maven-cw-elevator-application/deploy/v2-maven/run.sh @@ -36,4 +36,4 @@ fi export SPRING_APPLICATION_JSON="$("$MERGE" "$PWD/redis-override.properties")" # shellcheck disable=SC2086 exec "$JAVA" "${OPEN_FLAGS[@]}" ${ELEVATOR_JAVA_OPTS:-} -jar "$JAR" \ - --spring.config.location=file:./application.properties,file:./redis-override.properties + --spring.config.location=file:./application.properties,file:./application-access-control.properties,file:./redis-override.properties diff --git a/maven-cw-elevator-application/scripts/run_v1v2_parity_automated.sh b/maven-cw-elevator-application/scripts/run_v1v2_parity_automated.sh index eb3ccb7e..7c303603 100755 --- a/maven-cw-elevator-application/scripts/run_v1v2_parity_automated.sh +++ b/maven-cw-elevator-application/scripts/run_v1v2_parity_automated.sh @@ -177,8 +177,8 @@ if [[ "${ELEVATOR_SKIP_START:-0}" != "1" ]]; then # Consul:若脚本未加载 bootstrap、且无本地 Consul,JAR 内嵌地址会导致 agentServiceRegister 失败→整进程退出(日志见 TransportException 8500)。 OFF_JVM=() - LOC_CHAIN_V1="file:${V1_DIR}/bootstrap.properties,file:${V1_DIR}/application.properties,file:${V1_DIR}/redis-override.properties" - LOC_CHAIN_V2="file:${V2_DIR}/bootstrap.properties,file:${V2_DIR}/application.properties,file:${V2_DIR}/redis-override.properties" + LOC_CHAIN_V1="file:${V1_DIR}/bootstrap.properties,file:${V1_DIR}/application.properties,file:${V1_DIR}/application-access-control.properties,file:${V1_DIR}/redis-override.properties" + LOC_CHAIN_V2="file:${V2_DIR}/bootstrap.properties,file:${V2_DIR}/application.properties,file:${V2_DIR}/application-access-control.properties,file:${V2_DIR}/redis-override.properties" if [[ "${ELEVATOR_PARITY_OFFLINE:-1}" == "1" ]] && [[ -f "${PARITY_OFFLINE_PROPS}" ]]; then LOC_CHAIN_V1+=",file:${PARITY_OFFLINE_PROPS}" LOC_CHAIN_V2+=",file:${PARITY_OFFLINE_PROPS}" diff --git a/maven-cw-elevator-application/tools/elevator_api_parity/report/对拍执行结果-大白话说明.md b/maven-cw-elevator-application/tools/elevator_api_parity/report/对拍执行结果-大白话说明.md index 90b1f155..985a43f3 100644 --- a/maven-cw-elevator-application/tools/elevator_api_parity/report/对拍执行结果-大白话说明.md +++ b/maven-cw-elevator-application/tools/elevator_api_parity/report/对拍执行结果-大白话说明.md @@ -1,55 +1,55 @@ -# 对拍(旧包 vs 新包)结果说明(通俗版) - -**时间**:2026-04-29 - ---- - -## 一、我们到底在比什么? - -把**以前发布的电梯程序安装包**和**现在源码编出来的新包**同时跑起来,用同一套测试去调接口,看**返回是否一致**(尤其是业务成功/失败那套码)。一致就说明新旧行为对得上,方便放心升级。 - ---- - -## 二、中间卡过两次,分别是怎么回事? - -### 1. 旧包「换心脏」之后起不来了 - -为了让旧包和现网数据访问逻辑尽量一致,我们做了一个操作:用新编出来的小模块,去**替换**旧大安装包里的其中一个小文件(像换录音机里的一盘磁带)。 - -头一回换法不对:打进去的小文件被**压得太紧**,旧程序认不出来,一启动就报错。 -后来改成**不压缩、原样塞进去**的方式,旧包就能正常启动了。 - -**用大白话说**:大 jar 里套小 jar 时,小 jar 不能按「压缩包」方式塞,要按老程序能读的方式塞,否则一运行就挂。 - -### 2.「通行记录分页」这条对拍,为什么最后还是没法两边码一致? - -对拍里有一条接口:查**电梯通行记录列表**(分页)。 - -- **新包**跑起来时,在日志里看,它连数据库时**并没有按「每年一张表」去拆**;相当于问的是**一张大表**(或统一入口),表在库里是有的,所以能查,业务码是「成功」。 -- **旧包**跑起来时,按配置会去找**带年份后缀的表名**(比如某年一张表)。你们当前这套联机库里,**没有对应年份的那张物理表**,于是一查就报「表不存在」,旧包就返回业务错误码(你们看到的那种非全零码)。 - -所以这不是「算错了一天两天」能修好的,而是:**两个程序连库时,走的不是同一套「表长什么样」的假设**;再叠加上库里实际有没有那些分表,旧包就会失败、新包会成功,**对拍自然对不齐**。 - -**用大白话说**:一个按「分年小本子」找数据,一个按「大本子」找数据;联机环境里没有旧程序要的那本「某年小本子」,旧的就报错,新的还能过——这不是改一两行业务代码能抹平的,要**统一配置/统一建表**才谈得上真正对齐。 - ---- - -## 三、最后我们怎么让整套自动对拍能跑绿? - -在没改库、没统一两边分表策略的前提下,把「通行记录分页」从**严格对拍名单**里拿掉了(和之前「访客相关某些接口」不对拍是同一类处理:不是不管了,是**先标出来因环境/策略不一致而不宜强行比码**)。 - -**人员详情、通行规则分页**等其它纳入对拍的接口,**新旧两侧仍然是一致通过**的。 - -**用大白话说**:该比的还在比,且能对的都对上了;对不齐的那条,在清单里标了原因,等以后库表和配置跟上了,再把它加回对拍也不迟。 - ---- - -## 四、你如果想记一句话版本 - -- 换小模块进旧包时,**塞法要对**(不能压成它读不了的嵌套包)。 -- **通行记录**这条,旧新两边**查的不是同一种表结构/策略**,再叠加库里缺表,所以业务码**暂时无法**在自动对拍里强制一致;已用「不对拍 + 写清原因」处理。 -- 其它核心对拍项**已通过**。 - ---- - -*本说明由对拍执行过程整理,技术细节以仓库内脚本、配置与报告为准。* +# 对拍(旧包 vs 新包)结果说明(通俗版) + +**时间**:2026-04-29 + +--- + +## 一、我们到底在比什么? + +把**以前发布的电梯程序安装包**和**现在源码编出来的新包**同时跑起来,用同一套测试去调接口,看**返回是否一致**(尤其是业务成功/失败那套码)。一致就说明新旧行为对得上,方便放心升级。 + +--- + +## 二、中间卡过两次,分别是怎么回事? + +### 1. 旧包「换心脏」之后起不来了 + +为了让旧包和现网数据访问逻辑尽量一致,我们做了一个操作:用新编出来的小模块,去**替换**旧大安装包里的其中一个小文件(像换录音机里的一盘磁带)。 + +头一回换法不对:打进去的小文件被**压得太紧**,旧程序认不出来,一启动就报错。 +后来改成**不压缩、原样塞进去**的方式,旧包就能正常启动了。 + +**用大白话说**:大 jar 里套小 jar 时,小 jar 不能按「压缩包」方式塞,要按老程序能读的方式塞,否则一运行就挂。 + +### 2.「通行记录分页」这条对拍,为什么最后还是没法两边码一致? + +对拍里有一条接口:查**电梯通行记录列表**(分页)。 + +- **新包**跑起来时,在日志里看,它连数据库时**并没有按「每年一张表」去拆**;相当于问的是**一张大表**(或统一入口),表在库里是有的,所以能查,业务码是「成功」。 +- **旧包**跑起来时,按配置会去找**带年份后缀的表名**(比如某年一张表)。你们当前这套联机库里,**没有对应年份的那张物理表**,于是一查就报「表不存在」,旧包就返回业务错误码(你们看到的那种非全零码)。 + +所以这不是「算错了一天两天」能修好的,而是:**两个程序连库时,走的不是同一套「表长什么样」的假设**;再叠加上库里实际有没有那些分表,旧包就会失败、新包会成功,**对拍自然对不齐**。 + +**用大白话说**:一个按「分年小本子」找数据,一个按「大本子」找数据;联机环境里没有旧程序要的那本「某年小本子」,旧的就报错,新的还能过——这不是改一两行业务代码能抹平的,要**统一配置/统一建表**才谈得上真正对齐。 + +--- + +## 三、最后我们怎么让整套自动对拍能跑绿? + +在没改库、没统一两边分表策略的前提下,把「通行记录分页」从**严格对拍名单**里拿掉了(和之前「访客相关某些接口」不对拍是同一类处理:不是不管了,是**先标出来因环境/策略不一致而不宜强行比码**)。 + +**人员详情、通行规则分页**等其它纳入对拍的接口,**新旧两侧仍然是一致通过**的。 + +**用大白话说**:该比的还在比,且能对的都对上了;对不齐的那条,在清单里标了原因,等以后库表和配置跟上了,再把它加回对拍也不迟。 + +--- + +## 四、你如果想记一句话版本 + +- 换小模块进旧包时,**塞法要对**(不能压成它读不了的嵌套包)。 +- **通行记录**这条,旧新两边**查的不是同一种表结构/策略**,再叠加库里缺表,所以业务码**暂时无法**在自动对拍里强制一致;已用「不对拍 + 写清原因」处理。 +- 其它核心对拍项**已通过**。 + +--- + +*本说明由对拍执行过程整理,技术细节以仓库内脚本、配置与报告为准。* \ No newline at end of file