从SQL Server旧系统的CarData表同步车辆数据到MySQL的tb_vehicle_info表,实现车辆信息的自动同步和部门关联。
| SQL Server (CarData) | MySQL (tb_vehicle_info) | 说明 |
|---|---|---|
| CarId | car_id | 旧系统车辆ID |
| CarLicense | vehicle_no | 车牌号(去除括号内容) |
| CarOrdClass | dept_id | 通过匹配dispatch_order_class转换为部门ID |
格式示例:
- ZB → 单个编码
- HB.TI → 多个编码用.分隔
- HB,TI → 多个编码用,分隔
解析流程:
1. 按分隔符(., ,, 空格)拆分CarOrdClass
2. 遍历每个编码,在sys_dept表中查询dispatch_order_class字段
3. 返回第一个匹配的部门ID
场景1:精确匹配 SQL Server: 浙A12345 MySQL: 浙A12345 → 精确匹配成功
场景2:带品牌信息 SQL Server: 浙A12345(奔驰) MySQL: 浙A12345 → 提取括号前部分匹配
场景3:模糊匹配 SQL Server: 浙A12345 MySQL: 浙A12345(奔驰GLE) → 包含关系匹配成功
-- 在tb_vehicle_info表中添加car_id字段
ALTER TABLE tb_vehicle_info
ADD COLUMN car_id INT NULL COMMENT '旧系统车辆ID(SQL Server CarID)' AFTER vehicle_id;
-- 添加索引
ALTER TABLE tb_vehicle_info ADD INDEX idx_car_id (car_id);
INSERT INTO sys_job (
job_name,
job_group,
invoke_target,
cron_expression,
misfire_policy,
concurrent,
status,
create_by,
create_time,
remark
) VALUES (
'旧系统车辆同步',
'DEFAULT',
'legacyVehicleSyncTask.syncVehicles()',
'0 0 2 * * ?', -- 每天凌晨2点执行
'3',
'1',
'0',
'admin',
sysdate(),
'从SQL Server的CarData表同步车辆数据到MySQL'
);
路径: ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleSyncDTO.java
作用: 封装从SQL Server查询的车辆数据
字段:
- carId: 车辆ID
- carLicense: 车牌号
- carOrdClass: 单据类型编码
路径: ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleSyncMapper.java
作用: SQL Server数据源查询接口
注解: @DataSource(DataSourceType.SQLSERVER)
SQL:sql SELECT CarId, CarLicense, CarOrdClass FROM CarData WHERE CarState = 1 ORDER BY CarId
路径: ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleSyncDataServiceImpl.java
职责: 专门负责从SQL Server查询车辆数据
数据流向: SQL Server → 返回DTO列表
路径: ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleSyncServiceImpl.java
职责: 将查询到的数据同步到MySQL
核心方法:
- syncVehicles(): 同步车辆数据
- extractPlateNumber(): 提取车牌号
- parseDeptIdFromCarOrdClass(): 解析部门ID
- findVehicleByPlateNumber(): 查找车辆(支持模糊匹配)
路径: ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/LegacyVehicleSyncTask.java
作用: 定时任务执行类
调用目标: legacyVehicleSyncTask.syncVehicles()
graph TD
A[定时任务触发] --> B[查询SQL Server CarData表]
B --> C[遍历车辆数据]
C --> D[提取车牌号]
D --> E{车辆是否存在?}
E -->|存在| F[更新车辆信息]
E -->|不存在| G[新增车辆]
F --> H[解析CarOrdClass]
G --> H
H --> I[匹配部门dispatch_order_class]
I --> J[更新dept_id]
J --> K[保存CarID到car_id字段]
K --> L[记录同步结果]
级别1:记录级错误
- 单条车辆同步失败不影响其他车辆
- 错误信息记录到结果中
- 继续处理下一条记录
级别2:整体错误
- 查询SQL Server失败:直接返回错误
- 事务回滚:确保数据一致性
接口地址: POST /system/vehicle/sync/legacy
权限标识: system:vehicle:sync
请求参数: 无
响应示例:json { "code": 200, "msg": "车辆同步完成 - 新增: 5, 更新: 10, 跳过: 2, 失败: 0", "data": { "insertCount": 5, "updateCount": 10, "skipCount": 2, "errorCount": 0, "errors": {} } }
通过API接口手动触发同步:
curl -X POST http://localhost:8080/system/vehicle/sync/legacy \
-H "Authorization: Bearer YOUR_TOKEN"
方式1:系统日志bash tail -f logs/sys-info.log | grep "车辆同步"
方式2:定时任务日志
1. 进入「系统监控」→「定时任务」
2. 点击「旧系统车辆同步」的「日志」按钮
3. 查看执行历史和结果
步骤1:准备测试数据
```sql
-- SQL Server 中准备测试数据
INSERT INTO CarData (CarLicense, CarOrdClass, CarState)
VALUES
('浙A12345', 'HB', 1),
('浙B67890(奔驰)', 'TI.ZB', 1);
-- MySQL 中准备部门数据
UPDATE sys_dept SET dispatch_order_class = 'HB' WHERE dept_name = '转运队';
UPDATE sys_dept SET dispatch_order_class = 'TI' WHERE dept_name = '调度中心';
```
步骤2:执行同步
- 方式1:通过定时任务「立即执行」
- 方式2:调用API接口
步骤3:验证结果
```sql
-- 查询同步结果
SELECT vehicle_id, car_id, vehicle_no, dept_id, platform_code, remark
FROM tb_vehicle_info
WHERE platform_code = 'LEGACY';
-- 验证部门关联
SELECT v.vehicle_no, v.car_id, d.dept_name, d.dispatch_order_class
FROM tb_vehicle_info v
LEFT JOIN sys_dept d ON v.dept_id = d.dept_id
WHERE v.platform_code = 'LEGACY';
```
| 测试场景 | 输入 | 预期输出 |
|---|---|---|
| 新车辆同步 | CarLicense='浙A12345', CarOrdClass='HB' | 新增记录,dept_id匹配到'转运队' |
| 更新车辆 | 车牌已存在,CarOrdClass变更 | 更新dept_id |
| 多编码解析 | CarOrdClass='TI.ZB' | 匹配第一个编码TI对应的部门 |
| 车牌提取 | CarLicense='浙B67890(奔驰)' | vehicle_no='浙B67890' |
问题1:车辆未同步
- 检查CarState是否为1
- 检查车牌号是否为空
- 查看错误日志
问题2:部门未关联
- 检查sys_dept表中是否有对应的dispatch_order_class
- 检查CarOrdClass格式是否正确
- 查看日志中的解析过程
问题3:数据源连接失败
- 检查application-dev.yml中的SQL Server配置
- 验证网络连接和权限
VehicleSyncDTO.java - 数据传输对象VehicleSyncMapper.java - 数据查询MapperVehicleSyncMapper.xml - SQL映射文件IVehicleSyncDataService.java - 数据查询服务接口VehicleSyncDataServiceImpl.java - 数据查询服务实现IVehicleSyncService.java - 同步服务接口VehicleSyncServiceImpl.java - 同步服务实现LegacyVehicleSyncTask.java - 定时任务VehicleSyncController.java - 控制器VehicleInfo.java - 车辆实体(新增car_id字段)VehicleInfoMapper.xml - 车辆Mapper(新增car_id映射)legacy_vehicle_sync.sql - 数据库变更和任务配置旧系统车辆同步功能说明.md