feat: flow-guide tildeler ledige vogne til solo-traktorer
Solo-traktorer (ingen vogn bagpå) er valgbare når en frakoblet vogn med Connect-markør kan bære flowets varer. Guiden foreslår en vogn (navnematch, så Disponibel) med vognvalg pr. traktor; flowet husker parret ved gem, så vognens parkering ikke skal omdøbes.
This commit is contained in:
@@ -7,7 +7,10 @@
|
||||
-- products = {{name, title}} -- varer kilderne har (udkørsel)
|
||||
-- storeBuildings = {{id, name, text}} -- lagre der kan tage flowets lagervarer
|
||||
-- waitPools = {{group, count}}
|
||||
-- vehicles = {{id, label, text, otherRunId, otherRunName, blocked}}} -- label = kort navn (resumé)
|
||||
-- vehicles = {{id, label, text, otherRunId, otherRunName, blocked, solo}} -- label = kort navn (resumé)
|
||||
-- wagons = {{id, label}}} -- ledige vogne til solo-traktorer (bedste først)
|
||||
-- Solo-traktor (ingen vogn bagpå) får en ledig vogn fra context.wagons (draft.wagons = {[traktorId] = vognId}),
|
||||
-- som den henter ved "Connect <vognens parkering>" — uden at vognens parkering skal omdøbes.
|
||||
-- Gem: ADRunsController.createRun/updateRun + assignVehicle/unassignVehicle (GUI'et).
|
||||
|
||||
ADFlowGuide = {}
|
||||
@@ -66,7 +69,7 @@ end
|
||||
local RUN_FIELDS = {
|
||||
"id", "name", "kind", "sourceBuildingIds", "targetBuildingIds", "storeBuildingIds", "products",
|
||||
"ingredientMode", "ingredients", "sellAtPercent", "storeAbovePercent", "sellAbovePercent", "collectRound", "loops",
|
||||
"returnBelowPercent", "waitPoolGroup", "vehicleIds",
|
||||
"returnBelowPercent", "waitPoolGroup", "vehicleIds", "wagons",
|
||||
}
|
||||
|
||||
local function draftFrom(run, isNew)
|
||||
@@ -83,6 +86,7 @@ local function draftFrom(run, isNew)
|
||||
draft.returnBelowPercent = draft.returnBelowPercent or ADRuns.DEFAULT_RETURN_BELOW_PERCENT
|
||||
draft.loops = draft.loops or 0
|
||||
draft.waitPoolGroup = draft.waitPoolGroup or ""
|
||||
draft.wagons = draft.wagons or {}
|
||||
draft.collectRound = draft.collectRound == true
|
||||
draft.isNew = isNew == true
|
||||
draft.showAllBuildings = false
|
||||
@@ -124,6 +128,44 @@ function ADFlowGuide.previewRun(draft, markerIds)
|
||||
return run
|
||||
end
|
||||
|
||||
-- ---- vogne til solo-traktorer ----
|
||||
|
||||
local function soloIds(context)
|
||||
local set = {}
|
||||
for _, vehicle in ipairs((context or {}).vehicles or {}) do
|
||||
if vehicle.solo then set[vehicle.id] = true end
|
||||
end
|
||||
return set
|
||||
end
|
||||
|
||||
-- Ny vogn-tabel: fravalgte traktorer slipper deres vogn; valgte solo-traktorer uden (gyldig) vogn får den første
|
||||
-- ledige i context.wagons, som ingen anden traktor i flowet har. Vogne til ikke-solo-traktorer bevares (husket).
|
||||
function ADFlowGuide.assignWagons(draft, context)
|
||||
local chosen, solo, offered = {}, soloIds(context), {}
|
||||
for _, id in ipairs(draft.vehicleIds or {}) do chosen[id] = true end
|
||||
for _, wagon in ipairs((context or {}).wagons or {}) do offered[wagon.id] = true end
|
||||
local wagons, used = {}, {}
|
||||
for tractorId, wagonId in pairs(draft.wagons or {}) do
|
||||
local valid = chosen[tractorId] and (not solo[tractorId] or offered[wagonId])
|
||||
if valid and not used[wagonId] then
|
||||
wagons[tractorId] = wagonId
|
||||
used[wagonId] = true
|
||||
end
|
||||
end
|
||||
for _, tractorId in ipairs(draft.vehicleIds or {}) do
|
||||
if solo[tractorId] and wagons[tractorId] == nil then
|
||||
for _, wagon in ipairs((context or {}).wagons or {}) do
|
||||
if not used[wagon.id] then
|
||||
wagons[tractorId] = wagon.id
|
||||
used[wagon.id] = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return wagons
|
||||
end
|
||||
|
||||
-- ---- valg ----
|
||||
|
||||
local SET_VALUES = {
|
||||
@@ -157,6 +199,10 @@ function ADFlowGuide.choose(guide, id, value)
|
||||
draft[id] = value == true
|
||||
elseif LIST_VALUES[id] then
|
||||
draft[id] = ADGuide.toggleItem(draft[id], value.item, value.on)
|
||||
if id == "vehicleIds" then draft.wagons = ADFlowGuide.assignWagons(draft, guide.context) end
|
||||
elseif id == "wagon" then
|
||||
draft.wagons = ADGuide.deepCopy(draft.wagons or {})
|
||||
draft.wagons[value.item] = value.value
|
||||
elseif id == "buildings" then
|
||||
local key = draft.kind == "outbound" and "sourceBuildingIds" or "targetBuildingIds"
|
||||
draft[key] = ADGuide.toggleItem(draft[key], value.item, value.on)
|
||||
@@ -307,6 +353,21 @@ local function rowsWait(guide)
|
||||
return {choice("waitPoolGroup", L("spu_waitPool"), options, guide.draft.waitPoolGroup or "")}
|
||||
end
|
||||
|
||||
-- Vognvalg under en valgt solo-traktor: dens egen vogn + ledige vogne ingen anden traktor i flowet har.
|
||||
local function rowWagon(guide, tractorId)
|
||||
local wagons = guide.draft.wagons or {}
|
||||
local usedByOthers = {}
|
||||
for otherId, wagonId in pairs(wagons) do
|
||||
if otherId ~= tractorId then usedByOthers[wagonId] = true end
|
||||
end
|
||||
local options = {}
|
||||
for _, wagon in ipairs(guide.context.wagons or {}) do
|
||||
if not usedByOthers[wagon.id] then table.insert(options, {label = T(tostring(wagon.label)), value = wagon.id}) end
|
||||
end
|
||||
if #options == 0 or wagons[tractorId] == nil then return text("spu_guide_flow_noFreeWagon") end
|
||||
return choice("wagon", L("spu_guide_flow_wagon"), options, wagons[tractorId], tractorId)
|
||||
end
|
||||
|
||||
-- Traktorer: flowets egne først, så de ledige. Traktorer i andre flows og blokerede (vognen passer ikke)
|
||||
-- skjules med en linje hver.
|
||||
local function rowsTractors(guide)
|
||||
@@ -329,8 +390,13 @@ local function rowsTractors(guide)
|
||||
end
|
||||
table.insert(entries, {id = vehicle.id, label = tostring(vehicle.text), state = state})
|
||||
end
|
||||
local solo = soloIds(guide.context)
|
||||
for _, entry in ipairs(ADFlowView.vehicleRows(entries, false)) do
|
||||
table.insert(rows, check("vehicleIds", entry.id, entry.label, entry.state == "in"))
|
||||
if entry.state == "in" and solo[entry.id] then
|
||||
local wagonRow = rowWagon(guide, entry.id)
|
||||
if wagonRow ~= nil then table.insert(rows, wagonRow) end
|
||||
end
|
||||
end
|
||||
if #rows == 0 then table.insert(rows, text("spu_guide_flow_noTractors")) end
|
||||
if other > 0 then table.insert(rows, text("spu_guide_flow_otherFlows", {other})) end
|
||||
@@ -468,7 +534,16 @@ function ADFlowGuide.result(guide)
|
||||
}
|
||||
if draft.name ~= nil and draft.name:match("%S") then changes.name = draft.name end
|
||||
return {isNew = draft.isNew == true, runId = draft.id, name = draft.name, kind = draft.kind, changes = changes,
|
||||
vehicleIds = ADGuide.deepCopy(draft.vehicleIds)}
|
||||
vehicleIds = ADGuide.deepCopy(draft.vehicleIds), wagons = ADFlowGuide.resultWagons(draft)}
|
||||
end
|
||||
|
||||
-- Vogne for de valgte traktorer (til run.wagons ved gem).
|
||||
function ADFlowGuide.resultWagons(draft)
|
||||
local chosen, wagons = chosenSet(draft.vehicleIds), {}
|
||||
for tractorId, wagonId in pairs(draft.wagons or {}) do
|
||||
if chosen[tractorId] then wagons[tractorId] = wagonId end
|
||||
end
|
||||
return wagons
|
||||
end
|
||||
|
||||
-- Traktorer der skal tildeles/fjernes efter gem.
|
||||
|
||||
Reference in New Issue
Block a user