package com.ruoyi.system.utils;
|
|
import com.ruoyi.system.domain.enums.TaskStatus;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
|
/**
|
* 新系统状态向旧系统状态转换工具类
|
*
|
* @author ruoyi
|
* @date 2024-01-16
|
*/
|
public class TaskStatusPushConverter {
|
|
private static final Logger log = LoggerFactory.getLogger(TaskStatusPushConverter.class);
|
|
/**
|
* 将新系统TaskStatus转换为旧系统状态码
|
*
|
* @param taskStatus 新系统任务状态枚举
|
* @return 旧系统状态码,如果不需要同步则返回null
|
*/
|
public static Integer convertToLegacyStatus(TaskStatus taskStatus) {
|
if (taskStatus == null) {
|
log.warn("新系统状态为空");
|
return null;
|
}
|
|
switch (taskStatus) {
|
case DEPARTING: // 出发中
|
return 4;
|
case IN_PROGRESS: // 任务中
|
return 6;
|
case RETURNING: // 返程中
|
return 7;
|
case COMPLETED: // 已完成
|
return 8;
|
case CANCELLED: // 已取消
|
return 10;
|
case PENDING: // 待处理 - 不同步
|
case ARRIVED: // 已到达 - 不同步
|
default:
|
log.debug("新系统状态不需要同步到旧系统: {}", taskStatus.getInfo());
|
return null;
|
}
|
}
|
|
/**
|
* 判断是否需要更新旧系统状态
|
* 增加防止状态倒退机制:当新系统状态落后于旧系统时,不进行推送
|
*
|
* @param newStatusCode 新系统要推送的状态码
|
* @param oldStatusCode 旧系统当前状态码
|
* @return 是否需要更新
|
*/
|
public static boolean shouldUpdateLegacyStatus(Integer newStatusCode, Integer oldStatusCode) {
|
if (newStatusCode == null || oldStatusCode == null) {
|
log.warn("状态码为空,跳过更新,新状态码: {}, 旧状态码: {}", newStatusCode, oldStatusCode);
|
return false;
|
}
|
|
// 防止状态倒退:旧系统状态 >= 新系统要推送的状态时,不更新
|
// 原因:可能是旧系统已经处理了更新的状态,而新系统由于时间差还没有同步到
|
if (oldStatusCode >= newStatusCode) {
|
log.info("旧系统状态({}) >= 新系统目标状态({}),跳过推送,防止状态倒退," +
|
"旧系统: {} ({}), 新系统目标: {} ({})",
|
oldStatusCode, newStatusCode,
|
oldStatusCode, getLegacyStatusDescription(oldStatusCode),
|
newStatusCode, getLegacyStatusDescription(newStatusCode));
|
return false;
|
}
|
|
// 特殊状态检查:已完成或已取消的任务不应该被更新为中间状态
|
if (oldStatusCode >= 8) {
|
// 旧系统已经是完成态(8,9,10),不应该被任何中间状态覆盖
|
if (newStatusCode < 8) {
|
log.warn("旧系统已是终态({})(:{}),拒绝推送中间状态({})(:{})",
|
oldStatusCode, getLegacyStatusDescription(oldStatusCode),
|
newStatusCode, getLegacyStatusDescription(newStatusCode));
|
return false;
|
}
|
}
|
|
log.debug("允许推送状态,旧系统: {} ({}), 新系统目标: {} ({})",
|
oldStatusCode, getLegacyStatusDescription(oldStatusCode),
|
newStatusCode, getLegacyStatusDescription(newStatusCode));
|
|
return true;
|
}
|
|
/**
|
* 获取旧系统状态描述
|
*
|
* @param statusCode 旧系统状态码
|
* @return 状态描述
|
*/
|
public static String getLegacyStatusDescription(Integer statusCode) {
|
if (statusCode == null) {
|
return "未知";
|
}
|
|
switch (statusCode) {
|
case 0: return "新调度单(未下发)";
|
case 1: return "完全未确认";
|
case 2: return "部分已确认";
|
case 3: return "未出车";
|
case 4: return "已出车(去接患者途中)";
|
case 5: return "已出车(等待患者)";
|
case 6: return "已出车(服务中)";
|
case 7: return "已送达(回程中)";
|
case 8: return "已返回";
|
case 9: return "跑空单,已返回";
|
case 10: return "取消";
|
case 11: return "审核中";
|
case 12: return "审核通过";
|
case 13: return "审核不通过";
|
case 14: return "驻点";
|
default: return "未知状态(" + statusCode + ")";
|
}
|
}
|
}
|