在 MySQL 数据库中确认总公司(ID=101)已存在:
SELECT * FROM sys_dept WHERE dept_id = 101;
如果不存在,需要先创建:
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());
测试 SQL Server 数据源是否可用,查看转运部数据:
-- 在 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
如果需要单独测试数据查询功能,可以在代码中调用:
@Autowired
private IDepartmentSyncDataService departmentSyncDataService;
// 查询转运部子部门
List<DepartmentSyncDTO> transportDepts = departmentSyncDataService.getTransportDepartments();
System.out.println("查询到转运部子部门数量: " + transportDepts.size());
请求 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 } }
-- 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;
前置条件:
- 总公司(ID=101)存在
- "转运部"不存在
- 转运部的子部门都不存在
执行操作: 调用同步接口
预期结果:
- 创建"转运部"(parent_id=101)
- 创建所有子部门(parent_id=转运部ID)
- 响应显示:创建子部门数 = 传入的数据条数
前置条件:
- 已完成场景 1 的同步
- 所有部门都已存在
执行操作: 使用相同的数据再次调用同步接口
预期结果:
- "转运部"不会重复创建
- 子部门不会重复创建
- 已存在的子部门信息会被更新
- 响应显示:更新子部门数 = 传入的数据条数,创建子部门数 = 0
前置条件:
- 已完成场景 1 的同步
- 部分子部门已存在
执行操作: 传入包含新部门和已存在部门的混合数据
预期结果:
- 新部门被创建
- 已存在的部门被更新
- 响应显示:创建子部门数 + 更新子部门数 = 传入的数据条数
前置条件:
- 已手动创建了一个名为"转运队"的部门(没有 department_id)
执行操作: 同步包含"转运队"的数据
预期结果:
- 不会创建重复的"转运队"
- 已存在的"转运队"会被更新,添加 department_id
- 响应显示:更新子部门数 = 1
前置条件:
- 总公司(ID=101)不存在
执行操作: 调用同步接口
预期结果:
- 同步失败
- 返回错误信息:"总公司(ID=101)不存在,请先创建总公司"
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<DepartmentSyncDTO> 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());
}
}
}
同步过程中会输出详细的日志,关注以下关键日志:
开始从 SQL Server 查询转运部子部门数据...
从 SQL Server 查询到 5 条转运部子部门数据
开始同步 5 条转运部子部门数据到 MySQL 数据库...
转运部已存在: ID=200
创建新转运部子部门: 转运队, departmentId: 1001
创建新转运部子部门: 调度中心, departmentId: 1002
更新转运部子部门: 设备维护
转运部同步完成!创建子部门: 2, 更新子部门: 1
切换数据源: null -> SQLSERVER
切换数据源: SQLSERVER -> null
原因: 数据库中没有 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());
原因:
1. SQL Server 数据源配置错误
2. uv_department 视图不存在
3. 网络连接问题
解决方案:
1. 检查 application.yml 中 SQL Server 数据源配置
2. 在 SQL Server 中确认视图存在:SELECT * FROM uv_department WHERE departmentName = N'转运部'
3. 测试数据库连接
原因: departmentId 字段没有正确设置或匹配
解决方案:
1. 确保 DepartmentSyncDTO 中的 departmentId 字段正确
2. 检查 sys_dept 表中的 department_id 字段是否正确关联
原因: DataSourceAspect 配置问题
解决方案:
1. 确认 DataSourceAspect.java 已按照"多数据源切换问题修复说明.md"进行修复
2. 查看日志确认数据源切换情况
// 测试 10 条数据
List<DepartmentSyncDTO> data10 = generateTestData(10);
long start = System.currentTimeMillis();
departmentSyncService.syncTransportDepartments(data10);
long time10 = System.currentTimeMillis() - start;
System.out.println("10 条数据同步耗时: " + time10 + "ms");
// 测试 100 条数据
List<DepartmentSyncDTO> data100 = generateTestData(100);
start = System.currentTimeMillis();
departmentSyncService.syncTransportDepartments(data100);
long time100 = System.currentTimeMillis() - start;
System.out.println("100 条数据同步耗时: " + time100 + "ms");
如果需要清除测试数据重新测试:
-- 删除转运部的子部门
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;
完成以上测试后,确认以下功能正常:
转运部同步功能说明.md - 功能详细说明部门同步服务重构说明.md - 架构设计说明多数据源切换问题修复说明.md - 数据源切换机制