Selaa lähdekoodia

```
feat(api): 添加图片记录同步功能和组合21支持

- 在删除商品图片时同步照片记录到远程服务
- 为同步系统配置和操作配置设置用户令牌和环境变量
- 新增syncPhotoRecord接口用于同步本地拍照记录
- 在图片插入、更新和删除操作时调用同步功能
- 扩展图片处理功能,支持组合21选项
- 更新PhotoRecord模型字段类型为字符串格式
- 添加调试信息输出便于问题排查
```

rambo 2 viikkoa sitten
vanhempi
commit
51bcdc12b4

+ 34 - 0
python/api.py

@@ -1211,6 +1211,7 @@ def delect_goods_arts(params: PhotoRecordDelete):
     session = SqlQuery()
     photos = CRUD(PhotoRecord)
     for item in params.goods_art_nos:
+        settings.syncPhotoRecord({"goods_art_no": item},action_type=2)
         photos.deleteConditions(session, conditions={"goods_art_no": item,"delete_time": None})
     session.close()
     return {
@@ -1436,6 +1437,8 @@ def syncUserJsonConfigs(token):
 def sync_sys_configs(params: SyncLocalConfigs):
     hlm_token = params.token
     env = params.env
+    settings.USER_TOKEN = hlm_token
+    settings.USER_ENV = env
     headers = {
         "Authorization": f"Bearer {hlm_token}",
         "content-type": "application/json",
@@ -1475,6 +1478,8 @@ def sync_sys_configs(params: SyncLocalConfigs):
 def sync_action_configs(params: SyncLocalConfigs):
     hlm_token = params.token
     env = params.env
+    settings.USER_TOKEN = hlm_token
+    settings.USER_ENV = env
     headers = {
         "Authorization": f"Bearer {hlm_token}",
         "content-type": "application/json",
@@ -1680,3 +1685,32 @@ async def remove_background(params:PhotoRecordRemoveBackground):
     except Exception as e:
         print("error",e)
         raise UnicornException(f"抠图异常,请稍后重试:{e}")
+
+
+@app.post("/syncPhotoRecord", description="同步本地拍照记录-和output目录")
+async def syncPhotoRecord(params:SyncPhotoRecord):
+    # 查询所有不重复的货号及对应的最大时间,进行分页
+    settings.USER_TOKEN = params.token
+    settings.USER_ENV = params.env
+    session = SqlQuery()
+    base_statement = (
+        select(PhotoRecord)
+        .where(PhotoRecord.delete_time == None)
+    )
+    paginated_results = session.exec(base_statement).all()
+    
+    def model_to_dict(model):
+        """将SQLAlchemy模型对象转换为字典,排除_sa_instance_state"""
+        result = {}
+        for column in model.__table__.columns:
+            result[column.name] = getattr(model, column.name)
+        return result
+    
+    json_results = []
+    for result in paginated_results:
+        # 使用自定义函数将SQLAlchemy对象转换为字典
+        json_results.append(model_to_dict(result))
+    # 最终转换为JSON字符串
+    settings.syncPhotoRecord(json_results,action_type=0)
+    session.close()
+    return {"code": 0, "message": "同步完成", "data": None}

+ 10 - 0
python/databases.py

@@ -5,6 +5,7 @@ from datetime import datetime
 from typing import Optional
 import json
 from sqlalchemy import and_, desc, asc, delete,inspect
+import settings
 from utils.utils_func import check_path
 from sqlalchemy.dialects import sqlite
 from model import DeviceConfig, PhotoRecord, SysConfigs, DeviceConfigTabs
@@ -303,6 +304,15 @@ async def insert_photo_records(
         session.commit()
         session.refresh(device_config)
         record_id = device_config.id
+        syncData = {
+            "id": record_id,
+            "image_deal_mode": image_deal_mode,
+            "goods_art_no": goods_art_no,
+            "image_index": image_index,
+            "action_id": action_id,
+        }
+        # 异步插入一条数据
+        settings.syncPhotoRecord(syncData,action_type=1)
         return True, record_id
 
 

+ 8 - 6
python/model/photo_record.py

@@ -1,6 +1,6 @@
 from sqlmodel import SQLModel, Field
 from datetime import datetime
-from typing import Optional
+from typing import Optional, Union
 import pytz
 
 TIME_ZONE = pytz.timezone("Asia/Shanghai")
@@ -12,9 +12,11 @@ class PhotoRecord(SQLModel, table=True):
     image_path: Optional[str] = Field(default=None)
     image_index: Optional[int] = Field(default=None)
     image_deal_mode: Optional[int] = Field(default=None)
-    photo_create_time: Optional[datetime] = Field(default=None)
-    update_time: Optional[datetime] = Field(
-        default_factory=lambda: datetime.now(TIME_ZONE)
+    photo_create_time: Optional[str] = Field(default=None)
+    update_time: Optional[str] = Field(
+        default_factory=lambda: datetime.now(TIME_ZONE).strftime("%Y-%m-%d %H:%M:%S")
     )
-    create_time: Optional[datetime] = Field(default_factory=lambda: datetime.now(TIME_ZONE))
-    delete_time: Optional[datetime] = Field(default=None)
+    create_time: Optional[str] = Field(
+        default_factory=lambda: datetime.now(TIME_ZONE).strftime("%Y-%m-%d %H:%M:%S")
+    )
+    delete_time: Optional[str] = Field(default=None)

+ 8 - 1
python/models.py

@@ -159,4 +159,11 @@ class PhotoRecordRemoveBackground(BaseModel):
     """获取可执行程序命令列表"""
 
     goods_art_nos: list[str] = Field(default=None, description="货号数组")
-    token: str = Field(default=None, description="用户token")
+    token: str = Field(default=None, description="用户token")
+    
+    
+class SyncPhotoRecord(BaseModel):
+    """同步图片记录"""
+
+    token: str = Field(default=None, description="用户token")
+    env: str = Field(default="dev", description="当前环境")

+ 1 - 0
python/service/auto_deal_pics/base_deal.py

@@ -194,6 +194,7 @@ class BaseDealImage(object):
                 "组合18",
                 "组合19",
                 "组合20",
+                "组合21",
                 "组合22",
                 "组合23",
                 "组合24",

+ 3 - 0
python/service/base_deal.py

@@ -238,6 +238,7 @@ class BaseDealImage(object):
         imageOrderList = (
             image_order.replace(",", ",").replace(" ", "").replace("图", "").split(",")
         )
+        print("imageOrderList",imageOrderList)
         if len(set(imageOrderList)) != len(imageOrderList):
             return {"code": 1, "msg": "图片位置与顺序重复,请检查您的输入"}
 
@@ -268,6 +269,7 @@ class BaseDealImage(object):
                 "组合18",
                 "组合19",
                 "组合20",
+                "组合21",
                 "组合22",
                 "组合23",
                 "组合24",
@@ -275,6 +277,7 @@ class BaseDealImage(object):
                 "组合26",
             ]
             if val not in image_orders:
+                print("val",val)
                 image_orders_str = ','.join(map(str, image_orders))
                 return {
                     "code": 1,

+ 1 - 0
python/service/match_and_cutout_mode_control/base_deal_image_v2.py

@@ -207,6 +207,7 @@ class BaseDealImage(object):
                 "组合18",
                 "组合19",
                 "组合20",
+                "组合21",
                 "组合22",
                 "组合23",
                 "组合24",

+ 13 - 1
python/settings.py

@@ -20,6 +20,8 @@ from databases import (
     batch_insert_device_configs,
     batch_insert_device_configsNew,
 )
+USER_TOKEN = None  # 可以通过外部设置或从配置文件中加载
+USER_ENV = None  # 可以通过外部设置或从配置文件中加载
 # 追加配置参数 machine_type 拍照机设备类型;0鞋;1服装
 MACHINE_TYPE = 0
 # 初始化数据表
@@ -297,7 +299,17 @@ def recordDataPoint(token=None, page="", uuid=None, data=""):
     return requests.post(
         headers=headers, data=json.dumps(params), url=DOMAIN + "/api/record/point"
     )
-
+def syncPhotoRecord(data,action_type=0):
+    """同步图片记录"""
+    headers = {
+        "Authorization": f"Bearer {USER_TOKEN}",
+        "content-type": "application/json",
+    }
+    machine_type = MACHINE_TYPE
+    url = getDoman(USER_ENV) + f"/api/ai_image/camera_machine/photo_records_handler"
+    postData = {"data":data,"machine_type":machine_type,'action_type':action_type}
+    response = requests.post(url=url,data=json.dumps(postData, ensure_ascii=False, default=str), headers=headers)
+    print("用户token",response.content)
 
 async def sendSocketMessage(
     code=0, msg="", data=None, device_status=2, msg_type=""

+ 1 - 0
python/sockets/socket_server.py

@@ -33,6 +33,7 @@ async def updateDataRecord(PhotoFilename, id):
         print(f"smart shooter 拍照记录更新失败,记录id:{id},不存在")
     else:
         # 走编辑逻辑
+        settings.syncPhotoRecord(data,action_type=3)
         record_model.updateConditions(session, conditions={"id": id}, **data)
         print(f"smart shooter 拍照记录更新成功,记录id:{id}")
     session.close()