Explorar el Código

Merge branch 'publish_goods_smartshooter_0819' into smart-shooter-socket-progress

rambo hace 3 meses
padre
commit
dac0ac2643

+ 22 - 18
python/api.py

@@ -26,8 +26,7 @@ from service.base import check_move_goods_art_no_folder
 import hashlib
 import win32api, win32gui, win32con
 from win32gui import EnumWindows, GetWindowText
-from mcu.capture.smart_shooter_class import SmartShooter
-
+from service.online_request.module_online_data import OnlineDataRequest
 
 def calculate_md5(filepath):
     # 打开文件,以二进制只读模式打开
@@ -301,8 +300,10 @@ async def handle_detail(request: Request, params: HandlerDetail):
     token = "Bearer " + params.token
     uuid = params.uuid
     run_main = RunMain(obj, token, uuid)
+    onlineData = OnlineDataRequest(token)
     goods_art_no_arrays = params.goods_art_no
     is_only_cutout = params.is_only_cutout
+    online_stores = params.online_stores
     handler_result = []
     handler_result_folder = ""
     if is_only_cutout == 1:
@@ -437,20 +438,7 @@ async def handle_detail(request: Request, params: HandlerDetail):
             except:
                 config_data = result
         if config_data["sign_text"] == "已结束详情处理":
-            # at_pic = AutoDealPics()
             print("config_data", config_data)
-            # if config_data["upload_is_enable"]:
-            #     to_deal_dir = "{}/软件-详情图生成".format(config_data["image_dir"])
-            #     check_path(to_deal_dir)
-            #     print("to_deal_dir", to_deal_dir)
-            #     if os.path.exists(to_deal_dir):
-            #         upload_pic = UploadPic(
-            #             windows=None,
-            #             to_deal_dir=to_deal_dir,
-            #             config_data=config_data,
-            #             token=token,
-            #         )
-            #         upload_pic.run()
             out_put_dir = config_data.get("out_put_dir")
             if out_put_dir == None:
                 handler_result_folder = ""
@@ -481,6 +469,22 @@ async def handle_detail(request: Request, params: HandlerDetail):
                             }
                         )
                 else:
+                    result_goods_no_dict = return_data_check_before_detail["data"][
+                        "goods_no_dict"
+                    ]
+                    for goods_idx,goods_no_dict in enumerate(result_goods_no_dict.keys()):
+                        all_detail_path_list = config_data["all_detail_path_list"]
+                        for detail_path in all_detail_path_list:
+                            if goods_no_dict in detail_path:
+                                detail_path_replace = detail_path.replace(
+                                    "\\", "/"
+                                )
+                                result_goods_no_dict[goods_no_dict][
+                                    "detail_path"
+                                ] = f"{detail_path_replace}/拼接图/1.jpg"
+                    onlineData.uploadGoods2ThirdParty(
+                        result_goods_no_dict, online_stores=online_stores
+                    )
                     handler_result = config_data["success_handler"]
         else:
             handler_result.append(
@@ -489,9 +493,9 @@ async def handle_detail(request: Request, params: HandlerDetail):
     except UnicornException as e:
         handler_result_folder = ""
         handler_result = e.msg
-    except Exception as e:
-        handler_result_folder = ""
-        handler_result.append({"goods_art_no": "", "success": False, "info": str(e)})
+    # except Exception as e:
+    #     handler_result_folder = ""
+    #     handler_result.append({"goods_art_no": "", "success": False, "info": str(e)})
     return {
         "code": 0,
         "msg": "",

+ 88 - 0
python/detail_template_test_jack.json

@@ -0,0 +1,88 @@
+{
+    "AC5120913": {
+        "款号": "AC5120913",
+        "货号资料": [
+            {
+                "货号": "A333",
+                "文件夹名称": "A333",
+                "编号": "A333",
+                "颜色名称": "酒红色",
+                "pics": {
+                    "俯视-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/俯视_抠图.png",
+                    "俯视-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/俯视_阴影.jpg",
+                    "侧视-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/侧视_抠图.png",
+                    "侧视-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/侧视_阴影.jpg",
+                    "后跟-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/后跟_抠图.png",
+                    "后跟-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/后跟_阴影.jpg",
+                    "鞋底-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/鞋底_抠图.png",
+                    "鞋底-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/鞋底_阴影.jpg",
+                    "内里-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/内里_抠图.png",
+                    "内里-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/内里_阴影.jpg",
+                    "组合-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合_抠图.png",
+                    "组合-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合_阴影.jpg",
+                    "组合2-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合2_抠图.png",
+                    "组合2-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合2_阴影.jpg",
+                    "组合3-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合3_抠图.png",
+                    "组合3-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合3_阴影.jpg",
+                    "组合4-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合4_抠图.png",
+                    "组合4-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合4_阴影.jpg"
+                },
+                "800x800": [
+                    "C:/Zhihuiyin/2025-06-162/A333/800x800/A333(1).jpg",
+                    "C:/Zhihuiyin/2025-06-162/A333/800x800/A333(2).jpg",
+                    "C:/Zhihuiyin/2025-06-162/A333/800x800/A333(3).jpg",
+                    "C:/Zhihuiyin/2025-06-162/A333/800x800/A333(4).jpg",
+                    "C:/Zhihuiyin/2025-06-162/A333/800x800/A333(5).jpg"
+                ]
+            },
+            {
+                "货号": "A444",
+                "文件夹名称": "A444",
+                "编号": "A444",
+                "颜色名称": "米白色",
+                "pics": {
+                    "俯视-抠图": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/俯视_抠图.png",
+                    "俯视-阴影": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/俯视_阴影.jpg",
+                    "侧视-抠图": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/侧视_抠图.png",
+                    "侧视-阴影": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/侧视_阴影.jpg",
+                    "后跟-抠图": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/后跟_抠图.png",
+                    "后跟-阴影": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/后跟_阴影.jpg",
+                    "鞋底-抠图": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/鞋底_抠图.png",
+                    "鞋底-阴影": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/鞋底_阴影.jpg",
+                    "内里-抠图": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/内里_抠图.png",
+                    "内里-阴影": "C:/Zhihuiyin/2025-06-162/A444/阴影图处理/内里_阴影.jpg",
+                    "组合-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合_抠图.png",
+                    "组合-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合_阴影.jpg",
+                    "组合2-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合2_抠图.png",
+                    "组合2-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合2_阴影.jpg",
+                    "组合3-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合3_抠图.png",
+                    "组合3-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合3_阴影.jpg",
+                    "组合4-抠图": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合4_抠图.png",
+                    "组合4-阴影": "C:/Zhihuiyin/2025-06-162/A333/阴影图处理/组合4_阴影.jpg"
+                },
+                "800x800": [
+                    "C:/Zhihuiyin/2025-06-162/A444/800x800/A444(1).jpg",
+                    "C:/Zhihuiyin/2025-06-162/A444/800x800/A444(2).jpg",
+                    "C:/Zhihuiyin/2025-06-162/A444/800x800/A444(3).jpg",
+                    "C:/Zhihuiyin/2025-06-162/A444/800x800/A444(4).jpg",
+                    "C:/Zhihuiyin/2025-06-162/A444/800x800/A444(5).jpg"
+                ]
+            }
+        ],
+        "文件夹名称": "AN5021361",
+        "掌宽": "9.7cm",
+        "跟高": "3.6cm",
+        "鞋面": "牛皮革",
+        "鞋垫": "合成革",
+        "内里": "合成革",
+        "鞋底": "聚氨酯底",
+        "细节1标题": "牛皮鞋面",
+        "细节1内容": "质感真皮鞋面 柔韧有型",
+        "细节2标题": "可调节式魔术贴",
+        "细节2内容": "穿脱随心方便舒适",
+        "细节3标题": "舒软鞋垫",
+        "细节3内容": "沙发感鞋垫 契合足型",
+        "细节4标题": "柔韧鞋底",
+        "细节4内容": "舒适耐穿 畅快出行"
+    }
+}

+ 1 - 0
python/models.py

@@ -97,6 +97,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是")
+    online_stores: Optional[list[str]] = Field(default=[], description="是否仅抠图;0否;1是")
 
 class LogoParams(BaseModel):
     """logo参数"""

+ 233 - 90
python/service/online_request/module_online_data.py

@@ -1,3 +1,4 @@
+import base64
 import requests
 import settings
 import json
@@ -17,7 +18,7 @@ class JsonEncoder(json.JSONEncoder):
 
 
 class OnlineDataRequest(object):
-    def __init__(self,token):
+    def __init__(self, token):
         self.s = requests.session()
         self.token = token
         self.post_headers = {
@@ -42,23 +43,21 @@ class OnlineDataRequest(object):
 
     def auth_user(self):
         # 用户登录
-        url = "{domain}/api/auth/user".format(
-            domain=settings.DOMAIN
-        )
+        url = "{domain}/api/auth/user".format(domain=settings.DOMAIN)
         s = requests.session()
         _s = s.get(url=url, headers=settings.Headers)
         response_data = _s.json()
         return response_data
 
     def logout(self):
-        url = "{domain}/api/auth/logout".format(
-            domain=settings.DOMAIN
-        )
+        url = "{domain}/api/auth/logout".format(domain=settings.DOMAIN)
         s = requests.session()
         _s = s.post(url=url, headers=settings.Headers)
 
     def get_change_bar_code(self, code):
-        url = "{domain}/api/hct/open/sting_search_goods?string={code}".format(domain=settings.DOMAIN, code=code)
+        url = "{domain}/api/hct/open/sting_search_goods?string={code}".format(
+            domain=settings.DOMAIN, code=code
+        )
         try:
             s = requests.get(url)
             goods_art_no = s.json()["data"]["goods_art_no"]
@@ -67,22 +66,16 @@ class OnlineDataRequest(object):
             print(e)
             return
 
-    def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None,token=None):
+    def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None, token=None):
         # 获取商品基础信息,入参为商品的编号
 
-        url = "{domain}/api/backend/produce/goods/info".format(
-            domain=settings.DOMAIN
-        )
+        url = "{domain}/api/backend/produce/goods/info".format(domain=settings.DOMAIN)
         print("执行   get_goods_art_no_info   ", url)
         if numbers_list:
-            data = {
-                'numbers': numbers_list
-            }
+            data = {"numbers": numbers_list}
             print("请求编码:", numbers_list)
         else:
-            data = {
-                'goods_art_nos': goods_art_list
-            }
+            data = {"goods_art_nos": goods_art_list}
             print("请求货号:", goods_art_list)
             print("请求货号=====>", self.token)
         print("执行   get_goods_art_no_info----------------", data)
@@ -128,7 +121,7 @@ class OnlineDataRequest(object):
             goods_number_data[number]["所属企划"] = data["projects"][0]
             goods_number_data[number]["设计方名称"] = data["purchasing_unit"]
             goods_number_data[number]["供应商"] = data["supplier_name"]
-            goods_number_data[number]["供应商编码"] = data["supplier_code"].lstrip('0')
+            goods_number_data[number]["供应商编码"] = data["supplier_code"].lstrip("0")
             goods_number_data[number]["供应商货号"] = data["supplier_goods_artno"]
             goods_number_data[number]["销售工厂"] = data["sales_factory_name"]
             goods_number_data[number]["销售组织"] = data["man_org_name"]
@@ -144,8 +137,7 @@ class OnlineDataRequest(object):
     def get_on_goods_all_art(self, number):
         # 获取商品基础信息,入参为商品的编号
         url = "{domain}/api/backend/produce/goods/query/numbers?number={number}".format(
-            domain=settings.DOMAIN,
-            number=number
+            domain=settings.DOMAIN, number=number
         )
         _s = self.s.get(url=url, headers=self.post_headers)
         response_data = _s.json()
@@ -153,24 +145,34 @@ class OnlineDataRequest(object):
         """
         14250230 {'data': {'goods_number': 'AC5200117', 'brother_goods_arts': [{'number': '14250232', 'goods_art_no': 'AC52001173', 'color': '杏色'}, {'number': '14250231', 'goods_art_no': 'AC52001172', 'color': '灰色'}, {'number': '14250230', 'goods_art_no': 'AC52001171', 'color': '黑色'}]}, 'code': 0, 'message': 'success'}
         """
-        return response_data["data"]["goods_number"], response_data["data"]["brother_goods_arts"], \
-               response_data["data"]["goods_art_no"]
+        return (
+            response_data["data"]["goods_number"],
+            response_data["data"]["brother_goods_arts"],
+            response_data["data"]["goods_art_no"],
+        )
 
     def get_views(self, image_url):
 
         url = "http://{}/shoes_category".format(settings.VIEW_DEAL_DOMAIN)
-        data = {"train_path": "./datasets/Shoes_Dataset/Train/angle",
-                "model_filename": "./models/0320/output0320.pth",
-                "validate_path": image_url, }
-        _s = requests.post(url=url, data=json.dumps(data), )
+        data = {
+            "train_path": "./datasets/Shoes_Dataset/Train/angle",
+            "model_filename": "./models/0320/output0320.pth",
+            "validate_path": image_url,
+        }
+        _s = requests.post(
+            url=url,
+            data=json.dumps(data),
+        )
         response_data = _s.json()
         return response_data["classify_result"]
 
     def uploadImage(self, local_path: str) -> str:
         post_headers = {"Authorization": self.token}
-        url = settings.DOMAIN + '/api/upload'
-        resultData = self.s.post(url, files={'file': open(local_path, 'rb')}, headers=post_headers).json()
-        return resultData['data']['url']
+        url = settings.DOMAIN + "/api/upload"
+        resultData = self.s.post(
+            url, files={"file": open(local_path, "rb")}, headers=post_headers
+        ).json()
+        return resultData["data"]["url"]
 
     def get_current_menu(self):
         def get_menu(_menu_dict, _data):
@@ -200,18 +202,22 @@ class OnlineDataRequest(object):
     # 获取所有资源的配置
     def get_resource_config(self):
         url = "{domain}/api/openai/query_client_addons".format(domain=settings.DOMAIN)
-        _s = self.s.get(url=url, headers=self.post_headers, params={"type": "client_camera"})
+        _s = self.s.get(
+            url=url, headers=self.post_headers, params={"type": "client_camera"}
+        )
         response_data = _s.json()
         return response_data
 
     # 拍照日志上报
     def add_auto_photo_logs(self, data):
         url = "{domain}/api/openai/add_auto_photo_logs".format(domain=settings.DOMAIN)
-        post_data = {"goods_no": data["goods_art_no"],
-                     "take_photo_created_at": data["take_photo_created_at"],
-                     "photo_created_at": data["photo_create_time"],
-                     "image_dispose_mode": data["image_deal_mode"],
-                     "photo_serial_number": data["image_index"], }
+        post_data = {
+            "goods_no": data["goods_art_no"],
+            "take_photo_created_at": data["take_photo_created_at"],
+            "photo_created_at": data["photo_create_time"],
+            "image_dispose_mode": data["image_deal_mode"],
+            "photo_serial_number": data["image_index"],
+        }
 
         post_data = json.dumps(post_data)
 
@@ -223,9 +229,7 @@ class OnlineDataRequest(object):
         return response_data
 
     def upload_pic_list_data(self, data):
-        url = "{domain}/api/backend/goods/save/images".format(
-            domain=settings.DOMAIN
-        )
+        url = "{domain}/api/backend/goods/save/images".format(domain=settings.DOMAIN)
         data = json.dumps(data)
         self.post_headers["Content-Length"] = str(len(data))
         _s = self.s.post(url=url, data=data, headers=self.post_headers)
@@ -245,18 +249,24 @@ class OnlineDataRequest(object):
 
     def upload_pic(self, goods_data):
         # 检查货号图是否存在
-        url = "{domain}/api/backend/upload".format(
-            domain=settings.DOMAIN
-        )
+        url = "{domain}/api/backend/upload".format(domain=settings.DOMAIN)
         # print(url)
-        headers = {'Authorization': settings.Headers["Authorization"],
-                   'User-Agent': settings.Headers["User-Agent"],
-                   'Origin': settings.Headers["Origin"],
-                   'Host': settings.Headers["Host"], }
+        headers = {
+            "Authorization": settings.Headers["Authorization"],
+            "User-Agent": settings.Headers["User-Agent"],
+            "Origin": settings.Headers["Origin"],
+            "Host": settings.Headers["Host"],
+        }
 
         files = [
-            ('file',
-             (goods_data["file_path"], goods_data["image_io"], 'image/{}'.format(goods_data["e"])))
+            (
+                "file",
+                (
+                    goods_data["file_path"],
+                    goods_data["image_io"],
+                    "image/{}".format(goods_data["e"]),
+                ),
+            )
         ]
 
         _s = requests.post(url=url, headers=headers, files=files)
@@ -265,9 +275,10 @@ class OnlineDataRequest(object):
         return response_data["data"]["url"]
 
     # 查询是否已有详情图
-    def check_detail_image(self, goods_art_no,token):
-        url = "{domain}/api/backend/goods/check_detail_image?number={number}".format(domain=settings.DOMAIN,
-                                                                                     number=goods_art_no)
+    def check_detail_image(self, goods_art_no, token):
+        url = "{domain}/api/backend/goods/check_detail_image?number={number}".format(
+            domain=settings.DOMAIN, number=goods_art_no
+        )
         _s = self.s.get(url=url, headers=self.post_headers)
         response_data = _s.json()
         # print(response_data)
@@ -275,9 +286,12 @@ class OnlineDataRequest(object):
 
     # 调用API识别是否是拖鞋
     def yolo_shoes_category(self, image_url):
-        url = "{domain}/api/ai_image/main/yolo_shoes_category".format(domain=settings.DOMAIN)
-        post_data = {"image_url": image_url,
-                     }
+        url = "{domain}/api/ai_image/main/yolo_shoes_category".format(
+            domain=settings.DOMAIN
+        )
+        post_data = {
+            "image_url": image_url,
+        }
 
         post_data = json.dumps(post_data)
 
@@ -297,31 +311,150 @@ class OnlineDataRequest(object):
     # 图片上传by IO
     def upload_image_by_io(self, image_io) -> str:
         post_headers = {"Authorization": settings.Authorization}
-        url = settings.DOMAIN + '/api/upload'
-        resultData = self.s.post(url, files={'file': image_io}, headers=post_headers).json()
-        return resultData['data']['url']
-
+        url = settings.DOMAIN + "/api/upload"
+        resultData = self.s.post(
+            url, files={"file": image_io}, headers=post_headers
+        ).json()
+        return resultData["data"]["url"]
+
+    def upload_goods_api(self, params):
+        '''上传商品api'''
+        post_headers = {
+            "Authorization": self.token,
+            "Content-Type": "application/json",
+        }
+        url = settings.DOMAIN+"/api/ai_image/camera_machine/publish_goods"
+        postData = json.dumps(params)
+        print("上传商品api==>url", url)
+        print("上传第三方数据打印", params)
+        resultData = self.s.post(url, data=postData, headers=post_headers).json()
+        print("上传商品api==>resultData", resultData)
+        return resultData
+
+    def uploadGoods2ThirdParty(self, goods_no_dict=None,online_stores=[]):
+        params = []
+        if goods_no_dict == None:
+            return
+        for goods_no in goods_no_dict.keys():
+            goods_data = goods_no_dict[goods_no]
+            detail_path = goods_data.get("detail_path", "")
+            if detail_path == "":
+                continue
+            goods_title = goods_data.get("商品标题", "")
+            if goods_title == "":
+                continue
+            goods_price = goods_data.get("商品价格", 0)
+            if goods_title == 0:
+                continue
+            skuList = []
+            itemImageInfoList = []
+            itemSkuImageList = []
+            sku_list_basic = goods_data.get("货号资料", [])
+            quantity = 9999
+            skuPropValueList = []
+            for skuIdx, sku_data in enumerate(sku_list_basic):
+                sku_goods_art_no = sku_data.get("货号", "")
+                color_name = sku_data.get("颜色名称", "")
+                mainImages = sku_data.get("800x800", [])
+                if not mainImages:
+                    continue
+                mainImagePath = mainImages[0]
+                imageUrl = self.uploadImage(local_path=mainImagePath)
+                skuItemData = {
+                    "skuNo": sku_goods_art_no,
+                    "originalPrice": float(goods_price),
+                    "newSkuWeight": int(1),
+                    "skuMainImageUrl": str(imageUrl),
+                    "skuName": f"颜色:{color_name}",
+                    "sellingPrice": float(goods_price),
+                    "quantity": int(quantity),
+                    "showOrder": int(skuIdx + 1),
+                }
+                skuList.append(skuItemData)
+                itemImage = {
+                    "imageUrl": str(imageUrl),
+                    "imageType": 0,
+                    "imageItem": int(skuIdx),
+                    "imageIndex": 10,
+                }
+                itemImageInfoList.append(itemImage)
+                imageJson = {
+                    "imageUrl": str(imageUrl),
+                    "imageType": 1,
+                    "showOrder": 1,
+                }
+                skuPropValueList.append(
+                    {
+                        "imageJson": imageJson,
+                        "propValue": str(color_name),
+                        "showOrder": 1,
+                    }
+                )
+            itemSkuImageList.append(
+                {
+                    "propName": "颜色",
+                    "isImageProp": 1,
+                    "propShowOrder": 1,
+                    "skuPropValueList": skuPropValueList,
+                }
+            )
+            detailImageUrl = self.uploadImage(local_path=detail_path)
+            category_info = "流行男鞋>>休闲鞋>>时尚休闲鞋"
+            itemData = {
+                "catePathName": category_info,  # 分类
+                "itemName": str(goods_title),  # 商品标题
+                "itemNo": str(goods_no),
+                "brandName": "vali",  # 品牌名称
+                "sellingPrice": float(goods_price),  # 售价(未划线价)
+                "originalPrice": float(goods_price),  # 划线价
+                "quantity": int(quantity),  # 库存数量
+                "propInfoList": [
+                    {"propName": "品牌", "propIndex": 2, "propValue": "Vali"},
+                    {
+                        "propName": "平台类目",
+                        "propIndex": 3,
+                        "propValue": category_info,
+                    },
+                ],
+                "skuList": skuList,
+                "itemImageInfoList": itemImageInfoList,
+                "itemSkuImageList": itemSkuImageList,
+                "wapDescription": f'<img src="{detailImageUrl}"/>',
+                "pcDescription": f'<img src="{detailImageUrl}"/>',
+            }
+            params.append(itemData)
+        json_params = str(params)  # 直接转换为字符串表示
+        # 使用base64编码
+        encoded = base64.b64encode(json_params.encode("utf-8")).decode("utf-8")
+        self.upload_goods_api({"bizcontent": encoded, "online_stores": online_stores})
+        print("商品上传第三方成功")
 
 class GetOnlineDataHLM(OnlineDataRequest):
 
-    def __init__(self,token):
+    def __init__(self, token):
         super().__init__(token)
         self.token = token
-    def upload_pic(self, goods_data,token):
+
+    def upload_pic(self, goods_data, token):
         # 检查货号图是否存在
-        url = "{domain}/api/backend/upload".format(
-            domain=settings.DOMAIN
-        )
+        url = "{domain}/api/backend/upload".format(domain=settings.DOMAIN)
         # print(url)
-        headers = {'Authorization': self.token,
-                #    'User-Agent': settings.Headers["User-Agent"],
-                #    'Origin': settings.Headers["Origin"],
-                #    'Host': settings.Headers["Host"], 
-                   }
+        headers = {
+            "Authorization": self.token,
+            #    'User-Agent': settings.Headers["User-Agent"],
+            #    'Origin': settings.Headers["Origin"],
+            #    'Host': settings.Headers["Host"],
+        }
 
         files = [
-            ('file',
-             (goods_data["file_path"], goods_data["image_io"], 'image/{}'.format(goods_data["e"])))
+            (
+                "file",
+                (
+                    goods_data["file_path"],
+                    goods_data["image_io"],
+                    "image/{}".format(goods_data["e"]),
+                ),
+            )
         ]
 
         _s = requests.post(url=url, headers=headers, files=files)
@@ -329,10 +462,8 @@ class GetOnlineDataHLM(OnlineDataRequest):
 
         return response_data["data"]["url"]
 
-    def upload_pic_list_data(self, data,token):
-        url = "{domain}/api/backend/goods/save/images".format(
-            domain=settings.DOMAIN
-        )
+    def upload_pic_list_data(self, data, token):
+        url = "{domain}/api/backend/goods/save/images".format(domain=settings.DOMAIN)
         data = json.dumps(data)
         self.post_headers["Content-Length"] = str(len(data))
         _s = self.s.post(url=url, data=data, headers=self.post_headers)
@@ -348,14 +479,12 @@ class GetOnlineDataHLM(OnlineDataRequest):
             print(response_data)
             return False
 
-    def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None,token=None):
+    def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None, token=None):
         # 获取商品基础信息,入参为商品的编号
         url = "{domain}/api/backend/goods_client/goods_query".format(
             domain=settings.DOMAIN
         )
