Browse Source

云端数据同步

rambo 2 tháng trước cách đây
mục cha
commit
e92a89b555
4 tập tin đã thay đổi với 133 bổ sung9 xóa
  1. 89 8
      python/api.py
  2. 36 1
      python/databases.py
  3. 7 0
      python/models.py
  4. 1 0
      python/settings.py

+ 89 - 8
python/api.py

@@ -34,6 +34,7 @@ from fastapi import BackgroundTasks
 import functools
 import traceback
 
+
 def log_exception_with_context(context_message=""):
     """装饰器:为函数添加异常日志上下文"""
 
@@ -66,16 +67,20 @@ def parserGoodsDict2Aigc(return_data_check_before_detail):
     return goods_no_dict
 
 
-async def sendAsyncMessage(msg="", goods_arts=[], status="",msg_type="",data=None):
+async def sendAsyncMessage(msg="", goods_arts=[], status="", msg_type="", data=None):
     """异步发送消息"""
     data = {
         "code": 0,
         "msg": msg,
         "status": 2,
-        "data": data if data is not None else {
-            "status": status,
-            "goods_art_nos": goods_arts,
-        },
+        "data": (
+            data
+            if data is not None
+            else {
+                "status": status,
+                "goods_art_nos": goods_arts,
+            }
+        ),
         "msg_type": msg_type,
     }
     await message_queue.put(data)
@@ -593,7 +598,9 @@ async def process_handle_detail(request: Request, params: HandlerDetail):
                         msg_type="scene_progress",
                     )
             if new_goods_dict is not None or new_goods_dict != {}:
-                return_data_check_before_detail["data"]["goods_no_dict"] = new_goods_dict
+                return_data_check_before_detail["data"][
+                    "goods_no_dict"
+                ] = new_goods_dict
         if is_upper_footer == 1:
             goods_dict = parserGoodsDict2Aigc(return_data_check_before_detail)
             new_goods_dict = {}
@@ -677,7 +684,7 @@ async def process_handle_detail(request: Request, params: HandlerDetail):
             status="开始处理详情页",
             msg_type="detail_progress",
         )
-        check_for_detail_first_res =  run_main.check_for_detail_first_call_back(
+        check_for_detail_first_res = run_main.check_for_detail_first_call_back(
             return_data_check_before_detail
         )
         if isinstance(check_for_detail_first_res, partial):
@@ -749,7 +756,7 @@ async def process_handle_detail(request: Request, params: HandlerDetail):
                                 result_goods_no_dict, online_stores=online_stores
                             )
                         except Exception as e:
-                            print(f'上传任务出现错误:{e}')
+                            print(f"上传任务出现错误:{e}")
                         await sendAsyncMessage(
                             msg="商品上传第三方成功",
                             goods_arts=[],
@@ -1192,3 +1199,77 @@ def close_other_window():
         win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
         return {"code": 0, "msg": "关闭成功", "data": {"status": True}}
     return {"code": 0, "msg": "关闭失败", "data": {"status": False}}
+
+
+@app.post("/sync_sys_configs", description="同步线上配置到本地")
+def sync_sys_configs(params: SyncLocalConfigs):
+    hlm_token = params.token
+    headers = {
+        "Authorization": f"Bearer {hlm_token}",
+        "content-type": "application/json",
+    }
+    url = settings.DOMAIN + "/api/ai_image/camera_machine/get_all_user_configs"
+    result = requests.get(url=url, headers=headers)
+    sys_configs = result.json().get("data", {}).get("configs")
+    session = SqlQuery()
+    sysConfigs = CRUD(SysConfigs)
+    if sys_configs:
+        sysConfigs.deleteConditions(session, {})
+        configList = []
+        for config_keys in sys_configs.keys():
+            sys_configs[config_keys]
+            configList.append(
+                {
+                    "key": config_keys,
+                    "value": json.dumps(sys_configs[config_keys], ensure_ascii=False),
+                }
+            )
+        batch_insert_sys_configs(session, configList)
+    else:
+        all_configs = sysConfigs.read_all(session)
+        localConfigData = {}
+        for local_config in all_configs:
+            localConfigData[local_config.key] = json.loads(local_config.value)
+        data_json = json.dumps({"configs": localConfigData}, ensure_ascii=False)
+        # 同步本地到线上
+        url = settings.DOMAIN + "/api/ai_image/camera_machine/update_all_user_configs"
+        requests.post(url=url, headers=headers, data=data_json)
+    return {"code": 0, "msg": "操作成功", "data": None}
+
+
+@app.post("/sync_actions", description="同步左右脚配置到本地")
+def sync_action_configs(params: SyncLocalConfigs):
+    hlm_token = params.token
+    headers = {
+        "Authorization": f"Bearer {hlm_token}",
+        "content-type": "application/json",
+    }
+    url = settings.DOMAIN + "/api/ai_image/camera_machine/get_all_user_tabs"
+    result = requests.get(url=url, headers=headers)
+    session = SqlQuery()
+    deviceConfigs = CRUD(DeviceConfig)
+    deviceConfigTabs = CRUD(DeviceConfigTabs)
+    tabs = result.json().get("data", {}).get("tabs")
+    actions = result.json().get("data", {}).get("actions")
+    if tabs:
+        # 先删除再创建
+        deviceConfigTabs.deleteConditions(session, {})
+        deviceConfigs.deleteConditions(session, {})
+        batch_insert_device_configsNew(session, tabs, actions)
+    else:
+        all_actions = deviceConfigs.read_all(session)
+        all_tabs = deviceConfigTabs.read_all(session)
+        all_tabs_json = [item.model_dump(mode='json') for item in all_tabs]
+        all_actions_json = [item.model_dump(mode="json") for item in all_actions]
+        data_json = json.dumps(
+            {"tabs": all_tabs_json, "actions": all_actions_json}, ensure_ascii=False
+        )
+        sync_url = settings.DOMAIN + "/api/ai_image/camera_machine/sync_actions"
+        result = requests.post(url=sync_url, headers=headers, data=data_json)
+        tabs = result.json().get("data", {}).get("tabs")
+        actions = result.json().get("data", {}).get("actions")
+        if tabs:
+            deviceConfigTabs.deleteConditions(session, {})
+            deviceConfigs.deleteConditions(session, {})
+            batch_insert_device_configsNew(session, tabs, actions)
+    return {"code": 0, "msg": "操作成功", "data": None}

+ 36 - 1
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
+from sqlalchemy import and_, desc, asc, delete
 from utils.utils_func import check_path
 from sqlalchemy.dialects import sqlite
 from model import DeviceConfig, PhotoRecord, SysConfigs, DeviceConfigTabs
@@ -51,6 +51,16 @@ class CRUD:
         session.refresh(db_obj)
         return db_obj
 
+    def truncate(self, session: Session):
+        """
+        使用SQL删除语句清空所有记录(更高效)
+        :param session: 数据库会话
+        """
+        stmt = delete(self.model)
+        result = session.exec(stmt)
+        session.commit()
+        return result.rowcount
+
     def read(
         self,
         session: Session,
@@ -198,14 +208,39 @@ def batch_insert_device_configs(session: Session, action_tabs: list, data_list:
             session.add(device_config)
     session.commit()  # 合并事务提交
 
+
+def batch_insert_device_configsNew(
+    session: Session, action_tabs: list, data_list: list
+):
+    """批量插入数据到设备配置表"""
+    for idx, tab in enumerate(action_tabs):
+        crud = CRUD(DeviceConfigTabs)
+        device_tab = DeviceConfigTabs(
+            id=tab.get("id"),
+            mode_type=tab.get("mode_type"),
+            mode_name=tab.get("mode_name"),
+        )
+        create_obj = crud.create(session, obj_in=device_tab)
+    for data in data_list:
+        # data["tab_id"] = create_obj.id
+        # data["is_system"] = False
+        # if idx in [0, 6]:
+        #     data["is_system"] = True
+        device_config = DeviceConfig(**data)
+        session.add(device_config)
+    session.commit()  # 合并事务提交
+
+
 # 批量插入系统配置
 def batch_insert_sys_configs(session: Session, data_list: list):
     """批量插入数据到设备配置表"""
     for data in data_list:
+        print("data", data, type(data))
         config = SysConfigs(**data)
         session.add(config)
     session.commit()  # 合并事务提交
 
+
 # 插入照片记录
 async def insert_photo_records(
     image_deal_mode: int, goods_art_no: str, image_index: int, action_id: int

+ 7 - 0
python/models.py

@@ -138,3 +138,10 @@ class RecordUpdate(BaseModel):
 
     id: int = Field(default=0, description="记录id")
     image_path: str = Field(default=None, description="图片地址")
+
+
+class SyncLocalConfigs(BaseModel):
+    """同步系统配置"""
+
+    token: str = Field(default=None, description="用户token")
+    

+ 1 - 0
python/settings.py

@@ -17,6 +17,7 @@ from databases import (
     batch_insert_sys_configs,
     SqlQuery,
     batch_insert_device_configs,
+    batch_insert_device_configsNew,
 )
 
 # 初始化数据表