feat(udkørsel): kilder hvis læssestationer deler lager (mælketanke som udvidelser) regnes som ét stop (v1.17.3.0)

This commit is contained in:
2026-09-24 03:53:07 +02:00
parent e7c482a3cb
commit edf6805cac
7 changed files with 105 additions and 3 deletions
+28
View File
@@ -62,6 +62,30 @@ local function fillTypeName(fillType)
return g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(fillType) or tostring(fillType)
end
-- Lagrene en kildes læssestation trækker fra (FS25: sourceStorages = {[storage] = storage}); nil = ukendt.
local function sourceStorages(source)
local station = source ~= nil and source.station or nil
if station == nil or type(station.sourceStorages) ~= "table" then
return nil
end
local list = {}
for key, value in pairs(station.sourceStorages) do
table.insert(list, type(key) == "table" and key or value)
end
return #list > 0 and list or nil
end
local mergedLogged = {}
local function logMergedSources(vehicle, run, merged)
for keptId, ids in pairs(merged or {}) do
local key = tostring(run.id) .. ":" .. tostring(keptId) .. ":" .. table.concat(ids, ",")
if not mergedLogged[key] then
mergedLogged[key] = true
Logging.info(ADOutbound.LOG_PREFIX .. "run '%s': kilde %s deler lager med %s — regnes som ét stop", tostring(run.name), tostring(keptId), table.concat(ids, ", "))
end
end
end
local function getStatus(run)
status[run.id] = status[run.id] or {}
return status[run.id]
@@ -199,6 +223,10 @@ function ADOutbound.buildPlanInput(adEnv, run, vehicle)
sourcesById[wayPointId] = source
end
end
-- kilder der deler lager (mælketanke som udvidelser) er ét stop — ellers kører runden mellem dem
local merged
sources, merged = ADOutboundPlanner.dedupeSharedSources(sources, sourceStorages)
logMergedSources(vehicle, run, merged)
local byName, products = {}, {}
local time = now()
for _, source in ipairs(sources) do
+33
View File
@@ -193,6 +193,39 @@ local function buildTrip(primary, candidates, input)
return trip
end
-- Kilder hvis læssestationer trækker fra samme lagre (fx mælketanke der er udvidelser inden for hinandens
-- storageRadius) er ét stop: læsser man ved én, tømmes de alle. Den første i rækkefølgen beholdes, de
-- øvrige lægges ind under den. storagesOf(source) -> liste af lager-objekter (nil = ukendt, beholdes).
-- Returnerer kept (rækkefølge bevaret) og merged {[beholdt wayPointId] = {sammenlagte wayPointIds}}.
function ADOutboundPlanner.dedupeSharedSources(sources, storagesOf)
local kept, merged, groups = {}, {}, {}
for _, source in ipairs(sources or {}) do
local storages = storagesOf(source)
local owner = nil
if storages ~= nil then
for _, group in ipairs(groups) do
for _, storage in ipairs(storages) do
if group.storages[storage] then owner = group break end
end
if owner ~= nil then break end
end
end
if owner ~= nil then
for _, storage in ipairs(storages) do owner.storages[storage] = true end
merged[owner.source.wayPointId] = merged[owner.source.wayPointId] or {}
table.insert(merged[owner.source.wayPointId], source.wayPointId)
else
table.insert(kept, source)
if storages ~= nil then
local set = {}
for _, storage in ipairs(storages) do set[storage] = true end
table.insert(groups, {source = source, storages = set})
end
end
end
return kept, merged
end
function ADOutboundPlanner.plan(input)
local sell, store, reasons = collectCandidates(input)
if sell[1] ~= nil then
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107">
<author>masterdraco</author>
<version>1.17.2.0</version>
<version>1.17.3.0</version>
<title>
<en>AD Smart Pickup</en>
</title>