Bladeren bron

ARN1411512

rambo 8 maanden geleden
bovenliggende
commit
4132da8b31

+ 30 - 46
python/api.py

@@ -6,6 +6,8 @@ import json
 from logger import logger
 from serial.tools import list_ports
 from model import PhotoRecord
+import settings
+
 from utils.hlm_http_request import forward_request
 from utils.utils_func import check_path
 from sockets.socket_client import socket_manager
@@ -117,66 +119,49 @@ async def forwardRequest(request: HlmForwardRequest):
 @app.post("/handle_detail")
 async def handle_detail(request: Request, params: HandlerDetail):
     goods_art_no = params.goods_art_no
-    token = params.token
+    token = "Bearer " + params.token
     session = SqlQuery()
     pr = CRUD(PhotoRecord)
     images = pr.read_all(session, conditions={"goods_art_no": goods_art_no})
     if not images:
         raise UnicornException("没有可用货号数据")
-    image_dir = "{}/data".format(os.getcwd())
+    image_dir = "{}/data/".format(os.getcwd())
     for itemImg in images:
         if not os.path.exists(image_dir + "/" + os.path.basename(itemImg.image_path)):
             shutil.copy(itemImg.image_path, image_dir)
     check_path(image_dir)
     dealImage = DealImage(image_dir)
-    dealImage.header = {}
-    print(">>>>>>>>>>>>>>>>>请求参数")
-    print(dealImage.header)
     resFlag, path = dealImage.dealMoveImage(
         image_dir=image_dir, callback_func=None, goods_art_no=goods_art_no
     )
     if not resFlag:
-        return {
-            "code": 0,
-            "msg": path,
-            "data": None,
-        }
-    #
-    # params = json.dump(request.query_params)
-    # #{'image_dir': 'D:/phpstudy_pro/WWW/auto_photo/output/2024-11-18', 'image_order': '俯视,侧视,后跟,鞋底,内里', 'is_check_number': True,
-    # 'resize_image_view': '后跟', 'cutout_mode': '1', 'logo_path': '', 'special_goods_art_no_folder_line': '', 'is_use_excel': True,
-    # 'excel_path': '', 'is_check_color_is_all': True, 'assigned_page_dict': {},
-    # 'temp_class': {'huilima-2': <class 'detail_template.huilima.detail_huilima2.DetailPicGet'>,
-    # 'huilima-3': <class 'detail_template.huilima.detail_huilima3.DetailPicGet'>,
-    # 'huilima-4': <class 'detail_template.huilima.detail_huilima4.DetailPicGet'>,
-    # 'huilima-1': <class 'detail_template.huilima.detail_huilima1.DetailPicGet'>},
-    # 'temp_name': 'huilima-2',
-    # 'temp_name_list': ['huilima-2', 'huilima-3', 'huilima-4', 'huilima-1'],
-    # 'target_error_folder': 'D:/phpstudy_pro/WWW/auto_photo/output/2024-11-18/软件-生成详情错误'}
-    #
-    # ,鞋底,内里
+        raise UnicornException(path)
+
     config_data = {
         "image_dir": path,
-        "image_order": "俯视,侧视,后跟,鞋底,内里",
+        "image_order": params.template_image_order,
+        "goods_art_no": goods_art_no,
         "is_check_number": False,
         "resize_image_view": "后跟",
-        "cutout_mode": "1",
-        "logo_path": "",
+        "cutout_mode": "0",
+        "logo_path": params.logo_path,
         "special_goods_art_no_folder_line": "",
-        "is_use_excel": False,
-        "excel_path": "",
-        "is_check_color_is_all": True,
-        "cutout_is_pass": False,
+        "is_use_excel": False if params.excel_path == "" else True,  # 是否使用excel
+        "excel_path": params.excel_path,  # excel路径
+        "is_check_color_is_all": False,
+        "cutout_is_pass": True,
         "assigned_page_dict": {},
         "detail_is_pass": True,
-        "upload_is_enable": True,
+        "upload_is_pass": False,
+        "upload_is_enable": False,
+        "is_filter": False,
         "temp_class": {
             "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",
             "huilima-1": "custom_plugins.plugins.detail_template.huilima.detail_huilima1.DetailPicGet",
         },
-        "temp_name": "huilima-2",
+        "temp_name": params.temp_name,
         "temp_name_list": ["huilima-2", "huilima-3", "huilima-4", "huilima-1"],
         "target_error_folder": f"{path}/软件-生成详情错误",
     }
