소스 검색

Merge branch 'bug_fix_merge' into cloud_configs

rambo 2 달 전
부모
커밋
aaf060d656
36개의 변경된 파일351개의 추가작업 그리고 68개의 파일을 삭제
  1. 76 5
      python/api.py
  2. 67 4
      python/custom_plugins/plugins/detail_template/hongqingting/detail_hongqingting2.py
  3. 72 3
      python/custom_plugins/plugins/detail_template/hongqingting/detail_hongqingting3.py
  4. 1 1
      python/mcu/BaseClass.py
  5. 59 37
      python/mcu/DeviceControl.py
  6. 15 7
      python/mcu/ProgramItem.py
  7. 1 0
      python/models.py
  8. 56 7
      python/service/online_request/module_online_data.py
  9. 3 3
      python/service/run_main.py
  10. 1 1
      python/sockets/message_handler.py
  11. BIN
      测试文件夹2/BX72000015/200images/BX72000015(1).jpg
  12. BIN
      测试文件夹2/BX72000015/800x800/BX72000015(1)_1600.png
  13. BIN
      测试文件夹2/BX72000015/800x800/BX72000015(2)_1600.png
  14. BIN
      测试文件夹2/BX72000015/800x800/BX72000015(3)_1600.png
  15. BIN
      测试文件夹2/BX72000015/800x800/BX72000015(4)_1600.png
  16. BIN
      测试文件夹2/BX72000015/800x800/BX72000015(5)_1600.png
  17. BIN
      测试文件夹2/BX72000015/原始图/BX72000015(1).jpg
  18. BIN
      测试文件夹2/BX72000015/原始图/BX72000015(2).jpg
  19. BIN
      测试文件夹2/BX72000015/原始图/BX72000015(3).jpg
  20. BIN
      测试文件夹2/BX72000015/原始图/BX72000015(4).jpg
  21. BIN
      测试文件夹2/BX72000015/原始图/BX72000015(5).jpg
  22. BIN
      测试文件夹2/BX72000015/原始图_已抠图/BX72000015(1).png
  23. BIN
      测试文件夹2/BX72000015/原始图_已抠图/BX72000015(2).png
  24. BIN
      测试文件夹2/BX72000015/原始图_已抠图/BX72000015(3).png
  25. BIN
      测试文件夹2/BX72000015/原始图_已抠图/BX72000015(4).png
  26. BIN
      测试文件夹2/BX72000015/原始图_已抠图/BX72000015(5).png
  27. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(1)_俯视_抠图.png
  28. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(1)_俯视_阴影.png
  29. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(2)_侧视_抠图.png
  30. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(2)_侧视_阴影.png
  31. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(3)_后跟_抠图.png
  32. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(3)_后跟_阴影.png
  33. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(4)_鞋底_抠图.png
  34. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(4)_鞋底_阴影.png
  35. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(5)_内里_抠图.png
  36. BIN
      测试文件夹2/BX72000015/阴影图处理/BX72000015(5)_内里_阴影.png

+ 76 - 5
python/api.py

@@ -185,7 +185,9 @@ async def fromExcelHandler(params: HandlerDetail):
         pr = CRUD(PhotoRecord)
         images = pr.read_all(session, conditions={"goods_art_no": goods_art_no})
         if not images:
-            raise UnicornException("没有可用货号数据")
+            raise UnicornException(
+                f"商品货号【{goods_art_no}】在商品档案资料中不存在,请检查货号是否正确"
+            )
         # 货号目录不存在再去进行移动和创建操作
         if move_folder_array.get(goods_art_no) == None:
             image_dir = "{}/data/".format(os.getcwd()).replace("\\", "/")
@@ -352,7 +354,68 @@ def group_by_style_number(data):
 async def handle_detail_background(
     request: Request, params: HandlerDetail, background_tasks: BackgroundTasks
 ):
