feat: multi-plate grouping, compensation badges, pieces_override on slots
Deploy via Portainer / deploy (push) Successful in 0s

This commit is contained in:
Jo
2026-07-07 11:58:09 +02:00
parent 935a2f9634
commit de9ecec6dc
2 changed files with 146 additions and 31 deletions
+25
View File
@@ -268,6 +268,7 @@ def init_db():
'ALTER TABLE jobs ADD COLUMN plate_name TEXT DEFAULT ""',
'ALTER TABLE printers ADD COLUMN ha_entity_prefix TEXT DEFAULT ""',
'ALTER TABLE print_slots ADD COLUMN pieces_ignored INTEGER DEFAULT 0',
'ALTER TABLE print_slots ADD COLUMN pieces_override INTEGER DEFAULT NULL',
]
for sql in migrations:
try:
@@ -1631,6 +1632,15 @@ def api_slots():
SELECT ps.id, ps.job_id, ps.printer_id, ps.planned_start, ps.planned_end,
ps.status, ps.failure_note,
COALESCE(ps.pieces_ignored, 0) as pieces_ignored,
ps.pieces_override,
COALESCE(ps.pieces_override, j.pieces_per_plate) as effective_pieces,
(SELECT COUNT(*) FROM print_slots ps2
WHERE ps2.job_id = ps.job_id
AND ps2.planned_start <= ps.planned_start
AND ps2.id <= ps.id) as plate_num,
(SELECT COUNT(*) FROM print_slots WHERE job_id = ps.job_id) as total_plates,
(SELECT COALESCE(SUM(COALESCE(pieces_ignored,0)), 0) FROM print_slots
WHERE job_id = ps.job_id) as job_total_ignored,
j.name as job_name, j.print_time_s, j.final_price,
j.pieces_per_plate, j.order_qty, j.weight_g,
j.plate_name,
@@ -1647,6 +1657,21 @@ def api_slots():
conn.close()
return jsonify([dict(s) for s in slots])
@app.route('/api/slots/<int:id>/pieces_override', methods=['POST'])
@login_required
def api_slot_pieces_override(id):
d = request.get_json(silent=True) or {}
pieces = d.get('pieces')
conn = get_db()
if pieces is None:
conn.execute('UPDATE print_slots SET pieces_override=NULL WHERE id=?', (id,))
else:
conn.execute('UPDATE print_slots SET pieces_override=? WHERE id=?', (max(1, int(pieces)), id))
conn.commit()
conn.close()
return jsonify({'ok': True})
def _check_capacity(conn, start_dt, end_dt, max_printers, exclude_id=None):
"""Vérifie si ajouter ce créneau dépasserait max_printers simultanés.
Retourne (True, peak_count) si limite atteinte, (False, peak_count) sinon.