@@ -193,26 +178,23 @@ async def handle_detail(request: Request, params: HandlerDetail):
     run_main = RunMain(obj,token)
     return_data = run_main.check_before_cutout(config_data)
     cutout_res = run_main.check_for_cutout_image_first_call_back(return_data)
-    print("cutout_res", cutout_res)
     check_for_detail_first_res = None
     if cutout_res == True:
         return_data_check_before_detail = run_main.check_before_detail(config_data)
+        print("return_data_check_before_detail", return_data_check_before_detail)
         check_for_detail_first_res = run_main.check_for_detail_first_call_back(
             return_data_check_before_detail
         )
-        print("check_for_detail_first_res", check_for_detail_first_res)
-        # run_main.do_thread_run(
-        #     func=func,
-        #     call_back=run_main.check_for_detail_first_call_back,
-        #     time_out=30,
-        #     is_show_mask=False,
-        # )
     if isinstance(check_for_detail_first_res, partial):
         result = check_for_detail_first_res()
-        print("Result from partial call:", result)
-        config_data = result["config_data"]
+        try:
+            config_data = result["config_data"]
+        except:
+            config_data = result
+    print("config_data", config_data)
     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)
@@ -224,10 +206,12 @@ async def handle_detail(request: Request, params: HandlerDetail):
                     config_data=config_data,
                     token=token,
                 )
-                # upload_pic.run_end_sign.connect(at_pic.deal_run_end_sign)
-                # at_pic.show_progress_detail()
                 upload_pic.run()
-                # threading.Thread(target=self.upload_pic.run_by_thread, args=()).start()
+        return {
+            "code": 0,
+            "msg": "详情处理完成",
+            "data": {"out_put_dir": config_data["out_put_dir"]},
+        }
 
 
 @app.post("/get_device_configs", description="获取可执行程序命令列表")

+ 16 - 15
python/middleware.py

@@ -10,7 +10,7 @@ from settings import *
 import random
 import os, json
 from pydantic import BaseModel, validator, conint, constr, Field
-from databases import create_all_database, DeviceConfig,SysConfigs, CRUD,batch_insert_sys_configs, SqlQuery,batch_insert_device_configs
+
 
 # 关闭文档
 app = FastAPI()