-    # background_tasks.add_task(process_handle_detail, request, params)
+    goods_art_no_arrays = params.goods_art_no
+    is_check = params.is_check
+    is_only_cutout = params.is_only_cutout  # 是否仅抠图
+    if is_only_cutout == 1:
+        # 如果是仅抠图模式,避免进入到excel模式
+        params.excel_path = ""
+    if params.excel_path != "" and params.excel_path != None:
+        return await fromExcelHandler(params)
+    path = ""
+    limit_path = "output/{}".format(
+        time.strftime("%Y-%m-%d", time.localtime(time.time()))
+    )
+    check_path(limit_path)
+    # 该数组表示是否需要后面的移动文件夹操作,减少重复抠图,提升抠图时间和速度
+    move_folder_array = check_move_goods_art_no_folder(
+        "output", goods_art_no_arrays, limit_path
+    )
+    try:
+        for goods_art_no in goods_art_no_arrays:
+            if not goods_art_no:
+                raise UnicornException("货号不能为空")
+            session = SqlQuery()
+            pr = CRUD(PhotoRecord)
+            images = pr.read_all(session, conditions={"goods_art_no": goods_art_no})
+            if not images:
+                raise UnicornException(
+                    f"商品货号【{goods_art_no}】在商品档案资料中不存在,请检查货号是否正确"
+                )
+            if is_only_cutout != 1:
+                detail_counts = len(params.template_image_order.split(","))
+                image_counts = len(images)
+                if image_counts < detail_counts:
+                    raise UnicornException(
+                        f"货号:[{goods_art_no}],实际照片数量:{image_counts}张,小于详情图要求数量:{detail_counts}张"
+                    )
+            if move_folder_array.get(goods_art_no) == None:
+                image_dir = "{}/data/".format(os.getcwd()).replace("\\", "/")
+                check_path(image_dir)
+                for idx, itemImg in enumerate(images):
+                    if itemImg.image_path == "" or itemImg.image_path == None:
+                        raise UnicornException(
+                            f"货号【{goods_art_no}】存在没有拍摄完成的图片,请重拍或删除后重试"
+                        )
+                    new_file_name = str(itemImg.goods_art_no) + "_" + str(idx) + ".jpg"
+                    if not os.path.exists(
+                        image_dir + "/" + os.path.basename(new_file_name)
+                    ):
+                        shutil.copy(itemImg.image_path, image_dir + new_file_name)
+                dealImage = DealImage(image_dir)
+                resFlag, path = dealImage.dealMoveImage(
+                    image_dir=image_dir, callback_func=None, goods_art_no=goods_art_no
+                )
+                if not resFlag:
+                    raise UnicornException(path)
+    except Exception as e:
+        raise UnicornException(str(e))
+    if is_check == 1:
+        return {
+            "code": 0,
+            "msg": "检测通过",
+            "data": None,
+        }
     asyncio.create_task(process_handle_detail(request, params))
     return {"code": 0, "msg": "任务已提交后台处理", "data": {"status": "processing"}}
 
@@ -396,7 +459,9 @@ async def process_handle_detail(request: Request, params: HandlerDetail):
             pr = CRUD(PhotoRecord)
             images = pr.read_all(session, conditions={"goods_art_no": goods_art_no})
             if not images:
-                raise UnicornException("没有可用货号数据")
+                raise UnicornException(
+                    f"商品货号【{goods_art_no}】在商品档案资料中不存在,请检查货号是否正确"
+                )
             if is_only_cutout != 1:
                 detail_counts = len(params.template_image_order.split(","))
                 image_counts = len(images)
@@ -564,7 +629,10 @@ async def process_handle_detail(request: Request, params: HandlerDetail):
                     continue
                 aigc_clazz.center_paste_image(ceshi_image_path, save_image_path)
                 try:
-                    image_path = aigc_clazz.generateProductScene(
+                    # image_path = aigc_clazz.generateProductScene(
+                    #     save_image_path, product_scene_prompt, save_image_path
+                    # )
+                    image_path = aigc_clazz.generateProductSceneQW(
                         save_image_path, product_scene_prompt, save_image_path
                     )
                     goods_art_dict_info["场景图"] = image_path
@@ -625,7 +693,10 @@ async def process_handle_detail(request: Request, params: HandlerDetail):
                     continue
                 shutil.copy(ceshi_image_path, save_image_path)
                 try:
-                    image_path = aigc_clazz.generateUpperShoes(
+                    # image_path = aigc_clazz.generateUpperShoes(
+                    #     save_image_path, model_id, save_image_path
+                    # )
+                    image_path = aigc_clazz.generateModelShoesQW(
                         save_image_path, model_id, save_image_path
                     )
                     goods_art_dict_info["模特图"] = image_path

+ 67 - 4
python/custom_plugins/plugins/detail_template/hongqingting/detail_hongqingting2.py

@@ -465,16 +465,17 @@ class DetailPicGet(DetailBase):
             pp_png_1 = pp_png_1.transpose()
             pp_jpg_1 = pp_jpg_1.transpose()
 
-
+        posy=2325
         if pp_jpg_1.height > pp_jpg_1.width:
             aheight =350
             # 等比计算目标宽度
             awidth = int(pp_jpg_1.width * aheight / pp_jpg_1.height)
         else:
             if pp_jpg_1.height > (pp_jpg_1.width/2):
-                awidth = int(pp_jpg_1.width * 0.13)
+                awidth = int(bg_img.width * 0.4)
             else:
-                awidth = int(pp_jpg_1.width * 0.30)
+                awidth = int(bg_img.width * 0.4)
+                posy=2380
 
 
         pp_jpg_1 = pp_jpg_1.resize(value=awidth)
@@ -483,7 +484,7 @@ class DetailPicGet(DetailBase):
             mode="pixel",
             top_img=pp_jpg_1,
             base="cs",
-            value=(-15, 2325),
+            value=(-15, posy),
             top_png_img=pp_png_1,
         )
 
@@ -1105,5 +1106,67 @@ class DetailPicGet(DetailBase):
 
     def deal_pic_12(self):
         # 背景图
+        goods_art_no_list = list(self.data.keys())
+        # 背景图
         bg_img = PictureProcessing(r"{}\12.jpg".format(self.root))
+
+        item_img = PictureProcessing("RGB", (404, 334), (247,247,247))
+        bg_img = bg_img.to_overlay_pic_advance(
+            mode="pixel",
+            top_img=item_img,
+            base="es",
+            value=(150, 180+2158),
+            top_png_img=item_img,
+        )
+
+
+        # item4
+        item_img = PictureProcessing("RGBA", (bg_img.width, 760), (255,255,255))
+
+
+
+        pp_jpg_1, pp_png_1 = self.image_one_pic(
+            return_orign=True,
+            goods_art_no=goods_art_no_list[0],
+            name="内里",
+        )
+
+
+
+        aheight =100
+        # 等比计算目标宽度
+        awidth = int(pp_jpg_1.width * aheight / pp_jpg_1.height)
+        pp_jpg_1 = pp_jpg_1.resize(value=awidth)
+        pp_png_1 = pp_png_1.resize(value=awidth)
+
+        ty=0
+        if self.check_shoe_is_right_by_pixel(im=pp_png_1.im) == False:
+            pp_jpg_1 = pp_jpg_1.transpose()
+            pp_png_1 = pp_png_1.transpose()
+            ty=1
+
+        pp_jpg_1=pp_jpg_1.rotate_advance(doge=90,is_crop=False)
+        pp_png_1=pp_png_1.rotate_advance(doge=90,is_crop=False)
+
+
+        if ty==1:
+            pp_jpg_1 = pp_jpg_1.transpose()
+            pp_png_1 = pp_png_1.transpose()
+
+        bg_img = bg_img.to_overlay_pic_advance(
+            mode="pixel",
+            top_img=pp_png_1,
+            base="es",
+            value=(-60+50,50+2158),
+            top_png_img=pp_png_1,
+        )
+        pp_jpg_1 = pp_jpg_1.transpose()
+        pp_png_1 = pp_png_1.transpose()
+        bg_img = bg_img.to_overlay_pic_advance(
+            mode="pixel",
+            top_img=pp_png_1,
+            base="es",
+            value=(60+50, 50+2158),
+            top_png_img=pp_png_1,
+        )
         return bg_img

+ 72 - 3
python/custom_plugins/plugins/detail_template/hongqingting/detail_hongqingting3.py

@@ -399,9 +399,12 @@ class DetailPicGet(DetailBase):
             name="俯视",
         )
 
-        aheight =650
-        # 等比计算目标宽度
-        awidth = int(pp_jpg_1.width * aheight / pp_jpg_1.height)
+        if pp_jpg_1.height > pp_jpg_1.width:
+            aheight =650
+            # 等比计算目标宽度
+            awidth = int(pp_jpg_1.width * aheight / pp_jpg_1.height)
+        else:
+            awidth=round(0.52*bg_img.width)
 
         pp_jpg_1 = pp_jpg_1.resize(value=awidth)
         pp_png_1 = pp_png_1.resize(value=awidth)
@@ -977,6 +980,72 @@ class DetailPicGet(DetailBase):
         return bg_img
 
     def deal_pic_12(self):
+
+        goods_art_no_list = list(self.data.keys())
         # 背景图
         bg_img = PictureProcessing(r"{}\12.jpg".format(self.root))
