소스 검색

feat(detail_template): 添加miniso详情页模板并优化基础功能

- 添加了miniso品牌详情页模板实现
- 更新配置文件中的本地开发host地址
- 优化detail_generate_base.py中的代码格式和参数对齐
- 添加详细的日志打印信息便于调试
- 重构字符串格式化中的空格处理
- 完善异常处理和错误提示信息
- 创建miniso模板专用测试文件和数据配置
- 更新测试脚本以支持新模板测试
rambo 3 주 전
부모
커밋
1d02408bc7

+ 1 - 1
python/config.ini

@@ -4,7 +4,7 @@ app_name = 智慧拍-后端应用
 # 应用版本号
 version = 1.0.0
 # 应用host地址
-host = 192.168.31.246
+host = 127.0.0.1
 # 应用服务启动名称
 app_run = api:app
 # 端口号

+ 0 - 0
python/custom_plugins/plugins/detail_template/miniso/__init__.py


+ 374 - 0
python/custom_plugins/plugins/detail_template/miniso/detail_miniso1.py

@@ -0,0 +1,374 @@
+"""
+步骤:
+1、整理需要处理的款号图-输出款号图文件夹
+2、整理所有相关的图片作为素材图
+3、按要求进行拼接
+"""
+import os
+from PIL import ImageFont
+import sys
+import settings
+
+# from module.view_control.generate_goods_no_detail_pic.detail_generate_base import DetailBase
+# from module.view_control.generate_goods_no_detail_pic.pic_deal import PictureProcessing
+is_test_plugins = False
+try:
+    is_test_plugins = settings.is_test_plugins
+except:
+    is_test_plugins = False
+
+if is_test_plugins:
+    from custom_plugins.plugins_mode.detail_generate_base import DetailBase
+    from custom_plugins.plugins_mode.pic_deal import PictureProcessing
+else:
+    from plugins_mode.detail_generate_base import DetailBase
+    from plugins_mode.pic_deal import PictureProcessing
+
+plugins_name = "详情模板"
+company_name_list = ["miniso"]
+template_name = "miniso-1"
+
+
+# 运动鞋详情页
+
+class DetailPicGet(DetailBase):
+    need_view = ["俯视", "侧视", "后跟", "鞋底", "内里"]
+    root = r"{}\resources\detail_temp\miniso\1".format(os.getcwd())
+
+    def __init__(self, goods_no, goods_no_value: dict, out_put_dir, windows=None, test=False, excel_data=None,
+                 assigned_page_list=None, **kwargs):
+
+        super().__init__(goods_no, goods_no_value, out_put_dir, windows=windows, excel_data=excel_data,
+                         assigned_page_list=assigned_page_list)
+        self.template_name = template_name
+        self.root = r"{}\resources\detail_temp\miniso\1".format(os.getcwd())
+        self.basic_width = PictureProcessing(r"{}\1.jpg".format(self.root)).width
+        print(f"run {template_name}")
+        # 红色
+        self.red_color = (248, 55, 69)
+        # 灰色
+        self.gray_color = (227, 227, 227)
+        self.white_color = (255, 255, 255)
+        self.black_color = (0, 0, 0)
+        self.base_bg_color = (255, 255, 255)
+        self.deal_pic_func_list = [
+            self.deal_pic_1,
+            self.deal_pic_2,
+            self.deal_pic_3,
+            self.deal_pic_4,
+            # self.deal_pic_5,
+        ]
+        if test:
+            self.run_test()
+        else:
+            self.run_all()
+
+    def run_test(self):
+        detailed_images = []
+        detailed_images.append(self.deal_pic_1())
+        detailed_images.append(self.deal_pic_2())
+        detailed_images.append(self.deal_pic_3())
+        detailed_images.append(self.deal_pic_4())
+        # detailed_images.append(self.deal_pic_5())
+        img = self.add_pic(detailed_images)
+        if img:
+            self.create_folder(r"{}/{}".format(self.out_put_dir, template_name))
+            img.save(r"{}/{}/{}.jpg".format(self.out_put_dir, template_name, self.goods_no, format="JPEG"))
+            img.show()
+
+    # 斜视图展示  多色进行拼接
+    def deal_pic_1(self):
+        detailed_images = []
+        font_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 60)  # 颜色名称
+        font_ml = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 40)  # 颜色名称
+        first_bg = PictureProcessing(r"{}\2.jpeg".format(self.root))
+        first_bg = first_bg.resize(value=self.basic_width)
+        circle_bg = PictureProcessing(r"{}\circle.png".format(self.root))
+        circle_bg = circle_bg.resize(value=circle_bg.width + 60)
+        circle_bg = circle_bg.resize(base='high', value=circle_bg.height + 10)
+        title_text = self.get_text_value("标题一")
+        ml_text = self.get_text_value("毫升")
+        title_bg = PictureProcessing().get_text_image_advanced(
+            font=font_title,
+            text=title_text,
+            fill=self.white_color,
+            return_mode="min_image",
+        )
+        ml_bg = PictureProcessing().get_text_image_advanced(
+            font=font_ml,
+            text=ml_text,
+            fill=self.white_color,
+            return_mode="min_image",
+        )
+        first_bg = first_bg.paste_img(top_img=title_bg, value=(40, 100), base="nw")
+        circle_bg = circle_bg.paste_img(top_img=ml_bg, value=(0, 0), base="cc")
+        first_bg = first_bg.paste_img(top_img=circle_bg, value=(40, 300), base="nw")
+        goods_art_no_list = list(self.data.keys())
+        pp_jpg_1, pp_png_1 = self.image_one_pic(return_orign=True,
+                                                goods_art_no=goods_art_no_list[0],
+                                                name="俯视",
+                                                )
+        pp_jpg_1 = pp_jpg_1.resize(value=self.basic_width / 2.8)
+        pp_png_1 = pp_png_1.resize(value=self.basic_width / 2.8)
+        first_bg = first_bg.to_overlay_pic_advance(top_img=pp_jpg_1, top_png_img=pp_png_1, base="nc", value=(0, 380))
+        # 图2
+        second_bg = PictureProcessing("RGB", (self.basic_width, 825), self.white_color)
+        second_bg = second_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
+        second_font_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 70)  # 颜色名称
+        second_title_text = self.get_text_value("标题二")
+        second_title_bg = PictureProcessing().get_text_image_advanced(
+            font=second_font_title,
+            text=second_title_text,
+            fill=self.black_color,
+            return_mode="min_image",
+        )
+        second_bg = second_bg.paste_img(top_img=second_title_bg, value=(68, 50), base="nw")
+        second_sub_bg = PictureProcessing("RGB", (self.basic_width * 0.9, 500), self.red_color)
+        second_sub_bg = second_sub_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
+        _, pp_png_1 = self.image_one_pic(return_orign=True,
+                                         goods_art_no=goods_art_no_list[0],
+                                         name="内里",
+                                         )
+        pp_cup = pp_png_1.resize(value=second_sub_bg.width * 0.6)
+        second_sub_bg = second_sub_bg.paste_img(top_img=pp_cup, value=(0, 0), base="cc")
+        second_bg = second_bg.paste_img(top_img=second_sub_bg, value=(0, 260), base="nc")
+        # 图2结束
+        basic_bg = PictureProcessing("RGB", (self.basic_width, first_bg.height + second_bg.height - 100),
+                                     (227, 227, 227))
+        basic_bg = basic_bg.paste_img(top_img=first_bg, value=(0, 0), base="nc")
+        basic_bg = basic_bg.paste_img(top_img=second_bg, value=(0, first_bg.height - 120), base="nc")
+        detailed_images.append(basic_bg)
+
+        return PictureProcessing(im=self.add_pic(detailed_images))
+
+    # 展示基础信息
+    def deal_pic_2(self):
+        detailed_images = []
+        goods_art_no_list = list(self.data.keys())
+        # 区域1
+        font_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 60)  # 颜色名称
+        title_text = self.get_text_value("标题三")
+        area_1 = PictureProcessing("RGB", (self.basic_width * 0.9, 500), self.red_color)
+        area_1 = area_1.radius(value=80, circular_pos=(1, 1, 1, 1))
+        _, pp_png_1 = self.image_one_pic(return_orign=True,
+                                         goods_art_no=goods_art_no_list[0],
+                                         name="侧视",
+                                         )
+        pp_png_1_copy = pp_png_1
+        pp_png_1 = pp_png_1.resize(value=area_1.width * 0.4)
+        pp_png_1 = pp_png_1.rotate_advance(doge=40)
+        area_1 = area_1.paste_img(top_img=pp_png_1, value=(-100, 20), base="en")
+        # 区域1结束
+        # 区域2
+        area_2 = PictureProcessing("RGB", (self.basic_width * 0.43, 500), self.red_color)
+        area_2 = area_2.radius(value=40, circular_pos=(1, 1, 1, 1))
+        pp_png_1_copy = pp_png_1_copy.resize(value=area_2.width * 1.1)
+        pp_png_1_copy = pp_png_1_copy.rotate_advance(doge=40)
+        area_2 = area_2.paste_img(top_img=pp_png_1_copy, value=(-area_2.width * 1.1, 50), base="en")
+        # 区域2结束
+        # 区域3
+        _, pp_png_3 = self.image_one_pic(return_orign=True,
+                                         goods_art_no=goods_art_no_list[0],
+                                         name="后跟",
+                                         )
+        area_3 = PictureProcessing("RGB", (self.basic_width * 0.43, area_2.height / 2 - 20), self.red_color)
+        area_3 = area_3.radius(value=40, circular_pos=(1, 1, 1, 1))
+        pp_png_3 = pp_png_3.resize(value=area_3.width / 1.5)
+        area_3 = area_3.paste_img(top_img=pp_png_3, value=(0, 0), base="en")
+        # 区域3结束
+        # 区域4
+        _, pp_png_4 = self.image_one_pic(return_orign=True,
+                                         goods_art_no=goods_art_no_list[0],
+                                         name="鞋底",
+                                         )
+        area_4 = PictureProcessing("RGB", (self.basic_width * 0.43, area_2.height / 2 - 20), self.red_color)
+        area_4 = area_4.radius(value=40, circular_pos=(1, 1, 1, 1))
+        pp_png_4 = pp_png_4.resize(value=area_4.width / 1.2)
+        pp_png_4 = pp_png_4.rotate_advance(doge=36)
+        area_4 = area_4.paste_img(top_img=pp_png_4, value=(-40, -80), base="en")
+        # 区域4结束
+        title_bg = PictureProcessing().get_text_image_advanced(
+            font=font_title,
+            text=title_text,
+            fill=self.black_color,
+            return_mode="min_image",
+        )
+        basic_bg = PictureProcessing("RGB", (self.basic_width, area_1.height + area_2.height + 170), self.white_color)
+        basic_bg = basic_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
+        basic_bg = basic_bg.paste_img(top_img=area_1, value=(0, 150), base="nc")
+        basic_bg = basic_bg.paste_img(top_img=area_2, value=(self.basic_width * 0.05, area_1.height + 170), base="nw")
+        basic_bg = basic_bg.paste_img(top_img=area_3, value=(self.basic_width * 0.05, area_1.height + 170), base="en")
+        basic_bg = basic_bg.paste_img(top_img=area_4,
+                                      value=(self.basic_width * 0.05, area_1.height + area_3.height + 210), base="en")
+        basic_bg = basic_bg.paste_img(top_img=title_bg, value=(self.basic_width * 0.1, 50), base="nw")
+        basic_bg = basic_bg.radius(value=80, circular_pos=(1, 1, 0, 0))
+        # 文本介绍
+        # 介绍卖点
+        font_desc = ImageFont.truetype(r"resources\ttf\mi\MiSans-Semibold.ttf", 35)  # 颜色名称
+        text_list = [
+            {
+                "text": "细节一",
+                "default": "轻盈缓震,健步如飞,久走不累",
+                "pos": (self.basic_width * 0.08, 458),
+                "base": "nw",
+            },
+            {
+                "text": "细节二",
+                "default": "透气网面,干爽舒适,告别闷热",
+                "pos": (self.basic_width * 0.08, 1078),
+                "base": "nw",
+            },
+            {
+                "text": "细节三",
+                "default": "柔韧大底,灵活弯折,自在穿行",
+                "pos": (self.basic_width * 0.3, 858),
+                "base": "en",
+            },
+            {
+                "text": "细节四",
+                "default": "柔韧大底,灵活弯折,自在穿行",
+                "pos": (self.basic_width * 0.33, 1118),
+                "base": "en",
+            },
+        ]
+        for text_data in text_list:
+            text = self.get_text_value(text_data["text"])
+            if not text:
+                text = text_data["default"]
+            temp_pp = PictureProcessing().get_text_image_advanced(
+                font=font_desc,
+                text=text,
+                fill=self.white_color,
+                return_mode="min_image",
+            )
+            basic_bg = basic_bg.paste_img(top_img=temp_pp, value=text_data["pos"], base=text_data["base"])
+        hide_basic_bg = PictureProcessing("RGB", (self.basic_width, basic_bg.height),
+                                          self.gray_color)
+        hide_basic_bg = hide_basic_bg.paste_img(top_img=basic_bg, value=(0, 0), base="cc")
+        detailed_images.append(hide_basic_bg)
+        bottom_bg = PictureProcessing("RGB", (self.basic_width, 150), self.white_color)
+        small_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Light.ttf", 20)  # 颜色名称
+        small_text = "*数据为第三方实验室侧视所得。保温效果因使用环境\n及初始水温可能略有差异,请以实际为准。"
+        small_text_bg = PictureProcessing().get_text_image_advanced(
+            font=small_title,
+            text=small_text,
+            fill=self.black_color,
+            align="center",
+            return_mode="min_image",
+        )
+        hide_bottom_bg = PictureProcessing("RGB", (self.basic_width, bottom_bg.height + 20),
+                                           self.gray_color)
+        bottom_bg = bottom_bg.paste_img(top_img=small_text_bg, value=(0, 0), base="cc")
+        bottom_bg = bottom_bg.radius(value=80, circular_pos=(0, 0, 1, 1))
+        hide_bottom_bg = hide_bottom_bg.paste_img(top_img=bottom_bg, value=(0, 0), base="nc")
+        detailed_images.append(hide_bottom_bg)
+        return PictureProcessing(im=self.add_pic(detailed_images))
+
+    # 细节展示
+    def deal_pic_3(self):
+        detailed_images = []
+        goods_art_no_list = list(self.data.keys())
+        hidden_bg = PictureProcessing("RGB", (self.basic_width, 1140), self.gray_color)
+        white_bg = PictureProcessing("RGB", (self.basic_width, hidden_bg.height - 50), self.white_color)
+        white_bg = white_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
+        red_bg = PictureProcessing(r"{}\2.jpeg".format(self.root))
+        red_bg = red_bg.resize(value=white_bg.width * 0.9)
+        red_bg = red_bg.resize(value=white_bg.height - 60, base='high')
+        # 粘贴
+        pp_jpg_1, pp_png_1 = self.image_one_pic(return_orign=True,
+                                                goods_art_no=goods_art_no_list[0],
+                                                name="俯视",
+                                                )
+        pp_jpg_1 = pp_jpg_1.resize(value=self.basic_width / 2.3)
+        pp_png_1 = pp_png_1.resize(value=self.basic_width / 2.3)
+        red_bg = red_bg.to_overlay_pic_advance(top_img=pp_jpg_1, top_png_img=pp_png_1, base="nc", value=(0, 80))
+        red_bg = red_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
+        font_ml = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 40)  # 颜色名称
+        circle_bg = PictureProcessing(r"{}\circle.png".format(self.root))
+        circle_bg = circle_bg.resize(value=circle_bg.width + 80)
+        ml_text = "产品实拍"
+        ml_bg = PictureProcessing().get_text_image_advanced(
+            font=font_ml,
+            text=ml_text,
+            fill=self.white_color,
+            return_mode="min_image",
+        )
+        circle_bg = circle_bg.paste_img(top_img=ml_bg, value=(0, 0), base="cc")
+        red_bg = red_bg.paste_img(top_img=circle_bg, value=(40, 50), base="nw")
+        white_bg = white_bg.paste_img(top_img=red_bg, value=(0, 0), base="cc")
+        hidden_bg = hidden_bg.paste_img(top_img=white_bg, value=(0, 0), base="cc")
+        # 展示鞋面材质  粘贴内里顶视图
+        detailed_images.append(hidden_bg)
+        # raise 1
+        return PictureProcessing(im=self.add_pic(detailed_images))
+
+    # 展示产品信息和颜色图
+    def deal_pic_4(self):
+        detailed_images = []
+        face = PictureProcessing(r"{}\face.png".format(self.root))
+        goods_art_no_list = list(self.data.keys())
+        font_1 = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 60)  # 颜色名称
+        hidden_bg = PictureProcessing("RGB", (self.basic_width, 950), self.gray_color)
+        white_bg = PictureProcessing("RGB", (self.basic_width, hidden_bg.height), self.white_color)
+        white_bg = white_bg.radius(value=80, circular_pos=(1, 1, 0, 0))
+        red_bg2 = PictureProcessing("RGB", (white_bg.width * 0.9, 800), self.red_color)
+        red_bg2 = red_bg2.radius(value=80, circular_pos=(1, 1, 1, 1))
+        ml_text = "产品信息"
+        ml_bg = PictureProcessing().get_text_image_advanced(
+            font=font_1,
+            text=ml_text,
+            fill=self.black_color,
+            return_mode="min_image",
+        )
+        _, pp_png_fu = self.image_one_pic(return_orign=True,
+                                          goods_art_no=goods_art_no_list[0],
+                                          name="俯视",
+                                          )
+        pp_png_fu = pp_png_fu.resize(value=red_bg2.width * 0.4)
+        _, pp_png_ce = self.image_one_pic(return_orign=True,
+                                          goods_art_no=goods_art_no_list[0],
+                                          name="侧视",
+                                          )
+        pp_png_ce = pp_png_ce.resize(value=red_bg2.width * 0.4)
+        red_bg2 = red_bg2.paste_img(top_img=pp_png_fu, value=(40, 50), base="wc")
+        red_bg2 = red_bg2.paste_img(top_img=pp_png_ce, value=(40, 50), base="ec")
+        white_bg = white_bg.paste_img(top_img=red_bg2, value=(0, 130), base="nc")
+        white_bg = white_bg.paste_img(top_img=face, value=(40, 50), base="en")
+        white_bg = white_bg.paste_img(top_img=ml_bg, value=(40, 50), base="nw")
+        hidden_bg = hidden_bg.paste_img(top_img=white_bg, value=(0, 0), base="cc")
+        detailed_images.append(hidden_bg)
+        bottom = PictureProcessing(r"{}\1.jpg".format(self.root))
+        detailed_images.append(bottom)
+        return PictureProcessing(im=self.add_pic(detailed_images))
+
+    # 添加注意事项
+    def deal_pic_5(self):
+        detailed_images = []
+        detailed_images.append(PictureProcessing(r"{}\19.jpg".format(self.root)))
+        detailed_images.append(PictureProcessing(r"{}\20.jpg".format(self.root)))
+        return PictureProcessing(im=self.add_pic(detailed_images))
+
+    def copy_view(self, pp_jpg: PictureProcessing, pp_png: PictureProcessing):
+        pp_bg_jpg = PictureProcessing("RGB", (1600, 1600), (255, 255, 255))
+        pp_bg_png = PictureProcessing("RGBA", (1600, 1600), (255, 255, 255, 0))
+
+        pp_jpg_1_list = [pp_jpg, pp_jpg]
+        pp_png_1_list = [pp_png, pp_png]
+
+        x, y = 0, 0
+        for index, pp_jpg in enumerate(pp_jpg_1_list):
+            pp_bg_jpg = pp_bg_jpg.to_overlay_pic_advance(top_img=pp_jpg,
+                                                         value=(x, y))
+            x += pp_jpg.width - 20
+
+        x, y = 0, 0
+        for index, pp_png in enumerate(pp_png_1_list):
+            pp_bg_png = pp_bg_png.paste_img(top_img=pp_png,
+                                            value=(x, y))
+            x += pp_jpg.width - 20
+
+        min_bbox = pp_bg_png.getbbox()
+        min_bbox = PictureProcessing().expand_bbox(min_bbox, value=50)
+        pp_bg_jpg = pp_bg_jpg.crop(bbox=min_bbox)
+        pp_bg_png = pp_bg_png.crop(bbox=min_bbox)
+        return pp_bg_jpg, pp_bg_png

