# 转运部同步功能测试指南 ## 测试环境准备 ### 1. 确保总公司存在 在 MySQL 数据库中确认总公司(ID=101)已存在: ```sql SELECT * FROM sys_dept WHERE dept_id = 101; ``` 如果不存在,需要先创建: ```sql INSERT INTO sys_dept (dept_id, parent_id, ancestors, dept_name, order_num, status, create_by, create_time) VALUES (101, 0, '0', '总公司', 1, '0', 'admin', NOW()); ``` ### 2. 确保 SQL Server 连接正常 测试 SQL Server 数据源是否可用,查看转运部数据: ```sql -- 在 SQL Server 中执行 SELECT TOP 10 b.departmentID, b.departmentName, b.parentID, a.departmentName AS parentName FROM uv_department a WITH (NOLOCK) INNER JOIN uv_department b WITH (NOLOCK) ON a.departmentID = b.parentID WHERE a.departmentName = N'转运部' ORDER BY b.departmentName ``` ## 测试步骤 ### 测试 1: 查询转运部数据(可选) 如果需要单独测试数据查询功能,可以在代码中调用: ```java @Autowired private IDepartmentSyncDataService departmentSyncDataService; // 查询转运部子部门 List transportDepts = departmentSyncDataService.getTransportDepartments(); System.out.println("查询到转运部子部门数量: " + transportDepts.size()); ``` ### 测试 2: 通过 REST API 同步转运部 #### 使用 Postman 或 curl 测试 **请求 URL**: ``` POST http://localhost:8080/system/dept/sync/transport/data ``` **请求头**: ``` Content-Type: application/json Authorization: Bearer {your_token} ``` **请求体示例**: ```json [ { "departmentId": 1001, "departmentName": "转运队", "parentId": 100, "parentName": "转运部" }, { "departmentId": 1002, "departmentName": "调度中心", "parentId": 100, "parentName": "转运部" }, { "departmentId": 1003, "departmentName": "设备维护", "parentId": 100, "parentName": "转运部" } ] ``` **curl 命令**: ```bash curl -X POST http://localhost:8080/system/dept/sync/transport/data \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_TOKEN" \ -d '[ { "departmentId": 1001, "departmentName": "转运队", "parentId": 100, "parentName": "转运部" }, { "departmentId": 1002, "departmentName": "调度中心", "parentId": 100, "parentName": "转运部" } ]' ``` **期望响应**: ```json { "code": 200, "msg": "转运部同步完成!创建子部门: 2, 更新子部门: 0", "data": { "transportDeptId": 200, "createdDept": 2, "updatedDept": 0, "totalProcessed": 2 } } ``` ### 测试 3: 验证同步结果 #### 在 MySQL 中验证 ```sql -- 1. 查询转运部是否创建成功 SELECT * FROM sys_dept WHERE dept_name = '转运部' AND parent_id = 101; -- 2. 查询转运部的子部门 SELECT d.dept_id, d.dept_name, d.department_id AS sql_server_dept_id, d.parent_id, p.dept_name AS parent_name, d.ancestors, d.create_time, d.update_time FROM sys_dept d LEFT JOIN sys_dept p ON d.parent_id = p.dept_id WHERE p.dept_name = '转运部' ORDER BY d.dept_id; -- 3. 查看完整的部门树(包括转运部) SELECT CASE WHEN dept_id = 101 THEN dept_name WHEN parent_id = 101 THEN CONCAT(' └─ ', dept_name) ELSE CONCAT(' └─ ', dept_name) END AS dept_tree, dept_id, department_id, parent_id, status FROM sys_dept WHERE dept_id = 101 OR parent_id = 101 OR parent_id IN (SELECT dept_id FROM sys_dept WHERE parent_id = 101) ORDER BY ancestors, order_num; ``` ## 测试场景 ### 场景 1: 首次同步 **前置条件**: - 总公司(ID=101)存在 - "转运部"不存在 - 转运部的子部门都不存在 **执行操作**: 调用同步接口 **预期结果**: - 创建"转运部"(parent_id=101) - 创建所有子部门(parent_id=转运部ID) - 响应显示:创建子部门数 = 传入的数据条数 ### 场景 2: 重复同步(幂等性测试) **前置条件**: - 已完成场景 1 的同步 - 所有部门都已存在 **执行操作**: 使用相同的数据再次调用同步接口 **预期结果**: - "转运部"不会重复创建 - 子部门不会重复创建 - 已存在的子部门信息会被更新 - 响应显示:更新子部门数 = 传入的数据条数,创建子部门数 = 0 ### 场景 3: 部分更新 **前置条件**: - 已完成场景 1 的同步 - 部分子部门已存在 **执行操作**: 传入包含新部门和已存在部门的混合数据 **预期结果**: - 新部门被创建 - 已存在的部门被更新 - 响应显示:创建子部门数 + 更新子部门数 = 传入的数据条数 ### 场景 4: 同名部门处理 **前置条件**: - 已手动创建了一个名为"转运队"的部门(没有 department_id) **执行操作**: 同步包含"转运队"的数据 **预期结果**: - 不会创建重复的"转运队" - 已存在的"转运队"会被更新,添加 department_id - 响应显示:更新子部门数 = 1 ### 场景 5: 总公司不存在 **前置条件**: - 总公司(ID=101)不存在 **执行操作**: 调用同步接口 **预期结果**: - 同步失败 - 返回错误信息:"总公司(ID=101)不存在,请先创建总公司" ## 完整测试流程(Java 代码) ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.system.domain.DepartmentSyncDTO; import com.ruoyi.system.service.IDepartmentSyncDataService; import com.ruoyi.system.service.IDepartmentSyncService; import java.util.List; @RestController @RequestMapping("/test") public class TestTransportSyncController { @Autowired private IDepartmentSyncDataService departmentSyncDataService; @Autowired private IDepartmentSyncService departmentSyncService; /** * 完整测试:查询并同步转运部数据 */ @GetMapping("/syncTransport") public AjaxResult testSyncTransport() { try { // 步骤 1: 从 SQL Server 查询转运部数据 System.out.println("===== 开始查询 SQL Server 转运部数据 ====="); List transportDepts = departmentSyncDataService.getTransportDepartments(); System.out.println("查询到 " + transportDepts.size() + " 条转运部子部门数据"); if (transportDepts.isEmpty()) { return AjaxResult.warn("SQL Server 中没有转运部数据"); } // 打印查询到的数据 for (DepartmentSyncDTO dto : transportDepts) { System.out.println(String.format(" 部门: %s, ID: %d, 父级: %s", dto.getDepartmentName(), dto.getDepartmentId(), dto.getParentName())); } // 步骤 2: 同步到 MySQL System.out.println("\n===== 开始同步到 MySQL ====="); AjaxResult result = departmentSyncService.syncTransportDepartments(transportDepts); System.out.println("同步结果: " + result.get("msg")); System.out.println("详细信息: " + result.get("data")); return result; } catch (Exception e) { e.printStackTrace(); return AjaxResult.error("测试失败: " + e.getMessage()); } } } ``` ## 日志监控 同步过程中会输出详细的日志,关注以下关键日志: ### 数据查询日志(DepartmentSyncDataServiceImpl) ``` 开始从 SQL Server 查询转运部子部门数据... 从 SQL Server 查询到 5 条转运部子部门数据 ``` ### 同步逻辑日志(DepartmentSyncServiceImpl) ``` 开始同步 5 条转运部子部门数据到 MySQL 数据库... 转运部已存在: ID=200 创建新转运部子部门: 转运队, departmentId: 1001 创建新转运部子部门: 调度中心, departmentId: 1002 更新转运部子部门: 设备维护 转运部同步完成!创建子部门: 2, 更新子部门: 1 ``` ### 数据源切换日志(DataSourceAspect) ``` 切换数据源: null -> SQLSERVER 切换数据源: SQLSERVER -> null ``` ## 常见问题排查 ### 问题 1: "总公司(ID=101)不存在" **原因**: 数据库中没有 ID=101 的部门 **解决方案**: ```sql INSERT INTO sys_dept (dept_id, parent_id, ancestors, dept_name, order_num, status, create_by, create_time) VALUES (101, 0, '0', '总公司', 1, '0', 'admin', NOW()); ``` ### 问题 2: "从 SQL Server 查询转运部子部门数据失败" **原因**: 1. SQL Server 数据源配置错误 2. uv_department 视图不存在 3. 网络连接问题 **解决方案**: 1. 检查 `application.yml` 中 SQL Server 数据源配置 2. 在 SQL Server 中确认视图存在:`SELECT * FROM uv_department WHERE departmentName = N'转运部'` 3. 测试数据库连接 ### 问题 3: 部门重复创建 **原因**: departmentId 字段没有正确设置或匹配 **解决方案**: 1. 确保 DepartmentSyncDTO 中的 departmentId 字段正确 2. 检查 sys_dept 表中的 department_id 字段是否正确关联 ### 问题 4: 数据源切换失败 **原因**: DataSourceAspect 配置问题 **解决方案**: 1. 确认 DataSourceAspect.java 已按照"多数据源切换问题修复说明.md"进行修复 2. 查看日志确认数据源切换情况 ## 性能测试 ### 测试不同数据量的同步性能 ```java // 测试 10 条数据 List data10 = generateTestData(10); long start = System.currentTimeMillis(); departmentSyncService.syncTransportDepartments(data10); long time10 = System.currentTimeMillis() - start; System.out.println("10 条数据同步耗时: " + time10 + "ms"); // 测试 100 条数据 List data100 = generateTestData(100); start = System.currentTimeMillis(); departmentSyncService.syncTransportDepartments(data100); long time100 = System.currentTimeMillis() - start; System.out.println("100 条数据同步耗时: " + time100 + "ms"); ``` ## 回滚测试数据 如果需要清除测试数据重新测试: ```sql -- 删除转运部的子部门 DELETE FROM sys_dept WHERE parent_id IN ( SELECT dept_id FROM sys_dept WHERE dept_name = '转运部' AND parent_id = 101 ); -- 删除转运部 DELETE FROM sys_dept WHERE dept_name = '转运部' AND parent_id = 101; ``` ## 总结 完成以上测试后,确认以下功能正常: - ✅ 从 SQL Server 查询转运部数据 - ✅ 创建转运部(如果不存在) - ✅ 创建转运部的子部门 - ✅ 更新已存在的子部门 - ✅ 幂等性(可重复执行) - ✅ 事务回滚(异常时) - ✅ 数据源自动切换 - ✅ 日志记录完整 ## 相关文档 - `转运部同步功能说明.md` - 功能详细说明 - `部门同步服务重构说明.md` - 架构设计说明 - `多数据源切换问题修复说明.md` - 数据源切换机制