+
+        item_img = PictureProcessing("RGB", (510, 440), (247,247,247))
+        bg_img = bg_img.to_overlay_pic_advance(
+            mode="pixel",
+            top_img=item_img,
+            base="es",
+            value=(190, 240),
+            top_png_img=item_img,
+        )
+
+
+        # item4
+        item_img = PictureProcessing("RGBA", (bg_img.width, 760), (255,255,255))
+
+
+
+        pp_jpg_1, pp_png_1 = self.image_one_pic(
+            return_orign=True,
+            goods_art_no=goods_art_no_list[0],
+            name="内里",
+        )
+
+
+
+        aheight =170
+        # 等比计算目标宽度
+        awidth = int(pp_jpg_1.width * aheight / pp_jpg_1.height)
+        pp_jpg_1 = pp_jpg_1.resize(value=awidth)
+        pp_png_1 = pp_png_1.resize(value=awidth)
+
+        ty=0
+        if self.check_shoe_is_right_by_pixel(im=pp_png_1.im) == False:
+            pp_jpg_1 = pp_jpg_1.transpose()
+            pp_png_1 = pp_png_1.transpose()
+            ty=1
+
+        pp_jpg_1=pp_jpg_1.rotate_advance(doge=90,is_crop=False)
+        pp_png_1=pp_png_1.rotate_advance(doge=90,is_crop=False)
+
+
+        if ty==1:
+            pp_jpg_1 = pp_jpg_1.transpose()
+            pp_png_1 = pp_png_1.transpose()
+
+        bg_img = bg_img.to_overlay_pic_advance(
+            mode="pixel",
+            top_img=pp_png_1,
+            base="es",
+            value=(-100-0,30),
+            top_png_img=pp_png_1,
+        )
+        pp_jpg_1 = pp_jpg_1.transpose()
+        pp_png_1 = pp_png_1.transpose()
+        bg_img = bg_img.to_overlay_pic_advance(
+            mode="pixel",
+            top_img=pp_png_1,
+            base="es",
+            value=(100-0, 30),
+            top_png_img=pp_png_1,
+        )
+
+
+
+
         return bg_img

+ 1 - 1
python/mcu/BaseClass.py

@@ -31,7 +31,7 @@ class BaseClass:
             loop.create_task(
                 self.websocket_manager.send_personal_message(data, self.websocket)
             )
