在从旧系统同步转运单(ServiceOrder)到新系统时,除了已有的ServiceOrdID(服务单ID)和DispatchOrdID(调度单ID),现在还会同步ServiceOrdNo(转运单编号)字段,并保存到sys_task_emergency表中。
在sys_task_emergency表中添加以下字段:
-- 旧系统ServiceOrdNo(转运单编号)
ALTER TABLE sys_task_emergency
ADD COLUMN legacy_service_ord_no VARCHAR(50) NULL COMMENT '旧系统ServiceOrdNo(转运单编号)' AFTER need_resync;
-- 添加索引
ALTER TABLE sys_task_emergency
ADD INDEX idx_legacy_service_ord_no (legacy_service_ord_no);
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| legacy_service_ord_no | VARCHAR(50) | 旧系统转运单编号 | "123"、"045"等 |
注意:ServiceOrdNo字段在旧系统中是数字类型,在生成任务编号时会被格式化为3位数字字符串(如 32 → "032",1 → "001")。
文件: SysTaskEmergency.java
新增属性:java /** 旧系统ServiceOrdNo(转运单编号) */ private String legacyServiceOrdNo;
新增getter/setter方法。
文件: SysTaskEmergencyMapper.xml
resultMap中添加字段映射selectSysTaskEmergencyVo中添加查询字段insertSysTaskEmergency中添加插入逻辑updateSysTaskEmergency中添加更新逻辑文件: ISysTaskService.java
修改方法签名,添加serviceOrdNo参数:java public int insertTask(TaskCreateVO createVO, String serviceOrderId, String dispatchOrderId, String serviceOrdNo, Long userId, String userName, Long deptId, Date createTime, Date updateTime);
文件: SysTaskServiceImpl.java
insertTask方法签名,添加serviceOrdNo参数saveEmergencyInfo方法签名,添加serviceOrdNo参数saveEmergencyInfo方法中保存serviceOrdNo:if(serviceOrdNo!=null){
emergencyInfo.setLegacyServiceOrdNo(serviceOrdNo);
}
文件: LegacyTransferSyncServiceImpl.java
在syncSingleTransferOrder方法中:
从旧系统查询结果中提取ServiceOrdNo:java String serviceOrdNo = getStringValue(order, "ServiceOrdNo");
调用insertTask方法时传递serviceOrdNo参数:java int result = sysTaskService.insertTask(createTaskVo, serviceOrdID, dispatchOrdID, serviceOrdNo, taskCreatorId, createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
旧系统 ServiceOrder 表
↓ (查询)
LegacyTransferSyncServiceImpl
↓ (提取)
ServiceOrdNo 字段
↓ (传递)
SysTaskService.insertTask()
↓ (保存)
SysTaskEmergency.legacy_service_ord_no
通过legacy_service_ord_no字段可以快速在旧系统中定位原始转运单数据。
ServiceOrdNo字段用于生成新系统的任务编号(task_code),格式为: {ServiceOrdClass}{YYYYMMDD}-{ServiceOrdNo(3位)}
例如:BF20251101-032
查询已同步的转运单及其编号:sql SELECT t.task_id, t.task_code, e.legacy_service_ord_id, e.legacy_service_ord_no, e.legacy_dispatch_ord_id, e.sync_status FROM sys_task t JOIN sys_task_emergency e ON t.task_id = e.task_id WHERE e.legacy_service_ord_no IS NOT NULL ORDER BY t.create_time DESC;
按ServiceOrdNo查询特定转运单:sql SELECT t.task_id, t.task_code, t.task_status, e.patient_name, e.hospital_out_name, e.hospital_in_name FROM sys_task t JOIN sys_task_emergency e ON t.task_id = e.task_id WHERE e.legacy_service_ord_no = '032';
执行数据库脚本
bash mysql -u用户名 -p数据库名 < sql/add_legacy_service_ord_no.sql
重启应用
确保新代码生效。
触发同步任务
sql SELECT task_id, legacy_service_ord_id, legacy_service_ord_no FROM sys_task_emergency WHERE sync_status = 2 ORDER BY id DESC LIMIT 10; legacy_service_ord_no字段应包含从旧系统同步的ServiceOrdNo值legacy_service_ord_id一一对应legacy_service_ord_no字段允许为NULL,因为:数据类型:虽然ServiceOrdNo在旧系统中是数字,但在新系统中使用VARCHAR类型存储,以保持原始格式。
向后兼容:此修改不影响已存在的数据和功能,只对新同步的转运单有效。
任务编号生成:ServiceOrdNo用于生成任务编号,但如果该字段为空,系统会自动生成新的任务编号。
sql/add_legacy_service_ord_no.sql - 添加字段的SQL脚本ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.javaruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.javaruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.javaruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.javaruoyi-system/src/main/resources/mapper/system/SysTaskEmergencyMapper.xml旧系统ServiceOrdNo字段同步功能说明.md - 本文档A: 虽然在旧系统中是数字类型,但使用VARCHAR可以:
- 保留原始格式(如前导零)
- 避免类型转换错误
- 更灵活地处理特殊情况
A: 代码中有NULL检查,如果ServiceOrdNo为空,该字段在新系统中也为NULL,不影响其他业务。
A: 不会。此功能只对新同步的转运单有效。如需更新历史数据,需要编写专门的数据迁移脚本。
A: 不会。这是一个新增字段,不影响任何现有业务逻辑,完全向后兼容。
历史数据回填:可以编写脚本为已同步的历史任务回填legacy_service_ord_no字段。
前端展示:可以在任务详情页面展示该字段,方便用户查看原始转运单编号。
数据校验:可以添加数据一致性校验,确保legacy_service_ord_id和legacy_service_ord_no的对应关系正确。
更新日期: 2024-11-30
版本: v1.0