customer_template_service.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from email.policy import default
  2. from settings import *
  3. from middleware import UnicornException
  4. import copy
  5. import requests
  6. from PIL import Image
  7. from io import BytesIO
  8. import base64
  9. generate_templace = "/generate"
  10. # CUSTOMER_TEMPLATE_URL
  11. class CustomerTemplateService:
  12. def __init__(self):
  13. pass
  14. def generateTemplate(self,config_data,template_json):
  15. '''
  16. 参数:
  17. config_data: 配置数据
  18. template_json: 模板数据
  19. '''
  20. print("开始生成模板")
  21. # print("config_data",config_data)
  22. handler_config_data = self.__handler_config_data(config_data)
  23. print("handler_config_data",handler_config_data)
  24. headers = {"Content-Type": "application/json"}
  25. json_data = {"goodsList":handler_config_data,"canvasList":template_json}
  26. json_data = json.dumps(json_data,ensure_ascii=False)
  27. # print("json_data",json_data)
  28. template_result = requests.post(CUSTOMER_TEMPLATE_URL+generate_templace,data=json_data,headers=headers)
  29. resultJson = template_result.json()
  30. code = resultJson.get("code")
  31. msg = resultJson.get("msg")
  32. images = resultJson.get("images",[])
  33. if code != 0:
  34. raise UnicornException(f"详情页生成失败,请检查模板数据是否正确:{msg}")
  35. for image in images:
  36. canvasIndex = image.get("canvasIndex")
  37. dataUrl = image.get("dataUrl")
  38. path = r"C:/Development/project/output/2025-12-05/详情图-测试"
  39. save_name = f"{path}/切片图-自定义-1/{int(canvasIndex)+1}.png"
  40. match dataUrl:
  41. case "model":
  42. # 复制模特图进行拼接
  43. pass
  44. case "scene":
  45. # 复制场景图进行拼接
  46. pass
  47. case _:
  48. self.save_base64_image(dataUrl,save_name)
  49. print("模板生成成功")
  50. def __handler_config_data(self,config_data):
  51. '''
  52. 处理配置数据,返回一个新的数据对象
  53. '''
  54. # 深拷贝原始数据,确保不改变原数据对象
  55. new_config_data = copy.deepcopy(config_data)
  56. # 如果输入是字典,则将其转换为目标结构
  57. if isinstance(new_config_data, dict):
  58. result = []
  59. for key, item in new_config_data.items():
  60. # 提取需要添加的数据
  61. additional_data = {k: v for k, v in item.items() if k not in ["款号", "货号资料"]}
  62. # 遍历货号资料,将额外数据添加到每个货号对象中
  63. for product in item.get("货号资料", []):
  64. product.update(additional_data)
  65. # 构建目标结构
  66. result.append({key: item})
  67. return result
  68. return new_config_data
  69. def save_base64_image(self,base64_data, output_path):
  70. """
  71. 将 Base64 编码的图像保存到本地文件
  72. 参数:
  73. - base64_data: str,Base64 编码的图像数据(不包含前缀如 "data:image/png;base64,")
  74. - output_path: str,保存图像的本地路径
  75. """
  76. if "data:image/jpeg;base64," in base64_data:
  77. base64_data = base64_data.split(",")[1]
  78. try:
  79. # 1. 解码 Base64 数据
  80. image_data = base64.b64decode(base64_data)
  81. # 2. 加载图像数据
  82. image = Image.open(BytesIO(image_data))
  83. # 3. 检查路径是否存在,如果不存在则创建
  84. directory = os.path.dirname(output_path)
  85. if directory and not os.path.exists(directory):
  86. os.makedirs(directory)
  87. print(f"目录已创建: {directory}")
  88. # 4. 保存图像到本地
  89. image.save(output_path)
  90. print(f"图像已成功保存到 {output_path}")
  91. except Exception as e:
  92. print(f"保存图像失败: {e}")
  93. print(f"Base64 数据前 100 字符: {base64_data[:100]}")