Ver código fonte

feat(api): 添加商品档案上传类型支持和设备控制功能

- 在API中新增item_type参数支持商品(1)和材料(2)类型上传
- 实现设备一键关机功能和照片记录删除功能
- 优化设备配置管理,过滤空值项并改进返回结果
- 添加强制自动对焦功能增强拍照体验
- 更新串口通信日志记录方式,移除调试打印语句
- 扩展遥控器控制模块支持新的消息类型处理
rambo 1 dia atrás
pai
commit
06df463ac1

+ 4 - 0
python/api.py

@@ -2321,10 +2321,13 @@ async def upload_item_to_open_api(params: OpenApiUploadItem):
     """将货号800x800目录下已抠图图片上传到开放平台商品档案"""
     goods_art_no = params.goods_art_no
     company_id = params.company_id
+    item_type = params.item_type
     if not goods_art_no:
         raise UnicornException("货号不能为空")
     if not company_id:
         raise UnicornException("企业ID不能为空")
+    if item_type not in (1, 2):
+        raise UnicornException("上传类型item_type必须为1(商品)或2(材料)")
 
     goods_path = check_goods_art_no_cutout_dir(goods_art_no)
     if not goods_path:
@@ -2368,6 +2371,7 @@ async def upload_item_to_open_api(params: OpenApiUploadItem):
                     "ImageType": image_type,
                     "CreateDate": create_date,
                     "CompanyId": company_id,
+                    "ItemType": item_type,
                 }
                 resp = requests.post(
                     f"{OPEN_API_BASE_URL}/camera/items",

+ 1 - 1
python/conifg_info.py

@@ -33,7 +33,7 @@ class ConfigManager:
             "precision": _precision,
         }
         if _addr in self.CONFIG_METADATA_BY_ADDR:
-            print("{} 有重复".format(_addr))
+            # print("{} 有重复".format(_addr))
             raise Exception("地址重复")
         self.CONFIG_METADATA_BY_ADDR[_addr] = _key
 

+ 25 - 13
python/mcu/DeviceControl.py

@@ -182,20 +182,21 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         if not self.init_state:
             self.sendSocketMessage(code=1, msg="mcu设备未初始化", device_status=4)
             return False
-        # 先收集需要删除的键
-        keys_to_delete = []
-        for item in list(self.config_manager.CONFIG_METADATA.keys()):
+        # 构建返回结果,过滤掉值为空的项,不修改原字典
+        result = {}
+        for item in self.config_manager.CONFIG_METADATA:
             item_value = self.config_manager.get_dynamic_value(self.config_manager.CONFIG_METADATA[item])
+            # time.sleep(0.01)
+            entry = dict(self.config_manager.CONFIG_METADATA[item])
             if not item_value:
-                keys_to_delete.append(item)
-                continue
-            self.config_manager.CONFIG_METADATA[item]['value'] = item_value
-
-        # 遍历结束后再删除
-        for key in keys_to_delete:
-            del self.config_manager.CONFIG_METADATA[key]
+                entry['value'] = None
+            else:
+                entry['value'] = item_value
+            result[item] = entry
 