-        data = {
-            'goods_art_list': goods_art_list
-        }
+        data = {"goods_art_list": goods_art_list}
         print("url:", url)
         print("请求货号:", goods_art_list)
 
@@ -384,45 +513,58 @@ class GetOnlineDataHLM(OnlineDataRequest):
 
         for data in response_data["data"]:
             goods_number_data[data["goods_art_no"]] = {}
-            goods_number_data[data["goods_art_no"]]["商品货号"] = data["goods_art_no"].upper()
-            goods_number_data[data["goods_art_no"]]["款号"] = data["goods_number"].upper()
+            goods_number_data[data["goods_art_no"]]["商品货号"] = data[
+                "goods_art_no"
+            ].upper()
+            goods_number_data[data["goods_art_no"]]["款号"] = data[
+                "goods_number"
+            ].upper()
             goods_number_data[data["goods_art_no"]]["商品面料"] = data["fabric"]
             goods_number_data[data["goods_art_no"]]["商品内里"] = data["lining"]
             goods_number_data[data["goods_art_no"]]["商品鞋底"] = data["sole"]
             goods_number_data[data["goods_art_no"]]["鞋垫"] = data["insole"]
             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"]
 
         return goods_number_data
 
     def uploadImage(self, local_path: str) -> str:
         post_headers = {"Authorization": settings.Authorization}
