编辑 | blame | 历史 | 原始文档

转运部同步功能测试指南

测试环境准备

1. 确保总公司存在

在 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());

2. 确保 SQL Server 连接正常

测试 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

测试步骤

测试 1: 查询转运部数据(可选)

如果需要单独测试数据查询功能,可以在代码中调用:

@Autowired
private IDepartmentSyncDataService departmentSyncDataService;

// 查询转运部子部门
List<DepartmentSyncDTO> 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 中验证

-- 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 代码)

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());
        }
    }
}

日志监控

同步过程中会输出详细的日志,关注以下关键日志:

数据查询日志(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. 查看日志确认数据源切换情况

性能测试

测试不同数据量的同步性能

// 测试 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;

总结

完成以上测试后,确认以下功能正常:

  • ✅ 从 SQL Server 查询转运部数据
  • ✅ 创建转运部(如果不存在)
  • ✅ 创建转运部的子部门
  • ✅ 更新已存在的子部门
  • ✅ 幂等性(可重复执行)
  • ✅ 事务回滚(异常时)
  • ✅ 数据源自动切换
  • ✅ 日志记录完整

相关文档

  • 转运部同步功能说明.md - 功能详细说明
  • 部门同步服务重构说明.md - 架构设计说明
  • 多数据源切换问题修复说明.md - 数据源切换机制