+ 53 - 45
python/custom_plugins/plugins_mode/detail_generate_base.py

@@ -25,11 +25,14 @@ from logger import logger
 from PIL import ImageFont
 import settings
 from settings import sendSocketMessage
+
 # 全局线程池
 _executor = ThreadPoolExecutor(max_workers=4)
 # 全局事件循环和线程
 _message_loop = None
 _message_thread = None
+
+
 def _start_message_loop():
     """在单独线程中启动事件循环"""
     global _message_loop
@@ -77,14 +80,14 @@ _init_message_thread()
 
 class DetailBase(object):
     def __init__(
-        self,
-        goods_no,
-        goods_no_value: dict,
-        out_put_dir,
-        windows=None,
-        excel_data=None,
-        assigned_page_list=None,
-        output_queue=None,
+            self,
+            goods_no,
+            goods_no_value: dict,
+            out_put_dir,
+            windows=None,
+            excel_data=None,
+            assigned_page_list=None,
+            output_queue=None,
     ):
         self.goods_no = goods_no
         self.output_queue = output_queue
@@ -146,20 +149,21 @@ class DetailBase(object):
 
     def del_detail_folder(self):
         out_path = "{out_put_dir}/切片图-{template_name}".format(
-            out_put_dir=self.out_put_dir,template_name=self.template_name
+            out_put_dir=self.out_put_dir, template_name=self.template_name
         )
         detail_image_path = "{out_put_dir}/详情页-{template_name}".format(
-            out_put_dir=self.out_put_dir,template_name=self.template_name
+            out_put_dir=self.out_put_dir, template_name=self.template_name
         )
         if not os.path.exists(out_path):
             return
         try:
-            shutil.rmtree(out_path,onerror=settings.handle_remove_readonly)
+            shutil.rmtree(out_path, onerror=settings.handle_remove_readonly)
         except BaseException as e:
             print("删除文件夹失败", e)
+
     def del_detail_longimage(self):
         detail_image_path = "{out_put_dir}/详情页-{template_name}".format(
-            out_put_dir=self.out_put_dir,template_name=self.template_name
+            out_put_dir=self.out_put_dir, template_name=self.template_name
         )
         if not os.path.exists(detail_image_path):
             return
@@ -183,7 +187,7 @@ class DetailBase(object):
         detailed_images = self.deal_details()
         self.create_folder(self.out_put_dir)
         detail_path = "{out_put_dir}/切片图-{template_name}".format(
-            out_put_dir=self.out_put_dir, goods_no=self.goods_no,template_name=self.template_name
+            out_put_dir=self.out_put_dir, goods_no=self.goods_no, template_name=self.template_name
         )
         self.create_folder(detail_path)
         self.save_to_png(detailed_images=detailed_images, detail_path=detail_path)
@@ -208,12 +212,12 @@ class DetailBase(object):
             out_put_dir=self.out_put_dir
         )
         for pic_data in self.goods_no_value["货号资料"]:
-            print("正在复制 pic_data",pic_data)
-            scene_image = pic_data.get("场景图",None)
-            model_image = pic_data.get("模特图",None)
-            goods_art_no = pic_data.get("货号",None)
-            print("正在复制 scene_image",scene_image)
-            print("正在复制 model_image",model_image)
+            print("正在复制 pic_data", pic_data)
+            scene_image = pic_data.get("场景图", None)
+            model_image = pic_data.get("模特图", None)
+            goods_art_no = pic_data.get("货号", None)
+            print("正在复制 scene_image", scene_image)
+            print("正在复制 model_image", model_image)
             print("正在复制===================================>")
             # {out_put_dir}/{goods_number}
             # 资料长度,决定是否添加货号后缀