-        url = settings.DOMAIN + '/api/upload'
-        resultData = self.s.post(url, files={'file': open(local_path, 'rb')}, headers=post_headers).json()
-        return resultData['data']['url']
+        url = settings.DOMAIN + "/api/upload"
+        resultData = self.s.post(
+            url, files={"file": open(local_path, "rb")}, headers=post_headers
+        ).json()
+        return resultData["data"]["url"]
 
     # ============pixian抠图处理==========================
     def dispose_point(self, _type):
         # 扣分 sub;add为增加分数,每次操作一分
         url = "{domain}/api/ai_image/client/dispose_point".format(
-            domain=settings.DOMAIN)
+            domain=settings.DOMAIN
+        )
         data = {"type": _type}
-        _s = self.s.post(url=url, headers=self.post_headers, data=json.dumps(data), timeout=10)
+        _s = self.s.post(
+            url=url, headers=self.post_headers, data=json.dumps(data), timeout=10
+        )
         response_data = _s.json()
         return response_data
 
     def send_message(self, text):
         # 发送钉钉消息
-        url = "{domain}/api/ai_image/client/send_message".format(
-            domain=settings.DOMAIN)
+        url = "{domain}/api/ai_image/client/send_message".format(domain=settings.DOMAIN)
         data = {"message": text}
