Browse Source

数据交互和拍摄记录列表

rambo 8 months ago
parent
commit
5a9d767d49

+ 40 - 1
python/api.py

@@ -1,15 +1,17 @@
 from natsort.natsort import order_by_index
 from natsort.natsort import order_by_index
+from sqlalchemy import func
 from models import *
 from models import *
 import requests
 import requests
 import json
 import json
 from logger import logger
 from logger import logger
 from serial.tools import list_ports
 from serial.tools import list_ports
+from model import PhotoRecord
 from utils.hlm_http_request import forward_request
 from utils.hlm_http_request import forward_request
 from sockets.socket_client import socket_manager
 from sockets.socket_client import socket_manager
 from mcu.DeviceControl import DeviceControl
 from mcu.DeviceControl import DeviceControl
 import time
 import time
 # from service.base_deal import  BaseDealImage
 # from service.base_deal import  BaseDealImage
-from databases import DeviceConfig,SqlQuery,CRUD
+from databases import DeviceConfig, SqlQuery, CRUD, select
 
 
 @app.get("/")
 @app.get("/")
 async def index():
 async def index():
@@ -207,3 +209,40 @@ def reset_config(params: ModelGetDeviceConfig):
             act.append(item)
             act.append(item)
     batch_insert_device_configs(session, act)
     batch_insert_device_configs(session, act)
     return {"code": 0, "msg": "操作成功", "data": None}
     return {"code": 0, "msg": "操作成功", "data": None}
+
+
+@app.get("/get_photo_records", description="获取拍照记录")
+def get_photo_records(page: int=1,size:int=3):
+
+    session = SqlQuery()
+    photos = CRUD(PhotoRecord)
+    statement = (
+        select(PhotoRecord)
+        .offset((page - 1) * size)
+        .limit(size)
+        .group_by("goods_art_no")
+    )
+    list = []
+    result = session.exec(statement).all()
+    for item in result:
+        list_item = photos.read_all(session, conditions={"goods_art_no": item.goods_art_no})
+        list.append({"goods_art_no": item.goods_art_no, "items": list_item})
+    return {
+        "code": 0,
+        "msg": "",
+        "data": {"list": list, "page": page, "size": size},
+    }
+
+
+@app.post("/delect_goods_arts", description="通过货号删除记录")
+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})
+    return {
+        "code": 0,
+        "msg": "操作成功",
+        "data": None,
+    }

+ 6 - 2
python/databases.py

@@ -30,10 +30,14 @@ def batch_insert_device_configs(session: Session, data_list: list):
     session.commit()
     session.commit()
 
 
 
 
-def insert_photo_records(image_deal_mode:int,goods_art_no: str):
+def insert_photo_records(image_deal_mode: int, goods_art_no: str, image_index:int):
     session = SqlQuery()
     session = SqlQuery()
     """批量插入数据到照片记录"""
     """批量插入数据到照片记录"""
-    data = {"image_deal_mode": image_deal_mode, "goods_art_no": goods_art_no}
+    data = {
+        "image_deal_mode": image_deal_mode,
+        "goods_art_no": goods_art_no,
+        "image_index": image_index,
+    }
     device_config = PhotoRecord(**data)
     device_config = PhotoRecord(**data)
     session.add(device_config)
     session.add(device_config)
     session.commit()
     session.commit()

+ 31 - 3
python/docs/socket命令.md