@@ -224,25 +228,28 @@ class DetailBase(object):
             if scene_image:
                 self.copyImage(scene_image, f"{scp_path}/场景图{concat_shuffix}.jpg")
         return True
-    def copyImage(self,src_path,limit_path):
+
+    def copyImage(self, src_path, limit_path):
         try:
-          shutil.copy(src_path, limit_path)
+            shutil.copy(src_path, limit_path)
         except Exception as e:
-            logger.info(f"copyImage 复制模特图/场景图出错:{str(e)}",src_path,limit_path)
-    def concatAigcImage(self,image_path,resize=1600,bg_color=(255,255,255)):
+            logger.info(f"copyImage 复制模特图/场景图出错:{str(e)}", src_path, limit_path)
+
+    def concatAigcImage(self, image_path, resize=1600, bg_color=(255, 255, 255)):
         """拼接模特图场景图"""
         try:
-                mote_img = PictureProcessing(image_path)
-                mote_img = mote_img.resize(value=resize)
-                bg_img = PictureProcessing(
-                    "RGB", (mote_img.width, mote_img.height), bg_color
-                )
-                bg_img = bg_img.paste_img(top_img=mote_img, base="nc", value=(0, 0))
-                print("拼接模特图场景图====>",image_path)
-                return bg_img
+            mote_img = PictureProcessing(image_path)
+            mote_img = mote_img.resize(value=resize)
+            bg_img = PictureProcessing(
+                "RGB", (mote_img.width, mote_img.height), bg_color
+            )
+            bg_img = bg_img.paste_img(top_img=mote_img, base="nc", value=(0, 0))
+            print("拼接模特图场景图====>", image_path)
+            return bg_img
         except Exception as e:
-             logger.info(f"copyImage 拼接模特图/场景图出错:{str(e)}")
-             return
+            logger.info(f"copyImage 拼接模特图/场景图出错:{str(e)}")
+            return
+
     # 移动一张图片到新的文件夹
     def move_one_pic(self, old_path, new_path, new_name):
         image_file = os.listdir(old_path)[0]
@@ -268,9 +275,9 @@ class DetailBase(object):
 
             return [x for x in detailed_images if x]
         except KeyError as e:
-          raise UnicornException(f"缺少详情页资料:[{e}],请检查系统商品信息或excel是否缺少该字段")
+            raise UnicornException(f"缺少详情页资料:[{e}],请检查系统商品信息或excel是否缺少该字段")
         except Exception as e:
-          raise UnicornException(str(e))
+            raise UnicornException(str(e))
 
     # 生成拼接的图片
     def generate_spliced_picture(self):
@@ -286,7 +293,7 @@ class DetailBase(object):
         #     },
         # )
         detail_path = "{out_put_dir}/切片图-{template_name}".format(
-            out_put_dir=self.out_put_dir, goods_no=self.goods_no,template_name=self.template_name
+            out_put_dir=self.out_put_dir, goods_no=self.goods_no, template_name=self.template_name
         )
         if not os.path.exists(detail_path):
             return
