فهرست منبع

```
feat(api): 查询时过滤已删除的拍摄记录

在多个接口中添加了对 `delete_time` 字段的条件过滤,
确保查询结果不包含已被软删除的数据。同时优化了数据库
CRUD 类中的删除逻辑,支持根据模型是否存在 `delete_time`
字段来决定执行软删除或硬删除操作。
```

rambo 1 ماه پیش
والد
کامیت
93a2f2bc58
4فایلهای تغییر یافته به همراه36 افزوده شده و 18 حذف شده
  1. 8 6
      python/api.py
  2. 22 6
      python/databases.py
  3. 5 5
      python/sockets/message_handler.py
  4. 1 1
      python/sockets/socket_server.py

+ 8 - 6
python/api.py

@@ -382,7 +382,7 @@ async def _process_non_excel_mode(params, goods_art_no_arrays):
             
         session = SqlQuery()
         pr = CRUD(PhotoRecord)
-        images = pr.read_all(session, conditions={"goods_art_no": goods_art_no})
+        images = pr.read_all(session, conditions={"goods_art_no": goods_art_no,"delete_time": None})
         session.close()
         if not images:
             raise UnicornException(
@@ -413,7 +413,7 @@ async def _process_excel_mode(goods_art_no_arrays,excel_df):
             if not goods_art_no:
                 raise UnicornException("货号不能为空")
             pr = CRUD(PhotoRecord)
-            images = pr.read_all(session, conditions={"goods_art_no": goods_art_no})
+            images = pr.read_all(session, conditions={"goods_art_no": goods_art_no,"delete_time": None})
             if not images:
                 raise UnicornException(
                     f"商品货号【{goods_art_no}】未查询到拍摄记录,请检查表格中的货号数据列"
@@ -1091,6 +1091,7 @@ def get_photo_records(page: int = 1, size: int = 5):
         select(PhotoRecord)
         .offset((page - 1) * size)
         .limit(size)
+        .where(PhotoRecord.delete_time == None)
         .order_by(desc("id"))
         .group_by("goods_art_no")
     )
@@ -1133,6 +1134,7 @@ def get_last_photo_record():
     statement = (
         select(PhotoRecord)
         .where(PhotoRecord.image_path != None)
+        .where(PhotoRecord.delete_time == None)
         .order_by(desc("photo_create_time"))
     )
     result = session.exec(statement).first()
@@ -1150,7 +1152,7 @@ def get_photo_record_detail(goods_art_no: str = None):
         return {"code": 1, "msg": "参数错误", "data": None}
     session = SqlQuery()
     photos = CRUD(PhotoRecord)
-    items = photos.read_all(session, conditions={"goods_art_no": goods_art_no})
+    items = photos.read_all(session, conditions={"goods_art_no": goods_art_no,"delete_time": None})
     session.close()
     return {
         "code": 0,
@@ -1168,7 +1170,7 @@ def delect_goods_arts(params: PhotoRecordDelete):
     session = SqlQuery()
     photos = CRUD(PhotoRecord)
     for item in params.goods_art_nos:
-        photos.deleteConditions(session, conditions={"goods_art_no": item})
+        photos.deleteConditions(session, conditions={"goods_art_no": item,"delete_time": None})
     session.close()
     return {
         "code": 0,
@@ -1248,7 +1250,7 @@ def update_left_right_config(params: LeftRightParams):
 def update_record(params: RecordUpdate):
     session = SqlQuery()
     photoRecord = CRUD(PhotoRecord)
-    model = photoRecord.read(session, conditions={"id": params.id})
+    model = photoRecord.read(session, conditions={"id": params.id,"delete_time": None})
     if model == None:
         return {"code": 1, "msg": "记录不存在", "data": None}
     kwargs = params.__dict__
@@ -1486,7 +1488,7 @@ def get_goods_image_json(goods_art_no: str,token:str):
     session = SqlQuery()
     photoRecord = CRUD(PhotoRecord)
     goods_art_record = photoRecord.read_all(
-        session, conditions={"goods_art_no": goods_art_no}
+        session, conditions={"goods_art_no": goods_art_no,"delete_time": None}
     )
     if not goods_art_record:
         raise UnicornException("该货号拍摄记录不存在")

+ 22 - 6
python/databases.py

@@ -4,7 +4,7 @@ from typing import Dict
 from datetime import datetime
 from typing import Optional
 import json
-from sqlalchemy import and_, desc, asc, delete
+from sqlalchemy import and_, desc, asc, delete,inspect
 from utils.utils_func import check_path
 from sqlalchemy.dialects import sqlite
 from model import DeviceConfig, PhotoRecord, SysConfigs, DeviceConfigTabs
@@ -141,8 +141,10 @@ class CRUD:
         conditions: Optional[Dict] = None,
     ):
         query = select(self.model)
-        if conditions == None:
+        if conditions is None:
             return False
+        
+        # 构建查询条件
         query = query.where(
             and_(
                 *(
@@ -151,11 +153,25 @@ class CRUD:
                 )
             )
         )
+        
+        # 获取需要删除的对象
         objects_to_delete = session.exec(query).all()
-        for obj in objects_to_delete:
-            session.delete(obj)
-        session.commit()
-        # session.refresh()
+        
+        # 检查模型是否包含 delete_time 字段
+        model_columns = {column.name for column in inspect(self.model).columns}
+        if 'delete_time' in model_columns:
+            # 软删除:更新 delete_time 字段
+            for obj in objects_to_delete:
+                setattr(obj, 'delete_time', datetime.now())
+            session.commit()
+            print("软删除完成")
+        else:
+            # 硬删除:直接删除对象
+            for obj in objects_to_delete:
+                session.delete(obj)
+            session.commit()
+            print("硬删除完成")
+        
         return True
 
     def delete(self, session: Session, obj_id: int):

+ 5 - 5
python/sockets/message_handler.py

@@ -211,7 +211,7 @@ async def handlerSend(
             tab_id = action_configs_json.get(action_flag)
             photoRecord = CRUD(PhotoRecord)
             goods_art_record = photoRecord.read(
-                session, conditions={"goods_art_no": goods_art_no}
+                session, conditions={"goods_art_no": goods_art_no,"delete_time": None}
             )
             if goods_art_record != None:
                 data = manager.jsonMessage(
@@ -264,7 +264,7 @@ async def handlerSend(
             )
             session = SqlQuery()
             crud = CRUD(PhotoRecord)
-            record = crud.read(session=session, order_by="id", ascending=False)
+            record = crud.read(session=session, order_by="id", ascending=False,conditions={"delete_time": None})
             if record == None:
             # 发送失败消息
                 data = manager.jsonMessage(
@@ -298,7 +298,7 @@ async def handlerSend(
             record_id = data.get("record_id")
             session = SqlQuery()
             photoRecord = CRUD(PhotoRecord)
-            goods_art_record = photoRecord.read(session, conditions={"id": record_id})
+            goods_art_record = photoRecord.read(session, conditions={"id": record_id,"delete_time": None})
             if goods_art_record == None:
                 data = manager.jsonMessage(
                     code=1,
@@ -469,7 +469,7 @@ async def handlerSend(
             goods_art_no = data.get("goods_art_no", "")
             session = SqlQuery()
             photoRecord = CRUD(PhotoRecord)
-            goods_art_record = photoRecord.read(session, conditions={"id": id})
+            goods_art_record = photoRecord.read(session, conditions={"id": id,"delete_time": None})
             if goods_art_record == None:
                 data = manager.jsonMessage(
                     code=1,
@@ -515,7 +515,7 @@ async def handlerSend(
             session = SqlQuery()
             for goods_art_no in goods_art_no_arrays:
                 pr = CRUD(PhotoRecord)
-                images = pr.read_all(session, conditions={"goods_art_no": goods_art_no})
+                images = pr.read_all(session, conditions={"goods_art_no": goods_art_no,"delete_time": None})
                 if not images:
                     data = manager.jsonMessage(
                         code=1,

+ 1 - 1
python/sockets/socket_server.py

@@ -28,7 +28,7 @@ async def updateDataRecord(PhotoFilename, id):
     # record_model = PhotoRecord(**data)
     session = SqlQuery()
     record_model = CRUD(PhotoRecord)
-    model = record_model.read(session, conditions={"id": id})
+    model = record_model.read(session, conditions={"id": id,"delete_time": None})
     if model == None:
         print(f"smart shooter 拍照记录更新失败,记录id:{id},不存在")
     else: