From 6322cb0caaedd9779c3273e40372f921a4885607 Mon Sep 17 00:00:00 2001 From: liangweihao <734499798@qq.com> Date: Sat, 27 Dec 2025 19:09:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=8E=9F=E6=96=99=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为fabrics表添加is_deleted字段用于标记删除状态 - 修改delete_raw方法实现逻辑删除而非物理删除 - 更新所有查询语句过滤已删除的原料数据 - 更新库存视图过滤已删除的原料和相关记录 - 保留历史数据,支持数据恢复 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- database.py | 26 +++++++++++++++++--------- fabric_manager_pro.py | 2 +- garment_dialogs.py | 2 +- main.py | 2 +- raw_material_dialog.py | 36 ++++++++++++++++++++---------------- stock_dialog.py | 4 ++-- 6 files changed, 42 insertions(+), 30 deletions(-) diff --git a/database.py b/database.py index 962cdde..034c417 100644 --- a/database.py +++ b/database.py @@ -145,6 +145,10 @@ class DatabaseManager: pass # 添加逻辑删除字段 + try: + conn.execute("ALTER TABLE fabrics ADD COLUMN is_deleted INTEGER DEFAULT 0") + except: + pass try: conn.execute("ALTER TABLE fabric_stock_in ADD COLUMN is_deleted INTEGER DEFAULT 0") except: @@ -223,9 +227,10 @@ class DatabaseManager: conn.execute('CREATE INDEX IF NOT EXISTS idx_fabric_consumption_date ON fabric_consumption(consume_date)') # 添加库存计算视图 + conn.execute('DROP VIEW IF EXISTS fabric_stock_view') conn.execute(''' - CREATE VIEW IF NOT EXISTS fabric_stock_view AS - SELECT + CREATE VIEW fabric_stock_view AS + SELECT f.model, f.category, f.supplier, @@ -238,13 +243,16 @@ class DatabaseManager: LEFT JOIN ( SELECT model, SUM(quantity) as total_in FROM fabric_stock_in + WHERE is_deleted IS NULL OR is_deleted = 0 GROUP BY model ) stock_in ON f.model = stock_in.model LEFT JOIN ( SELECT model, SUM(consume_quantity) as total_consumed FROM fabric_consumption + WHERE is_deleted IS NULL OR is_deleted = 0 GROUP BY model ) consumption ON f.model = consumption.model + WHERE f.is_deleted IS NULL OR f.is_deleted = 0 ''') # 初始化默认密码 @@ -284,8 +292,8 @@ def get_fabric_categories(db_path): with get_db_connection(db_path) as conn: cursor = conn.execute(""" SELECT DISTINCT category - FROM fabrics - WHERE category IS NOT NULL AND category != '' + FROM fabrics + WHERE category IS NOT NULL AND category != '' AND (is_deleted IS NULL OR is_deleted = 0) ORDER BY category """) categories = set() @@ -306,8 +314,8 @@ def get_fabric_types_by_category(db_path, category): with get_db_connection(db_path) as conn: cursor = conn.execute(""" SELECT DISTINCT fabric_type - FROM fabrics - WHERE category = ? AND fabric_type IS NOT NULL AND fabric_type != '' + FROM fabrics + WHERE category = ? AND fabric_type IS NOT NULL AND fabric_type != '' AND (is_deleted IS NULL OR is_deleted = 0) ORDER BY fabric_type """, (category,)) @@ -325,9 +333,9 @@ def get_fabric_models_by_category_type(db_path, category, fabric_type): try: with get_db_connection(db_path) as conn: cursor = conn.execute(""" - SELECT model, color, unit - FROM fabrics - WHERE category = ? OR category = ? OR category LIKE ? + SELECT model, color, unit + FROM fabrics + WHERE (category = ? OR category = ? OR category LIKE ?) AND (is_deleted IS NULL OR is_deleted = 0) ORDER BY model """, (category, f"{category}-{fabric_type}", f"{category}-{fabric_type}-%")) diff --git a/fabric_manager_pro.py b/fabric_manager_pro.py index 3338e79..cb71246 100644 --- a/fabric_manager_pro.py +++ b/fabric_manager_pro.py @@ -263,7 +263,7 @@ class FabricManager(QMainWindow): if fabric_model: try: with self.get_conn() as conn: - cursor = conn.execute("SELECT width, gsm FROM fabrics WHERE model = ?", (fabric_model,)) + cursor = conn.execute("SELECT width, gsm FROM fabrics WHERE model = ? AND (is_deleted IS NULL OR is_deleted = 0)", (fabric_model,)) fabric_info = cursor.fetchone() if fabric_info and fabric_info[0] and fabric_info[1]: width, gsm = fabric_info diff --git a/garment_dialogs.py b/garment_dialogs.py index 9ea69d3..611d7ed 100644 --- a/garment_dialogs.py +++ b/garment_dialogs.py @@ -659,7 +659,7 @@ class GarmentEditDialog(QDialog): try: with self.get_conn() as conn: cursor = conn.execute( - "SELECT category, fabric_type, unit FROM fabrics WHERE model = ?", + "SELECT category, fabric_type, unit FROM fabrics WHERE model = ? AND (is_deleted IS NULL OR is_deleted = 0)", (base_model,) ) row_db = cursor.fetchone() diff --git a/main.py b/main.py index a353fe5..aab80e4 100644 --- a/main.py +++ b/main.py @@ -412,7 +412,7 @@ class FabricManager(QMainWindow): if fabric_model: try: with self.get_conn() as conn: - cursor = conn.execute("SELECT width, gsm FROM fabrics WHERE model = ?", (fabric_model,)) + cursor = conn.execute("SELECT width, gsm FROM fabrics WHERE model = ? AND (is_deleted IS NULL OR is_deleted = 0)", (fabric_model,)) fabric_info = cursor.fetchone() if fabric_info and fabric_info[0] and fabric_info[1]: width, gsm = fabric_info diff --git a/raw_material_dialog.py b/raw_material_dialog.py index d40ca94..296aa6a 100644 --- a/raw_material_dialog.py +++ b/raw_material_dialog.py @@ -112,13 +112,13 @@ class RawMaterialEditDialog(QDialog): try: with self.get_conn() as conn: # 加载类目 - cursor = conn.execute("SELECT DISTINCT category FROM fabrics WHERE category IS NOT NULL AND category != ''") + cursor = conn.execute("SELECT DISTINCT category FROM fabrics WHERE category IS NOT NULL AND category != '' AND (is_deleted IS NULL OR is_deleted = 0)") majors = set(row[0] for row in cursor.fetchall() if row[0]) majors.update({"布料", "辅料", "其他"}) self.edit_major_category.addItems(sorted(majors)) # 加载供应商 - cursor = conn.execute("SELECT DISTINCT supplier FROM fabrics WHERE supplier IS NOT NULL AND supplier != '' ORDER BY supplier") + cursor = conn.execute("SELECT DISTINCT supplier FROM fabrics WHERE supplier IS NOT NULL AND supplier != '' AND (is_deleted IS NULL OR is_deleted = 0) ORDER BY supplier") suppliers = [row[0] for row in cursor.fetchall()] self.edit_supplier.addItems(suppliers) except: @@ -129,7 +129,7 @@ class RawMaterialEditDialog(QDialog): try: with self.get_conn() as conn: cursor = conn.execute( - "SELECT category, fabric_type, supplier, color, width, gsm, unit, retail_price, bulk_price FROM fabrics WHERE model = ?", + "SELECT category, fabric_type, supplier, color, width, gsm, unit, retail_price, bulk_price FROM fabrics WHERE model = ? AND (is_deleted IS NULL OR is_deleted = 0)", (self.model,) ) row = cursor.fetchone() @@ -456,10 +456,10 @@ class RawMaterialLibraryDialog(QDialog): """加载主类目""" try: with self.get_conn() as conn: - cursor = conn.execute("SELECT DISTINCT category FROM fabrics WHERE category IS NOT NULL AND category != ''") + cursor = conn.execute("SELECT DISTINCT category FROM fabrics WHERE category IS NOT NULL AND category != '' AND (is_deleted IS NULL OR is_deleted = 0)") majors = set(row[0] for row in cursor.fetchall() if row[0]) majors.update({"布料", "辅料", "其他"}) - + self.major_combo.blockSignals(True) self.major_combo.clear() self.major_combo.addItem("全部类目") @@ -473,15 +473,15 @@ class RawMaterialLibraryDialog(QDialog): """加载添加界面的主类目""" try: with self.get_conn() as conn: - cursor = conn.execute("SELECT DISTINCT category FROM fabrics WHERE category IS NOT NULL AND category != ''") + cursor = conn.execute("SELECT DISTINCT category FROM fabrics WHERE category IS NOT NULL AND category != '' AND (is_deleted IS NULL OR is_deleted = 0)") majors = set(row[0] for row in cursor.fetchall() if row[0]) majors.update({"布料", "辅料", "其他"}) - + self.add_major_category.blockSignals(True) current_text = self.add_major_category.currentText() self.add_major_category.clear() self.add_major_category.addItems(sorted(majors)) - + if current_text in majors: self.add_major_category.setCurrentText(current_text) else: @@ -498,20 +498,20 @@ class RawMaterialLibraryDialog(QDialog): self.sub_combo.blockSignals(True) self.sub_combo.clear() self.sub_combo.addItem("全部类型") - + try: with self.get_conn() as conn: if major in ("全部类目", ""): - cursor = conn.execute("SELECT DISTINCT fabric_type FROM fabrics WHERE fabric_type IS NOT NULL AND fabric_type != ''") + cursor = conn.execute("SELECT DISTINCT fabric_type FROM fabrics WHERE fabric_type IS NOT NULL AND fabric_type != '' AND (is_deleted IS NULL OR is_deleted = 0)") subs = [row[0] for row in cursor.fetchall() if row[0]] self.sub_combo.addItems(sorted(subs)) else: - cursor = conn.execute("SELECT DISTINCT fabric_type FROM fabrics WHERE category = ? AND fabric_type IS NOT NULL AND fabric_type != ''", (major,)) + cursor = conn.execute("SELECT DISTINCT fabric_type FROM fabrics WHERE category = ? AND fabric_type IS NOT NULL AND fabric_type != '' AND (is_deleted IS NULL OR is_deleted = 0)", (major,)) subs = [row[0] for row in cursor.fetchall() if row[0]] self.sub_combo.addItems(sorted(subs)) except: pass - + self.sub_combo.blockSignals(False) self.load_table() @@ -519,7 +519,7 @@ class RawMaterialLibraryDialog(QDialog): """加载供应商列表""" try: with self.get_conn() as conn: - cursor = conn.execute("SELECT DISTINCT supplier FROM fabrics WHERE supplier IS NOT NULL AND supplier != '' ORDER BY supplier") + cursor = conn.execute("SELECT DISTINCT supplier FROM fabrics WHERE supplier IS NOT NULL AND supplier != '' AND (is_deleted IS NULL OR is_deleted = 0) ORDER BY supplier") suppliers = [row[0] for row in cursor.fetchall()] self.supplier_combo.blockSignals(True) @@ -543,6 +543,9 @@ class RawMaterialLibraryDialog(QDialog): params = [] conditions = [] + # 过滤已删除的原料 + conditions.append("(is_deleted IS NULL OR is_deleted = 0)") + # 类目过滤 major = self.major_combo.currentText() sub = self.sub_combo.currentText() @@ -643,12 +646,13 @@ class RawMaterialLibraryDialog(QDialog): self.refresh_filters_and_table() def delete_raw(self, model): - """删除原料""" - reply = QMessageBox.question(self, "确认", f"删除 '{model}'?") + """逻辑删除原料""" + reply = QMessageBox.question(self, "确认", f"确定要删除 '{model}' 吗?\n\n此操作将标记删除该原料,不会影响历史数据。") if reply == QMessageBox.Yes: try: with self.get_conn() as conn: - conn.execute("DELETE FROM fabrics WHERE model=?", (model,)) + # 逻辑删除:设置is_deleted=1 + conn.execute("UPDATE fabrics SET is_deleted=1, updated_at=CURRENT_TIMESTAMP WHERE model=?", (model,)) conn.commit() self.load_table() QMessageBox.information(self, "成功", "删除完成") diff --git a/stock_dialog.py b/stock_dialog.py index 3980d11..7ecc5c6 100644 --- a/stock_dialog.py +++ b/stock_dialog.py @@ -58,10 +58,10 @@ class StockInDialog(QDialog): try: with self.get_conn() as conn: # 查询面料基础信息 - query = "SELECT model, color, supplier, unit FROM fabrics" + query = "SELECT model, color, supplier, unit FROM fabrics WHERE (is_deleted IS NULL OR is_deleted = 0)" params = [] if keyword: - query += " WHERE model LIKE ? OR color LIKE ?" + query += " AND (model LIKE ? OR color LIKE ?)" params = ["%" + keyword + "%", "%" + keyword + "%"] query += " ORDER BY timestamp DESC" cursor = conn.execute(query, params)