@@ -296,7 +303,7 @@ class DetailBase(object):
         # 生成拼接图
         img = self.add_pic(detailed_images)
         join_path = "{out_put_dir}/详情页-{template_name}".format(
-            out_put_dir=self.out_put_dir, goods_no=self.goods_no,template_name=self.template_name
+            out_put_dir=self.out_put_dir, goods_no=self.goods_no, template_name=self.template_name
         )
         # self.create_folder(join_path)
         img.save("{}.jpg".format(join_path), format="JPEG")
@@ -386,7 +393,7 @@ class DetailBase(object):
 
             return text
         except:
-          raise UnicornException(f"缺少货号资料:[{key}],请检查系统商品信息或excel是否缺少该字段")
+            raise UnicornException(f"缺少货号资料:[{key}],请检查系统商品信息或excel是否缺少该字段")
 
     def create_folder(self, path):
         if not os.path.exists(path):
@@ -442,7 +449,7 @@ class DetailBase(object):
         return return_data
 
     def get_overlay_pic_from_dict(
-        self, goods_art_no, color_name, bg_color
+            self, goods_art_no, color_name, bg_color
     ) -> PictureProcessing:
         self.check_state_end()
         # 增加逻辑,获取任意货号下的组合图
@@ -586,6 +593,7 @@ class DetailBase(object):
             # 移动颜色图=====================
             # goods_art_no_f = "{}/{}".format(self.out_put_dir, self.goods_no)
             sorted_list_800 = natsorted(goods_art_no_dict["800x800"], key=lambda x: x.split("(")[1].split(")")[0])