@@ -89,19 +89,47 @@ _(该命令用于单独自定义配置中某一项的单独调整测试,不进
 * data参数释义:
 * data参数释义:
     * image_counts : 执行拍照任务的数量,可理解为照片张数
     * image_counts : 执行拍照任务的数量,可理解为照片张数
     * goods_art_no : 货号
     * goods_art_no : 货号
+    * current_time : 当前时间
 * msg 消息提示
 * msg 消息提示
 #### 响应示例
 #### 响应示例
 ```python
 ```python
 {
 {
     "msg":"MCU 命令已发送完成",
     "msg":"MCU 命令已发送完成",
     "data": {
     "data": {
-        "image_counts": "执行左脚程序",
-        "goods_art_no": "1234556"
+        "image_counts": 4,
+        "goods_art_no": "1234556",
+        "current_time": "年月日时分秒"
     },
     },
     "msg_type":"image_process"
     "msg_type":"image_process"
 }
 }
 ```
 ```
-
+### 单张照片拍照完成后-服务端响应消息
+* msg_type 为photo_take时,代表拍照已完成
+* data参数释义:
+    * image_counts : 执行拍照任务的数量,可理解为照片张数
+    * goods_art_no : 货号
+    * current_time : 当前时间
+* msg 消息提示
+#### 响应示例-拍照成功
+```python
+{
+    "code": 0,
+    "msg": "拍鞋底 执行完成~",
+    "status": 2,
+    "data": null,
+    "msg_type":"photo_take"
+}
+```
+#### 响应示例-拍照成功
+```python
+{
+    "code": 1,
+    "msg": "拍鞋底 执行失败~",
+    "status": 2,
+    "data": null,
+    "msg_type":"photo_take"
+}
+```
 ### 接收遥控器扫码货号动作处理
 ### 接收遥控器扫码货号动作处理
 #### 消息示例
 #### 消息示例
 * data中的子data参数释义:
 * data中的子data参数释义:

+ 11 - 3
python/mcu/DeviceControl.py

@@ -1,4 +1,5 @@
 import asyncio
 import asyncio
+import datetime
 import serial.tools.list_ports
 import serial.tools.list_ports
 import time, json
 import time, json
 from .SerialIns import SerialIns
 from .SerialIns import SerialIns
@@ -1150,13 +1151,13 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             return
             return
         image_counts = 0
         image_counts = 0
         if config_list:
         if config_list:
-            for _, item in enumerate(config_list):
+            for idx, item in enumerate(config_list):
                 is_take_picture = item["take_picture"]
                 is_take_picture = item["take_picture"]
                 if is_take_picture:
                 if is_take_picture:
                     image_counts += 1
                     image_counts += 1
                     # 批量插入
                     # 批量插入
                     image_deal_mode = 0 if action_info == "执行左脚程序" else 1
                     image_deal_mode = 0 if action_info == "执行左脚程序" else 1
-                    insert_photo_records(image_deal_mode, goods_art_no)
+                    insert_photo_records(image_deal_mode=image_deal_mode, goods_art_no=goods_art_no, image_index=idx)
             total_len = len(config_list)
             total_len = len(config_list)
             self.action_state = 1
             self.action_state = 1
             self.msg_type = "image_process"
             self.msg_type = "image_process"
@@ -1167,22 +1168,29 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 data={
                 data={
                     "goods_art_no": goods_art_no,
                     "goods_art_no": goods_art_no,
                     "image_counts": image_counts,
                     "image_counts": image_counts,
+                    "current_time":datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                 },
                 },
             )
             )
             self.msg_type = "mcu"
             self.msg_type = "mcu"
             for index, action in enumerate(config_list):
             for index, action in enumerate(config_list):
                 await asyncio.sleep(0.1)
                 await asyncio.sleep(0.1)
+                action_is_take_picture = action["take_picture"]
+                image_index = -1
+                if action_is_take_picture:
+                    image_index = index
                 program_item = ProgramItem(
                 program_item = ProgramItem(
                     websocket_manager=self.websocket_manager,
                     websocket_manager=self.websocket_manager,
                     action_data=action,
                     action_data=action,
                     mcu=self,
                     mcu=self,
                     goods_art_no=goods_art_no,
                     goods_art_no=goods_art_no,
+                    image_index=image_index,
                 )
                 )
                 print("self.action_state===>", self.action_state)
                 print("self.action_state===>", self.action_state)
                 if self.action_state != 1:
                 if self.action_state != 1:
                     # 异常终止
                     # 异常终止
                     print("action异常终止")
                     print("action异常终止")
                     break
                     break
+                self.msg_type = "photo_take"
                 if not program_item.run(total_len):
                 if not program_item.run(total_len):
                     self.sendSocketMessage(
                     self.sendSocketMessage(
                         code=1,
                         code=1,
@@ -1198,7 +1206,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                         msg="{} 执行完成~".format(program_item.action_name),
                         msg="{} 执行完成~".format(program_item.action_name),
                         device_status=2,
                         device_status=2,
                     )
                     )
-
+                self.msg_type = "mcu"
                 # 在第三张图时检查是否有对应图片生成
                 # 在第三张图时检查是否有对应图片生成
                 # if index == 3:
                 # if index == 3:
                 #     # if not self.image_process_data.check_photo_is_get():
                 #     # if not self.image_process_data.check_photo_is_get():

+ 3 - 1
python/mcu/ProgramItem.py

@@ -11,7 +11,7 @@ class ProgramItem(BaseClass):
     # program_sign = Signal(dict)
     # program_sign = Signal(dict)
     # program_refresh_photo_list_sign = Signal()
     # program_refresh_photo_list_sign = Signal()
 
 
-    def __init__(self,websocket_manager, action_data:any, mcu, goods_art_no:str=None):
+    def __init__(self,websocket_manager, action_data:any, mcu, goods_art_no:str=None,image_index:int=-1):
         super().__init__(BaseClass)
         super().__init__(BaseClass)
         # 1 表示等待中,2表示没有等待
         # 1 表示等待中,2表示没有等待
         self.wait_state = 2
         self.wait_state = 2
@@ -19,6 +19,8 @@ class ProgramItem(BaseClass):
         self.capture_one = DigiCam()
         self.capture_one = DigiCam()
         captrure_folder_path = self.capture_one.getCaptureFolderPath()
         captrure_folder_path = self.capture_one.getCaptureFolderPath()
         self.watch_dog = FileEventHandler()
         self.watch_dog = FileEventHandler()