-        return self.config_manager.CONFIG_METADATA
+        # print("CONFIG_METADATA", self.config_manager.CONFIG_METADATA)
+        # print("result", result)
+        return result
 
     def get_dynamic_config_signle(self, name):
         """
@@ -204,9 +205,20 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         data = {"addr": name}
         print("参数值打印", data)
         item_value = self.config_manager.get_dynamic_value(data)
-
+        if not item_value:
+            return None
         return item_value
 
+    def one_key_turnoff(self, device_name, flag):
+        # 一键关机
+        if device_name in self.device_name_dict:
+            device_id = self.device_name_dict[device_name]
+            buf = [self.command["mcu_power_off"],
+                   device_id,
+                   1 if flag else 0,
+                   ]
+            self.add_send_data_queue(buf)
+
     def one_key_down(self):
         cmd = [0x55, 0x55, 0x69, 0x96, 0x00, 0x03, 0x00, 0xC8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
@@ -792,7 +804,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         if not receive_data:
             return False
         command = receive_data[0]
-        print("get_basic_info_mcu", command)
+        logger.info(f"get_basic_info_mcu{command}")
         if command in self.deal_code_func_dict:
             _data = ' '.join([hex(x) for x in receive_data])
             return self.deal_code_func_dict[command](receive_data)

+ 13 - 12
python/mcu/RemoteControlV2.py

@@ -234,7 +234,7 @@ class RemoteControlV2(BaseClass):
         self.msg_type = "blue_tooth"
         self.photo_take_state = 2
 
-    async def handlerTakePhoto(self, smart_shooter=None,session=None,record=None,PointName="A",action_id=None):
+    async def handlerTakePhoto(self, smart_shooter=None, session=None, record=None, PointName="A", action_id=None):
         """处理单独拍照"""
         await asyncio.sleep(0.1)
         print("开始单拍1")
@@ -280,13 +280,14 @@ class RemoteControlV2(BaseClass):
                 None,
             )
             CameraKey = camera_configs[PointName].get("CameraKey", None)
-            print("单排CameraKey",CameraKey)
+            print("单排CameraKey", CameraKey)
             loop = asyncio.get_event_loop()
             loop.create_task(
                 smart_shooter.CameraShooter(
                     msg_type="handler_take_picture",
                     goods_art_no=record.goods_art_no,
                     id=record_id,
+                    is_af=True,  # 增加强制自动对焦
                     CameraKey=CameraKey,
                 ),
                 name="CameraShooter",
@@ -371,7 +372,7 @@ class RemoteControlV2(BaseClass):
                 # 处理遥控器单拍
                 self.msg_type = "handler_take_picture"
                 # 0 闲置;1进行中;2已完成;
-                _data = {"type": self.msg_type,"data":None}
+                _data = {"type": self.msg_type, "data": None}
                 self.sendSocketMessage(0, "处理单拍消息", data=_data, device_status=-1)
                 self.msg_type = "blue_tooth"
             if button_value in [9]:
@@ -457,10 +458,10 @@ class RemoteControlV2(BaseClass):
 
         if receive_data[0] == 111:
             value = (
-                receive_data[1] << 24
-                | receive_data[2] << 16
-                | receive_data[3] << 8
-                | receive_data[4]
+                    receive_data[1] << 24
+                    | receive_data[2] << 16
+                    | receive_data[3] << 8
+                    | receive_data[4]
             )
             print("遥控器-测试   value:{}".format(value))
             # self.windows.show_label.setText("--------{}".format(value))
@@ -472,7 +473,7 @@ class RemoteControlV2(BaseClass):
 
     # 通用串口数据解析器
     def get_data_from_receive_data(
-        self, receive_data, start, len_data, data_magnification=1
+            self, receive_data, start, len_data, data_magnification=1
     ):
         # data_magnification 数据放大倍数,或缩小倍数,默认为1
         try:
@@ -484,10 +485,10 @@ class RemoteControlV2(BaseClass):
                 return data * data_magnification
             elif len_data == 4:
                 data = (
-                    receive_data[start] << 24
-                    | receive_data[start + 1] << 16
-                    | receive_data[start + 2] << 8
-                    | receive_data[start + 3]
+                        receive_data[start] << 24
+                        | receive_data[start + 1] << 16
+                        | receive_data[start + 2] << 8
+                        | receive_data[start + 3]
                 )
                 return data * data_magnification
             return None

+ 17 - 14
python/mcu/SerialIns.py

@@ -5,6 +5,7 @@ import logging
 
 logger = logging.getLogger(__name__)
 
+
 # https://blog.csdn.net/weixin_44289254/article/details/121583562
 
 
@@ -68,7 +69,7 @@ class SerialIns(object):
             buf.extend(data)
             buf.extend([0xFF & ~sum(data)])
             # 55 55 02 5a 01 a4
-            print("send buf  {}".format(self.change_hex_to_int(buf)))
+            # print("send buf  {}".format(self.change_hex_to_int(buf)))
             # logger.info("正在发送命令======>>>>> send buf  %s", self.change_hex_to_int(buf))
             try:
                 self.serial_handle.write(buf)
@@ -122,9 +123,9 @@ class SerialIns(object):
                     if time.time() - s > out_time:
                         time.sleep(0.01)
                         return
-                _data = self.receive_data[3 : data_len + 4]
+                _data = self.receive_data[3: data_len + 4]
                 # 更新缓存区
-                self.receive_data = self.receive_data[data_len + 4 :]
+                self.receive_data = self.receive_data[data_len + 4:]
                 # 校验数据
                 if check is None:
                     if 0xFF & ~sum(_data[:-1]) == _data[-1]:
@@ -151,7 +152,7 @@ class SerialIns(object):
                 if index >= len(self.receive_data):
                     self.receive_data = b""
                 else:
-                    self.receive_data = self.receive_data[index - 1 :]
+                    self.receive_data = self.receive_data[index - 1:]
 
     def read_cmd111(self, out_time=1, check=None):
         while 1:
@@ -180,7 +181,7 @@ class SerialIns(object):
                     #     return
                     return
 
-                _data = _recv_data[3 : data_len + 4]
+                _data = _recv_data[3: data_len + 4]
                 # 校验数据
                 if check is None:
                     if 0xFF & ~sum(_data[:-1]) == _data[-1]:
@@ -205,8 +206,8 @@ class SerialIns(object):
                             self.receive_data = b""
                     else:
                         if (
-                            self.receive_data[0] == 0x55
-                            and self.receive_data[1] == 0x55
+                                self.receive_data[0] == 0x55
+                                and self.receive_data[1] == 0x55
                         ):
                             break
                         else:
@@ -225,7 +226,8 @@ class SerialIns(object):
 
             if len(self.receive_data) < 4:
                 break
-            print("read ori ", self.change_hex_to_int(self.receive_data))
+            receive_data = self.change_hex_to_int(self.receive_data)
+            logger.info(f"read ori {receive_data}")
             if self.receive_data[0] == 0x55 and self.receive_data[1] == 0x55:
                 # print("read ori ", self.change_hex_to_int(self.receive_data))
                 data_len = self.receive_data[2]
@@ -240,9 +242,9 @@ class SerialIns(object):
                     #     return None
                     # time.sleep(0.01)
                     continue
-                _data = self.receive_data[3 : data_len + 4]
+                _data = self.receive_data[3: data_len + 4]
                 # 更新缓存区
-                self.receive_data = self.receive_data[data_len + 4 :]
+                self.receive_data = self.receive_data[data_len + 4:]
                 # 校验数据
                 if 0xFF & ~sum(_data[:-1]) == _data[-1]:
                     # print("receive_data:", self.change_hex_to_int(self.receive_data[:-1]))
@@ -260,8 +262,8 @@ class SerialIns(object):
                             self.receive_data = b""
                     else:
                         if (
-                            self.receive_data[0] == 0x55
-                            and self.receive_data[1] == 0x55
+                                self.receive_data[0] == 0x55
+                                and self.receive_data[1] == 0x55
                         ):
                             break
                         else:
@@ -305,14 +307,15 @@ class SerialIns(object):
     def __del__(self):
         self.close_serial_port()
 
+
 if __name__ == "__main__":
     s = SerialIns(port_name="COM5", baud=115200, timeout=0.1)
     s.scan_serial_port()
     s.clearn_flush()
     print("-" * 30)
     for i in range(2):
-        data = [2,99,1]
-        
+        data = [2, 99, 1]
+
         s.write_cmd(data)
 
         time.sleep(0.1)

+ 1 - 0
python/models.py

@@ -218,3 +218,4 @@ class OpenApiUploadItem(BaseModel):
     """拍照机商品资料上传"""
     goods_art_no: str = Field(default=None, description="货号")
     company_id: str = Field(default=None, description="混淆企业ID")
+    item_type: int = Field(default=None, description="上传类型:1商品 2材料")

+ 28 - 0
python/sockets/message_handler.py

@@ -865,6 +865,34 @@ async def handlerSend(
                 websocket_manager=manager, smart_shooter=smart_shooter
             )
             device_ctrl.set_stepper_disable("mcu", False)
+        case "mcu_power_off":
+            device_ctrl = DeviceControl(
+                websocket_manager=manager, smart_shooter=smart_shooter
+            )
+            device_ctrl.one_key_turnoff("mcu", False)
+        case "delete_photo_record":  # 重拍
+            msg_type = "delete_photo_record"
+            record_id = data.get("record_id")
+            session = SqlQuery()
+            photoRecord = CRUD(PhotoRecord)
+            goods_art_record = photoRecord.read(session, conditions={"id": record_id, "delete_time": None})
+            if goods_art_record == None:
+                data = manager.jsonMessage(
+                    code=1,
+                    msg=f"记录不存在,请核实后重新操作~",
+                    msg_type=msg_type,
+                )
+                await manager.send_personal_message(data, websocket)
+                return
+            photoRecord.deleteConditions(session, conditions={"id": record_id, "delete_time": None})
+            session.close()
+            data = manager.jsonMessage(
+                code=0,
+                msg=f"记录删除成功",
+                msg_type=msg_type,
+            )
+            await manager.send_personal_message(data, websocket)
+            return
         case _:
             data = manager.jsonMessage(code=1, msg="未知消息")
             await manager.send_personal_message(data, websocket)