-        _s = self.s.post(url=url, headers=self.post_headers, data=json.dumps(data), timeout=10)
+        _s = self.s.post(
+            url=url, headers=self.post_headers, data=json.dumps(data), timeout=10
+        )
         response_data = _s.json()
         return response_data
 
     def get_cutout_image_times(self):
         # 获取抠图剩余次数
         url = "{domain}/api/ai_image/client/search_company_balance".format(
-            domain=settings.DOMAIN)
+            domain=settings.DOMAIN
+        )
         _s = self.s.post(url=url, headers=self.post_headers, timeout=10)
         response_data = _s.json()
         if "data" not in response_data:
@@ -433,7 +575,8 @@ class GetOnlineDataHLM(OnlineDataRequest):
     def get_key_secret(self):
         # 获取抠图剩余次数
         url = "{domain}/api/ai_image/client/get_key_serect".format(
-            domain=settings.DOMAIN)
+            domain=settings.DOMAIN
+        )
         _s = self.s.post(url=url, headers=self.post_headers, timeout=10)
         response_data = _s.json()
         return response_data["data"]

+ 124 - 9
python/temp.py

@@ -1,10 +1,125 @@
-from PIL import Image
-from settings import recordDataPoint
+# from PIL import Image
+# from settings import recordDataPoint
+from service.online_request.module_online_data import OnlineDataRequest
 