+        self.watch_dog.goods_art_no = goods_art_no
+        self.watch_dog.image_index = image_index
         self.watch_dog.start_observer(captrure_folder_path)
         self.watch_dog.start_observer(captrure_folder_path)
         print("21 =========ProgramItem=======action_data=====")
         print("21 =========ProgramItem=======action_data=====")
         print(action_data)
         print(action_data)

+ 33 - 0
python/mcu/capture/module_watch_dog.py

@@ -7,6 +7,30 @@ from utils.utils_func import get_folder, check_path
 import datetime
 import datetime
 from utils.SingletonType import SingletonType
 from utils.SingletonType import SingletonType
 from databases import CRUD,SqlQuery,PhotoRecord
 from databases import CRUD,SqlQuery,PhotoRecord
+from databases import CRUD, SqlQuery, PhotoRecord
+def updateImageRaw(time_str, image_path, goods_art_no, image_index):
+    session = SqlQuery()
+    crud = CRUD(PhotoRecord)
+    res = crud.read(
+        session,
+        conditions={
+            "image_path": None,
+            "goods_art_no": goods_art_no,
+            "image_index": image_index,
+        },
+    )
+    if res:
+        # 格式化为年月日时分
+        update = {
+            "image_path": image_path,
+            "photo_create_time": time_str,
+        }
+        crud.update(
+            session,
+            res.id,
+            **update,
+        )
+
 
 
 class FileEventHandler(FileSystemEventHandler, metaclass=SingletonType):
 class FileEventHandler(FileSystemEventHandler, metaclass=SingletonType):
     instance = None
     instance = None
@@ -17,6 +41,8 @@ class FileEventHandler(FileSystemEventHandler, metaclass=SingletonType):
         #     return
         #     return
         # else:
         # else:
         #     self.init_flag = True
         #     self.init_flag = True
+        self.goods_art_no = None
+        self.image_index = -1
         super().__init__()
         super().__init__()
         # self.window = window
         # self.window = window
         FileSystemEventHandler.__init__(self)
         FileSystemEventHandler.__init__(self)
@@ -97,6 +123,13 @@ class FileEventHandler(FileSystemEventHandler, metaclass=SingletonType):
                 # print("获取文件create_time:{}".format(create_time))
                 # print("获取文件create_time:{}".format(create_time))
                 self.get_photo_info(raw_path=file_path, create_time=create_time, take_time=take_time)
                 self.get_photo_info(raw_path=file_path, create_time=create_time, take_time=take_time)
                 self.send_log("获取文件create_time:{}".format(create_time))
                 self.send_log("获取文件create_time:{}".format(create_time))
+                if self.goods_art_no == None:
+                    print("货号不存在,监听不写入")
+                    return
+                if file_path == None:
+                    print("file_path不存在,监听不写入")
+                    return
+                updateImageRaw(create_time, file_path, self.goods_art_no,self.image_index)
             except BaseException as e:
             except BaseException as e:
                 print("获取文件create_time失败", e)
                 print("获取文件create_time失败", e)
                 self.send_log("获取文件处理失败{}".format(e))
                 self.send_log("获取文件处理失败{}".format(e))

+ 4 - 0
python/models.py

@@ -46,3 +46,7 @@ class SaveDeviceConfig(BaseModel):
     is_need_confirm: Optional[bool] = Field(default=False)
     is_need_confirm: Optional[bool] = Field(default=False)
 
 
 
 
+class PhotoRecordDelete(BaseModel):
+    """获取可执行程序命令列表"""
+
+    goods_art_nos: list[str] = Field(default=None, description="货号数组")

+ 4 - 5
python/temp.py

@@ -6,15 +6,14 @@ crud = CRUD(PhotoRecord)
 res = crud.read(session,conditions={"image_path":None})
 res = crud.read(session,conditions={"image_path":None})
 if res:
 if res:
     time_str = "2025-03-26 19:29:39.954187"
     time_str = "2025-03-26 19:29:39.954187"
-    time_str_without_ms = time_str.split(".")[0]
+    dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f")
+    # 格式化为年月日时分
+    formatted_time_str = dt.strftime("%Y-%m-%d %H:%M:%S")
     update = {
     update = {
         "image_path": "sadasda",
         "image_path": "sadasda",
         "image_index": 0,
         "image_index": 0,
-        "photo_create_time": datetime.strptime(
-            time_str_without_ms, "%Y-%m-%d %H:%M"
-        ),
+        "photo_create_time": datetime.strptime(formatted_time_str, "%Y-%m-%d %H:%M:%S"),
     }
     }
-    res.__dict__
     crud.update(
     crud.update(
         session,
         session,
         res.id,
         res.id,