txw/docs/superpowers/specs/2026-04-13-txw-gxzx-to-mhzc-migration-design.md
liulujian b2d0c032df docs: 补充 E2E 测试要求到迁移设计方案
- 新增第6节 E2E 测试要求
- 包含 15 个迁移前基准测试场景
- 明确迁移后回归测试路径替换规则
- 更新验收标准纳入 E2E 测试判定

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 00:31:31 +08:00

402 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# txw-gxzx 功能迁移到 txw-mhzc 设计方案
## 1. 背景与目标
### 1.1 背景
碳信网项目目前存在两个独立的后端服务:
- **txw-mhzc门户站场**:用户/企业管理、资讯、公共列表、企业入驻
- **txw-gxzx供需中心**:绿色金融、绿色交易、企业入驻、供需大厅
两个服务功能上有重叠,且 gxzx 的企业入驻实际通过 Feign 调用 mhzc 完成。长期维护两套独立服务增加复杂度。
### 1.2 目标
**txw-gxzx 全部功能迁移到 txw-mhzc**形成统一的后端服务。txw-gxzx 模块废弃gxzx-web 前端路由配置改为调用 mhzc 后端接口。
---
## 2. 现状分析
### 2.1 txw-gxzx 模块结构
| 模块 | Controller | API数量 | 业务描述 |
|------|-----------|---------|---------|
| 绿色金融 | `LsjrController` | 14 | 银行/保险机构查询、信贷/保险产品管理、贷款/投保申请 |
| 绿色交易 | `LsjyController` | 8 | 资产类型管理、资产信息管理、审批流程 |
| 企业入驻 | `QyRzController` | 4 | 企业入驻申请、审批、列表查询 |
| 供需大厅 | `GxdtController` | 10 | 供需信息发布、收藏、标签管理 |
**总计36 个 API 接口**
### 2.2 数据库表9张
| 表名 | 说明 | 记录类型 |
|------|------|---------|
| `txw_gxzx_gxxxb` | 供需信息表 | 供需大厅-供需发布 |
| `txw_gxzx_gxbqb` | 供需标签表 | 供需大厅-标签关联 |
| `txw_gxzx_gxscb` | 供需收藏表 | 供需大厅-收藏 |
| `txw_gxzx_qybqb` | 企业标签表 | 供需大厅-企业标签 |
| `txw_gxzx_rzsqjlb` | 入驻申请记录表 | 企业入驻 |
| `txw_gxzx_shqkb` | 审核情况表 | 通用审批流程 |
| `txw_gxzx_dkbxsqxx` | 贷款/保险申请信息表 | 绿色金融-申请 |
| `txw_gxzx_lsjrcpxx` | 绿色金融产品信息表 | 绿色金融-产品 |
| `txw_gxzx_lsjy_zcxx` | 绿色交易资产信息表 | 绿色交易-资产 |
### 2.3 关键依赖关系
```
txw-gxzx 外部依赖:
├── IMhzcApi (Feign Client) → txw-mhzc
│ └── 仅用于 qyrz 企业入驻gxzx实际是申请流程层
├── XxzxApi (消息中心) → 外部框架
│ └── 审批通过/拒绝后发送系统消息
└── txw-gxzx-service-api
└── 对外暴露的 Feign 接口(但接口体为空,无实际消费者)
```
### 2.4 Gateway 路由配置
```yaml
# txw-gateway bootstrap.yml (Nacos)
- id: txw-gxzx
uri: grayLb://txw-gxzx
predicates:
- Path=/gxzx/**
- id: txw-mhzc
uri: grayLb://txw-mhzc
predicates:
- Path=/mhzc/**
```
---
## 3. 迁移方案
### 3.1 数据库迁移
#### 3.1.1 表合并策略
| gxzx 表 → mhzc | 合并方式 |
|----------------|---------|
| `txw_gxzx_rzsqjlb``txw_mhzc_qyrzsqjlb` | **合并**:字段高度兼容,差异仅 `sqly`(gxzx) vs `sqsm`(mhzc)、多 `ywlx_dm` 字段 |
| 其余 8 张表 | **迁移**:直接迁移到 mhzc 库,表名保持 `txw_gxzx_*` 前缀(避免与其他表名冲突) |
#### 3.1.2 字段映射rzsqjlb 合并)
| gxzx 字段 | mhzc 字段 | 处理方式 |
|-----------|----------|---------|
| `uuid` | `uuid` | 直接映射 |
| `ywlx_dm` | 无 | **废弃**gxzx 代码中硬编码为 "01",不做业务判断 |
| `nsrsbh` | `nsrsbh` | 直接映射 |
| `qymc` | `qymc` | 直接映射 |
| `sjhm1` | `sjhm_1` | 直接映射 |
| `sqly` | `sqsm` | 直接映射(含义相同) |
| `lrruuid` | `lrruuid` | 直接映射 |
| `lrrq` | `lrrq` | 直接映射 |
| `shrsfid` | `shrsfid` | 直接映射 |
| `shsj` | `shsj` | 直接映射 |
| `shyj_1` | `shyj_1` | 直接映射 |
| `shjg_1` | `shjg_1` | 直接映射 |
| `dlzh` | `dlzh` | 直接映射 |
| `zsxm_1` | `zsxm_1` | 直接映射 |
| `yh_uuid` | `yh_uuid` | 直接映射 |
#### 3.1.3 数据迁移脚本
```sql
-- 1. 将 gxzx_rzsqjlb 数据迁移到 mhzc_qyrzsqjlb
INSERT INTO txw_mhzc_qyrzsqjlb
(uuid, qymc, nsrsbh, sqsm, lrruuid, lrrq, shrsfid, shjg_1, shyj_1, shsj, sjhm_1, dlzh, zsxm_1, yh_uuid)
SELECT
uuid, qymc, nsrsbh, sqly, lrruuid, lrrq, shrsfid, shjg_1, shyj_1, shsj, sjhm1, dlzh, zsxm_1, yh_uuid
FROM txw_gxzx_rzsqjlb;
-- 2. 将其余 8 张 gxzx 表迁移到 mhzc 库(表名不变)
-- gxxxb, gxbqb, gxscb, qybqb, shqkb, dkbxsqxx, lsjrcpxx, lsjy_zcxx
-- 直接 RENAME TABLE 或 INSERT INTO ... SELECT
```
### 3.2 代码迁移
#### 3.2.1 API 层txw-mhzc-service-api
新增 4 个业务接口,补充 gxzx 的功能:
| 新增接口 | 包路径 | 说明 |
|---------|--------|------|
| `ILsjrApi` | `com.css.txw.mhzc.api` | 绿色金融 Feign 接口 |
| `ILsjyApi` | `com.css.txw.mhzc.api` | 绿色交易 Feign 接口 |
| `IQyRzApi` | `com.css.txw.mhzc.api` | 企业入驻 Feign 接口(补充 gxzx 部分) |
| `IGxdtApi` | `com.css.txw.mhzc.api` | 供需大厅 Feign 接口 |
**注意**`txw-gxzx-service-api` 中的 `IGxzxApi` 为空接口体,无实际方法,无需迁移。
#### 3.2.2 BIZ 层txw-mhzc-service-biz
迁移文件清单:
**Controller 层4个**
```
txw-gxzx-service-biz/controller/
├── LsjrController.java → txw-mhzc-service-biz/controller/LsjrController.java
├── LsjyController.java → txw-mhzc-service-biz/controller/LsjyController.java
├── QyRzController.java → txw-mhzc-service-biz/controller/QyRzController.java
└── GxdtController.java → txw-mhzc-service-biz/controller/GxdtController.java
```
**Service 层(需迁移+新建):**
```
txw-gxzx-service-biz/service/lsjr/* → txw-mhzc-service-biz/service/lsjr/*
txw-gxzx-service-biz/service/lsjy/* → txw-mhzc-service-biz/service/lsjy/*
txw-gxzx-service-biz/service/impl/* → txw-mhzc-service-biz/service/impl/*
(TxwGxzxGxbqbServiceImpl, TxwGxzxGxscbServiceImpl, TxwGxzxGxxxbServiceImpl,
TxwGxzxQybqbServiceImpl, TxwGxzxRzsqjlbServiceImpl, TxwGxzxShqkbServiceImpl)
```
**Mapper 层(需迁移+合并):**
```
txw-gxzx-service-biz/mapper/lsjr/* → txw-mhzc-service-biz/mapper/lsjr/*
txw-gxzx-service-biz/mapper/lsjy/* → txw-mhzc-service-biz/mapper/lsjy/*
txw-gxzx-service-biz/mapper/* → txw-mhzc-service-biz/mapper/*
(TxwGxzxGxbqbMapper, TxwGxzxGxscbMapper, TxwGxzxGxxxbMapper,
TxwGxzxQybqbMapper, TxwGxzxRzsqjlbMapper, TxwGxzxShqkbMapper,
GxzxDkbxsqxxMapper, GxzxLsjrcpxxMapper, GxzxLsjyZcxxMapper)
```
**DO/POJO/DTO/VO 层:**
- `pojo/domain/*``pojo/domain/` (保持)
- `pojo/dto/*``pojo/dto/` (保持)
- `pojo/vo/*``pojo/vo/` (保持)
- `pojo/lsjr/*``pojo/lsjr/` (保持)
- `pojo/lsjy/*``pojo/lsjy/` (保持)
**Configuration**
- `GxzxServiceConfiguration.java``MhzcServiceConfiguration.java` (合并 MapperScan 路径)
#### 3.2.3 关键代码改动
**1. Feign 调用改为内部服务调用**
原 gxzx 代码:
```java
// GxzxRzsqjlbServiceImpl.java
@Resource
private IMhzcApi iMhzcApi;
// 审批通过后调用 mhzc 入驻
CommonResult<String> qyrz = iMhzcApi.qyrz(reqDTO);
```
迁移后:直接注入 mhzc 本地 Service不走 Feign
```java
// 改为直接调用本地 TxwMhzcQyxxbService
@Resource
private TxwMhzcQyxxbService qyxxbService;
// 审批通过后
qyxxbService.qyrz(reqDTO);
```
**2. 企业入驻 Service 合并**
gxzx 的 `TxwGxzxRzsqjlbServiceImpl` 合并到 mhzc 的 `TxwMhzcQyrzsqjlbServiceImpl`
- gxzx 申请 → 直接使用 mhzc 的 qyrzsqjlb 表和 Service
- 删除 gxzx 中对 `IMhzcApi.qyrz()` 的 Feign 调用,改为本地 `qyxxbService.qyrz()`
- 审批消息发送xxzxApi保留
**3. MapperScan 配置合并**
原 gxzx 配置:
```java
@MapperScan("com.css.txw.gxzx.mapper")
```
迁移后合并到 mhzc
```java
@MapperScan({
"com.css.txw.mhzc.mapper",
"com.css.txw.gxzx.mapper" // 迁移后改为 mhzc 包下的 gxzx mapper
})
```
**4. 包名重命名**
迁移过程中将 `com.css.txw.gxzx` 包逐步改为 `com.css.txw.mhzc`
- `Gxzx*` 类名 → 改为 `Mhzc*` 或保持(视情况)
- `TxwGxzx*``TxwMhzc*`
### 3.3 路由配置变更
#### 3.3.1 Gateway 路由txw-gateway
**变更前:**
```yaml
- id: txw-gxzx
uri: grayLb://txw-gxzx
predicates:
- Path=/gxzx/**
- id: txw-mhzc
uri: grayLb://txw-mhzc
predicates:
- Path=/mhzc/**
```
**变更后:**
```yaml
# 删除 txw-gxzx 路由,或将 /gxzx/** 指向 txw-mhzc
- id: txw-gxzx-migrated
uri: grayLb://txw-mhzc
predicates:
- Path=/gxzx/**
- id: txw-mhzc
uri: grayLb://txw-mhzc
predicates:
- Path=/mhzc/**
```
gxzx-web 前端调用 `/gxzx/lsjr/xxx` → 路由到 txw-mhzc 处理。
#### 3.3.2 Nacos 配置
更新 `txw-gateway.yaml``txw-mhzc.yaml`(如有服务名配置)。
### 3.4 前端适配
gxzx-web 前端无需代码迁移,仅需:
1. **路由配置变更**:将前端 API 请求路径从 `/gxzx/` 改为 `/mhzc/`
2. **接口调用路径**:确保前端调用的接口 URL 与 mhzc 后端一致
---
## 4. 迁移步骤
### 阶段一:数据库迁移(独立执行)
1. 备份 gxzx 和 mhzc 数据库
2. 执行数据迁移 SQLrzsqjlb 合并 + 8张表迁移
3. 验证数据完整性
### 阶段二API 层建设
1.`txw-mhzc-service-api` 中新增 4 个 Feign 接口
2. 定义 gxzx 各业务模块的请求/响应 DTO
### 阶段三:业务代码迁移
1. 迁移 PO/DO/VO/DTO 到 mhzc 的 pojo 包
2. 迁移 Mapper 到 mhzc 的 mapper 包(含自定义 SQL
3. 迁移 Service 到 mhzc 的 service 包
4. 迁移 Controller 到 mhzc 的 controller 包
5. 更新 Feign 调用为本地注入
6. 更新 `MapperScan``ComponentScan` 配置
### 阶段四:依赖配置
1. 删除 gxzx-service-biz 对 gxzx-service-api 的依赖(迁移后不再需要)
2. 保留 `txw-gxzx-service-api` 依赖(已有代码可能引用)
### 阶段五:路由切换
1. 更新 txw-gateway 路由配置
2. 通知前端团队修改 API 调用路径
3. 灰度验证
### 阶段六:旧模块处理
1. 保留 txw-gxzx 模块代码(建议添加 deprecated 注释)
2. 或完全删除 txw-gxzx 模块
---
## 5. 风险点与注意事项
| 风险 | 描述 | 缓解措施 |
|------|------|---------|
| Feign 循环依赖 | gxzx → mhzc迁移后若 mhzc 也需调用 gxzx 会循环 | 迁移后 Feign 调用改为本地注入,消除循环 |
| 表名冲突 | gxzx 表名与 mhzc 现有表可能重名 | gxzx 表保持 `txw_gxzx_*` 前缀,不重命名 |
| 消息通知 | xxzxApi 调用在 gxzx 和 mhzc 中都可能存在 | 保持 Feign 调用方式,不变 |
| 审批流程 | gxzx 的 shqkb 是通用审批表mhzc 也有类似需求 | shqkb 迁移后作为 mhzc 的通用审批表使用 |
| Session 依赖 | 各 Controller 依赖 SessionUtils 获取当前用户 | 不变Session 获取方式相同 |
---
## 6. E2E 测试要求
### 6.1 测试目标
在迁移**前**和迁移**后**分别执行相同的 E2E 测试用例,验证功能完全等价,确保迁移过程无业务影响。
### 6.2 迁移前 E2E 测试(基准测试)
| 序号 | 模块 | 测试场景 | 测试路径 |
|------|------|---------|---------|
| 1 | 企业入驻 | 新用户提交入驻申请 → 管理员审批通过 → 企业入驻成功 | POST /gxzx/qyrz/qyrzsq → POST /gxzx/qyrz/qyrzsp → 查询企业列表 |
| 2 | 企业入驻 | 入驻申请审批拒绝 → 验证拒绝原因回写 | POST /gxzx/qyrz/qyrzsp(shjg=5) → 查询申请状态 |
| 3 | 绿色金融-产品管理 | 机构查询、信贷产品列表分页查询、产品详情查询 | POST /gxzx/lsjr/queryJgList → POST /gxzx/lsjr/queryXdbxcpList → GET /gxzx/lsjr/queryXdbxcpxq |
| 4 | 绿色金融-产品管理 | 新增产品 → 审批通过 → 上下架 | POST /gxzx/lsjr/saveOrUpdateCpxx → POST /gxzx/lsjr/cpSp → POST /gxzx/lsjr/cpsxj |
| 5 | 绿色金融-产品管理 | 批量导入产品模板下载 + 导入 | GET /gxzx/lsjr/getTemplate → POST /gxzx/lsjr/pldr |
| 6 | 绿色金融-申请管理 | 提交贷款申请 → 查询申请详情 → 下载申请文件 | POST /gxzx/lsjr/saveDksqxx → GET /gxzx/lsjr/queryXdbxcpsqxq → GET /gxzx/lsjr/querySqFileByid |
| 7 | 绿色金融-申请管理 | 提交投保申请 → 查询申请列表 | POST /gxzx/lsjr/saveTbsqxx → POST /gxzx/lsjr/queryXdbxcpsqList |
| 8 | 绿色交易-资产管理 | 资产类型查询、资产列表分页、资产详情 | GET /gxzx/lsjy/queryZclxList → POST /gxzx/lsjy/queryZcxxList → GET /gxzx/lsjy/queryZcxxxq |
| 9 | 绿色交易-资产管理 | 新增资产 → 审批通过 → 上下架 | POST /gxzx/lsjy/saveOrUpdate → POST /gxzx/lsjy/zcSp → POST /gxzx/lsjy/zcsxj |
| 10 | 绿色交易-资产管理 | 批量删除资产 | POST /gxzx/lsjy/batchDelete |
| 11 | 供需大厅-供需发布 | 发布供需信息 → 审批通过 → 收藏 | POST /gxzx/gxdt/gxfb → POST /gxzx/gxdt/gxfbSp → POST /gxzx/gxdt/gxsc |
| 12 | 供需大厅-供需查询 | 按标签查询供需列表、按企业查询、收藏状态过滤 | POST /gxzx/gxdt/gxxxList → POST /gxzx/gxdt/getGxSqList → POST /gxzx/gxdt/gxfbList |
| 13 | 供需大厅-供需管理 | 供需信息详情查询、供需上架/下架 | GET /gxzx/gxdt/getGxxx → POST /gxzx/gxdt/gxsj |
| 14 | 综合验证 | 所有接口响应格式一致CommonResult | 各接口返回结构校验 |
| 15 | 综合验证 | Session 用户信息在迁移前后一致 | 各接口获取当前用户信息对比 |
### 6.3 迁移后 E2E 测试(回归测试)
**路径替换规则:** `/gxzx/``/mhzc/`,其余路径不变。
| 序号 | 验证方式 |
|------|---------|
| 1-13 | **路径替换后重复迁移前测试**,验证结果一致 |
| 14-15 | **路径替换后重复迁移前测试**,验证结果一致 |
**新增验证点:**
| 验证项 | 说明 |
|--------|------|
| rzsqjlb 数据完整性 | 迁移前后的入驻申请记录数量一致 |
| 审批消息通知 | 迁移后 xxzx 消息仍能正常发送 |
| Gateway 路由 | /gxzx/** 正确路由到 txw-mhzc |
### 6.4 测试工具建议
- **Postman / Apifox**:接口测试
- **前端联调**gxzx-web 调用新接口验证完整链路
- **数据库比对**:迁移前后关键表数据一致性校验
### 6.5 判定标准
| 条件 | 结果 |
|------|------|
| 迁移前 15 个测试场景全部通过 | ✅ 基准测试通过 |
| 迁移后相同 15 个场景路径替换后全部通过 | ✅ 迁移成功 |
| 任意场景失败 | ❌ 需排查问题后重新迁移 |
---
## 7. 验收标准
1. **功能完整性**36 个 API 接口全部迁移,接口签名保持兼容
2. **数据完整性**9 张表数据完整迁移rzsqjlb 合并无数据丢失
3. **路由正确性**gxzx-web 调用 `/gxzx/*` 路径能正确路由到 mhzc 后端
4. **无编译错误**mvn compile 全部通过
5. **企业入驻流程**:申请→审批→入驻 全流程端到端验证通过
6. **E2E 回归测试**:迁移前 15 个 E2E 测试场景全部通过,迁移后路径替换(/gxzx/→/mhzc/)后相同场景全部回归通过
---
## 8. 后续工作
1. **旧模块废弃**:删除或归档 txw-gxzx 整个模块
2. **前端合并**(可选):长期可将 gxzx-web 合并到 mhzc-web
3. **数据库清理**:废弃 gxzx 原有表,保留迁移后的新表