From be7a8e9d89dd5a0625234fadc87920d5d10b4ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=8D=E7=BC=96=E8=AF=91=E5=B7=A5=E4=BD=9C=E5=8C=BA?= Date: Mon, 27 Apr 2026 14:10:41 +0800 Subject: [PATCH] =?UTF-8?q?release(cw-elevator):=20v2.0.0=20=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E8=AF=B4=E6=98=8E=E3=80=81=E5=8D=87=E7=BA=A7=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E4=B8=8E=E5=8F=91=E5=B8=83=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加电梯应用 v2.0.0 技术/甲方/升级计划说明 - 增加 release-cw-elevator-application.sh 与 releases 忽略 JAR - 发布包目录含 ddl 与文档副本(JAR 由本地构建,不提交) Made-with: Cursor Former-commit-id: 3939231809c424041419f38be69db99edaef55f4 --- ...cw-elevator-application-v2.0.0-升级计划.md | 106 +++++++++++++++++ ...cw-elevator-application-v2.0.0-发布说明.md | 29 +++++ ...vator-application-v2.0.0-版本升级说明书.md | 111 ++++++++++++++++++ ...tor-application-v2.0.0-甲方版本升级说明.md | 34 ++++++ maven-cw-elevator-application/.gitignore | 2 + .../releases/v2.0.0/BUILD_MANIFEST.txt | 9 ++ .../ddl/tenant_visitor_floor_policy.sql | 27 +++++ .../releases/v2.0.0/升级计划.md | 106 +++++++++++++++++ .../releases/v2.0.0/发布说明.md | 29 +++++ .../releases/v2.0.0/版本升级说明书.md | 111 ++++++++++++++++++ .../releases/v2.0.0/甲方版本升级说明.md | 34 ++++++ scripts/release-cw-elevator-application.sh | 89 ++++++++++++++ 12 files changed, 687 insertions(+) create mode 100644 docs/build/cw-elevator-application-v2.0.0-升级计划.md create mode 100644 docs/build/cw-elevator-application-v2.0.0-发布说明.md create mode 100644 docs/build/cw-elevator-application-v2.0.0-版本升级说明书.md create mode 100644 docs/build/cw-elevator-application-v2.0.0-甲方版本升级说明.md create mode 100644 maven-cw-elevator-application/.gitignore create mode 100644 maven-cw-elevator-application/releases/v2.0.0/BUILD_MANIFEST.txt create mode 100644 maven-cw-elevator-application/releases/v2.0.0/ddl/tenant_visitor_floor_policy.sql create mode 100644 maven-cw-elevator-application/releases/v2.0.0/升级计划.md create mode 100644 maven-cw-elevator-application/releases/v2.0.0/发布说明.md create mode 100644 maven-cw-elevator-application/releases/v2.0.0/版本升级说明书.md create mode 100644 maven-cw-elevator-application/releases/v2.0.0/甲方版本升级说明.md create mode 100755 scripts/release-cw-elevator-application.sh diff --git a/docs/build/cw-elevator-application-v2.0.0-升级计划.md b/docs/build/cw-elevator-application-v2.0.0-升级计划.md new file mode 100644 index 00000000..d863c88f --- /dev/null +++ b/docs/build/cw-elevator-application-v2.0.0-升级计划.md @@ -0,0 +1,106 @@ +# cw-elevator-application v2.0.0 升级计划 + +**项目名称**(可填):智慧电梯 / 访客派梯系统升级 +**版本**:v2.0.0 +**计划性质**:执行级排期草案,**具体日期、起止时刻以与甲方书面/邮件确认为准**。 + +--- + +## 1. 升级目标 + +完成电梯派梯应用 **v2.0.0** 上线,启用**租户访客固定访问楼层**能力所需的应用与数据库对象;按业务需要为指定租户配置策略并完成验收。 + +--- + +## 2. 计划时间窗口(夜间 · 暂定周二、周三) + +| 窗口 | 意向安排 | 建议内容(可合并或调整) | +|------|-----------|----------------------------| +| **第一次:周二晚间** | 夜间低峰段,具体 **HH:MM–HH:MM** 待定 | 环境检查、数据库备份、执行 **DDL**(新建策略表)、(可选)预发布验证、必要时准备回滚包与检查单 | +| **第二次:周三晚间** | 夜间低峰段,具体 **HH:MM–HH:MM** 待定 | 部署新版本 **JAR**、滚动/重启应用、按需 **INSERT** 租户策略数据、业务联调与验收、监控与值守 | + +**说明**: + +- 若贵方现场要求**一个晚上完成全部步骤**,可将 DDL 与部署**合并在同一晚间窗口**执行,本表仅体现「周二、周三两晚」的**当前意向拆分**,最终以确认单为准。 +- 两次窗口建议**间隔至少数小时至一个工作日**,便于第一次变更后观察库表与低风险项;若合并为单次窗口,须在计划单中注明**连续操作顺序与回滚点**。 + +**待确认栏**(实施时填写): + +- 周二实施日期:`____年____月____日`,时段: `____ : ____` – `____ : ____` +- 周三实施日期:`____年____月____日`,时段: `____ : ____` – `____ : ____` +- 甲方现场联系人: `____________` 乙方/实施负责人: `____________` + +--- + +## 3. 影响范围与沟通 + +| 项目 | 说明 | +|------|------| +| 影响系统 | 电梯派梯相关应用(`cw-elevator-application`)及同一业务库。 | +| 用户感知 | 应用重启期间可能出现短时派梯接口失败;策略误配可能导致部分访客路径失败,需按验收清单核对。 | +| 通知范围 | 建议提前通知:物业/客服、前台与访客登记、安保与梯控相关值班(按项目实际 roster 确定)。 | + +--- + +## 4. 前置条件(升级前) + +- [ ] 已与甲方确认 **周二 / 周三** 夜间窗口。 +- [ ] 取得 **v2.0.0** 发布包(含 `jar`、`ddl/tenant_visitor_floor_policy.sql`、说明书)。 +- [ ] 目标环境 **JDK 版本**符合实施方要求(与构建说明一致,一般为 JDK 8)。 +- [ ] 数据库已做**备份**(全库或按运维规范),并可从发布包定位 DDL。 +- [ ] 明确需启用「固定访客楼层」的租户列表及**允许区域**配置(若不启用,可跳过策略数据录入,行为与升级前一致)。 +- [ ] 回滚包:保留**当前线上 JAR** 备份与回滚步骤(见下文)。 + +--- + +## 5. 实施步骤(建议顺序) + +### 5.1 周二晚间(或首个窗口) + +1. 备份数据库。 +2. 执行 `tenant_visitor_floor_policy.sql`(`CREATE TABLE IF NOT EXISTS`,可重复执行需与 DBA 确认)。 +3. (可选)在测试/预发环境先执行一遍并验证。 +4. 记录执行人、时间与结果。 + +### 5.2 周三晚间(或第二个窗口 / 同晚续作) + +1. 停止或滚动发布应用(按现网规范)。 +2. 替换为 `cw-elevator-application-2.0.0.jar` 并启动。 +3. 按业务需求对需启用的租户执行策略 **INSERT**(`enabled=1`、`allow_zone_ids` 等为合法 JSON 等,字段级以技术说明书为准)。 +4. 抽样验证:未传显式楼层时的访客派梯、租户策略开/关、与组织楼层无交集时的失败提示等。 +5. 观察监控与日志,**值守**至约定结束时间。 + +*若合并为单次窗口:按「备份 → DDL → 部署 JAR → 策略数据 → 验收」顺序连续执行,并预留回滚决策时间。* + +--- + +## 6. 验收要点(摘要) + +- 未配置或未启用策略时:与升级前行为一致。 +- 已启用策略且业务走「未显式指定楼层」路径:访客可去楼层为**组织允许**与**租户允许**的**交集**。 +- 交集为空时:接口返回预期业务错误(技术码见实施方说明书)。 +- 第三方已显式传入楼层的路径:不因本策略表改变原逻辑。 + +--- + +## 7. 回滚预案 + +| 场景 | 建议动作 | +|------|-----------| +| 应用异常 | 回退至上一版本 JAR;数据库新表若已存在且旧应用不读该表,通常可继续服务;与实施方确认。 | +| 策略配置错误 | 优先**停用或修正策略行**,避免大规模回滚应用。 | +| 必须撤表 | 仅在评估无依赖后由 DBA 执行删表;**高风险**,需书面确认。 | + +--- + +## 8. 交付物核对 + +- [ ] `cw-elevator-application-2.0.0.jar` +- [ ] `ddl/tenant_visitor_floor_policy.sql` +- [ ] 《版本升级说明书》(实施/技术) +- [ ] 本《甲方版本升级说明》(如已作为对甲交付) +- [ ] 本《升级计划》(双方确认签字/邮件留档) + +--- + +**文档状态**:草案;**时间点为暂定周二、周三晚间**,正式实施前请更新「待确认栏」并留存确认记录。 diff --git a/docs/build/cw-elevator-application-v2.0.0-发布说明.md b/docs/build/cw-elevator-application-v2.0.0-发布说明.md new file mode 100644 index 00000000..c8a2eb27 --- /dev/null +++ b/docs/build/cw-elevator-application-v2.0.0-发布说明.md @@ -0,0 +1,29 @@ +# cw-elevator-application v2.0.0 发布索引 + +本版本**功能升级说明**已单独成文,**仅覆盖「租户访客固定访问楼层」**及配套数据库 DDL,见: + +**[cw-elevator-application-v2.0.0-版本升级说明书](./cw-elevator-application-v2.0.0-版本升级说明书.md)** + +**对甲交付(业务表述与排期)**: + +- [甲方版本升级说明](./cw-elevator-application-v2.0.0-甲方版本升级说明.md) +- [升级计划(含夜间 · 周二/周三窗口)](./cw-elevator-application-v2.0.0-升级计划.md) + +--- + +## 一键构建与发布目录 + +在仓库根目录、**JDK 8** 下执行: + +```bash +export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 +./scripts/release-cw-elevator-application.sh +``` + +输出:`**maven-cw-elevator-application/releases/v2.0.0/**`,含 `jar`、`ddl/`、`版本升级说明书.md`、`甲方版本升级说明.md`、`升级计划.md`、`发布说明.md`、`BUILD_MANIFEST.txt`。 + +--- + +## Git 与大文件 + +`maven-cw-elevator-application/.gitignore` 忽略 `**releases/**/*.jar**`;**DDL 与说明书**可提交;可执行 JAR 请通过制品库或制品服务器分发。 \ No newline at end of file diff --git a/docs/build/cw-elevator-application-v2.0.0-版本升级说明书.md b/docs/build/cw-elevator-application-v2.0.0-版本升级说明书.md new file mode 100644 index 00000000..a13c06fa --- /dev/null +++ b/docs/build/cw-elevator-application-v2.0.0-版本升级说明书.md @@ -0,0 +1,111 @@ +# cw-elevator-application v2.0.0 版本升级说明书 + +**适用范围**:本说明**仅**描述 **v2.0.0** 中与 **租户访客固定访问楼层**(租户级允许区域与组织 `floorList` 求交)相关的升级内容,不含其它性能优化或通用发布项。 + +**应用制品**:`cw-elevator-application-2.0.0.jar`(Spring Boot 可执行 fat JAR)。 + +--- + +## 1. 功能概述 + +在 **访客派梯** 接口 **`add/visitor`**(实现类 `PersonRuleServiceImpl#addVisitor`)中,当调用方 **未传入非空 `floorIds`**(业务流程 **UC-01**:按被访人组织侧楼层推导)时: + +1. 服务仍先通过 **`person/detail`** 取得被访人 **`floorList`**(与升级前一致)。 +2. **新增**:若数据库中存在**启用**的租户策略行,且 **`allow_zone_ids`** 解析为非空 JSON 数组,则最终生效楼层为 + **`effectiveFloors = floorList ∩ allow_zone_ids`**(顺序保持 **`floorList`** 原有顺序)。 +3. 若交集 **为空**,接口返回失败码 **`76260532`**(不允许静默放宽到其它楼层)。 +4. 若无策略表、无启用行、`allow_zone_ids` 为空或 JSON 无效:行为与升级前一致,使用 **`floorList` 全集**。 + +当调用方 **已传入非空 `floorIds`**(**UC-02**,第三方显式指定楼层)时:**不读取**策略表,**不对入参求交**,与升级前一致。 + +> **产品表述**:「固定访问楼层」在本阶段由租户管理员通过 **`allow_zone_ids`** 声明**允许开放给访客派梯的区域(zoneId)集合**;在 UC-01 路径下与组织返回的 **`floorList`** 取交集,从而将访客权限**收敛**到既有「被访人可去楼层」与「租户允许楼层」的双重约束内。 + +--- + +## 2. 涉及的数据库变更 + +### 2.1 变更类型 + +| 类型 | 对象 | +|------|------| +| **新增表** | `tenant_visitor_floor_policy` | + +**执行库**:与电梯应用 **同一数据源**(MySQL/InnoDB,与现有派梯业务库一致)。 + +### 2.2 表用途(摘要) + +| 字段 | 含义 | +|------|------| +| `business_id` | 租户/机构 ID | +| `policy_type` | 本阶段固定 **`INTERSECT_ALLOWLIST`** | +| `allow_zone_ids` | **TEXT**,存 **JSON 数组**字符串,元素为允许访客派梯的 **zoneId** | +| `building_id` | 租户级默认策略填 **NULL**(预留楼栋维) | +| `enabled` | **1** 启用 / **0** 停用 | +| `policy_version` | 配置版本号(审计) | + +唯一约束 **`uk_biz_building (business_id, building_id)`**:同一租户、租户级策略(`building_id` 为空)**建议仅维护一行**,避免多行时查询仅命中「最新一条」与运维预期不符。 + +### 2.3 DDL 脚本位置 + +| 用途 | 仓库内路径 | +|------|------------| +| **权威 DDL** | `docs/sql/tenant_visitor_floor_policy.sql` | + +**发布包内副本**:随 v2.0.0 发布目录一并下发,路径为 **`ddl/tenant_visitor_floor_policy.sql`**(与根目录 JAR 同级下的 `ddl` 子目录)。 + +脚本内容为 **`CREATE TABLE IF NOT EXISTS`**,在未建表环境可重复执行;**不含**业务数据 `INSERT`,上线需按租户配置自行 **`INSERT`** 策略行。 + +### 2.4 上线执行顺序(建议) + +1. **备份**当前电梯应用库(至少包含待变更库的全库或相关表备份策略)。 +2. 在目标库执行 **`ddl/tenant_visitor_floor_policy.sql`**(或直接使用仓库 `docs/sql` 下同源文件)。 +3. 对需启用策略的租户 **`INSERT`** 一行(示例字段:`business_id`、`policy_type='INTERSECT_ALLOWLIST'`、`allow_zone_ids` 为合法 JSON 数组、`enabled=1`、`building_id` 为 **NULL**)。 +4. 部署 **`cw-elevator-application-2.0.0.jar`** 并滚动重启应用。 +5. 按 §4 做 **UC-01 / UC-02** 验收。 + +### 2.5 回滚说明 + +- **仅回滚应用**:还原旧版本 JAR 后,若库中**已存在**策略行且仍为 **enabled=1**,旧版本应用**通常不读取**该表,行为与历史一致;表结构可保留。 +- **回滚数据库**:若需删除表(谨慎),在确认无其它依赖后执行 **`DROP TABLE tenant_visitor_floor_policy`**;请在变更窗口与 DBA 确认。 + +--- + +## 3. 行为与错误码(验收) + +| 场景 | `floorIds` | 策略库 | 期望 | +|------|------------|--------|------| +| UC-01 基线 | 空/未传 | 无启用行或 allow 空/无效 | 使用组织 **`floorList` 全集**(与升级前一致) | +| UC-01 + 固定楼层 | 空/未传 | 有启用行且 allow 非空 | **`floorList ∩ allow`**(保序) | +| 无交集 | 空/未传 | allow 与 `floorList` 无交集 | **`76260532`** | +| 被访人无楼层 | 空/未传 | 任意 | **`76260531`** | +| UC-02 | **非空** | 任意 | **不读策略表**,按请求楼层处理 | + +--- + +## 4. 发布包目录结构(v2.0.0) + +执行仓库根目录 **`./scripts/release-cw-elevator-application.sh`** 后,输出目录为: + +**`maven-cw-elevator-application/releases/v2.0.0/`** + +| 文件/目录 | 说明 | +|-----------|------| +| `cw-elevator-application-2.0.0.jar` | 可执行应用 | +| `ddl/tenant_visitor_floor_policy.sql` | 与本功能相关的 **唯一 DDL**(与 `docs/sql` 同源) | +| `版本升级说明书.md` | 本文件副本(便于随包交付) | +| `BUILD_MANIFEST.txt` | 构建时间、JDK、`git` 修订号 | + +--- + +## 5. 参考文档(仓库内) + +| 文档 | 路径 | +|------|------| +| 数据库阶段变更记录 | `docs/business/租户访客默认楼层-数据库阶段变更记录.md` | +| 数据库配置阶段技术设计 | `docs/business/租户访客默认楼层-数据库配置阶段技术设计.md` | +| 技术产品方案 | `docs/business/租户访客默认楼层技术产品方案.md` | +| 访客注册与派梯楼层走查 | `docs/business/访客注册与派梯楼层业务流程走查.md` | + +--- + +**文档版本**:与制品 **`cw-elevator-application-2.0.0`** 对齐;若仅升级文档而不改代码,请以 **`BUILD_MANIFEST.txt`** 中构建时间为准。 diff --git a/docs/build/cw-elevator-application-v2.0.0-甲方版本升级说明.md b/docs/build/cw-elevator-application-v2.0.0-甲方版本升级说明.md new file mode 100644 index 00000000..8a037109 --- /dev/null +++ b/docs/build/cw-elevator-application-v2.0.0-甲方版本升级说明.md @@ -0,0 +1,34 @@ +# 电梯派梯应用 v2.0.0 — 版本升级说明(广发基金) + +**制品**:`cw-elevator-application-2.0.0.jar`。技术细节、验收码与脚本位置见同目录《版本升级说明书》。 + +--- + +## 本次升级做什么 + +针对**广发基金**租户:访客走常见派梯路径(接口**未单独传楼层**)时,系统在「被访人所在单位给的可去楼层」基础上,再按**广发基金侧配置的允许区域**做一次收紧,两边**都满足**的楼层才能派梯。这样可以把访客权限收在比如固定接待层,而员工本人仍可按组织权限去多层办公。 + +广发基金若**未配置或未启用**该策略,行为与现在一致。 + +--- + +## 上线要动什么 + +- 换新版应用包。 +- 库里**多一张策略表**(脚本在发布包 `ddl/` 下);表里为广发基金写入**一行**启用策略即可,允许区域(如接待层对应的 zone)由业务与实施定稿。 + +其它租户不配策略则**不受影响**。 + +--- + +## 对您这边的影响 + +- **时间**:安排在**夜间**,具体周二/周三窗口见《升级计划》。 +- **中断**:重启应用时派梯接口可能**短暂**不可用,一般会控制在很短时间。 +- **配合**:指定一个对接人;确认广发基金侧要开放的**访客可达区域/楼层**(与前台、接待流程对齐);上线后若有异常派梯请及时反馈。 + +--- + +## 出问题怎么办 + +应用可先退回上一版包;策略数据可单独改/停,不一定整库回滚。细则见《升级计划》。 \ No newline at end of file diff --git a/maven-cw-elevator-application/.gitignore b/maven-cw-elevator-application/.gitignore new file mode 100644 index 00000000..3f74a625 --- /dev/null +++ b/maven-cw-elevator-application/.gitignore @@ -0,0 +1,2 @@ +# 发布目录中的可执行 JAR 体积大,默认不纳入 Git;说明与清单可单独跟踪。 +releases/**/*.jar diff --git a/maven-cw-elevator-application/releases/v2.0.0/BUILD_MANIFEST.txt b/maven-cw-elevator-application/releases/v2.0.0/BUILD_MANIFEST.txt new file mode 100644 index 00000000..2a433dae --- /dev/null +++ b/maven-cw-elevator-application/releases/v2.0.0/BUILD_MANIFEST.txt @@ -0,0 +1,9 @@ +artifact=cw-elevator-application-2.0.0.jar +directory=/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/反编译/maven-cw-elevator-application/releases/v2.0.0 +built_at=2026-04-27T14:05:31+08:00 +java_home=/usr/lib/jvm/java-8-openjdk-amd64 +java_version_line=openjdk version "1.8.0_482" +java_version_line=OpenJDK Runtime Environment (build 1.8.0_482-8u482-ga~us1-0ubuntu1~22.04-b08) +java_version_line=OpenJDK 64-Bit Server VM (build 25.482-b08, mixed mode) +git_rev=571c9a99ee26d90505e550c287eb8ad8d743ff8d +git_branch=release/cw-elevator-v1-lib-min-risk diff --git a/maven-cw-elevator-application/releases/v2.0.0/ddl/tenant_visitor_floor_policy.sql b/maven-cw-elevator-application/releases/v2.0.0/ddl/tenant_visitor_floor_policy.sql new file mode 100644 index 00000000..32151c02 --- /dev/null +++ b/maven-cw-elevator-application/releases/v2.0.0/ddl/tenant_visitor_floor_policy.sql @@ -0,0 +1,27 @@ +-- 租户访客默认楼层策略(电梯应用库) +-- 设计说明:docs/business/租户访客默认楼层-数据库配置阶段技术设计.md + +CREATE TABLE IF NOT EXISTS tenant_visitor_floor_policy ( + id VARCHAR(32) NOT NULL COMMENT '主键', + business_id VARCHAR(64) NOT NULL COMMENT '机构/租户 ID', + policy_type VARCHAR(32) NOT NULL DEFAULT 'INTERSECT_ALLOWLIST' COMMENT '策略类型', + allow_zone_ids TEXT NULL COMMENT 'JSON 数组,zoneId 列表', + building_id VARCHAR(64) NULL COMMENT '预留:楼栋维度;租户默认填 NULL', + enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 启用 0 停用', + policy_version BIGINT NOT NULL DEFAULT 1 COMMENT '配置版本号', + remark VARCHAR(256) NULL, + created_by VARCHAR(64) NULL, + created_at BIGINT NULL, + updated_by VARCHAR(64) NULL, + updated_at BIGINT NULL, + PRIMARY KEY (id), + UNIQUE KEY uk_biz_building (business_id, building_id), + KEY idx_business_enabled (business_id, enabled) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户访客默认楼层策略(与组织 floorList 求交)'; + +-- 示例(实施时替换占位符后执行) +-- INSERT INTO tenant_visitor_floor_policy +-- (id, business_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, remark, created_at, updated_at) +-- VALUES +-- (REPLACE(UUID(),'-',''), 'REPLACE_WITH_BUSINESS_ID', 'INTERSECT_ALLOWLIST', +-- '["REPLACE_ZONE_A","REPLACE_ZONE_B"]', NULL, 1, 1, '实施录入', UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000); diff --git a/maven-cw-elevator-application/releases/v2.0.0/升级计划.md b/maven-cw-elevator-application/releases/v2.0.0/升级计划.md new file mode 100644 index 00000000..d863c88f --- /dev/null +++ b/maven-cw-elevator-application/releases/v2.0.0/升级计划.md @@ -0,0 +1,106 @@ +# cw-elevator-application v2.0.0 升级计划 + +**项目名称**(可填):智慧电梯 / 访客派梯系统升级 +**版本**:v2.0.0 +**计划性质**:执行级排期草案,**具体日期、起止时刻以与甲方书面/邮件确认为准**。 + +--- + +## 1. 升级目标 + +完成电梯派梯应用 **v2.0.0** 上线,启用**租户访客固定访问楼层**能力所需的应用与数据库对象;按业务需要为指定租户配置策略并完成验收。 + +--- + +## 2. 计划时间窗口(夜间 · 暂定周二、周三) + +| 窗口 | 意向安排 | 建议内容(可合并或调整) | +|------|-----------|----------------------------| +| **第一次:周二晚间** | 夜间低峰段,具体 **HH:MM–HH:MM** 待定 | 环境检查、数据库备份、执行 **DDL**(新建策略表)、(可选)预发布验证、必要时准备回滚包与检查单 | +| **第二次:周三晚间** | 夜间低峰段,具体 **HH:MM–HH:MM** 待定 | 部署新版本 **JAR**、滚动/重启应用、按需 **INSERT** 租户策略数据、业务联调与验收、监控与值守 | + +**说明**: + +- 若贵方现场要求**一个晚上完成全部步骤**,可将 DDL 与部署**合并在同一晚间窗口**执行,本表仅体现「周二、周三两晚」的**当前意向拆分**,最终以确认单为准。 +- 两次窗口建议**间隔至少数小时至一个工作日**,便于第一次变更后观察库表与低风险项;若合并为单次窗口,须在计划单中注明**连续操作顺序与回滚点**。 + +**待确认栏**(实施时填写): + +- 周二实施日期:`____年____月____日`,时段: `____ : ____` – `____ : ____` +- 周三实施日期:`____年____月____日`,时段: `____ : ____` – `____ : ____` +- 甲方现场联系人: `____________` 乙方/实施负责人: `____________` + +--- + +## 3. 影响范围与沟通 + +| 项目 | 说明 | +|------|------| +| 影响系统 | 电梯派梯相关应用(`cw-elevator-application`)及同一业务库。 | +| 用户感知 | 应用重启期间可能出现短时派梯接口失败;策略误配可能导致部分访客路径失败,需按验收清单核对。 | +| 通知范围 | 建议提前通知:物业/客服、前台与访客登记、安保与梯控相关值班(按项目实际 roster 确定)。 | + +--- + +## 4. 前置条件(升级前) + +- [ ] 已与甲方确认 **周二 / 周三** 夜间窗口。 +- [ ] 取得 **v2.0.0** 发布包(含 `jar`、`ddl/tenant_visitor_floor_policy.sql`、说明书)。 +- [ ] 目标环境 **JDK 版本**符合实施方要求(与构建说明一致,一般为 JDK 8)。 +- [ ] 数据库已做**备份**(全库或按运维规范),并可从发布包定位 DDL。 +- [ ] 明确需启用「固定访客楼层」的租户列表及**允许区域**配置(若不启用,可跳过策略数据录入,行为与升级前一致)。 +- [ ] 回滚包:保留**当前线上 JAR** 备份与回滚步骤(见下文)。 + +--- + +## 5. 实施步骤(建议顺序) + +### 5.1 周二晚间(或首个窗口) + +1. 备份数据库。 +2. 执行 `tenant_visitor_floor_policy.sql`(`CREATE TABLE IF NOT EXISTS`,可重复执行需与 DBA 确认)。 +3. (可选)在测试/预发环境先执行一遍并验证。 +4. 记录执行人、时间与结果。 + +### 5.2 周三晚间(或第二个窗口 / 同晚续作) + +1. 停止或滚动发布应用(按现网规范)。 +2. 替换为 `cw-elevator-application-2.0.0.jar` 并启动。 +3. 按业务需求对需启用的租户执行策略 **INSERT**(`enabled=1`、`allow_zone_ids` 等为合法 JSON 等,字段级以技术说明书为准)。 +4. 抽样验证:未传显式楼层时的访客派梯、租户策略开/关、与组织楼层无交集时的失败提示等。 +5. 观察监控与日志,**值守**至约定结束时间。 + +*若合并为单次窗口:按「备份 → DDL → 部署 JAR → 策略数据 → 验收」顺序连续执行,并预留回滚决策时间。* + +--- + +## 6. 验收要点(摘要) + +- 未配置或未启用策略时:与升级前行为一致。 +- 已启用策略且业务走「未显式指定楼层」路径:访客可去楼层为**组织允许**与**租户允许**的**交集**。 +- 交集为空时:接口返回预期业务错误(技术码见实施方说明书)。 +- 第三方已显式传入楼层的路径:不因本策略表改变原逻辑。 + +--- + +## 7. 回滚预案 + +| 场景 | 建议动作 | +|------|-----------| +| 应用异常 | 回退至上一版本 JAR;数据库新表若已存在且旧应用不读该表,通常可继续服务;与实施方确认。 | +| 策略配置错误 | 优先**停用或修正策略行**,避免大规模回滚应用。 | +| 必须撤表 | 仅在评估无依赖后由 DBA 执行删表;**高风险**,需书面确认。 | + +--- + +## 8. 交付物核对 + +- [ ] `cw-elevator-application-2.0.0.jar` +- [ ] `ddl/tenant_visitor_floor_policy.sql` +- [ ] 《版本升级说明书》(实施/技术) +- [ ] 本《甲方版本升级说明》(如已作为对甲交付) +- [ ] 本《升级计划》(双方确认签字/邮件留档) + +--- + +**文档状态**:草案;**时间点为暂定周二、周三晚间**,正式实施前请更新「待确认栏」并留存确认记录。 diff --git a/maven-cw-elevator-application/releases/v2.0.0/发布说明.md b/maven-cw-elevator-application/releases/v2.0.0/发布说明.md new file mode 100644 index 00000000..c8a2eb27 --- /dev/null +++ b/maven-cw-elevator-application/releases/v2.0.0/发布说明.md @@ -0,0 +1,29 @@ +# cw-elevator-application v2.0.0 发布索引 + +本版本**功能升级说明**已单独成文,**仅覆盖「租户访客固定访问楼层」**及配套数据库 DDL,见: + +**[cw-elevator-application-v2.0.0-版本升级说明书](./cw-elevator-application-v2.0.0-版本升级说明书.md)** + +**对甲交付(业务表述与排期)**: + +- [甲方版本升级说明](./cw-elevator-application-v2.0.0-甲方版本升级说明.md) +- [升级计划(含夜间 · 周二/周三窗口)](./cw-elevator-application-v2.0.0-升级计划.md) + +--- + +## 一键构建与发布目录 + +在仓库根目录、**JDK 8** 下执行: + +```bash +export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 +./scripts/release-cw-elevator-application.sh +``` + +输出:`**maven-cw-elevator-application/releases/v2.0.0/**`,含 `jar`、`ddl/`、`版本升级说明书.md`、`甲方版本升级说明.md`、`升级计划.md`、`发布说明.md`、`BUILD_MANIFEST.txt`。 + +--- + +## Git 与大文件 + +`maven-cw-elevator-application/.gitignore` 忽略 `**releases/**/*.jar**`;**DDL 与说明书**可提交;可执行 JAR 请通过制品库或制品服务器分发。 \ No newline at end of file diff --git a/maven-cw-elevator-application/releases/v2.0.0/版本升级说明书.md b/maven-cw-elevator-application/releases/v2.0.0/版本升级说明书.md new file mode 100644 index 00000000..a13c06fa --- /dev/null +++ b/maven-cw-elevator-application/releases/v2.0.0/版本升级说明书.md @@ -0,0 +1,111 @@ +# cw-elevator-application v2.0.0 版本升级说明书 + +**适用范围**:本说明**仅**描述 **v2.0.0** 中与 **租户访客固定访问楼层**(租户级允许区域与组织 `floorList` 求交)相关的升级内容,不含其它性能优化或通用发布项。 + +**应用制品**:`cw-elevator-application-2.0.0.jar`(Spring Boot 可执行 fat JAR)。 + +--- + +## 1. 功能概述 + +在 **访客派梯** 接口 **`add/visitor`**(实现类 `PersonRuleServiceImpl#addVisitor`)中,当调用方 **未传入非空 `floorIds`**(业务流程 **UC-01**:按被访人组织侧楼层推导)时: + +1. 服务仍先通过 **`person/detail`** 取得被访人 **`floorList`**(与升级前一致)。 +2. **新增**:若数据库中存在**启用**的租户策略行,且 **`allow_zone_ids`** 解析为非空 JSON 数组,则最终生效楼层为 + **`effectiveFloors = floorList ∩ allow_zone_ids`**(顺序保持 **`floorList`** 原有顺序)。 +3. 若交集 **为空**,接口返回失败码 **`76260532`**(不允许静默放宽到其它楼层)。 +4. 若无策略表、无启用行、`allow_zone_ids` 为空或 JSON 无效:行为与升级前一致,使用 **`floorList` 全集**。 + +当调用方 **已传入非空 `floorIds`**(**UC-02**,第三方显式指定楼层)时:**不读取**策略表,**不对入参求交**,与升级前一致。 + +> **产品表述**:「固定访问楼层」在本阶段由租户管理员通过 **`allow_zone_ids`** 声明**允许开放给访客派梯的区域(zoneId)集合**;在 UC-01 路径下与组织返回的 **`floorList`** 取交集,从而将访客权限**收敛**到既有「被访人可去楼层」与「租户允许楼层」的双重约束内。 + +--- + +## 2. 涉及的数据库变更 + +### 2.1 变更类型 + +| 类型 | 对象 | +|------|------| +| **新增表** | `tenant_visitor_floor_policy` | + +**执行库**:与电梯应用 **同一数据源**(MySQL/InnoDB,与现有派梯业务库一致)。 + +### 2.2 表用途(摘要) + +| 字段 | 含义 | +|------|------| +| `business_id` | 租户/机构 ID | +| `policy_type` | 本阶段固定 **`INTERSECT_ALLOWLIST`** | +| `allow_zone_ids` | **TEXT**,存 **JSON 数组**字符串,元素为允许访客派梯的 **zoneId** | +| `building_id` | 租户级默认策略填 **NULL**(预留楼栋维) | +| `enabled` | **1** 启用 / **0** 停用 | +| `policy_version` | 配置版本号(审计) | + +唯一约束 **`uk_biz_building (business_id, building_id)`**:同一租户、租户级策略(`building_id` 为空)**建议仅维护一行**,避免多行时查询仅命中「最新一条」与运维预期不符。 + +### 2.3 DDL 脚本位置 + +| 用途 | 仓库内路径 | +|------|------------| +| **权威 DDL** | `docs/sql/tenant_visitor_floor_policy.sql` | + +**发布包内副本**:随 v2.0.0 发布目录一并下发,路径为 **`ddl/tenant_visitor_floor_policy.sql`**(与根目录 JAR 同级下的 `ddl` 子目录)。 + +脚本内容为 **`CREATE TABLE IF NOT EXISTS`**,在未建表环境可重复执行;**不含**业务数据 `INSERT`,上线需按租户配置自行 **`INSERT`** 策略行。 + +### 2.4 上线执行顺序(建议) + +1. **备份**当前电梯应用库(至少包含待变更库的全库或相关表备份策略)。 +2. 在目标库执行 **`ddl/tenant_visitor_floor_policy.sql`**(或直接使用仓库 `docs/sql` 下同源文件)。 +3. 对需启用策略的租户 **`INSERT`** 一行(示例字段:`business_id`、`policy_type='INTERSECT_ALLOWLIST'`、`allow_zone_ids` 为合法 JSON 数组、`enabled=1`、`building_id` 为 **NULL**)。 +4. 部署 **`cw-elevator-application-2.0.0.jar`** 并滚动重启应用。 +5. 按 §4 做 **UC-01 / UC-02** 验收。 + +### 2.5 回滚说明 + +- **仅回滚应用**:还原旧版本 JAR 后,若库中**已存在**策略行且仍为 **enabled=1**,旧版本应用**通常不读取**该表,行为与历史一致;表结构可保留。 +- **回滚数据库**:若需删除表(谨慎),在确认无其它依赖后执行 **`DROP TABLE tenant_visitor_floor_policy`**;请在变更窗口与 DBA 确认。 + +--- + +## 3. 行为与错误码(验收) + +| 场景 | `floorIds` | 策略库 | 期望 | +|------|------------|--------|------| +| UC-01 基线 | 空/未传 | 无启用行或 allow 空/无效 | 使用组织 **`floorList` 全集**(与升级前一致) | +| UC-01 + 固定楼层 | 空/未传 | 有启用行且 allow 非空 | **`floorList ∩ allow`**(保序) | +| 无交集 | 空/未传 | allow 与 `floorList` 无交集 | **`76260532`** | +| 被访人无楼层 | 空/未传 | 任意 | **`76260531`** | +| UC-02 | **非空** | 任意 | **不读策略表**,按请求楼层处理 | + +--- + +## 4. 发布包目录结构(v2.0.0) + +执行仓库根目录 **`./scripts/release-cw-elevator-application.sh`** 后,输出目录为: + +**`maven-cw-elevator-application/releases/v2.0.0/`** + +| 文件/目录 | 说明 | +|-----------|------| +| `cw-elevator-application-2.0.0.jar` | 可执行应用 | +| `ddl/tenant_visitor_floor_policy.sql` | 与本功能相关的 **唯一 DDL**(与 `docs/sql` 同源) | +| `版本升级说明书.md` | 本文件副本(便于随包交付) | +| `BUILD_MANIFEST.txt` | 构建时间、JDK、`git` 修订号 | + +--- + +## 5. 参考文档(仓库内) + +| 文档 | 路径 | +|------|------| +| 数据库阶段变更记录 | `docs/business/租户访客默认楼层-数据库阶段变更记录.md` | +| 数据库配置阶段技术设计 | `docs/business/租户访客默认楼层-数据库配置阶段技术设计.md` | +| 技术产品方案 | `docs/business/租户访客默认楼层技术产品方案.md` | +| 访客注册与派梯楼层走查 | `docs/business/访客注册与派梯楼层业务流程走查.md` | + +--- + +**文档版本**:与制品 **`cw-elevator-application-2.0.0`** 对齐;若仅升级文档而不改代码,请以 **`BUILD_MANIFEST.txt`** 中构建时间为准。 diff --git a/maven-cw-elevator-application/releases/v2.0.0/甲方版本升级说明.md b/maven-cw-elevator-application/releases/v2.0.0/甲方版本升级说明.md new file mode 100644 index 00000000..8a037109 --- /dev/null +++ b/maven-cw-elevator-application/releases/v2.0.0/甲方版本升级说明.md @@ -0,0 +1,34 @@ +# 电梯派梯应用 v2.0.0 — 版本升级说明(广发基金) + +**制品**:`cw-elevator-application-2.0.0.jar`。技术细节、验收码与脚本位置见同目录《版本升级说明书》。 + +--- + +## 本次升级做什么 + +针对**广发基金**租户:访客走常见派梯路径(接口**未单独传楼层**)时,系统在「被访人所在单位给的可去楼层」基础上,再按**广发基金侧配置的允许区域**做一次收紧,两边**都满足**的楼层才能派梯。这样可以把访客权限收在比如固定接待层,而员工本人仍可按组织权限去多层办公。 + +广发基金若**未配置或未启用**该策略,行为与现在一致。 + +--- + +## 上线要动什么 + +- 换新版应用包。 +- 库里**多一张策略表**(脚本在发布包 `ddl/` 下);表里为广发基金写入**一行**启用策略即可,允许区域(如接待层对应的 zone)由业务与实施定稿。 + +其它租户不配策略则**不受影响**。 + +--- + +## 对您这边的影响 + +- **时间**:安排在**夜间**,具体周二/周三窗口见《升级计划》。 +- **中断**:重启应用时派梯接口可能**短暂**不可用,一般会控制在很短时间。 +- **配合**:指定一个对接人;确认广发基金侧要开放的**访客可达区域/楼层**(与前台、接待流程对齐);上线后若有异常派梯请及时反馈。 + +--- + +## 出问题怎么办 + +应用可先退回上一版包;策略数据可单独改/停,不一定整库回滚。细则见《升级计划》。 \ No newline at end of file diff --git a/scripts/release-cw-elevator-application.sh b/scripts/release-cw-elevator-application.sh new file mode 100755 index 00000000..317f0ab4 --- /dev/null +++ b/scripts/release-cw-elevator-application.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# 构建 cw-elevator-application 指定版本发布包,并输出到 maven 模块下 releases//。 +# 用法:在仓库根执行 ./scripts/release-cw-elevator-application.sh [版本号] +# 默认版本与根 POM 中 elevator.release.finalName 后缀一致(当前 2.0.0)。 +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +MAVEN_ROOT="${ROOT}/maven-cw-elevator-application" +REL_VER="${1:-2.0.0}" +JAR_NAME="cw-elevator-application-${REL_VER}.jar" +OUT_DIR="${MAVEN_ROOT}/releases/v${REL_VER}" + +JAVA_HOME="${JAVA_HOME:-/usr/lib/jvm/java-8-openjdk-amd64}" +export JAVA_HOME +export PATH="${JAVA_HOME}/bin:${PATH}" + +if ! java -version 2>&1 | grep -q 'version "1\.8\.'; then + echo "ERROR: 需要 JDK 8(JAVA_HOME=${JAVA_HOME})。当前:" >&2 + java -version >&2 || true + exit 1 +fi + +mkdir -p "${OUT_DIR}" + +echo "==> Set reactor version to ${REL_VER}" +(cd "${MAVEN_ROOT}" && mvn -q org.codehaus.mojo:versions-maven-plugin:2.16.2:set \ + -DnewVersion="${REL_VER}" -DprocessAllModules=true -DgenerateBackupPoms=false) + +echo "==> Package starter (fat jar)" +(cd "${MAVEN_ROOT}" && mvn -q -pl cw-elevator-application-starter -am package -DskipTests) + +SRC_JAR="${MAVEN_ROOT}/cw-elevator-application-starter/target/${JAR_NAME}" +if [[ ! -f "${SRC_JAR}" ]]; then + echo "ERROR: 未找到 ${SRC_JAR}" >&2 + exit 1 +fi + +echo "==> Copy artifacts to ${OUT_DIR}" +install -m0644 "${SRC_JAR}" "${OUT_DIR}/${JAR_NAME}" + +DDL_SRC="${ROOT}/docs/sql/tenant_visitor_floor_policy.sql" +DDL_DIR="${OUT_DIR}/ddl" +mkdir -p "${DDL_DIR}" +if [[ -f "${DDL_SRC}" ]]; then + install -m0644 "${DDL_SRC}" "${DDL_DIR}/tenant_visitor_floor_policy.sql" +else + echo "WARN: 未找到 ${DDL_SRC},发布包未含 DDL" >&2 +fi + +UPGRADE_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-版本升级说明书.md" +if [[ -f "${UPGRADE_SRC}" ]]; then + install -m0644 "${UPGRADE_SRC}" "${OUT_DIR}/版本升级说明书.md" +else + echo "WARN: 未找到 ${UPGRADE_SRC},跳过 版本升级说明书.md" >&2 +fi + +INDEX_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-发布说明.md" +if [[ -f "${INDEX_SRC}" ]]; then + install -m0644 "${INDEX_SRC}" "${OUT_DIR}/发布说明.md" +fi + +CLIENT_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-甲方版本升级说明.md" +if [[ -f "${CLIENT_SRC}" ]]; then + install -m0644 "${CLIENT_SRC}" "${OUT_DIR}/甲方版本升级说明.md" +fi + +PLAN_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-升级计划.md" +if [[ -f "${PLAN_SRC}" ]]; then + install -m0644 "${PLAN_SRC}" "${OUT_DIR}/升级计划.md" +fi + +{ + echo "artifact=${JAR_NAME}" + echo "directory=${OUT_DIR}" + echo "built_at=$(date -Iseconds 2>/dev/null || date)" + echo "java_home=${JAVA_HOME}" + java -version 2>&1 | sed 's/^/java_version_line=/' || true + echo -n "git_rev=" + (cd "${ROOT}" && git rev-parse HEAD 2>/dev/null) || echo "unknown" + echo -n "git_branch=" + (cd "${ROOT}" && git rev-parse --abbrev-ref HEAD 2>/dev/null) || echo "unknown" +} > "${OUT_DIR}/BUILD_MANIFEST.txt" + +echo "==> Restore reactor version to 2.0-SNAPSHOT" +(cd "${MAVEN_ROOT}" && mvn -q org.codehaus.mojo:versions-maven-plugin:2.16.2:set \ + -DnewVersion=2.0-SNAPSHOT -DprocessAllModules=true -DgenerateBackupPoms=false) + +echo "==> Done." +ls -la "${OUT_DIR}"