-result = recordDataPoint(
-    token="7a6d7d43419df1f98bf00efa100f94b5f6e33c43",
-    uuid="1000548b-5a5e-5ff5-d322-0842bf2beb86",
-    page="抠图完成",
-    goods_art_no="12345"
-)
-print("result", result.json())
+tempData = {
+    "code": 0,
+    "message": "",
+    "data": {
+        "error_folder_list": [],
+        "goods_no_dict": {
+            "A596371111": {
+                "款号": "A596371",
+                "货号资料": [
+                    {
+                        "货号": "A596371",
+                        "文件夹名称": "A596371",
+                        " 编号": "",
+                        "颜色名称": "黑色",
+                        "pics": {
+                            "俯视-抠图": "output/2025-08-20/A596371/阴影图处理/A596371(1)_俯视_抠图.png",
+                            "俯视-阴影": "output/2025-08-20/A596371/阴影图处理/A596371(1)_俯视_阴影.png",
+                            "侧视-抠图": "output/2025-08-20/A596371/阴影图处理/A596371(2)_侧视_抠图.png",
+                            "侧视-阴影": "output/2025-08-20/A596371/阴影图处理/A596371(2)_侧视_阴影.png",
+                            "后跟-抠图": "output/2025-08-20/A596371/阴影图处理/A596371(3)_后跟_抠图.png",
+                            "后跟-阴影": "output/2025-08-20/A596371/阴影图处理/A596371(3)_后跟_阴影.png",
+                            "鞋底-抠图": "output/2025-08-20/A596371/阴影图处理/A596371(4)_鞋底_抠图.png",
+                            "鞋底-阴影": "output/2025-08-20/A596371/阴影图处理/A596371(4)_鞋底_阴影.png",
+                            "内里-抠图": "output/2025-08-20/A596371/阴影图处理/A596371(5)_内里_抠图.png",
+                            "内里-阴影": "output/2025-08-20/A596371/阴影图处理/A596371(5)_内里_阴影.png",
+                            "其他1-抠图": "output/2025-08-20/A596371/阴影图处理/A596371(6)_其他1_抠图.png",
+                            "其他1-阴影": "output/2025-08-20/A596371/阴影图处理/A596371(6)_其他1_阴影.png",
+                            "其他0-抠图": "output/2025-08-20/A596371/阴影图处理/A596371(7)_其他0_抠图.png",
+                            "其他0-阴影": "output/2025-08-20/A596371/阴影图处理/A596371(7)_其他0_阴影.png",
+                        },
+                        "800x800": [
+                            "output/2025-08-20/A596371/800x800/A596371(1)_800.png",
+                            "output/2025-08-20/A596371/800x800/A596371(2)_800.png",
+                            "output/2025-08-20/A596371/800x800/A596371(3)_800.png",
+                            "output/2025-08-20/A596371/800x800/A596371(4)_800.png",
+                            "output/2025-08-20/A596371/800x800/A596371(5)_800.png",
+                            "output/2025-08-20/A596371/800x800/A596371(6)_800.png",
+                            "output/2025-08-20/A596371/800x800/A596371(7)_800.png",
+                        ],
+                    }
+                ],
+                "商品面料": "",
+                "商品内里": "",
+                "商品鞋底": "",
+                "鞋垫": "",
+                "商品标题": "女单鞋",
+                "商品价格": "300.00",
+            }
+        },
+        "succeed_folder_list": ["A596371"],
+        "temp_name": "huilima-1",
+        "temp_name_list": [
+            "huilima-1",
+            "huilima-2",
+            "huilima-3",
+            "huilima-4",
+            "xinnuo-1",
+            "xinnuo-2",
+            "xinnuo-3",
+            "huilima-6",
+            "xinjunlue-1",
+            "qingyangyizhan-1",
+        ],
+        "assigned_page_dict": {},
+        "excel_temp_goods_no_data": {},
+        "finally_goods_no_need_temps": {"A596371": ["huilima-1"]},
+        "config_data": {
+            "image_dir": "output/2025-08-20",
+            "image_order": "俯视,侧视,后跟,鞋底,内里,组合,组合2",
+            "goods_art_no": "",
+            "goods_art_nos": ["A596371"],
+            "is_check_number": False,
+            "resize_image_view": "后跟",
+            "cutout_mode": 1,
+            "logo_path": "",
+            "special_goods_art_no_folder_line": "",
+            "is_use_excel": False,
+            "excel_path": "",
+            "is_check_color_is_all": False,
+            "cutout_is_pass": True,
+            "assigned_page_dict": {},
+            "detail_is_pass": True,
+            "upload_is_pass": False,
+            "upload_is_enable": True,
+            "is_filter": False,
+            "temp_class": {
+                "huilima-1": "custom_plugins.plugins.detail_template.huilima.detail_huilima1.DetailPicGet",
+                "huilima-2": "custom_plugins.plugins.detail_template.huilima.detail_huilima2.DetailPicGet",
+                "huilima-3": "custom_plugins.plugins.detail_template.huilima.detail_huilima3.DetailPicGet",
+                "huilima-4": "custom_plugins.plugins.detail_template.huilima.detail_huilima4.DetailPicGet",
+                "xinnuo-1": "custom_plugins.plugins.detail_template.xinnuo.detail_xinnuo1.DetailPicGet",
+                "xinnuo-2": "custom_plugins.plugins.detail_template.xinnuo.detail_xinnuo2.DetailPicGet",
+                "xinnuo-3": "custom_plugins.plugins.detail_template.xinnuo.detail_xinnuo3.DetailPicGet",
+                "huilima-6": "custom_plugins.plugins.detail_template.huilima.detail_huilima6.DetailPicGet",
+                "xinjunlue-1": "custom_plugins.plugins.detail_template.xinjunlue.detail_xinjunlue1.DetailPicGet",
+                "qingyangyizhan-1": "custom_plugins.plugins.detail_template.qingyangyizhan.detail_qingyangyizhan1.DetailPicGet",
+            },
+            "temp_name": "huilima-1",
+            "temp_name_list": [
+                "huilima-1",
+                "huilima-2",
+                "huilima-3",
+                "huilima-4",
+                "xinnuo-1",
+                "xinnuo-2",
+                "xinnuo-3",
+                "huilima-6",
+                "xinjunlue-1",
+                "qingyangyizhan-1",
+            ],
+            "target_error_folder": "output/2025-08-20/软件-生成详情错误",
+            "success_handler": [],
+            "sign_text": "",
+        },
+    },
+}
+goods_no_dict = tempData["data"]["goods_no_dict"]
+params = []
+token = "71c53bf53045d6bc5cb65a85be9e6064b6a5e2ba"
+onlineData = OnlineDataRequest(token)
+onlineData.uploadGoods2ThirdParty(goods_no_dict, params)