+            print("sorted_list_800", sorted_list_800)
             goods_art_no_f = "{}".format(self.out_put_dir)
             self.create_folder(goods_art_no_f)
             # 放入一张主图
@@ -599,14 +607,14 @@ class DetailBase(object):
 
             # 把其他主图放入作为款号图=====================
             if move_main_pic:
-                for idx,pic_path in enumerate(sorted_list_800):
+                for idx, pic_path in enumerate(sorted_list_800):
                     index = idx + 1
                     try:
-                      split_size = pic_path.split("_")[1].split(".")[0]
+                        split_size = pic_path.split("_")[1].split(".")[0]
                     except:
-                      split_size = ""
-                    suffix_name = "_"+split_size if split_size else ""
-                    print("pic_path=========>",split_size)
+                        split_size = ""
+                    suffix_name = "_" + split_size if split_size else ""
+                    print("pic_path=========>", split_size)
                     e = os.path.splitext(pic_path)[1]
                     shutil.copy(
                         pic_path,
@@ -769,7 +777,7 @@ class DetailBase(object):
                         if settings.getSysConfigs(
                             "basic_configs", "image_sharpening", "1"
                         )
-                        == ""
+                           == ""
                         else settings.getSysConfigs(
                             "basic_configs", "image_sharpening", "1"
                         )

+ 3 - 5
python/detail_template_test.py

@@ -3,18 +3,16 @@ import settings
 
 settings.is_test_plugins = True
 
-
-from custom_plugins.plugins.detail_template.qingyangyizhan.detail_qingyangyizhan2 import (
+from custom_plugins.plugins.detail_template.miniso.detail_miniso1 import (
     DetailPicGet,
 )
 
-
-data = json.load(open("detail_template_test_qingyangyizhan.json", mode="r", encoding="utf-8"))
+data = json.load(open("detail_template_test_miniso.json", mode="r", encoding="utf-8"))
 for goods_no, value in data.items():
     d = DetailPicGet(
         goods_no=goods_no,
         goods_no_value=value,
-        out_put_dir=r"C:\Development\project\python\CameraMachine\python\output\detail_qingyangyizhan2",
+        out_put_dir=r"C:\Development\project\python\CameraMachine\python\output\detail_miniso",
         test=False,
     )
 print("生成成功")

+ 64 - 0
python/detail_template_test_miniso.json

@@ -0,0 +1,64 @@
+{
+  "AC5120913": {
+    "款号": "AC5120913",
+    "货号资料": [
+      {
+        "货号": "hb",
+        "文件夹名称": "hb",
+        "编号": "hb",
+        "颜色名称": "枪色",
+        "模特图": "",
+        "场景图": "",
+        "pics": {
+          "俯视-抠图": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(1)_俯视_抠图.png",
+          "俯视-阴影": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(1)_俯视_阴影.png",
+          "侧视-抠图": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(2)_侧视_抠图.png",
+          "侧视-阴影": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(2)_侧视_阴影.png",
+          "后跟-抠图": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(3)_后跟_抠图.png",
+          "后跟-阴影": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(3)_后跟_阴影.png",
+          "鞋底-抠图": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(4)_鞋底_抠图.png",
+          "鞋底-阴影": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(4)_鞋底_阴影.png",
+          "内里-抠图": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(5)_内里_抠图.png",
+          "内里-阴影": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(5)_内里_阴影.png",
+          "组合-抠图": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(6)_组合_抠图.png",
+          "组合-阴影": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(6)_组合_阴影.png",
+          "组合2-抠图": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(7)_组合2_抠图.png",
+          "组合2-阴影": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(7)_组合2_阴影.png",
+          "组合3-抠图": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(8)_组合3_抠图.png",
+          "组合3-阴影": "C:/Users/15001/Desktop/miniso/hb/阴影图处理/hb(8)_组合3_阴影.png"
+        },
+        "800x800": [
+          "C:/Users/15001/Desktop/miniso/hb/800x800/hb(1)_1500.jpg",
+          "C:/Users/15001/Desktop/miniso/hb/800x800/hb(2)_1500.jpg",
+          "C:/Users/15001/Desktop/miniso/hb/800x800/hb(3)_1500.jpg",
+          "C:/Users/15001/Desktop/miniso/hb/800x800/hb(4)_1500.jpg",
+          "C:/Users/15001/Desktop/miniso/hb/800x800/hb(5)_1500.jpg"
+        ]
+      }
+    ],
+    "文件夹名称": "hb",
+    "标题一": "蝴蝶结系列\n三丽欧悦享提手双饮保温杯",
+    "毫升": "500ML",
+    "标题二": "316不锈钢内胆\n守护饮水健康",
+    "标题三": "好用藏在细节里",
+    "细节一": "保温能效水平:IV级\n*20°室温下,装入96℃\n以上热水,静止不开启状\n态下6小时后≥44℃",
+    "细节二": "安全锁扣\n密封锁水",
+    "细节三": "PP吸嘴",
+    "细节四": "直饮口",
+    "帮面": "网布+合成革",
+    "鞋底": "橡胶底",
+    "内里": "网布",
+    "鞋垫": "合成革",
+    "鞋宽": "11.8CM",
+    "帮高": "5.7CM",
+    "跟高": "7.0CM",
+    "细节亮点主标题": "舒适鞋面",
+    "细节亮点副标题": "轻透网面享受每一步的清爽",
+    "艺-主标题": "鞋面弧形拼接",
+    "艺-副标题": "尽显不拘一格风尚",
+    "跟-主标题": "鞋底跟高7.0CM",
+    "跟-副标题": "迈步更轻松",
+    "底-主标题": "全底贴地 出行畅快",
+    "底-副标题": "凹凸纹理,轻松行走"
+  }
+}