-
+        print("\033[1;32;40m 发送消息===>sendSocketMessage \033[0m", data)
     async def asyncSendSocketMessage(self, code=0, msg="", data=None, device_status=2):
         data = {
             "code": code,

+ 59 - 37
python/mcu/DeviceControl.py

@@ -47,6 +47,8 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.state_camera_steering = 3
         self.state_turntable_steering = 3
         self.state_overturn_steering = 3
+        # 是否实时获取mcu状态信息
+        self.is_get_mcu_state = True
         self.state_move_turntable_steering = 3
         self.last_from_mcu_move_respond_data = None
         self.camera_motor_speed = 0
@@ -192,6 +194,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.to_init_device_origin_point(device_name="mcu", is_force=is_force)
         print("MCU 开始循环~")
         logger.info("MCU 开始循环~")
+        loop = asyncio.get_event_loop()
         while 1:
             await asyncio.sleep(1)
             if not self.serial_ins or not self.connect_state:
@@ -204,7 +207,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 #     device_status=2,
                 # )
                 # print("mcu   send_cmd")
-                self.send_cmd()
+                loop.create_task(self.send_cmd())
                 # time.sleep(0.01)
                 if not self.get_basic_info_mcu():
                     pass
@@ -414,30 +417,36 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         await asyncio.sleep(0.001)
         while True:
             if self.send_data_queue:
-                self.sendSocketMessage(msg="正在发送命令", device_status=1)
+                # self.sendSocketMessage(msg="正在发送命令", device_status=1)
                 data = self.send_data_queue.pop(0)
                 self.serial_ins.write_cmd(data)
-                self.sendSocketMessage(msg="命令发送完成", device_status=2)
+                # self.sendSocketMessage(msg="命令发送完成", device_status=2)
             else:
                 break
 
-    def send_cmd(self):
+    async def send_cmd(self):
         self.lock.acquire()
+        asyncio.sleep(0.01)
         if self.send_data_queue:
-            self.sendSocketMessage(msg="正在发送命令", device_status=1)
+            # self.sendSocketMessage(msg="正在发送命令", device_status=1)
             data = self.send_data_queue.pop(0)
             self.serial_ins.write_cmd(data)
-            self.sendSocketMessage(msg="命令发送完成", device_status=2)
-        # else:
-        #     self.t_n += 1
-        #     # 加大发送获取基础数据的时间间隔
-        #     # 默认为0.01秒一个循环,每隔1.5秒发送数据
-        #     if self.t_n > 150:
-        #         self.t_n = 0
-        #         data = [self.command["get_all_info"], 1]
-        #         self.serial_ins.write_cmd(data)
+            # self.sendSocketMessage(msg="命令发送完成", device_status=2)
+        else:
+            # self.t_n += 1
+            # 加大发送获取基础数据的时间间隔
+            # 默认为0.01秒一个循环,每隔1.5秒发送数据
+            if self.t_n == 150:
+                # self.t_n = 0
+                self.send_get_all_info_to_mcu()
         self.lock.release()
 
+    def send_get_all_info_to_mcu(self):
+        if self.is_get_mcu_state is False:
+            return
+        data = [self.command["get_all_info"], 1]
+        self.serial_ins.write_cmd(data)
+
     def print_mcu_error_data(self, receive_data):
         # 扫码数据
         try:
@@ -465,7 +474,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
 
         # self.self_sign.emit({"type": "connect_sign", "data": connect_flag})
         message = {"type": "connect_sign", "data": connect_flag}
-        self.sendSocketMessage(msg="接收接信息", data=message)
+        self.sendSocketMessage(msg="接收接信息", data=message)
         print("接收链接信息")
         logger.info("接收链接信息")
         return
@@ -539,6 +548,9 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         receive_data = self.serial_ins.read_cmd(out_time=1)
         if receive_data is False:
             print("------------------------------------------------4657564654")
+            print(
+                "------------------------------------------------get_basic_info_mcu------------------"
+            )
             logger.info("------------------------------------------------4657564654")
             self.connect_state = False
             return False
@@ -1224,35 +1236,41 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             self.init_state = False
             print("关闭MCU")
             logger.info("关闭MCU")
+
     def close_lineConnect(self):
-        ''''关闭有线遥控器连接'''
+        """'关闭有线遥控器连接"""
         self.line_control.port_name = ""
         self.line_control.close_connect()
         print("关闭有线遥控器")
         logger.info("关闭有线遥控器")
+
     @property
     def mcu_move_state(self):
-        if self.m_t == 1:
-            if (
-                self.state_camera_motor == 2
-                and self.state_camera_steering == 2
-                and self.state_turntable_steering == 2
-                and self.state_overturn_steering == 2
-            ):
-                self._mcu_move_state = 2
-            else:
-                self._mcu_move_state = 1
+        if self.is_get_mcu_state is False:
+            self._mcu_move_state = 2
+            # self.action_state = 2
         else:
-            if (
-                self.state_camera_motor == 2
-                and self.state_camera_steering == 2
-                and self.state_turntable_steering == 2
-                and self.state_overturn_steering == 2
-                and self.state_move_turntable_steering == 2
-            ):
-                self._mcu_move_state = 2
+            if self.m_t == 1:
+                if (
+                    self.state_camera_motor == 2
+                    and self.state_camera_steering == 2
+                    and self.state_turntable_steering == 2
+                    and self.state_overturn_steering == 2
+                ):
+                    self._mcu_move_state = 2
+                else:
+                    self._mcu_move_state = 1
             else:
-                self._mcu_move_state = 1
+                if (
+                    self.state_camera_motor == 2
+                    and self.state_camera_steering == 2
+                    and self.state_turntable_steering == 2
+                    and self.state_overturn_steering == 2
+                    and self.state_move_turntable_steering == 2
+                ):
+                    self._mcu_move_state = 2
+                else:
+                    self._mcu_move_state = 1
 
         # self._mcu_move_state = 2
         return self._mcu_move_state
@@ -1397,7 +1415,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         if self.connect_state:
             self.lock.acquire()
             # print('==========================>1111')
-            # print("-------------------to_get_mcu_base_info--------------------------")
+            print("-------------------to_get_mcu_base_info--------------------------")
             data = [self.command["get_all_info"], 1]
             f = True
             try:
@@ -1653,6 +1671,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             )
             self.msg_type = "mcu"
             await self.controlDevice("laser_position", 1)
