feat(lagre): vareoversigt med nøgletal, 'kræver handling' og fyldningsbjælker — klik på en vare folder den ud til bygningerne; bygningstabellen bag 'Vis: Varer | Bygninger' (v1.52.0.0)

This commit is contained in:
2026-09-29 09:23:15 +02:00
parent 82db248775
commit 5b26415d1e
13 changed files with 919 additions and 2 deletions
+106
View File
@@ -76,5 +76,111 @@ check("ST3 paller med", egg.count, 24)
check("ST3 pladser med", egg.slots, 4000)
check("ST3 procent af pladser", egg.percent, 1)
-- ---- v1.52 vareoversigt ----
-- SV1: gruppér fanens bygninger pr. vare; bygninger sorteret mest først, varer efter titel
local titles = {[31] = "Straw", [5] = "Sugarbeet", [9] = "Milk"}
local titleOf = function(ft) return titles[ft] end
local siloInv = {
{name = "Farma #1", placeable = "p1", entries = {{fillType = 31, level = 300, capacity = 1000}, {fillType = 5, level = 50, capacity = 100}}},
{name = "Farma #2", placeable = "p2", entries = {{fillType = 31, level = 700, capacity = 1000}}},
{name = "Tom", placeable = "p3", entries = {}},
}
local groups = S.groupByFillType(siloInv, titleOf)
check("SV1 to varer", #groups, 2)
check("SV1 alfabetisk: Straw først", groups[1].title, "Straw")
check("SV1 straw total", groups[1].level, 1000)
check("SV1 straw kapacitet", groups[1].capacity, 2000)
check("SV1 straw procent", groups[1].percent, 50)
check("SV1 to siloer med straw", #groups[1].buildings, 2)
check("SV1 flest først", groups[1].buildings[1].name, "Farma #2")
check("SV1 bygning procent", groups[1].buildings[1].percent, 70)
check("SV1 placeable med", groups[1].buildings[2].placeable, "p1")
check("SV1 tomt inventar", #S.groupByFillType({}, titleOf), 0)
-- SV2: gårdens kapacitet pr. vare
local caps = S.farmCapacities(siloInv)
check("SV2 kapacitet straw", caps[31], 2000)
-- SV3: varens statistik: døgn til tom på gårdens netto, pris i % af top
local straw = S.groupStats(groups[1], {level = 1500, capacity = 3000}, {consumption = 1000, production = 0}, {price = 0.5, top = 1.0})
check("SV3 døgn til tom", straw.days, 1.5)
check("SV3 døgn til fuld nil (falder)", straw.daysToFull, nil)
check("SV3 værdi nu", straw.valueNow, 500)
check("SV3 pris % af top", straw.priceRatio, 0.5)
check("SV3 tomt-niveau gul (< 3 døgn)", straw.emptyLevel, "yellow")
check("SV3 samlet niveau", straw.severity, "yellow")
-- SV4: produceret vare -> døgn til fuld på gårdens ledige kapacitet
local sugar = S.groupStats({fillType = 5, title = "Sugar", level = 950, capacity = 1000, percent = 95, buildings = {}},
{level = 950, capacity = 1000}, {consumption = 0, production = 100}, nil)
check("SV4 døgn til fuld", sugar.daysToFull, 0.5)
check("SV4 producerer", sugar.producing, true)
check("SV4 fuld-niveau rød (95 %)", sugar.fullLevel, "red")
check("SV4 ingen pris -> nil", sugar.valueNow, nil)
-- SV5: fuld lagervare der ikke produceres er ikke et problem
local stock = S.groupStats({fillType = 31, title = "Straw", level = 990, capacity = 1000, percent = 99, buildings = {}}, nil, nil, nil)
check("SV5 fuld lager uden produktion -> intet", stock.fullLevel, nil)
check("SV5 severity nil", stock.severity, nil)
-- SV6: tærskler
check("SV6 < 1 døgn rød", S.emptyLevel(0.5), "red")
check("SV6 < 3 døgn gul", S.emptyLevel(2.9), "yellow")
check("SV6 5 døgn intet", S.emptyLevel(5), nil)
check("SV6 nil intet", S.emptyLevel(nil), nil)
check("SV6 fuld 85 % gul", S.fullLevel(85, true), "yellow")
check("SV6 fuld 84 % intet", S.fullLevel(84, true), nil)
-- SV7: bygningsniveau: stald-foder næsten tomt, fabrik-output næsten fuldt
check("SV7 stald 8 % rød", S.buildingLevel({percent = 8}, "husbandry", false), "red")
check("SV7 stald 20 % gul", S.buildingLevel({percent = 20}, "husbandry", false), "yellow")
check("SV7 stald-output (mælk) 8 % intet", S.buildingLevel({percent = 8}, "husbandry", true), nil)
check("SV7 output 96 % rød", S.buildingLevel({percent = 96, isOutput = true}, "factory", false), "red")
check("SV7 silo 50 % intet", S.buildingLevel({percent = 50}, "silo", false), nil)
-- SV8: kræver handling — rød tom > rød fuld > gul tom > gul fuld > sælg (efter kroner); højst max
local mk = function(t) t.buildings = {}; return t end
local list = S.attentionList({
mk({title = "A", emptyLevel = "yellow", days = 2, consumption = 1}),
mk({title = "B", fullLevel = "red", percent = 97, producing = true}),
mk({title = "C", emptyLevel = "red", days = 0.4, consumption = 1}),
mk({title = "D", priceRatio = 0.95, valueNow = 50000, net = 0}),
mk({title = "E", priceRatio = 0.97, valueNow = 900000, net = 0}),
mk({title = "F", priceRatio = 0.99, valueNow = 900000, net = -5}), -- gården æder den: sælg ikke
mk({title = "G", priceRatio = 0.99, valueNow = 5000, net = 0}), -- for lille
}, 4)
check("SV8 højst 4", #list, 4)
check("SV8 1: rød tom", list[1].stat.title, "C")
check("SV8 1: art", list[1].kind, "empty")
check("SV8 2: rød fuld", list[2].stat.title, "B")
check("SV8 3: gul tom", list[3].stat.title, "A")
check("SV8 4: største salg", list[4].stat.title, "E")
check("SV8 4: art", list[4].kind, "sell")
-- SV9: nøgletal for fanen
local kpi = S.kpis({
mk({valueNow = 100, valueTop = 150, emptyLevel = "red"}),
mk({valueNow = 50, valueTop = 50, fullLevel = "yellow"}),
mk({}),
})
check("SV9 værdi nu", kpi.valueNow, 150)
check("SV9 ekstra ved top", kpi.gain, 50)
check("SV9 løber tør", kpi.emptyCount, 1)
check("SV9 fyldt", kpi.fullCount, 1)
-- SV10: fyldningsbrøk til bjælker, klemt til [0,1]
check("SV10 halv", S.fraction(50), 0.5)
check("SV10 over 100", S.fraction(130), 1)
check("SV10 nil", S.fraction(nil), 0)
-- SV11: skur uden pladsgrænse (kapacitet 0) -> varens procent ukendt, ikke 940 %
local shedGroups = S.groupByFillType({
{name = "A", entries = {{fillType = 9, level = 40, capacity = 100}}},
{name = "B", entries = {{fillType = 9, level = 900, capacity = 0}}},
}, titleOf)
check("SV11 procent nil ved ubegrænset skur", shedGroups[1].percent, nil)
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
os.exit(failures == 0 and 0 or 1)