fix(forsyning): intet at hente til valgt mål -> prøv run'ets andre mål før Wait (to traktorer til samme DOB); hold-tekst siger den reelle grund (v1.18.2.0)

This commit is contained in:
2026-09-24 06:05:17 +02:00
parent 57fc01ac47
commit 889689cfce
5 changed files with 59 additions and 4 deletions
+35 -1
View File
@@ -736,6 +736,37 @@ local function chooseRunTarget(adEnv, driver)
Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' kører til %s (%s)", tostring(ADRuns.vehicleLabel(driver)), marker ~= nil and tostring(marker.name) or tostring(targetId), why)
end
local tryOtherRunTargets
-- Det valgte mål har intet der kan hentes (kilden er tom, eller andre traktorer har allerede læs på vej
-- til det): prøv run'ets ANDRE mål, og skift AD's aflæsningsmål til det første der kan forsynes.
-- Ellers holdt traktoren ved Wait mens fx fire andre DOB'er ved samme biogasanlæg stod tomme.
tryOtherRunTargets = function(adEnv, driver, ingredients)
local run = ADRunsController ~= nil and ADRunsController.getRunForVehicle(driver) or nil
if run == nil or (run.kind or "supply") ~= "supply" then
return nil
end
-- AD's mål er midlertidigt en silo (forkert last læsses af): rør det ikke
if ADUnloadWait ~= nil and ADUnloadWait.getPendingTargetRestore ~= nil and ADUnloadWait.getPendingTargetRestore(driver) ~= nil then
return nil
end
local stateModule = driver.ad.stateModule
local current = stateModule.getSecondMarker ~= nil and stateModule:getSecondMarker() or nil
local currentId = current ~= nil and current.id or nil
for _, targetId in ipairs(ADRunsController.getRunTargets(run)) do
if targetId ~= currentId then
local choice = ADSmartPickup.findSupplyPickup(adEnv, driver, ingredients, targetId)
if choice ~= nil and stateModule.setSecondMarkerByWayPointId ~= nil then
stateModule:setSecondMarkerByWayPointId(targetId)
local marker = adEnv.ADGraphManager.getMapMarkerByWayPointId ~= nil and adEnv.ADGraphManager:getMapMarkerByWayPointId(targetId) or nil
Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' kører til %s (intet at hente til %s)", tostring(ADRuns.vehicleLabel(driver)),
marker ~= nil and tostring(marker.name) or tostring(targetId), current ~= nil and tostring(current.name) or "?")
return choice
end
end
end
return nil
end
-- Samlet valg: behovsstyret med ingrediensliste, ellers mappe-logik. nil = AutoDrives original.
function ADSmartPickup.choosePickup(adEnv, driver)
enRoute[driver] = nil -- ny tur: forrige læs er leveret (eller opgivet)
@@ -747,6 +778,9 @@ function ADSmartPickup.choosePickup(adEnv, driver)
end
local choice = ADSmartPickup.findSupplyPickup(adEnv, driver, ingredients)
if choice == nil then
choice = tryOtherRunTargets(adEnv, driver, ingredients)
end
if choice == nil then
-- Traktor i et forsynings-run uden noget (tilladt) at hente: hold ved Wait og prøv igen, i stedet
-- for at falde tilbage til mappe-logikken (den henter hvad som helst, fx ensilage i et halvfuldt trug).
@@ -762,7 +796,7 @@ function ADSmartPickup.choosePickup(adEnv, driver)
activePickups[driver] = {station = next.station, fillTypes = next.fillTypes, markerName = next.markerName, fillType = next.fillType}
return next.markerId
end
local held = ADOutbound.holdSupplyVehicle(adEnv, driver, run, {"intet at hente (bedste foder mangler, truget ikke nødlidende)"}, replan)
local held = ADOutbound.holdSupplyVehicle(adEnv, driver, run, {"intet at hente til nogen af run'ets mål (tom kilde, læs på vej, eller bedste foder mangler)"}, replan)
if held ~= nil then
return held
end