479 lines
12 KiB
Markdown
479 lines
12 KiB
Markdown
|
|
# 广州→内蒙信用监管系统迁移检测实施方案
|
|||
|
|
|
|||
|
|
## 一、检测目标
|
|||
|
|
|
|||
|
|
确保从广州市场监督管理局迁移到内蒙市场监督管理局的信用监管综合系统能够:
|
|||
|
|
- 数据库连接正常(7个数据源)
|
|||
|
|
- 业务规则符合内蒙法规
|
|||
|
|
- 配置文件适配内蒙环境
|
|||
|
|
- 代码质量满足生产标准
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 二、检测阶段与优先级
|
|||
|
|
|
|||
|
|
### 第一阶段:基础环境检测(P0 - 阻塞启动)
|
|||
|
|
|
|||
|
|
#### 1.1 数据库连接检测
|
|||
|
|
**检测项**:7个数据源连接可用性
|
|||
|
|
|
|||
|
|
**数据源列表**:
|
|||
|
|
| 数据源 | 配置类 | 用途 |
|
|||
|
|
|--------|--------|------|
|
|||
|
|
| aiccs | AiccsDataSource | 信用监管核心业务 |
|
|||
|
|
| aiceps | AicepsDataSource | 企业信用评价 |
|
|||
|
|
| aicris | AicrisDataSource | 信用修复 |
|
|||
|
|
| crgs | CrgsDataSource | 信用风险监管 |
|
|||
|
|
| aicbiz | AicbizDataSource | 商事主体(DB2) |
|
|||
|
|
| aicorg | AicorgDataSource | 组织架构 |
|
|||
|
|
| youfool | YoufoolDataSource | 基础框架 |
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
```java
|
|||
|
|
// 使用DruidDataSource的testConnection()方法
|
|||
|
|
DruidDataSource dataSource = ...
|
|||
|
|
try {
|
|||
|
|
Connection conn = dataSource.getConnection();
|
|||
|
|
System.out.println("连接成功: " + dataSource.getName());
|
|||
|
|
} catch (SQLException e) {
|
|||
|
|
System.out.println("连接失败: " + e.getMessage());
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出**:数据库连接测试报告(成功/失败/响应时间)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 1.2 配置文件本地化检测
|
|||
|
|
**检测项**:
|
|||
|
|
- `application.yml` 环境配置(内蒙IP/端口/实例名)
|
|||
|
|
- Forest外部接口地址
|
|||
|
|
- SM4加密密钥(`oauth2.sm4.key`)
|
|||
|
|
- 文件上传路径(PDF/Word/Excel临时目录)
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
```bash
|
|||
|
|
# 搜索硬编码的广州配置
|
|||
|
|
grep -r "172\.22\.80" src/
|
|||
|
|
grep -r "广州\|广东\|GZ\|gz" src/
|
|||
|
|
grep -r "4401" src/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出**:待修改配置清单(Excel)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 1.3 行政区划代码检测
|
|||
|
|
**检测项**:硬编码的广州区划代码
|
|||
|
|
|
|||
|
|
**目标代码**:
|
|||
|
|
- `4401` - 广州市
|
|||
|
|
- `440100` - 广州市级
|
|||
|
|
- `440103` - 广州市荔湾区等
|
|||
|
|
|
|||
|
|
**检测位置**:
|
|||
|
|
- `com.chinaweal.aiccs.schedule` 缓存刷新逻辑
|
|||
|
|
- 企业查询过滤条件
|
|||
|
|
- 统计报表区域筛选
|
|||
|
|
|
|||
|
|
**检测方法**:Grep搜索`4401`,人工逐个分析业务场景
|
|||
|
|
|
|||
|
|
**输出**:区划代码分布报告(含业务影响评估)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 第二阶段:业务适配检测(P1 - 核心功能)
|
|||
|
|
|
|||
|
|
#### 2.1 权限体系检测
|
|||
|
|
**检测项**:Shiro Realm是否对接内蒙`aicorg`库
|
|||
|
|
|
|||
|
|
**检测位置**:
|
|||
|
|
- `UserRealm.java` - 认证逻辑
|
|||
|
|
- `RoleRealm.java` - 角色权限
|
|||
|
|
- 数据源配置指向
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
1. 检查`aicorg`数据源连接配置
|
|||
|
|
2. 测试登录功能(admin/123456)
|
|||
|
|
3. 验证权限注解`@RequiresPermissions`生效
|
|||
|
|
|
|||
|
|
**输出**:权限集成验证报告
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 2.2 业务规则差异检测
|
|||
|
|
**检测项**:广州vs内蒙法规差异
|
|||
|
|
|
|||
|
|
**业务模块对比**:
|
|||
|
|
| 模块 | 广州规则 | 内蒙规则 | 检测位置 |
|
|||
|
|
|------|---------|---------|---------|
|
|||
|
|
| 经营异常 | 列入条件XX | 列入条件YY | `abnormal` |
|
|||
|
|
| 严重违法 | 标准AA | 标准BB | `seriousillegal` |
|
|||
|
|
| 信用修复 | 审批流程M | 审批流程N | `aicris/forgiveprudent` |
|
|||
|
|
| 行政处罚 | 裁量权P | 裁量权Q | `punishment` |
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
1. 收集内蒙相关法规文档
|
|||
|
|
2. 对照代码中的业务判断逻辑
|
|||
|
|
3. 标注需要调整的代码位置
|
|||
|
|
|
|||
|
|
**输出**:业务规则差异对照表(Excel)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 2.3 数据字典缓存检测
|
|||
|
|
**检测项**:应用启动缓存正确性
|
|||
|
|
|
|||
|
|
**缓存类型**:
|
|||
|
|
- 企业类型缓存
|
|||
|
|
- 基础代码缓存
|
|||
|
|
- 数据类型代码缓存
|
|||
|
|
- 广州编码缓存 → **需替换为内蒙编码**
|
|||
|
|
|
|||
|
|
**检测位置**:`ContextRefreshedEvent`监听器
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
1. 启动应用,观察日志
|
|||
|
|
2. 连接Redis查看缓存内容:`redis-cli KEYS "*"`
|
|||
|
|
3. 检查缓存数据是否为内蒙数据
|
|||
|
|
|
|||
|
|
**输出**:缓存数据正确性报告
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 第三阶段:数据持久层检测(P1 - 数据完整性)
|
|||
|
|
|
|||
|
|
#### 3.1 Mapper XML与表结构一致性
|
|||
|
|
**检测项**:
|
|||
|
|
- 字段名映射
|
|||
|
|
- 数据类型匹配
|
|||
|
|
- 主键/索引配置
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
|
|||
|
|
**方案A:自动化检测(推荐)**
|
|||
|
|
```sql
|
|||
|
|
-- 导出数据库表结构
|
|||
|
|
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH
|
|||
|
|
FROM USER_TAB_COLUMNS
|
|||
|
|
WHERE TABLE_NAME IN ('表名列表')
|
|||
|
|
ORDER BY TABLE_NAME, COLUMN_ID;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# Python对比脚本
|
|||
|
|
import xml.etree.ElementTree as ET
|
|||
|
|
|
|||
|
|
def parse_mapper_xml(xml_path):
|
|||
|
|
"""解析Mapper XML获取字段列表"""
|
|||
|
|
tree = ET.parse(xml_path)
|
|||
|
|
root = tree.getroot()
|
|||
|
|
fields = []
|
|||
|
|
for result_map in root.findall('.//resultMap'):
|
|||
|
|
for column in result_map.findall('result'):
|
|||
|
|
fields.append(column.get('column'))
|
|||
|
|
return fields
|
|||
|
|
|
|||
|
|
def compare_with_db(exported_db_schema, mapper_fields):
|
|||
|
|
"""对比数据库schema和Mapper字段"""
|
|||
|
|
missing = set(exported_db_schema) - set(mapper_fields)
|
|||
|
|
extra = set(mapper_fields) - set(exported_db_schema)
|
|||
|
|
return missing, extra
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**方案B:使用MyBatis-Plus**
|
|||
|
|
```java
|
|||
|
|
TableInfo tableInfo = TableInfoHelper.getTableInfo(Entity.class);
|
|||
|
|
for (TableField field : tableInfo.getFields()) {
|
|||
|
|
System.out.println(field.getColumn() + " - " + field.getProperty());
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出**:差异清单(缺失字段/类型不匹配/多余字段)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 3.2 跨数据库SQL兼容性
|
|||
|
|
**检测项**:
|
|||
|
|
|
|||
|
|
| SQL类型 | MySQL | Oracle | 达梦 | DB2 | 检测方法 |
|
|||
|
|
|---------|-------|--------|------|-----|---------|
|
|||
|
|
| 分页 | LIMIT | ROWNUM | ROWNUM | FETCH FIRST | Grep搜索 |
|
|||
|
|
| 序列 | AUTO_INCREMENT | SEQ.NEXTVAL | SEQ.NEXTVAL | SEQ.NEXTVAL | Grep搜索 |
|
|||
|
|
| 日期 | NOW() | SYSDATE | SYSDATE | CURRENT TIMESTAMP | Grep搜索 |
|
|||
|
|
| 字符串 | CONCAT | \|\| | \|\| | \|\| | Grep搜索 |
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
```bash
|
|||
|
|
# 搜索分页语句
|
|||
|
|
grep -rn "LIMIT\|ROWNUM\|FETCH FIRST" src/
|
|||
|
|
|
|||
|
|
# 搜索序列
|
|||
|
|
grep -rn "\.NEXTVAL\|AUTO_INCREMENT" src/
|
|||
|
|
|
|||
|
|
# 搜索日期函数
|
|||
|
|
grep -rn "NOW()\|SYSDATE\|CURRENT_TIMESTAMP" src/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出**:不兼容SQL语句清单(含修复建议)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 第四阶段:代码质量与安全检测(P2 - 优化完善)
|
|||
|
|
|
|||
|
|
#### 4.1 依赖冲突检测
|
|||
|
|
**工具**:Maven依赖分析
|
|||
|
|
|
|||
|
|
**命令**:
|
|||
|
|
```bash
|
|||
|
|
mvn dependency:tree > dependency-tree.txt
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**检测项**:
|
|||
|
|
- 版本冲突jar包
|
|||
|
|
- 重复依赖(不同版本)
|
|||
|
|
- 传递依赖风险
|
|||
|
|
|
|||
|
|
**输出**:依赖冲突报告(需手动解决)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 4.2 安全漏洞扫描
|
|||
|
|
**工具**:SonarQube / OWASP Dependency Check
|
|||
|
|
|
|||
|
|
**检测项**:
|
|||
|
|
- Shiro版本漏洞(CVE-2016-4437等)
|
|||
|
|
- JWT实现安全(签名算法、密钥强度)
|
|||
|
|
- SQL注入风险(MyBatis `#{}` vs `${}`)
|
|||
|
|
- XSS漏洞(前端输入输出)
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
```bash
|
|||
|
|
# 静态扫描
|
|||
|
|
mvn sonar:sonar
|
|||
|
|
|
|||
|
|
# 依赖漏洞检查
|
|||
|
|
mvn org.owasp:dependency-check-maven:check
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**重点关注**:
|
|||
|
|
- 所有使用`${}`拼SQL的地方
|
|||
|
|
- 密码硬编码
|
|||
|
|
- Druid监控暴露(`/druid`是否需IP限制)
|
|||
|
|
|
|||
|
|
**输出**:安全漏洞清单(按严重等级分类)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 4.3 日志敏感信息检测
|
|||
|
|
**检测项**:日志中输出敏感数据
|
|||
|
|
|
|||
|
|
**敏感字段**:
|
|||
|
|
- 身份证号
|
|||
|
|
- 企业名称
|
|||
|
|
- 手机号
|
|||
|
|
- 密码
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
```bash
|
|||
|
|
# 搜索日志输出
|
|||
|
|
grep -rn "log\.\(info\|debug\|warn\).*\(name\|idCard\|phone\|password\)" src/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出**:敏感信息脱敏建议(使用`***`替换)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 第五阶段:性能与部署检测(P2 - 性能优化)
|
|||
|
|
|
|||
|
|
#### 5.1 数据库连接池配置
|
|||
|
|
**检测项**:Druid连接池是否满足内蒙数据量
|
|||
|
|
|
|||
|
|
**关键配置**:
|
|||
|
|
- `maxActive` - 最大连接数
|
|||
|
|
- `initialSize` - 初始连接数
|
|||
|
|
- `maxWait` - 获取连接超时时间
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
1. 压测:使用JMeter模拟并发请求
|
|||
|
|
2. 监控:访问`http://localhost:8080/druid`查看连接池状态
|
|||
|
|
3. 分析:是否存在连接等待超时
|
|||
|
|
|
|||
|
|
**输出**:连接池调优建议
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 5.2 定时任务负载检测
|
|||
|
|
**检测项**:`@Scheduled`任务执行时长
|
|||
|
|
|
|||
|
|
**定时任务位置**:`com.chinaweal.aiccs.schedule`
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
```java
|
|||
|
|
@Scheduled(cron = "0 0 2 * * ?")
|
|||
|
|
public void refreshCache() {
|
|||
|
|
long start = System.currentTimeMillis();
|
|||
|
|
try {
|
|||
|
|
// 原有逻辑
|
|||
|
|
} finally {
|
|||
|
|
long duration = System.currentTimeMillis() - start;
|
|||
|
|
log.info("任务执行时长: {}ms", duration);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出**:任务执行时间报告(是否需优化或调整执行时间窗口)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 5.3 文档生成性能
|
|||
|
|
**检测项**:PDF/Word批量生成性能
|
|||
|
|
|
|||
|
|
**测试场景**:批量生成100个行政处罚决定书
|
|||
|
|
|
|||
|
|
**检测方法**:
|
|||
|
|
1. 编写测试脚本
|
|||
|
|
2. 统计总耗时
|
|||
|
|
3. 分析瓶颈(PDF生成 iText vs Word处理 docx4j)
|
|||
|
|
|
|||
|
|
**输出**:性能瓶颈分析(是否需异步处理)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 三、检测工具清单
|
|||
|
|
|
|||
|
|
| 工具 | 用途 | 使用场景 |
|
|||
|
|
|------|------|---------|
|
|||
|
|
| **Grep** | 代码搜索 | 硬编码、SQL语句、敏感信息 |
|
|||
|
|
| **Maven** | 依赖分析 | `mvn dependency:tree` |
|
|||
|
|
| **Druid监控** | 数据库性能 | http://localhost:8080/druid |
|
|||
|
|
| **JMeter** | 接口压测 | 连接池、接口性能 |
|
|||
|
|
| **SonarQube** | 代码质量 | 静态扫描、安全漏洞 |
|
|||
|
|
| **Postman** | 接口测试 | API连通性、权限验证 |
|
|||
|
|
| **Redis-cli** | 缓存检查 | `KEYS *` / `GET key` |
|
|||
|
|
| **Python** | 自动化脚本 | Mapper对比、数据导出 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 四、输出物标准
|
|||
|
|
|
|||
|
|
每个检测项完成后需输出:
|
|||
|
|
|
|||
|
|
1. **检测报告**(Markdown格式)
|
|||
|
|
- 检测目的
|
|||
|
|
- 检测方法
|
|||
|
|
- 检测结果
|
|||
|
|
- 问题汇总
|
|||
|
|
|
|||
|
|
2. **问题清单**(Excel)
|
|||
|
|
- 序号
|
|||
|
|
- 问题分类
|
|||
|
|
- 优先级(P0/P1/P2)
|
|||
|
|
- 问题描述
|
|||
|
|
- 涉及文件
|
|||
|
|
- 负责人
|
|||
|
|
- 状态(待修复/修复中/已完成)
|
|||
|
|
|
|||
|
|
3. **修复建议**(具体到文件/行号)
|
|||
|
|
- 原代码
|
|||
|
|
- 修改后代码
|
|||
|
|
- 原因说明
|
|||
|
|
|
|||
|
|
4. **验证结果**(修复后回归测试)
|
|||
|
|
- 测试方法
|
|||
|
|
- 测试结果
|
|||
|
|
- 截图/日志
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 五、时间安排建议
|
|||
|
|
|
|||
|
|
| 阶段 | 检测项数量 | 预计工作量 | 参与人员 |
|
|||
|
|
|------|-----------|-----------|---------|
|
|||
|
|
| 阶段一:基础环境 | 3项 | 2天 | 后端开发 |
|
|||
|
|
| 阶段二:业务适配 | 3项 | 3天 | 后端开发 + 业务分析师 |
|
|||
|
|
| 阶段三:数据持久层 | 2项 | 3天 | 后端开发 + DBA |
|
|||
|
|
| 阶段四:质量与安全 | 3项 | 2天 | 后端开发 + 安全工程师 |
|
|||
|
|
| 阶段五:性能与部署 | 3项 | 2天 | 后端开发 + 运维 |
|
|||
|
|
| **合计** | **14项** | **12天** | - |
|
|||
|
|
|
|||
|
|
**并行执行建议**:
|
|||
|
|
- 阶段二和阶段三可并行(不同人员)
|
|||
|
|
- 阶段四和阶段五可并行(不同人员)
|
|||
|
|
- 最短周期:**6天**(2人并行)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 六、风险控制
|
|||
|
|
|
|||
|
|
### 高风险项
|
|||
|
|
1. **数据库连接失败**(P0)
|
|||
|
|
- 风险:系统无法启动
|
|||
|
|
- 应对:提前获取内蒙环境数据库连接信息
|
|||
|
|
|
|||
|
|
2. **业务规则差异**(P1)
|
|||
|
|
- 风险:监管流程不符合内蒙法规
|
|||
|
|
- 应对:邀请内蒙业务专家参与评审
|
|||
|
|
|
|||
|
|
3. **SQL兼容性问题**(P1)
|
|||
|
|
- 风险:查询失败、数据错误
|
|||
|
|
- 应对:逐条测试关键业务SQL
|
|||
|
|
|
|||
|
|
### 回归测试建议
|
|||
|
|
所有修复完成后,需进行:
|
|||
|
|
1. **冒烟测试**:核心业务流程(登录、查询、审批)
|
|||
|
|
2. **接口测试**:Postman测试所有API
|
|||
|
|
3. **性能测试**:JMeter压测关键接口
|
|||
|
|
4. **数据一致性**:对比数据库记录与缓存数据
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 七、检查清单模板
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
☑ 数据库连接检测
|
|||
|
|
☑ aiccs数据源连接成功
|
|||
|
|
☑ aiceps数据源连接成功
|
|||
|
|
☑ aicris数据源连接成功
|
|||
|
|
☑ crgs数据源连接成功
|
|||
|
|
☑ aicbiz数据源连接成功
|
|||
|
|
☑ aicorg数据源连接成功
|
|||
|
|
☑ youfool数据源连接成功
|
|||
|
|
|
|||
|
|
☑ 配置文件本地化检测
|
|||
|
|
☑ application.yml已更新内蒙IP
|
|||
|
|
☑ Forest外部接口地址已确认
|
|||
|
|
☑ SM4加密密钥已配置
|
|||
|
|
☑ 文件上传路径已调整
|
|||
|
|
|
|||
|
|
☑ ...(其他检测项)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 八、附录
|
|||
|
|
|
|||
|
|
### A. 关键配置文件位置
|
|||
|
|
- `src/main/resources/application.yml` - 主配置文件
|
|||
|
|
- `src/main/resources/application-{profile}.yml` - 环境配置
|
|||
|
|
- `src/main/resources/mybatis/config/mybatis-config.xml` - MyBatis配置
|
|||
|
|
- `src/main/resources/forest/` - Forest接口配置
|
|||
|
|
|
|||
|
|
### B. 关键代码位置
|
|||
|
|
- `com.chinaweal.aiccs.config` - 数据源配置
|
|||
|
|
- `com.chinaweal.aiccs.shiro` - Shiro权限配置
|
|||
|
|
- `com.chinaweal.aiccs.schedule` - 定时任务
|
|||
|
|
- `com.chinaweal.youfool.framework.shiro.realm` - Realm实现
|
|||
|
|
|
|||
|
|
### C. 联系人
|
|||
|
|
- 后端开发负责人:
|
|||
|
|
- DBA:
|
|||
|
|
- 业务分析师:
|
|||
|
|
- 运维负责人:
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档版本**:v1.0
|
|||
|
|
**最后更新**:2026-01-05
|
|||
|
|
**维护人**:Claude Code
|