+        self.action_state = 2
 
     async def run_mcu_config_single(
         self,
@@ -1690,7 +1709,10 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             program_item.smart_shooter = smart_shooter
             await program_item.run(3)
             self.msg_type = "mcu"
-            print("发送 run_mcu_signle消息","{} 执行完成~".format(program_item.action_name))
+            print(
+                "发送 run_mcu_signle消息",
+                "{} 执行完成~".format(program_item.action_name),
+            )
             self.sendSocketMessage(
                 code=0,
                 msg="{} 执行完成~".format(program_item.action_name),

+ 15 - 7
python/mcu/ProgramItem.py

@@ -150,8 +150,11 @@ class ProgramItem(BaseClass):
         last_num_1 = self.mcu.last_mcu_info_data["num"]
         await self.mcu.cleanAllReceiveData()
         while 1:
+            print("\033[1;31m执行检查动作\033[0m", self.mcu.mcu_move_state)
+            print("\033[1;31m执行检查动作\033[0m", self.mcu.action_state)
             if self.mcu.action_state != 1:
                 # 外部终止,停止运行
+                print("\033[1;31m执行结束\033[0m", "外部终止,停止运行")
                 return False
             cr_time = time.time()
             print(cr_time - _s, cr_time, _s)
@@ -160,20 +163,22 @@ class ProgramItem(BaseClass):
                 self.set_state(state_value=99)  # 标记异常
                 print("MCU检测运动未停止,自动退出")
                 self.sendSocketMessage(msg=self.error_info_text, device_status=-1)
+                print("\033[1;31m执行结束\033[0m", "MCU检测运动未停止,自动退出")
                 return False
                 # return True
             # 存在时间间隙,导致误认为所有设备已完成运动
             if self.mcu.mcu_move_state == 2:
+                print("\033[1;31m执行结束\033[0m", "导致误认为所有设备已完成运动")
                 return True
             else:
                 self.mcu.to_get_mcu_base_info()
-                await self.mcu.send_all_cmd()
+                asyncio.create_task(self.mcu.send_all_cmd())
                 await asyncio.sleep(0.5)
                 self.mcu.get_basic_info_mcu()
                 # return True
-
-            await asyncio.sleep(0.1)
-            # self.mcu.to_get_mcu_base_info()
+        print("\033[1;31m执行结束\033[0m", self.mcu.action_state)
+        # await asyncio.sleep(0.1)
+        # self.mcu.to_get_mcu_base_info()
 
     async def run(self, total_len=5, *args):
         if total_len == 1:
@@ -223,13 +228,16 @@ class ProgramItem(BaseClass):
                     device_name="turntable_steering", value=self.turntable_angle
                 )
                 time.sleep(0.1)
-            self.mcu.send_all_cmd()
+            loop = asyncio.get_event_loop()
+            # self.mcu.send_all_cmd()
+            loop.create_task(self.mcu.send_all_cmd())
 
     async def do_run(self, *args):
         await asyncio.sleep(0.001)
         # if not self.goods_art_no:  # and self.action_name != "初始化位置"
         #     return False
         start_time = time.time()
+        self.mcu.is_get_mcu_state = False
         # ============连接MCU 处理步进电机与舵机等
         if settings.IS_MCU:
             if self.mode_type != "其他配置" and await self.check_mcu_move_is_stop() is False:
@@ -273,14 +281,14 @@ class ProgramItem(BaseClass):
                 # time.sleep(0.1)
 
             # MCU运动是否有停止检查,设定超时时间
-            await self.mcu.send_all_cmd()
+            asyncio.create_task(self.mcu.send_all_cmd())
             if self.mode_type != "其他配置":
                 await asyncio.sleep(1.2)
                 print("二次检查")
                 if await self.check_mcu_move_is_stop(re_check=True) is False:
                     print("MCU检测运动未停止,自动退出,   提前退出")
                     return
-
+        self.mcu.is_get_mcu_state = True
         if self.delay_time:
             await asyncio.sleep(self.delay_time)
         if self.is_photograph:

+ 1 - 0
python/models.py

@@ -98,6 +98,7 @@ class HandlerDetail(BaseModel):
     temp_list: list[TemplateItem] = Field(default=[], description="所有模板列表")
     logo_path: Optional[str] = Field(default="", description="logo地址路径")
     is_only_cutout: Optional[int] = Field(default=0, description="是否仅抠图;0否;1是")
+    is_check: Optional[int] = Field(default=0, description="是否仅检测;0否;1是")
     online_stores: Optional[list[str]] = Field(
         default=[], description="上传的店铺,数组形式"
     )

+ 56 - 7
python/service/online_request/module_online_data.py

@@ -54,7 +54,7 @@ class AIGCDataRequest(object):
         resultData = self.s.post(
             url, files={"file": open(local_path, "rb")}, headers=post_headers
         ).json()
-        
+
         return resultData["data"]["url"]
 
     def center_paste_image(
@@ -126,7 +126,7 @@ class AIGCDataRequest(object):
         """生成场景图"""
         url = settings.DOMAIN + "/api/ai_image/inspired/command_to_image"
         resultData = self.s.post(url, data=data, headers=self.post_headers).json()
-        
+
         code = resultData.get("code", 0)
         message = resultData.get("message", "")
         if code != 0:
@@ -138,13 +138,59 @@ class AIGCDataRequest(object):
         save_image_path = download_image_with_pil(image_url, save_path)
         return save_image_path
 
+    def generateProductSceneQW(self, local_path, prompt, save_path):
+        '''千问生成场景图'''
+        imageUrl = self.uploadImage(local_path)
+        data = {
+            "machine_type": 0,  # 0鞋;1服装
+            "generate_type": 0,  # 生成类型,这里指代得是场景图还是模特图;0场景图;1模特图
+            "base_image": imageUrl,
+            "prompt": prompt
+        }
+        """生成场景图"""
+        url = settings.DOMAIN + "/api/ai_image/main/image_edit_generate"
+        resultData = self.s.post(url, data=data, headers=self.post_headers).json()
+
+        code = resultData.get("code", 0)
+        message = resultData.get("message", "")
+        if code != 0:
+            raise UnicornException(message)
+        image_url = resultData.get("data", None).get("image_url", '')
+        if image_url == "" or image_url is None:
+            raise UnicornException("场景图生成失败")
+        save_image_path = download_image_with_pil(image_url, save_path)
+        return save_image_path
+
+    def generateModelShoesQW(self, local_path, model_id, save_path):
+        '''千问生成场景图'''
+        imageUrl = self.uploadImage(local_path)
+        data = {
+            "machine_type": 0,  # 0鞋;1服装
+            "generate_type": 1,  # 生成类型,这里指代得是场景图还是模特图;0场景图;1模特图
+            "base_image": imageUrl,
+            "model_template_id": model_id,
+        }
+        """生成场景图"""
+        url = settings.DOMAIN + "/api/ai_image/main/image_edit_generate"
+        resultData = self.s.post(url, data=data, headers=self.post_headers).json()
+
+        code = resultData.get("code", 0)
+        message = resultData.get("message", "")
+        if code != 0:
+            raise UnicornException(message)
+        image_url = resultData.get("data", None).get("image_url", '')
+        if image_url == "" or image_url is None:
+            raise UnicornException("模特图生成失败")
+        save_image_path = download_image_with_pil(image_url, save_path)
+        return save_image_path
+
     def searchProgress(self, id):
         """查询进度"""
         url = settings.DOMAIN + "/api/ai_image/main/search_bacth_progress"
         data = {"site": 1, "generate_ids": [id], "type": "aigc_pro"}
         resultData = self.s.post(url, json=data, headers=self.post_headers)
         resultData = resultData.json()
-        
+
         code = resultData.get("code", 0)
         message = resultData.get("message", "")
         if code != 0:
@@ -175,7 +221,7 @@ class AIGCDataRequest(object):
         """生成上脚图"""
         url = settings.DOMAIN + "/api/ai_image/main/upper_footer"
         resultData = self.s.post(url, data=data, headers=self.post_headers).json()
-        
+
         code = resultData.get("code", 0)
         message = resultData.get("message", "")
         if code != 0:
@@ -357,7 +403,7 @@ class OnlineDataRequest(object):
         resultData = self.s.post(
             url, files={"file": open(local_path, "rb")}, headers=post_headers
         ).json()
-        
+
         return resultData["data"]["url"]
 
     def get_current_menu(self):
@@ -514,7 +560,7 @@ class OnlineDataRequest(object):
         # print("上传商品api==>url", url)
         # print("上传第三方数据打印", params)
         resultData = self.s.post(url, data=postData, headers=post_headers).json()
-        
+
         print("上传商品api==>resultData", resultData)
         return resultData
 
@@ -558,6 +604,8 @@ class OnlineDataRequest(object):
                 for skuIdx, sku_data in enumerate(sku_list_basic):
                     sku_goods_art_no = sku_data.get("货号", "")
                     color_name = sku_data.get("颜色名称", "")
+                    size = sku_data.get("尺码", "")
+                    # 尺码
                     mainImages = sku_data.get("800x800", [])
                     if not mainImages:
                         continue
@@ -569,7 +617,7 @@ class OnlineDataRequest(object):
                         "originalPrice": float(goods_price),
                         "newSkuWeight": int(1),
                         "skuMainImageUrl": str(imageUrl),
-                        "skuName": f"颜色:{color_name}",
+                        "skuName": f"颜色:{color_name};尺码:{size}",
                         "sellingPrice": float(goods_price),
                         "quantity": int(quantity),
                         "showOrder": int(skuIdx + 1),
@@ -733,6 +781,7 @@ class GetOnlineDataHLM(OnlineDataRequest):
             goods_number_data[data["goods_art_no"]]["颜色名称"] = data["color"]
             goods_number_data[data["goods_art_no"]]["商品标题"] = data["goods_title"]
             goods_number_data[data["goods_art_no"]]["商品价格"] = data["retail_price"]
+            goods_number_data[data["goods_art_no"]]["尺码"] = data["size"]
             goods_number_data[data["goods_art_no"]]["性别"] = data["gender"]
             goods_number_data[data["goods_art_no"]]["token"] = self.token
 

+ 3 - 3
python/service/run_main.py

@@ -604,14 +604,14 @@ class RunMain:
                         "folder_path": "{}/{}".format(image_dir, one_folder),
                     }
                 )
