소스 검색

```
feat(api): 添加删除所有拍照记录功能

- 新增 /delete_all_goods_arts 接口用于删除数据库中所有未删除的拍照记录
- 实现文件目录清理逻辑,复用现有的 handlerFolderDelete 函数
- 添加批量删除数据库记录功能,提高删除效率
- 包含事务处理确保数据一致性,添加异常回滚机制
- 支持同步线上状态和错误日志记录
```

rambo 1 개월 전
부모
커밋
a0da27ad66
1개의 변경된 파일45개의 추가작업 그리고 0개의 파일을 삭제
  1. 45 0
      python/api.py

+ 45 - 0
python/api.py

@@ -1223,7 +1223,52 @@ def delect_goods_arts(params: PhotoRecordDelete):
         "msg": "操作成功",
         "data": None,
     }
+@app.post("/delete_all_goods_arts", description="删除所有拍照记录")
+def delete_all_goods_arts():
+    """
+    删除数据库中所有未删除的拍照记录,并清理对应的文件目录
+    """
+    session = SqlQuery()
+    try:
+        # 1. 获取所有存在的货号
+        photos = CRUD(PhotoRecord)
+        # 查询所有 distinct 的 goods_art_no
+        statement = select(PhotoRecord.goods_art_no).where(PhotoRecord.delete_time == None).distinct()
+        all_goods_art_nos = session.exec(statement).all()
+        
+        if not all_goods_art_nos:
+            raise UnicornException("没有可删除的货号")
 
+        # 2. 清理文件目录 (复用现有的 handlerFolderDelete 逻辑)
+        limit_path = "{}/{}".format(settings.OUTPUT_DIR,
+                        time.strftime("%Y-%m-%d", time.localtime(time.time()))
+                    )
+        # 注意:handlerFolderDelete 内部可能涉及大量IO操作,如果数据量极大可能需要异步或后台任务
+        # 这里保持同步以符合原接口风格,但需注意超时风险
+        handlerFolderDelete(limit_path, list(all_goods_art_nos), False)
+
+        # 3. 同步线上状态 (如果需要)
+        for item in all_goods_art_nos:
+            settings.syncPhotoRecord({"goods_art_no": item}, action_type=2)
+
+        # 4. 批量删除数据库记录
+        # 使用 deleteConditions 一次性删除所有符合条件的记录,比循环删除效率高
+        photos.deleteConditions(session, conditions={"delete_time": None})
+        
+        session.commit() # 确保事务提交
+        
+        return {
+            "code": 0,
+            "msg": f"成功删除 {len(all_goods_art_nos)} 个货号的所有记录",
+            "data": None,
+        }
+        
+    except Exception as e:
+        session.rollback()
+        logger.error(f"删除所有记录失败: {str(e)}")
+        raise UnicornException(f"删除失败: {str(e)}")
+    finally:
+        session.close()
 
 def query_config_by_key(key_name):
     """