package com.ruoyi.system.listener;
|
|
import com.ruoyi.common.config.LegacySystemConfig;
|
import com.ruoyi.common.core.domain.entity.SysUser;
|
import com.ruoyi.system.domain.SysTask;
|
import com.ruoyi.system.domain.SysTaskEmergency;
|
import com.ruoyi.system.domain.enums.TaskStatus;
|
import com.ruoyi.system.event.TaskStatusChangedEvent;
|
import com.ruoyi.system.mapper.LegacyTransferSyncMapper;
|
import com.ruoyi.system.mapper.SysTaskEmergencyMapper;
|
import com.ruoyi.system.mapper.SysTaskMapper;
|
import com.ruoyi.system.mapper.SysUserMapper;
|
import com.ruoyi.system.utils.TaskStatusPushConverter;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.context.event.EventListener;
|
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.stereotype.Component;
|
|
import java.util.Date;
|
|
/**
|
* 调度单状态变更记录监听器
|
* 监听任务状态变更事件,并将状态变更记录同步到SQL Server的DispatchOrd_Running表
|
*
|
* @author ruoyi
|
* @date 2025-12-05
|
*/
|
@Component
|
public class DispatchOrdRunningListener {
|
|
private static final Logger log = LoggerFactory.getLogger(DispatchOrdRunningListener.class);
|
|
@Autowired
|
private LegacySystemConfig legacyConfig;
|
|
@Autowired
|
private SysTaskMapper sysTaskMapper;
|
|
@Autowired
|
private SysTaskEmergencyMapper sysTaskEmergencyMapper;
|
|
@Autowired
|
private LegacyTransferSyncMapper legacyTransferSyncMapper;
|
|
@Autowired
|
private SysUserMapper sysUserMapper;
|
|
/**
|
* 监听任务状态变更事件
|
*
|
* @param event 任务状态变更事件
|
*/
|
@Async
|
@EventListener
|
public void handleTaskStatusChangedEvent(TaskStatusChangedEvent event) {
|
try {
|
log.info("收到任务状态变更事件,准备同步到DispatchOrd_Running,任务ID:{},旧状态:{},新状态:{}",
|
event.getTaskId(), event.getOldStatus(), event.getNewStatus());
|
|
// 检查旧系统同步是否启用
|
if (!legacyConfig.isEnabled()) {
|
log.debug("旧系统同步已禁用,跳过DispatchOrd_Running同步,任务ID: {}", event.getTaskId());
|
return;
|
}
|
|
// 查询任务信息
|
SysTask task = sysTaskMapper.selectSysTaskByTaskId(event.getTaskId());
|
if (task == null) {
|
log.error("任务不存在,任务ID: {}", event.getTaskId());
|
return;
|
}
|
|
// 只处理急救转运任务
|
if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) {
|
log.debug("非急救转运任务,跳过DispatchOrd_Running同步,任务ID: {}", event.getTaskId());
|
return;
|
}
|
|
// 查询急救转运扩展信息
|
SysTaskEmergency emergency = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(event.getTaskId());
|
if (emergency == null) {
|
log.error("急救转运扩展信息不存在,任务ID: {}", event.getTaskId());
|
return;
|
}
|
|
// 必须已经同步过调度单
|
if (emergency.getLegacyDispatchOrdId() == null || emergency.getLegacyDispatchOrdId() <= 0) {
|
log.debug("调度单未同步到旧系统,跳过DispatchOrd_Running同步,任务ID: {}", event.getTaskId());
|
return;
|
}
|
|
// 获取新系统状态
|
TaskStatus newTaskStatus = TaskStatus.getByCode(event.getNewStatus());
|
if (newTaskStatus == null) {
|
log.error("无效的任务状态,任务ID: {}, 状态码: {}", event.getTaskId(), event.getNewStatus());
|
return;
|
}
|
|
SysUser user= sysUserMapper.selectUserById(event.getOperatorId());
|
if(user==null){
|
log.error("操作人不存在,任务ID: {}, 操作人ID: {}", event.getTaskId(), event.getOperatorId());
|
return;
|
}
|
Integer oaUserId=user.getOaUserId();
|
|
// 转换为旧系统状态码
|
Integer legacyStatusCode = TaskStatusPushConverter.convertToLegacyStatus(newTaskStatus);
|
if (legacyStatusCode == null) {
|
log.debug("任务状态不需要同步到旧系统,任务ID: {}, 状态: {}",
|
event.getTaskId(), newTaskStatus.getInfo());
|
return;
|
}
|
|
// 插入状态变更记录到DispatchOrd_Running表
|
syncDispatchOrdRunning(
|
emergency.getLegacyDispatchOrdId(),
|
legacyStatusCode,
|
new Date(), // 使用当前时间作为状态变更时
|
oaUserId.longValue(),
|
event.getLatitude(),
|
event.getLongitude(),
|
event.getAddress()
|
);
|
|
} catch (Exception e) {
|
log.error("处理任务状态变更事件并同步到DispatchOrd_Running失败,任务ID: {}", event.getTaskId(), e);
|
// 不抛出异常,避免影响主流程
|
}
|
}
|
|
/**
|
* 同步状态变更记录到DispatchOrd_Running表
|
*
|
* @param dispatchOrdId 调度单ID
|
* @param statusCode 状态码
|
* @param statusTime 状态时间
|
* @param operatorId 操作人ID
|
* @param latitude 纬度
|
* @param longitude 经度
|
* @param address 地址
|
*/
|
private void syncDispatchOrdRunning(Long dispatchOrdId, Integer statusCode,
|
Date statusTime, Long operatorId,
|
Double latitude, Double longitude, String address) {
|
try {
|
// 判断是否有GPS信息
|
boolean hasGps = (latitude != null && longitude != null);
|
if (hasGps) {
|
log.info("开始同步状态变更记录到DispatchOrd_Running,DispatchOrdID: {}, 状态码: {} ({}), GPS: [{}, {}]",
|
dispatchOrdId, statusCode, TaskStatusPushConverter.getLegacyStatusDescription(statusCode),
|
latitude, longitude);
|
} else {
|
log.info("开始同步状态变更记录到DispatchOrd_Running,DispatchOrdID: {}, 状态码: {} ({}), 无GPS信息",
|
dispatchOrdId, statusCode, TaskStatusPushConverter.getLegacyStatusDescription(statusCode));
|
}
|
|
// 调用Mapper插入记录
|
int rows = legacyTransferSyncMapper.insertDispatchOrdRunning(
|
dispatchOrdId,
|
statusCode,
|
statusTime,
|
operatorId,
|
latitude,
|
longitude,
|
address
|
);
|
|
if (rows > 0) {
|
if (hasGps) {
|
log.info("状态变更记录已同步到DispatchOrd_Running,DispatchOrdID: {}, 状态码: {} ({}), GPS: [{}, {}], 地址: {}",
|
dispatchOrdId,
|
statusCode,
|
TaskStatusPushConverter.getLegacyStatusDescription(statusCode),
|
latitude,
|
longitude,
|
address != null ? address : "无");
|
} else {
|
log.info("状态变更记录已同步到DispatchOrd_Running,DispatchOrdID: {}, 状态码: {} ({}), 无GPS信息",
|
dispatchOrdId,
|
statusCode,
|
TaskStatusPushConverter.getLegacyStatusDescription(statusCode));
|
}
|
} else {
|
log.warn("同步状态变更记录失败,未插入数据,DispatchOrdID: {}", dispatchOrdId);
|
}
|
|
} catch (Exception e) {
|
log.error("同步状态变更记录到DispatchOrd_Running异常,DispatchOrdID: {}, 状态码: {}",
|
dispatchOrdId, statusCode, e);
|
// 不抛出异常,避免影响主流程
|
}
|
}
|
}
|