-                return_data["message"] += "文件夹:{} 找不到对应数据\n".format(
+                return_data["message"] += "文件夹:{} 在系统资料中找不到对应数据\n".format(
                     one_folder
                 )
                 return_data["data"]["config_data"]["success_handler"].append(
                     {
                         "goods_art_no": one_folder,
                         "success": False,
-                        "info": f"文件夹:{one_folder} 找不到对应数据",
+                        "info": f"文件夹:{one_folder} 在系统资料中找不到对应数据",
                     }
                 )
 
@@ -675,7 +675,7 @@ class RunMain:
 
         # 如果没有有效数据则进行退出
         if not goods_no_dict:
-            return_data["message"] += "没有任何有效数据\n"
+            return_data["message"] += "在系统资料中没有查询到有效数据\n"
             return return_data
 
         # 校验无误的文件夹数据  goods_no_dict为最终有效数据

+ 1 - 1
python/sockets/message_handler.py

@@ -415,7 +415,7 @@ async def handlerSend(
                 if not images:
                     data = manager.jsonMessage(
                         code=1,
-                        msg=f"没有可用货号数据",
+                        msg=f"商品货号【{goods_art_no}】在商品档案资料中不存在,请检查货号是否正确",
                         msg_type=msg_type,
                     )
                     await manager.send_personal_message(data, websocket)

BIN
测试文件夹2/BX72000015/200images/BX72000015(1).jpg


BIN
测试文件夹2/BX72000015/800x800/BX72000015(1)_1600.png


BIN
测试文件夹2/BX72000015/800x800/BX72000015(2)_1600.png


BIN
测试文件夹2/BX72000015/800x800/BX72000015(3)_1600.png


BIN
测试文件夹2/BX72000015/800x800/BX72000015(4)_1600.png


BIN
测试文件夹2/BX72000015/800x800/BX72000015(5)_1600.png


BIN
测试文件夹2/BX72000015/原始图/BX72000015(1).jpg


BIN
测试文件夹2/BX72000015/原始图/BX72000015(2).jpg


BIN
测试文件夹2/BX72000015/原始图/BX72000015(3).jpg


BIN
测试文件夹2/BX72000015/原始图/BX72000015(4).jpg


BIN
测试文件夹2/BX72000015/原始图/BX72000015(5).jpg


BIN
测试文件夹2/BX72000015/原始图_已抠图/BX72000015(1).png


BIN
测试文件夹2/BX72000015/原始图_已抠图/BX72000015(2).png


BIN
测试文件夹2/BX72000015/原始图_已抠图/BX72000015(3).png


BIN
测试文件夹2/BX72000015/原始图_已抠图/BX72000015(4).png


BIN
测试文件夹2/BX72000015/原始图_已抠图/BX72000015(5).png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(1)_俯视_抠图.png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(1)_俯视_阴影.png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(2)_侧视_抠图.png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(2)_侧视_阴影.png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(3)_后跟_抠图.png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(3)_后跟_阴影.png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(4)_鞋底_抠图.png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(4)_鞋底_阴影.png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(5)_内里_抠图.png


BIN
测试文件夹2/BX72000015/阴影图处理/BX72000015(5)_内里_阴影.png