Junjie
16 小时以前 1654b0a8c149f86d38f3202cb88c655ad0a25384
src/main/java/com/zy/common/service/CommonService.java
@@ -31,6 +31,8 @@
@Service
public class CommonService {
    private static final long OUT_STATION_ROUTE_CACHE_SECONDS = 300L;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
@@ -686,12 +688,18 @@
            stationList = basDualCrnp.getOutStationList$();
        }
        Integer cachedSourceStationId = resolveCachedOutStationId(findCrnNoResult, targetStationId, stationList);
        if (cachedSourceStationId != null) {
            return cachedSourceStationId;
        }
        Integer finalSourceStationId = null;
        for (StationObjModel stationObjModel : stationList) {
            try {
                List<NavigateNode> navigateNodes = navigateUtils.calcReachablePathByStationId(stationObjModel.getStationId(), targetStationId);
                if(!navigateNodes.isEmpty()) {
                    finalSourceStationId = stationObjModel.getStationId();
                    cacheOutStationId(findCrnNoResult, targetStationId, finalSourceStationId);
                    break;
                }
            } catch (Exception e) {
@@ -701,4 +709,73 @@
        return finalSourceStationId;
    }
    /**
     * 出库路径搜索代价较高,只缓存已确认可达的站点结果,并通过 TTL 控制陈旧风险。
     */
    private Integer resolveCachedOutStationId(FindCrnNoResult findCrnNoResult,
                                              Integer targetStationId,
                                              List<StationObjModel> stationList) {
        if (findCrnNoResult == null || findCrnNoResult.getCrnType() == null
                || findCrnNoResult.getCrnNo() == null || targetStationId == null
                || stationList == null || stationList.isEmpty()) {
            return null;
        }
        Object cacheValue = redisUtil.get(buildOutStationRouteCacheKey(findCrnNoResult, targetStationId));
        if (cacheValue == null) {
            return null;
        }
        Integer cachedStationId = parseInteger(cacheValue);
        if (cachedStationId == null) {
            return null;
        }
        for (StationObjModel stationObjModel : stationList) {
            if (stationObjModel != null && cachedStationId.equals(stationObjModel.getStationId())) {
                return cachedStationId;
            }
        }
        return null;
    }
    private void cacheOutStationId(FindCrnNoResult findCrnNoResult,
                                   Integer targetStationId,
                                   Integer sourceStationId) {
        if (findCrnNoResult == null || findCrnNoResult.getCrnType() == null
                || findCrnNoResult.getCrnNo() == null || targetStationId == null
                || sourceStationId == null) {
            return;
        }
        redisUtil.set(buildOutStationRouteCacheKey(findCrnNoResult, targetStationId),
                sourceStationId,
                OUT_STATION_ROUTE_CACHE_SECONDS);
    }
    private String buildOutStationRouteCacheKey(FindCrnNoResult findCrnNoResult, Integer targetStationId) {
        return RedisKeyType.OUT_STATION_ROUTE_CACHE.key
                + findCrnNoResult.getCrnType().name()
                + "_"
                + findCrnNoResult.getCrnNo()
                + "_"
                + targetStationId;
    }
    private Integer parseInteger(Object value) {
        if (value == null) {
            return null;
        }
        if (value instanceof Integer) {
            return (Integer) value;
        }
        if (value instanceof Number) {
            return ((Number) value).intValue();
        }
        try {
            return Integer.parseInt(String.valueOf(value));
        } catch (Exception ignore) {
            return null;
        }
    }
}