@@ -35,20 +35,21 @@ app.add_middleware(
 
 @app.on_event("startup")
 def on_startup():
-    create_all_database()
-    session = SqlQuery()
-    device_config_crud = CRUD(DeviceConfig)
-    all_devices = device_config_crud.read_all(session)
-    if len(all_devices) == 0:
-        # 如果配置表中一条数据都没有,就将初始化数据全部插入到数据表中
-        actions = json.load(open("action.json", encoding="utf-8"))
-        batch_insert_device_configs(session,actions)
-    sys_config_crud = CRUD(SysConfigs)
-    all_sys_configs = sys_config_crud.read_all(session)
-    if len(all_sys_configs) == 0:
-        # 如果配置表中一条数据都没有,就将初始化数据全部插入到数据表中
-        sys_config_json = json.load(open("sys_configs.json", encoding="utf-8"))
-        batch_insert_sys_configs(session, sys_config_json)
+    pass
+    # create_all_database()
+    # session = SqlQuery()
+    # device_config_crud = CRUD(DeviceConfig)
+    # all_devices = device_config_crud.read_all(session)
+    # if len(all_devices) == 0:
+    #     # 如果配置表中一条数据都没有,就将初始化数据全部插入到数据表中
+    #     actions = json.load(open("action.json", encoding="utf-8"))
+    #     batch_insert_device_configs(session,actions)
+    # sys_config_crud = CRUD(SysConfigs)
+    # all_sys_configs = sys_config_crud.read_all(session)
+    # if len(all_sys_configs) == 0:
+    #     # 如果配置表中一条数据都没有,就将初始化数据全部插入到数据表中
+    #     sys_config_json = json.load(open("sys_configs.json", encoding="utf-8"))
+    #     batch_insert_sys_configs(session, sys_config_json)
 
 
 class UnicornException(Exception):

+ 17 - 0
python/models.py

@@ -57,8 +57,25 @@ class SysConfigParams(BaseModel):
     value: str = Field(default=None, description="json数据")
 
 
+class TemplateItem(BaseModel):
+    """模板项"""
+
+    id: int = Field(description="模板ID")
+    template_id: str = Field(description="模板名称")
+    template_name: str = Field(description="模板名称")
+    template_preview_image: str = Field(description="模板名称")
+    template_cover_image: str = Field(description="模板名称")
+    template_local_classes: str = Field(description="模板名称")
+    template_image_order: str = Field(description="模板名称")
+
+
 class HandlerDetail(BaseModel):
     """获取可执行程序命令列表"""
 
     goods_art_no: str = Field(default=None, description="货号")
     token: str = Field(default=None, description="惠利玛请求token")
+    template_image_order:str = Field(default=None, description="模板图片排序")
+    excel_path: Optional[str] = Field(default="", description="excel路径")
+    temp_name: str = Field(default="", description="选中的模板名称")
+    temp_list: list[TemplateItem] = Field(default=None, description="所有模板列表")
+    logo_path: Optional[str] = Field(default="", description="logo地址路径")

+ 24 - 9
python/service/auto_deal_pics/upload_pic.py

@@ -6,7 +6,7 @@ import concurrent.futures
 import re
 from PIL import Image
 from io import BytesIO
-
+from middleware import UnicornException
 
 # 详情图上传
 class UploadPic():
@@ -61,7 +61,7 @@ class UploadPic():
                 files = os.listdir(goods_no_path)
                 if "details" not in files:
                     continue
-
+                not_goods_art_msg = ""
                 for f in files:
                     f_path = "{}\{}\{}\{}".format(self.to_deal_dir, group_folders, goods_no, f)
                     if os.path.isdir(f_path):
@@ -70,13 +70,21 @@ class UploadPic():
                             # 是否货号文件夹判断
                             if not self.is_goods_art_dir(f, goods_no):
                                 self.show_info("{}文件夹下  {} {} 疑似不是货号".format(group_folders, goods_no, f))
+                                not_goods_art_msg += (
+                                    "{}文件夹下  {} {} 疑似不是货号".format(
+                                        group_folders, goods_no, f
+                                    )
+                                    + "\n"
+                                )
                                 flag = False
         if not flag:
             self.show_info("请解决以上问题后重试")
+            raise UnicornException(f"请解决:\n{not_goods_art_msg}\n以上问题后重试")
             return
 
         if total_num == 0:
             self.show_info("没有任何款号文件夹 需要上传")
+            raise UnicornException("没有任何款号文件夹 需要上传")
             return
 
         self.lock = threading.Lock()
@@ -100,8 +108,8 @@ class UploadPic():
 
                 # ================处理单个款号信息,图片上传处理============
                 self.show_info("开始处理  {}".format(goods_no))
-                try:
-                    if self.deal_goods_pic(goods_no, goods_no_path):
+                # try:
+                if self.deal_goods_pic(goods_no, goods_no_path):
                         # 移动文件到已完成
                         # dest = "{}\{}\{}".format(self.is_deal_dir, group_folders, goods_no)
                         # if os.path.exists(dest):
@@ -109,13 +117,13 @@ class UploadPic():
                         # else:
                         #     shutil.move(goods_no_path, dest)
                         self.show_info("{} 上传成功".format(goods_no))
-                    else:
+                else:
                         self.show_info("{} 处理失败".format(goods_no))
                         error_data.append(goods_no)
                         pass
-                except BaseException as e:
-                    self.show_info("上传异常:{},{}".format(goods_no, e))
-
+                # except BaseException as e:
+                #     self.show_info("上传异常:{},{}".format(goods_no, e))
+                #     raise UnicornException("上传异常:{},{}".format(goods_no, e))
                 # n += 1
                 # self.show_info({"type": "show_p",
                 #                 "data": int(n * 100 / total_num)})
@@ -123,9 +131,11 @@ class UploadPic():
         self.show_info("========已结束========== ")
         if error_data:
             self.show_info("以下编号/款号处理失败")
+            error_msg = ""
             for data in error_data:
                 self.show_info("{}".format(data))
-
+                error_msg += data+"\n"
+            raise UnicornException(f"以下编号/款号处理失败\n{error_msg}")
         # self.show_info({"type": "change_state",
         #                 "data": 2})
 
@@ -157,6 +167,7 @@ class UploadPic():
         files = os.listdir(goods_no_path)
         if "details" not in files:
             self.show_info("{} 缺少details 文件夹".format(goods_no, ))
+            raise UnicornException("{} 缺少details 文件夹".format(goods_no))
             return False
         for f in files:
             f_path = "{}\{}".format(goods_no_path, f)
@@ -172,6 +183,7 @@ class UploadPic():
                 if "货号素材" in f:
                     if "_" not in f:
                         self.show_info("{} 货号素材文件夹 格式错误".format(goods_no))
+                        raise UnicornException("{} 货号素材文件夹 格式错误".format(goods_no))
                         return False
 
         # 校验所有编号是否存在,是否是同个款
@@ -204,6 +216,7 @@ class UploadPic():
         _ = set([goods_number_data[x]["款号"] for x in goods_number_data])
         if len(_) != 1:
             self.show_info("{} 存在多个不同的款号".format(_))
+            raise UnicornException("{} 存在多个不同的款号".format(_))
             return False
 
         # 重新定义款号
@@ -245,6 +258,7 @@ class UploadPic():
 
             if not self.pic_data[key]["url"]:
                 self.show_info("{} {} 图片未上传完成".format(key, goods_no))
+                raise UnicornException("{} {} 图片未上传完成".format(key, goods_no))
                 return
 
         up_data = {"goods_art_no": [],
@@ -356,6 +370,7 @@ class UploadPic():
             if value:
                 if not self.data_mode_upload_pic.upload_pic_list_data(data={"images": value}):
                     self.show_info("{} {}上传错误".format(goods_no, key))
+                    raise UnicornException("{} {}上传错误".format(goods_no, key))
                     return False
 
         print("---{}  {} 完成".format(goods_no, time.time() - s))

+ 4 - 2
python/service/data.py

@@ -35,6 +35,7 @@ class DataModeGenerateDetail(DataBaseModel):
 
     def __init__(self, token):
         super().__init__(token)
+        self.token = token
         self.get_online_data.refresh_headers(token)
 
     def get_real_color_name(self, color_name: str):
@@ -61,11 +62,12 @@ class DataModeGenerateDetail(DataBaseModel):
                 if flag == "NUM":
                     # 注意,红蜻蜓和惠利玛函数不同
                     online_goods_art_data = self.get_online_data.get_goods_art_no_info(
-                        numbers_list=_list
+                        numbers_list=_list,
+                        token=self.token
                     )
                 else:
                     online_goods_art_data = self.get_online_data.get_goods_art_no_info(
-                        goods_art_list=_list
+                        goods_art_list=_list, token=self.token
                     )
                 if online_goods_art_data:
                     for key in online_goods_art_data:

+ 3 - 1
python/service/deal_image.py

@@ -14,6 +14,7 @@ from service.pic_deal import Picture
 import xlsxwriter
 from PIL import Image
 from .base_deal import BaseDealImage
+from middleware import UnicornException
 _Type = ['.png', '.PNG', '.jpg', '.JPG', '.gif', '.GIF', ".jpge", ".JPGE"]
 
 
@@ -173,7 +174,7 @@ class DealImage(BaseDealImage):
 
     def dealMoveImage(self, image_dir: str, callback_func=None,goods_art_no=None) -> dict:
         if not self.check_path(image_dir=image_dir + "/历史"):
-            return False, "文件夹创建失败"
+            raise UnicornException("文件夹创建失败")
 
         # 遍历目标文件夹,获取有拍摄信息的图片,并按拍摄时间排序
         files = self.list_dir(image_dir)
@@ -216,6 +217,7 @@ class DealImage(BaseDealImage):
                 shutil.move(file_path, image_dir + "/历史/" + file)
 
         if not original_photo_list:
+            raise UnicornException("没有任何匹配的图片")
             return False, "没有任何匹配的图片"
         # 暂不处理红蜻蜓
         # if settings.PROJECT == "红蜻蜓":

+ 3 - 2
python/service/detail_func.py

@@ -4,7 +4,7 @@ import settings
 import shutil
 
 
-def get_all_dir_info(image_dir):
+def get_all_dir_info(image_dir, goods_art_no):
     # 遍历货号获取所有货号--可能为编号
     folder_name_list = []
     for folder_name in os.listdir(image_dir):
@@ -18,7 +18,8 @@ def get_all_dir_info(image_dir):
                 # 删除空文件夹
                 os.rmdir(_path)
             continue
-        folder_name_list.append(folder_name)
+        if goods_art_no == folder_name:
+            folder_name_list.append(folder_name)
 
     return folder_name_list
 

+ 5 - 4
python/service/generate_goods_no_detail_pic/data.py

@@ -315,17 +315,18 @@ class DataModeUploadPic(DataBaseModel):
 
     def __init__(self, token):
         super().__init__(token)
+        self.token = token
         self.get_online_data.refresh_headers(token)
         self.is_deal_goods_no = []
 
     def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None):
-        return self.get_online_data.get_goods_art_no_info(numbers_list=numbers_list, goods_art_list=goods_art_list)
+        return self.get_online_data.get_goods_art_no_info(numbers_list=numbers_list, goods_art_list=goods_art_list,token=self.token)
 
     def upload_pic_list_data(self, data):
-        return self.get_online_data.upload_pic_list_data(data)
+        return self.get_online_data.upload_pic_list_data(data, token=self.token)
 
     def upload_pic(self,goods_data):
-        return self.get_online_data.upload_pic(goods_data)
+        return self.get_online_data.upload_pic(goods_data, token=self.token)
 
     def check_is_uploaded(self,goods_art_no=None):
-        return self.get_online_data.check_detail_image(goods_art_no)
+        return self.get_online_data.check_detail_image(goods_art_no, token=self.token)

+ 30 - 24
python/service/online_request/module_online_data.py

@@ -19,6 +19,7 @@ class JsonEncoder(json.JSONEncoder):
 class OnlineDataRequest(object):
     def __init__(self,token):
         self.s = requests.session()
+        self.token = token
         self.post_headers = {
             "Authorization": token,
             #  "Origin": settings.Headers["Origin"],
@@ -66,7 +67,7 @@ class OnlineDataRequest(object):
             print(e)
             return
 
-    def get_goods_art_no_info(self, numbers_list=None, goods_art_list=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
@@ -81,13 +82,15 @@ class OnlineDataRequest(object):
                 'goods_art_nos': goods_art_list
             }
             print("请求货号:", goods_art_list)
-
-        post_headers = {"Authorization": settings.Headers["Authorization"],
-                        "Origin": settings.Headers["Origin"],
-                        "Host": settings.Headers["Host"],
-                        "Content-Length": "",
-                        "Content-Type": "application/json",
-                        "Accept": "application/json"}
+            print("请求货号=====>", self.token)
+        post_headers = {
+            "Authorization": token,
+            # "Origin": settings.Headers["Origin"],
+            # "Host": settings.Headers["Host"],
+            "Content-Length": "",
+            "Content-Type": "application/json",
+            "Accept": "application/json",
+        }
         data = json.dumps(data)
         post_headers["Content-Length"] = str(len(data))
         _s = self.s.post(url=url, data=data, headers=post_headers)
@@ -141,7 +144,7 @@ class OnlineDataRequest(object):
             domain=settings.DOMAIN,
             number=number
         )
-        _s = self.s.get(url=url, headers=settings.Headers)
+        _s = self.s.get(url=url, headers=self.post_headers)
         response_data = _s.json()
         print(number, response_data)
         """
@@ -161,7 +164,7 @@ class OnlineDataRequest(object):
         return response_data["classify_result"]
 
     def uploadImage(self, local_path: str) -> str:
-        post_headers = {"Authorization": settings.Headers["Authorization"]}
+        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']
@@ -194,7 +197,7 @@ 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=settings.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
 
@@ -259,10 +262,10 @@ class OnlineDataRequest(object):
         return response_data["data"]["url"]
 
     # 查询是否已有详情图
-    def check_detail_image(self, 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=settings.Headers)
+        _s = self.s.get(url=url, headers=self.post_headers)
         response_data = _s.json()
         # print(response_data)
         return response_data["data"]["hasDetailImage"]
@@ -307,10 +310,11 @@ class GetOnlineDataHLM(OnlineDataRequest):
             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': self.token,
+                #    'User-Agent': settings.Headers["User-Agent"],
+                #    'Origin': settings.Headers["Origin"],
+                #    'Host': settings.Headers["Host"], 
+                   }
 
         files = [
             ('file',
@@ -341,7 +345,7 @@ class GetOnlineDataHLM(OnlineDataRequest):
             print(response_data)
             return False
 
-    def get_goods_art_no_info(self, numbers_list=None, goods_art_list=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
@@ -352,12 +356,14 @@ class GetOnlineDataHLM(OnlineDataRequest):
         print("url:", url)
         print("请求货号:", goods_art_list)
 
-        post_headers = {"Authorization": self.token,
-                        # "Origin": settings.Headers["Origin"],
-                        # "Host": settings.Headers["Host"],
-                        "Content-Length": "",
-                        "Content-Type": "application/json",
-                        "Accept": "application/json"}
+        post_headers = {
+            "Authorization": token,
+            # "Origin": settings.Headers["Origin"],
+            # "Host": settings.Headers["Host"],
+            "Content-Length": "",
+            "Content-Type": "application/json",
+            "Accept": "application/json",
+        }
         data = json.dumps(data)
         print(post_headers)
         print(data)

+ 59 - 60
python/service/run_main.py

@@ -16,7 +16,7 @@ from functools import partial
 # from multiprocessing import Process, Queue
 import pickle
 from  .base_deal import BaseDealImage
-
+from middleware import UnicornException
 
 class RunMain():
     # run_end_sign = Signal(dict)
@@ -71,7 +71,6 @@ class RunMain():
         #     # 规整红蜻蜓货号图
         #     all_goods_art_no_folder_data = get_all_goods_art_no_folder(path=image_dir)
         #     BaseDealImage().rename_folder_for_hqt(all_goods_art_no_folder_data=all_goods_art_no_folder_data)
-
         # 重新获取文件夹信息
         all_goods_art_no_folder_data = get_all_goods_art_no_folder(path=image_dir)
 
@@ -100,6 +99,7 @@ class RunMain():
                     f = False
 
         if not f:
+            # raise UnicornException(return_data["message"])
             self.set_state(state_value=2)
             return
 
@@ -118,6 +118,7 @@ class RunMain():
         )
         if res['code'] != 0:
             return_data["message"] += "{}\n".format(res['msg'])
+            # raise UnicornException(return_data["message"])
             return return_data
         else:
             # 图片命名顺序
@@ -165,15 +166,13 @@ class RunMain():
         code = return_data["code"]
         config_data = return_data["data"]["config_data"]
         config_data["sign_text"] = ""
-        # if code != 0:
-        #     # self.windows.show_message(return_data["message"])
-        #     # self.show_progress_detail(return_data["message"])
-        #     _dialog_dict = {"text": return_data["message"],
-        #                     "windows": self,
-        #                     }
-        #     self.show_dialog_sign.emit(_dialog_dict)
-        #     self.event.wait()
-        #     return
+        if code != 0:
+            # self.windows.show_message(return_data["message"])
+            # self.show_progress_detail(return_data["message"])
+            # _dialog_dict = {"text": return_data["message"],
+            #                 "windows": self,
+            #                 }
+            raise UnicornException(return_data["message"])
 
         do_next = False
         text = ""
@@ -364,12 +363,15 @@ class RunMain():
         is_use_excel = config_data["is_use_excel"]
         excel_path = config_data["excel_path"]
         temp_class = config_data["temp_class"]
+        goods_art_no = config_data["goods_art_no"]
         is_check_color_is_all = config_data["is_check_color_is_all"]
         detail_is_pass = config_data["detail_is_pass"]
 
         error_folder_list = []
         # 遍历货号获取所有货号--可能为编号
-        folder_name_list = get_all_dir_info(image_dir=image_dir)
+        folder_name_list = get_all_dir_info(
+            image_dir=image_dir, goods_art_no=goods_art_no
+        )
         if not folder_name_list:
             return_data["message"] += "不存在任何货号/编号文件夹\n"
             print("不存在任何货号/编号文件夹")
@@ -417,7 +419,6 @@ class RunMain():
         """
         # 获取所有文件夹基础数据内容  检查不满足要求的文件不满足要求移动到错误文件夹
         need_view_list = temp_class[temp_name].need_view
-        print("*********need_view_list************", need_view_list)
         _all_dir_info_data = get_all_dir_info_and_pic_info(
             image_dir, folder_name_list, need_view_list
         )
@@ -586,6 +587,8 @@ class RunMain():
                             _goods_no_dict[goods_no] = value  # 需要生成的数据
                         finally_goods_no_need_temps[goods_no].append(__temp_name)
                     else:
+                        # output/2025-04-03/软件-详情图生成/huilima-2/AQN141132
+                        return_data["data"]["config_data"]["out_put_dir"] = _path
                         if detail_is_pass:
                             return_data["message"] += "\n款号:{},模板:{} 已存在".format(goods_no, __temp_name)
                         else:
@@ -644,21 +647,7 @@ class RunMain():
         print("635  check_for_detail_first_call_back")
         print(data)
         if code != 0:
-            # self.windows.show_message(data["message"])
-            # my_dialog = DialogShow(self.windows.windows, text=data["message"])
-            # ret = my_dialog.exec()
-            self.show_progress_detail(text=data["message"])
-            _dialog_dict = {"text": data["message"],
-                            "windows": self,
-                            }
-            # self.show_dialog_sign.emit(_dialog_dict)
-            # self.event.wait()
-            print("_dialog_dict", _dialog_dict)
-
-            # self.windows.set_state(2)
-            config_data["sign_text"] = "已结束详情处理"
-            # self.run_end_sign.emit(config_data)
-            print("config_data==>", config_data)
+            raise UnicornException(data["message"])
             return False
 
         do_next = False
@@ -747,8 +736,7 @@ class RunMain():
         else:
             config_data["sign_text"] = "已结束详情处理"
             # self.run_end_sign.emit(config_data)
-            print("config_data===>2", config_data)
-            return True
+            return config_data
 
     def detail_run_by_thread(self, config_data, _goods_no_dict, temp_name, temp_name_list, assigned_page_dict,
                              excel_temp_goods_no_data,
@@ -776,39 +764,41 @@ class RunMain():
 
         all_detail_path_list = []
         for goods_no, temp_name_list in finally_goods_no_need_temps.items():
-            # try:
-            for _temp_name in temp_name_list:
-                # if _temp_name != "xiaosushuoxie-4":
-                #     continue
-                assigned_page_list = []
-                if _temp_name in assigned_page_dict:
-                    assigned_page_list = assigned_page_dict[_temp_name]
-                # 如果为使用表格,则获取表格中的数据作为款号的基础数据
-                temp_info_data = copy.copy(_goods_no_dict[goods_no])
-                if is_use_excel:
-                    # 将表格中的数据进行替换
-                    if goods_no in excel_temp_goods_no_data:
-                        if _temp_name in excel_temp_goods_no_data[goods_no]:
-                            # 将表格中的特定的模板的行,替换到goods_no的data中,因为不同的模板有数据特殊性
-                            for _key, _key_value in excel_temp_goods_no_data[goods_no][_temp_name].items():
-                                if _key in temp_info_data:
-                                    temp_info_data[_key] = _key_value
-                print("temp_info_data2222222222222222222222")
-                print("goods_no:{},_temp_name:{}".format(goods_no, _temp_name))
-                all_detail_path_list.append("{}/{}/".format(out_put_dir, _temp_name, goods_no))
-                # continue
-                self.detail_deal_one_data(
+            try:
+                for _temp_name in temp_name_list:
+                    # if _temp_name != "xiaosushuoxie-4":
+                    #     continue
+                    assigned_page_list = []
+                    if _temp_name in assigned_page_dict:
+                        assigned_page_list = assigned_page_dict[_temp_name]
+                    # 如果为使用表格,则获取表格中的数据作为款号的基础数据
+                    temp_info_data = copy.copy(_goods_no_dict[goods_no])
+                    if is_use_excel:
+                        # 将表格中的数据进行替换
+                        if goods_no in excel_temp_goods_no_data:
+                            if _temp_name in excel_temp_goods_no_data[goods_no]:
+                                # 将表格中的特定的模板的行,替换到goods_no的data中,因为不同的模板有数据特殊性
+                                for _key, _key_value in excel_temp_goods_no_data[goods_no][_temp_name].items():
+                                    if _key in temp_info_data:
+                                        temp_info_data[_key] = _key_value
+                    print("goods_no:{},_temp_name:{}".format(goods_no, _temp_name))
+                    all_detail_path_list.append("{}/{}/".format(out_put_dir, _temp_name, goods_no))
+                    # continue
+                    self.detail_deal_one_data(
                         goods_no=goods_no,
                         value=temp_info_data,
                         out_put_dir=out_put_dir,
                         temp_name=_temp_name,
                         assigned_page_list=assigned_page_list,
                         temp_class=config_data["temp_class"],
+                        target_error_folder=config_data["target_error_folder"],
+                        image_dir=config_data["image_dir"],
                     )
-        # except BaseException as e:
-        #     self.show_progress_detail(
-        #         "款:{}生成详情异常:{}".format(goods_no, e))
-        #     print(e)
+            except BaseException as e:
+                self.show_progress_detail(
+                    "款:{}生成详情异常:{}".format(goods_no, e))
+                print(e)
+                raise UnicornException("款:{}生成详情异常:{}".format(goods_no, e))
 
         # ==============完成处理==============
         self.set_state(state_value=2)
@@ -822,8 +812,9 @@ class RunMain():
 
         config_data["sign_text"] = "已结束详情处理"
         config_data["all_detail_path_list"] = all_detail_path_list
+        config_data["out_put_dir"] = out_put_dir
         # 打开文件夹
-        os.startfile(out_put_dir)
+        # os.startfile(out_put_dir)
 
         return config_data
 
@@ -943,7 +934,15 @@ class RunMain():
         return text
 
     def detail_deal_one_data(
-        self, goods_no, value, out_put_dir, temp_name, assigned_page_list, temp_class
+        self,
+        goods_no,
+        value,
+        out_put_dir,
+        temp_name,
+        assigned_page_list,
+        temp_class,
+        target_error_folder,
+        image_dir,
     ):
         # if self.windows.state == 99:
         #     self.show_progress_detail("用户主动取消:{}".format(goods_no))
@@ -990,10 +989,10 @@ class RunMain():
             # 将相关的文件夹统一移动至错误文件夹
             move_folders(
                 path_list=[
-                    "{}/{}".format(self.windows.image_dir, x)
+                    "{}/{}".format(image_dir, x)
                     for x in [x["文件夹名称"] for x in goods_art_no_list]
                 ],
-                target_folder=self.windows.target_error_folder,
+                target_folder=target_error_folder,
             )
             pass
         # 更新进度

+ 61 - 11
python/settings.py

@@ -1,6 +1,34 @@
 from dotenv import load_dotenv, find_dotenv
 from pathlib import Path  # Python 3.6+ only
-import configparser
+import configparser, json
+
+from numpy import true_divide
+from databases import (
+    create_all_database,
+    DeviceConfig,
+    SysConfigs,
+    CRUD,
+    batch_insert_sys_configs,
+    SqlQuery,
+    batch_insert_device_configs,
+)
+# 初始化数据表
+create_all_database()
+session = SqlQuery()
+device_config_crud = CRUD(DeviceConfig)
+all_devices = device_config_crud.read_all(session)
+if len(all_devices) == 0:
+    # 如果配置表中一条数据都没有,就将初始化数据全部插入到数据表中
+    actions = json.load(open("action.json", encoding="utf-8"))
+    batch_insert_device_configs(session, actions)
+sys_config_crud = CRUD(SysConfigs)
+all_sys_configs = sys_config_crud.read_all(session)
+if len(all_sys_configs) == 0:
+    # 如果配置表中一条数据都没有,就将初始化数据全部插入到数据表中
+    sys_config_json = json.load(open("sys_configs.json", encoding="utf-8"))
+    batch_insert_sys_configs(session, sys_config_json)
+# 初始化数据表---结束
+
 def get_config_by_items(config_dict):
     __config_dict = {}
     for i, k in config_dict:
@@ -8,16 +36,28 @@ def get_config_by_items(config_dict):
     return __config_dict
 
 
+def getSysConfigs(key,item,default=None):
+    session = SqlQuery()
+    crud = CRUD(SysConfigs)
+    one_item = crud.read(session, conditions={"key": key})
+    config = json.loads(one_item.value)
+    return config.get(item, default)
+
 def get_dict_value(_dict, key, default=None):
     if key in _dict:
         return _dict[key]
     else:
         return default
-MACHINE_LEVEL = "二档"
-IS_TEST = True
+
+MACHINE_LEVEL = getSysConfigs("other_configs", "device_speed", "二档")
+IS_TEST = False
 IS_MCU = True
 IS_LIN_SHI_TEST = False
-PhotographSeconds = float(0.3)  # 拍照停留时间
+PhotographSeconds = float(
+    getSysConfigs("take_photo_configs", "camera_delay", "0.5")
+)  # 拍照停留时间
+
+
 def moveSpeed(level: str = None):
     config = {
         "一档": {
@@ -127,18 +167,28 @@ DOMAIN = (
 
 Company = "惠利玛"
 
-is_test_plugins = True
+is_test_plugins = true_divide
 
 
-OUT_PIC_MODE = ".png"
+OUT_PIC_MODE = "."+getSysConfigs("basic_configs", "image_out_format", "png")  # ".png"
 
-OUT_PIC_SIZE = 800  # 主图大小
+OUT_PIC_SIZE = int(getSysConfigs("basic_configs", "main_image_size", "800"))  # 主图大小
 
 
-Mode = "鞋类"  # 程序执行类
-OUT_PIC_FACTOR = float(1.0)  # 图片锐化
-
+Mode = getSysConfigs("other_configs", "product_type", "鞋类")  # 程序执行类
+OUT_PIC_FACTOR = float(
+    getSysConfigs("basic_configs", "image_sharpening", "1")
+)  # 图片锐化
 
+ 
 RESIZE_IMAGE_MODE = 1
 
-GRENERATE_MAIN_PIC_BRIGHTNESS = 254 # 色阶是否调整到位判断
+GRENERATE_MAIN_PIC_BRIGHTNESS = 254  # 色阶是否调整到位判断
+
+RUNNING_MODE = getSysConfigs("other_configs", "running_mode", "普通模式")
+
+
+DEFAULT_CUTOUT_MODE = getSysConfigs("other_configs", "cutout_mode", "普通抠图")
+
+
+CUTOUT_MODE = 0 if getSysConfigs("other_configs", "cutout_mode", "普通抠图") =="普通抠图" else 1