@flowselections/logistiek-engine 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
- package/dist-lib/components/LogistiekEnginePage.js +19 -4
- package/dist-lib/components/StrategieDialog.d.ts.map +1 -1
- package/dist-lib/components/StrategieDialog.js +1 -1
- package/dist-lib/hooks/useLogistiekStrategieen.d.ts +2 -1
- package/dist-lib/hooks/useLogistiekStrategieen.d.ts.map +1 -1
- package/dist-lib/hooks/useLogistiekStrategieen.js +72 -2
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +396 -3
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +396 -3
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +396 -3
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +396 -3
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/floridayDocuments.functions.d.ts +1188 -9
- package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
- package/dist-lib/lib/floridayPush.functions.d.ts +396 -3
- package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
- package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
- package/dist-lib/lib/handlers/logistics-tick.server.js +12 -1
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +1980 -15
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
- package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +792 -6
- package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
- package/dist-lib/lib/logisticsRecalculate.functions.d.ts +396 -3
- package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.js +25 -0
- package/dist-lib/lib/planQueue.server.d.ts +17 -0
- package/dist-lib/lib/planQueue.server.d.ts.map +1 -0
- package/dist-lib/lib/planQueue.server.js +124 -0
- package/package.json +1 -1
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/planQueue.server.ts — incrementele planning van nieuwe/gewijzigde orders
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// De databasewachtrij `logistics_plan_queue` bevat orders die (opnieuw) moeten
|
|
5
|
+
// worden ingedeeld. Deze module claimt een batch, plant per impactgroep en
|
|
6
|
+
// draait daarna de dagniveau-stappen (taken inplannen, tellingen, capaciteit)
|
|
7
|
+
// voor de geraakte dagen. Alles via de meegegeven Supabase-client, zodat de
|
|
8
|
+
// module in elke shell werkt.
|
|
9
|
+
// ============================================================================
|
|
10
|
+
import { replanBufferInternal, replanOrderInternal } from "./loadCarrierPlanning.server.js";
|
|
11
|
+
import { attachIndelingToTasks } from "./loadCarrierTaskSync.server.js";
|
|
12
|
+
const EMPTY = {
|
|
13
|
+
claimed: 0,
|
|
14
|
+
planned: 0,
|
|
15
|
+
cartsCreated: 0,
|
|
16
|
+
skippedLocked: 0,
|
|
17
|
+
failed: 0,
|
|
18
|
+
errors: [],
|
|
19
|
+
};
|
|
20
|
+
/** Verwerkt één ronde van de planwachtrij. Idempotent en veilig bij parallelle runs. */
|
|
21
|
+
export async function runPlanQueue(sb, options = {}) {
|
|
22
|
+
const result = { ...EMPTY, errors: [] };
|
|
23
|
+
const deadlineAt = options.deadlineAt ?? Date.now() + 15000;
|
|
24
|
+
const { data, error } = await sb.rpc("logistics_plan_claim", {
|
|
25
|
+
p_limit: options.limit ?? null,
|
|
26
|
+
});
|
|
27
|
+
if (error) {
|
|
28
|
+
result.failed++;
|
|
29
|
+
result.errors.push(error.message);
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
const rows = Array.isArray(data) ? data : [];
|
|
33
|
+
result.claimed = rows.length;
|
|
34
|
+
if (rows.length === 0)
|
|
35
|
+
return result;
|
|
36
|
+
// Voorkomt dat dezelfde buffer binnen één ronde meerdere keren wordt gepland.
|
|
37
|
+
const plannedBuffers = new Set();
|
|
38
|
+
const touchedDates = new Set();
|
|
39
|
+
for (const row of rows) {
|
|
40
|
+
if (Date.now() > deadlineAt) {
|
|
41
|
+
// Teruggeven aan de wachtrij; de volgende ronde pakt hem weer op.
|
|
42
|
+
await sb.rpc("logistics_plan_finish", { p_id: row.id, p_error: "deadline" });
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const { data: impact } = await sb.rpc("logistics_plan_impact_orders", {
|
|
47
|
+
p_order_id: row.order_id,
|
|
48
|
+
});
|
|
49
|
+
const group = Array.isArray(impact) ? impact : [];
|
|
50
|
+
for (const g of group) {
|
|
51
|
+
if (g.plan_date)
|
|
52
|
+
touchedDates.add(String(g.plan_date).slice(0, 10));
|
|
53
|
+
}
|
|
54
|
+
const bufferId = group.find((g) => g.buffer_id)?.buffer_id ?? null;
|
|
55
|
+
if (bufferId) {
|
|
56
|
+
if (!plannedBuffers.has(bufferId)) {
|
|
57
|
+
plannedBuffers.add(bufferId);
|
|
58
|
+
const plan = await replanBufferInternal(sb, bufferId);
|
|
59
|
+
if (plan.skipped === "locked") {
|
|
60
|
+
result.skippedLocked++;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
result.planned++;
|
|
64
|
+
result.cartsCreated += Number(plan.cartsCreated ?? 0);
|
|
65
|
+
await attachIndelingToTasks(sb, plan);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const plan = await replanOrderInternal(sb, row.order_id);
|
|
71
|
+
if (plan && plan.skipped !== "locked") {
|
|
72
|
+
result.planned++;
|
|
73
|
+
result.cartsCreated += Number(plan.cartsCreated ?? 0);
|
|
74
|
+
await attachIndelingToTasks(sb, plan);
|
|
75
|
+
}
|
|
76
|
+
else if (plan?.skipped === "locked") {
|
|
77
|
+
result.skippedLocked++;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Orders zonder taken krijgen een order.received-event, zodat de
|
|
81
|
+
// taakdispatcher er taken van maakt.
|
|
82
|
+
for (const g of group.length > 0 ? group : [{ order_id: row.order_id }]) {
|
|
83
|
+
if (!g.order_id)
|
|
84
|
+
continue;
|
|
85
|
+
await sb.rpc("logistics_plan_ensure_event", { p_order_id: g.order_id });
|
|
86
|
+
}
|
|
87
|
+
await sb.rpc("logistics_plan_finish", { p_id: row.id, p_error: null });
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
91
|
+
result.failed++;
|
|
92
|
+
if (result.errors.length < 5)
|
|
93
|
+
result.errors.push(message);
|
|
94
|
+
await sb.rpc("logistics_plan_finish", { p_id: row.id, p_error: message });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (result.planned > 0) {
|
|
98
|
+
await runDayLevelSteps(sb, touchedDates, result);
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
/** Dagniveau-stappen: taken inplannen, tellingen bijwerken en capaciteit controleren. */
|
|
103
|
+
async function runDayLevelSteps(sb, dates, result) {
|
|
104
|
+
const sorted = [...dates].filter(Boolean).sort();
|
|
105
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
106
|
+
const from = sorted[0] && sorted[0] < today ? sorted[0] : today;
|
|
107
|
+
const to = sorted.length > 0 ? sorted[sorted.length - 1] : today;
|
|
108
|
+
const calls = [
|
|
109
|
+
{ fn: "logistics_schedule_tasks", args: {} },
|
|
110
|
+
{ fn: "logistics_sync_task_carriers", args: { p_order_ref: null } },
|
|
111
|
+
{ fn: "logistics_sync_pick_queue", args: {} },
|
|
112
|
+
{ fn: "logistics_apply_document_layouts", args: {} },
|
|
113
|
+
{ fn: "logistics_capacity_day_check", args: { p_from: from, p_to: to >= from ? to : from } },
|
|
114
|
+
];
|
|
115
|
+
for (const call of calls) {
|
|
116
|
+
const { error } = await sb.rpc(call.fn, call.args);
|
|
117
|
+
if (error && result.errors.length < 10)
|
|
118
|
+
result.errors.push(`${call.fn}: ${error.message}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Ruimt afgeronde wachtrijrijen op volgens de ingestelde bewaartermijn. */
|
|
122
|
+
export async function prunePlanQueue(sb) {
|
|
123
|
+
await sb.rpc("logistics_plan_prune");
|
|
124
|
+
}
|