txw/docs/superpowers/plans/2026-04-22-gxzx-migration-plan.md

319 lines
9.1 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.

# gxzx 服务迁移至 mhzc 方案
## 一、迁移背景
`gxzx`(供需大厅/绿色金融/绿色交易/企业入驻)需要合并到 `mhzc` 服务中,以实现:
1. 统一服务治理,减少跨服务调用
2. 支撑服务中心的搜索聚合功能
3. 简化系统架构
---
## 二、迁移范围
### 2.1 数据库表9张
| 序号 | 表名 | 说明 |
|------|------|------|
| 1 | `txw_gxzx_gxxxb` | 供需信息表 |
| 2 | `txw_gxzx_shqkb` | 审核情况表 |
| 3 | `txw_gxzx_gxscb` | 供需收藏表 |
| 4 | `txw_gxzx_gxbqb` | 供需标签表 |
| 5 | `txw_gxzx_qybqb` | 企业标签表 |
| 6 | `txw_gxzx_rzsqjlb` | 入驻申请记录表 |
| 7 | `txw_gxzx_lsjrcpxx` | 绿色金融产品信息表 |
| 8 | `txw_gxzx_dkbxsqxx` | 贷款保险申请信息表 |
| 9 | `txw_gxzx_lsjy_zcxx` | 绿色交易资产信息表 |
### 2.2 Java代码
| 层次 | 文件数 | 说明 |
|------|--------|------|
| Controller | 4 | GxdtController, LsjrController, LsjyController, QyRzController |
| Service接口 | 8 | 含业务接口定义 |
| Service实现 | 7 | 业务逻辑实现 |
| Mapper | 9 | MyBatis Mapper接口 |
| Mapper XML | 9 | MyBatis XML映射文件 |
| Domain | 9 | 数据实体DO |
| VO/Req/Res | ~20 | 传输对象 |
### 2.3 核心业务功能
1. **供需大厅**GxdtController- 供需发布/审批/上下架/收藏
2. **绿色金融**LsjrController- 信贷/保险产品管理
3. **绿色交易**LsjyController- 资产信息管理
4. **企业入驻**QyRzController- 入驻申请审批
---
## 三、迁移步骤
### 阶段一:数据库迁移
1. **备份源库**:在迁移前备份 `txw-gxzx` 相关表数据
2. **创建目标表**:在 `mhzc` 数据库中创建9张表可保持原表名或重命名
3. **数据同步**:将数据从 `gxzx` 库同步到 `mhzc`
```sql
-- 示例在mhzc库执行假设两库在同一实例
INSERT INTO mhzc_db.txw_gxzx_gxxxb SELECT * FROM gxzx_db.txw_gxzx_gxxxb;
```
### 阶段二:代码迁移
#### 2.1 创建目录结构
`txw-mhzc` 项目中创建以下目录:
```
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/
├── controller/gxzx/ # 原 gxzx/controller
├── service/gxzx/ # 原 gxzx/service
│ └── impl/ # 原 gxzx/service/impl
├── mapper/gxzx/ # 原 gxzx/mapper
├── pojo/domain/gxzx/ # 原 gxzx/pojo/domain
├── pojo/vo/gxzx/ # 原 gxzx/pojo/vo
├── pojo/req/gxzx/ # 新建请求对象
└── pojo/res/gxzx/ # 新建响应对象
```
#### 2.2 迁移文件清单
**Controller 层4个**
```
gxzx/controller/GxdtController.java → mhzc/controller/gxzx/GxdtController.java
gxzx/controller/LsjrController.java → mhzc/controller/gxzx/LsjrController.java
gxzx/controller/LsjyController.java → mhzc/controller/gxzx/LsjyController.java
gxzx/controller/QyRzController.java → mhzc/controller/gxzx/QyRzController.java
```
**Service 层8个接口 + 7个实现**
```
gxzx/service/TxwGxzxGxxxbService.java → mhzc/service/gxzx/TxwGxzxGxxxbService.java
gxzx/service/TxwGxzxShqkbService.java → mhzc/service/gxzx/TxwGxzxShqkbService.java
gxzx/service/TxwGxzxGxscbService.java → mhzc/service/gxzx/TxwGxzxGxscbService.java
gxzx/service/TxwGxzxGxbqbService.java → mhzc/service/gxzx/TxwGxzxGxbqbService.java
gxzx/service/TxwGxzxQybqbService.java → mhzc/service/gxzx/TxwGxzxQybqbService.java
gxzx/service/TxwGxzxRzsqjlbService.java → mhzc/service/gxzx/TxwGxzxRzsqjlbService.java
gxzx/service/GxzxLsjrService.java → mhzc/service/gxzx/GxzxLsjrService.java
gxzx/service/GxzxLsjyZcxxService.java → mhzc/service/gxzx/GxzxLsjyZcxxService.java
gxzx/service/impl/... → mhzc/service/gxzx/impl/...
```
**Mapper 层9个**
```
gxzx/mapper/TxwGxzxGxxxbMapper.java → mhzc/mapper/gxzx/TxwGxzxGxxxbMapper.java
gxzx/mapper/TxwGxzxShqkbMapper.java → mhzc/mapper/gxzx/TxwGxzxShqkbMapper.java
...其他7个同理
```
**Domain 层9个**
```
gxzx/pojo/domain/TxwGxzxGxxxbDO.java → mhzc/pojo/domain/gxzx/TxwGxzxGxxxbDO.java
...其他8个同理
```
**VO/Req/Res 层(~20个**
```
gxzx/pojo/vo/*.java → mhzc/pojo/vo/gxzx/
gxzx/pojo/req/*.java → mhzc/pojo/req/gxzx/
gxzx/pojo/lsjr/*.java → mhzc/pojo/lsjr/gxzx/
gxzx/pojo/lsjy/*.java → mhzc/pojo/lsjy/gxzx/
```
**Mapper XML9个**
```
gxzx/src/main/resources/mapper/*.xml → mhzc/src/main/resources/mapper/gxzx/
```
#### 2.3 代码修改要点
**1. 包名修改**
```java
// 原
package com.css.txw.gxzx.controller;
package com.css.txw.gxzx.service;
package com.css.txw.gxzx.mapper;
package com.css.txw.gxzx.pojo.domain;
// 改为
package com.css.txw.mhzc.controller.gxzx;
package com.css.txw.mhzc.service.gxzx;
package com.css.txw.mhzc.mapper.gxzx;
package com.css.txw.mhzc.pojo.domain.gxzx;
```
**2. import 语句修改**
```java
// 所有 import com.css.txw.gxzx.* 改为 com.css.txw.mhzc.gxzx.*
```
**3. Controller @RequestMapping 路径调整**
```java
// 原
@RequestMapping("/gxdt")
@RequestMapping("/lsjr")
@RequestMapping("/lsjy")
@RequestMapping("/qyrz")
// 保持不变(前端已对接)或调整
```
**4. ServiceImpl 类注解修改**
```java
// 原
@Service
public class TxwGxzxGxxxbServiceImpl extends ServiceImpl<TxwGxzxGxxxbMapper, TxwGxzxGxxxbDO>
// 改为
@Service
public class TxwGxzxGxxxbServiceImpl extends ServiceImpl<TxwGxzxGxxxbMapper, TxwGxzxGxxxbDO>
```
**5. MapperScan 配置**
`MhzcServiceConfiguration.java` 或新建 `GxzxMapperScanConfiguration.java`
```java
@MapperScan({"com.css.txw.mhzc.mapper", "com.css.txw.mhzc.mapper.gxzx"})
```
---
### 阶段三:依赖调整
#### 3.1 移除 gxzx 依赖
`txw-mhzc/pom.xml` 中移除对 `txw-gxzx-service-api` 的依赖(如果存在)。
#### 3.2 保留必要依赖
确保以下依赖存在:
```xml
<!-- 内部框架 -->
<dependency>ggzc-framework-starter-xxzx-api</dependency> <!-- 消息中心 -->
<!-- 数据库 -->
<dependency>DmJdbcDriver18</dependency>
<!-- 内部模块 -->
<dependency>txw-common</dependency>
```
#### 3.3 处理外部服务调用
**IMhzcApi 调用处理**(原 gxzx 调用 mhzc
- `TxwGxzxRzsqjlbServiceImpl` 中注入了 `IMhzcApi`
- 迁移后改为直接调用本地方法(企业入驻逻辑已在 mhzc 中)
**XxzxApi 调用处理**
- 确保 `txw-mhzc` 有消息中心依赖
- 如需迁移,保持调用方式不变
---
### 阶段四:配置调整
#### 4.1 网关路由(如有)
如果使用了网关,需要将 gxzx 相关路由从 gxzx 服务指向 mhzc
```yaml
# 网关配置
- id: gxzx-route
uri: http://mhzc-service
predicates:
- Path=/gxdt/**
- Path=/lsjr/**
- Path=/lsjy/**
- Path=/qyrz/**
```
#### 4.2 Nacos 注册
确保 `txw-mhzc` 注册到 Nacos且 gxzx 相关接口可访问。
---
### 阶段五:前端适配
前端 `txw-mhzc-web` 中已有 gxzx 相关接口调用(见 `fwsc/index.js`
```javascript
// 当前调用路径(需确认)
/gxzx/gxdt/gxxxList → /mhzc/gxdt/gxxxList 或保持不变
/gxzx/lsjr/queryJgList → /mhzc/lsjr/queryJgList 或保持不变
```
**方案**:迁移后保持接口路径不变,前端无需修改。
---
## 四、数据库表迁移脚本
```sql
-- 1. 备份原表(可选)
CREATE TABLE txw_gxzx_gxxxb_bak AS SELECT * FROM txw_gxzx_gxxxb;
-- 2. 创建新表(在 mhzc 库执行)
CREATE TABLE txw_gxzx_gxxxb (
gx_uuid VARCHAR(64) PRIMARY KEY,
bt_1 VARCHAR(200),
fwlx_dm VARCHAR(20),
sshy VARCHAR(50),
fwfw VARCHAR(500),
fwnr TEXT,
zt VARCHAR(10),
qyuuid VARCHAR(64),
sjzt VARCHAR(10),
gjjg DECIMAL(18,2),
-- 其他字段...
);
-- 3. 数据迁移
INSERT INTO mhzc_db.txw_gxzx_gxxxb SELECT * FROM gxzx_db.txw_gxzx_gxxxb;
-- 4. 验证
SELECT COUNT(*) FROM txw_gxzx_gxxxb;
```
---
## 五、风险点与注意事项
### 5.1 数据一致性
- 迁移期间禁止在 gxzx 写入数据
- 迁移后需验证数据完整性
### 5.2 接口兼容性
- 迁移前后接口路径尽量保持一致
- 如有变化需同步通知前端
### 5.3 事务处理
- 跨库迁移时可考虑使用分布式事务或分批迁移
- 确保关键业务(供需发布、审批)的事务完整性
### 5.4 依赖服务
- 消息中心XxzxApi需确保可用
- 确认 IMhzcApi 在 mhzc 中仍有调用需求
---
## 六、迁移验证清单
| 序号 | 验证项 | 方法 |
|------|--------|------|
| 1 | 数据库表迁移完整 | 对比记录数 |
| 2 | Controller 注入正常 | 启动应用无报错 |
| 3 | Service 层无异常 | 单元测试 |
| 4 | Mapper XML 路径正确 | 查询功能正常 |
| 5 | 接口路径可访问 | Postman 测试 |
| 6 | 搜索服务聚合供需数据 | 调用搜索接口验证 |
| 7 | 前端功能正常 | UI 测试 |
---
## 七、后续工作
1. **旧服务下线**gxzx 服务相关接口迁移完成后,可逐步停用 gxzx 服务
2. **搜索增强**:基于迁移后的供需数据,完善搜索服务聚合逻辑
3. **代码清理**:移除 gxzx 项目中已迁移的代码