diff --git a/main.py b/main.py index aab80e4..4178392 100644 --- a/main.py +++ b/main.py @@ -234,7 +234,7 @@ class FabricManager(QMainWindow): return quantity = self.quantity_input.value() loss_rate = self.loss_input.value() / 100 - + try: with self.get_conn() as conn: cursor = conn.execute(''' @@ -243,21 +243,24 @@ class FabricManager(QMainWindow): WHERE style_number = ? ''', (style_number,)) rows = cursor.fetchall() - inserted = 0 - + + # 第一步:检查所有原料库存是否充足 + insufficient_materials = [] + materials_to_record = [] + for category, fabric_type, usage_per_piece, unit in rows: if usage_per_piece == 0: continue - + # 获取该原料在入库时使用的单位 stock_cursor = conn.execute(''' - SELECT unit FROM fabric_stock_in - WHERE model = ? - ORDER BY purchase_date DESC + SELECT unit FROM fabric_stock_in + WHERE model = ? + ORDER BY purchase_date DESC LIMIT 1 ''', (category,)) stock_unit_row = stock_cursor.fetchone() - + # 如果有入库记录,使用入库单位;否则使用原来的单位 if stock_unit_row: stock_unit = stock_unit_row[0] @@ -272,17 +275,59 @@ class FabricManager(QMainWindow): # 没有入库记录,使用原单位 consume_qty = usage_per_piece * quantity * (1 + loss_rate) final_unit = unit - + + # 检查当前库存 + stock_info = conn.execute(''' + SELECT + COALESCE(SUM(CASE WHEN si.is_deleted = 0 THEN si.quantity ELSE 0 END), 0) AS total_in, + COALESCE(SUM(CASE WHEN c.is_deleted = 0 THEN c.consume_quantity ELSE 0 END), 0) AS total_out + FROM fabrics f + LEFT JOIN fabric_stock_in si ON f.model = si.model + LEFT JOIN fabric_consumption c ON f.model = c.model + WHERE f.model = ? + GROUP BY f.model + ''', (category,)).fetchone() + + if stock_info: + total_in, total_out = stock_info + current_stock = total_in - total_out + else: + current_stock = 0 + + # 如果库存不足,记录下来 + if current_stock < consume_qty: + material_name = category or "未命名材料" + insufficient_materials.append( + f"{material_name}: 需要 {consume_qty:.3f} {final_unit},库存仅剩 {current_stock:.3f} {final_unit}" + ) + else: + # 库存充足,加入待记录列表 + materials_to_record.append(( + style_number, category, usage_per_piece, quantity, + loss_rate, consume_qty, final_unit + )) + + # 如果有库存不足的材料,提示用户并中止操作 + if insufficient_materials: + message = "以下原料库存不足,无法记录消耗:\n\n" + "\n".join(insufficient_materials) + QMessageBox.warning(self, "库存不足", message) + return + + # 第二步:所有库存都充足,执行记录 + inserted = 0 + for material_data in materials_to_record: + style_num, model, single_usage, qty, loss, consume_qty, final_unit = material_data conn.execute(''' INSERT INTO fabric_consumption (style_number, model, single_usage, quantity_made, loss_rate, consume_quantity, consume_date, unit) VALUES (?, ?, ?, ?, ?, ?, ?, ?) - ''', (style_number, category, usage_per_piece, quantity, loss_rate, consume_qty, datetime.now().strftime('%Y-%m-%d'), final_unit)) + ''', (style_num, model, single_usage, qty, loss, consume_qty, datetime.now().strftime('%Y-%m-%d'), final_unit)) inserted += 1 + conn.commit() - + if inserted > 0: - QMessageBox.information(self, "成功", "本次生产消耗已记录到库存!") + QMessageBox.information(self, "成功", f"本次生产消耗已记录到库存!共记录 {inserted} 种原料。") else: QMessageBox.information(self, "提示", "本次没有可记录的原料消耗") except Exception as e: