import settings from .data_metaclass import DataBaseModel from PIL import Image from io import BytesIO import copy import pandas as pd import settings import numpy as np class DataModeAutoDealPics(DataBaseModel): def __init__(self,token): super().__init__(token) def check_is_right_foot_by_api(self, image): image = image.convert('RGB') re_x = int(640) re_y = int(image.height * re_x / image.width) image = image.resize((re_x, re_y)) e = "JPEG" img = BytesIO() image.save(img, format=e) # format: PNG or JPEG img.seek(0) # rewind to the start image_url = self.get_online_data.upload_image_by_io(image_io=img) if settings.IS_TEST: print("识别左右脚,{}".format(image_url)) # 识别左右脚 r_data = self.get_online_data.yolo_shoes_category(image_url=image_url) return r_data 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): _ = ["薄棉", "加厚", "厚棉"] for i in _: color_name = color_name.replace(i, "") return color_name def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None): if goods_art_list: data_list = copy.deepcopy(goods_art_list) flag = "Goods_Art" else: data_list = copy.deepcopy(numbers_list) flag = "NUM" _list = [] # 单次请求数少于20个 goods_dict = {} while data_list: one_data = data_list.pop() _list.append(one_data) if len(_list) == 20 or len(data_list) == 0: if flag == "NUM": # 注意,红蜻蜓和惠利玛函数不同 online_goods_art_data = self.get_online_data.get_goods_art_no_info( numbers_list=_list, token=self.token ) else: online_goods_art_data = self.get_online_data.get_goods_art_no_info( goods_art_list=_list, token=self.token ) if online_goods_art_data: for key in online_goods_art_data: # 映射为真实的文件夹名称 goods_dict[key] = online_goods_art_data[key] _list = [] return goods_dict def get_basic_goods_art_data_by_hqt_and_hlm(self, folder_name_list): """ 查询红蜻蜓货号的对应数据,输入写入为编码,可能带有@,可能为货号等 NUN为编码 """ original_folder_name_list = copy.deepcopy(folder_name_list) # 编号与文件名映射表 return_dict = {} for folder_name in original_folder_name_list: folder_name: str if "NUM" not in folder_name: # 即为货号 return_dict[folder_name] = { "type": "goods_art_no", "name": folder_name.upper(), "文件夹名称": folder_name, "data": {}, } else: if "@" not in folder_name: return_dict[folder_name] = { "type": "goods_number", "name": folder_name.upper().replace("NUM", ""), "文件夹名称": folder_name, "data": {}, } else: return_dict[folder_name] = { "type": "goods_number", "name": folder_name.upper().replace("NUM", "").split("@")[1], "文件夹名称": folder_name, "data": {}, } # -----------请求货号数据处理------------ goods_art_no_list = [ v["name"] for k, v in return_dict.items() if v["type"] == "goods_art_no" ] goods_art_no_all_data = self.get_goods_art_no_info( goods_art_list=goods_art_no_list ) print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", goods_art_no_all_data) print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", "") print("goods_art_no_all_data===========>>>>>", "") for folder_name, value in return_dict.items(): if value["type"] == "goods_art_no": if value["name"] in goods_art_no_all_data: return_dict[folder_name]["data"] = goods_art_no_all_data[ value["name"] ] # ------------请求编码数据---------------------- goods_number_list = [ v["name"] for k, v in return_dict.items() if v["type"] == "goods_number" ] goods_number_all_data = self.get_goods_art_no_info( numbers_list=goods_number_list ) for folder_name, value in return_dict.items(): if value["type"] == "goods_number": if value["name"] in goods_number_all_data: return_dict[folder_name]["data"] = goods_number_all_data[ value["name"] ] # 清空没有值的数据 error_key = [] for folder_name, value in return_dict.items(): if not value["data"]: error_key.append(folder_name) if error_key: for folder_name in error_key: return_dict.pop(folder_name) return {"code": 0, "message": "", "data": return_dict} def get_basic_goods_art_data_form_excel(self, folder_name_list, excel_path, keys): # =====创建虚拟表格并进行连表处理 need_df = pd.DataFrame(columns=["文件夹名称"]) for folder_name in folder_name_list: new_row = { "文件夹名称": str(folder_name), } need_df = need_df._append(new_row, ignore_index=True) need_df = need_df.fillna(value="") # 打开表格并进行匹配 _df = pd.read_excel(excel_path, sheet_name=0, header=0) # 去重数据 duplicates = _df.duplicated(subset=["文件夹名称"], keep="first") _df = _df.loc[~duplicates] _df = _df.fillna(value="") _df = _df.astype(str) # 数据匹配关联,左关联 need_df = pd.merge( need_df, _df, on=["文件夹名称"], how="left", indicator=False, ) # 补全字段 header_list = need_df.columns.values.tolist() for key in keys: if key not in header_list: need_df[key] = "" need_df = need_df.fillna(value="") need_df = need_df.astype(str) # 数据转字典 return_dict = {} message = "" for index, row in need_df.iterrows(): if settings.PROJECT == "红蜻蜓": if row["商品货号"] and row["款号"] and row["编号"]: return_dict[row["文件夹名称"]] = { "type": "goods_art_no", "name": row["文件夹名称"].upper(), "文件夹名称": row["文件夹名称"], "template_name": row["模板名称"], "data": row.to_dict(), } else: message = "商品货号、款号、编号必须有值" else: if row["商品货号"] and row["款号"]: return_dict[row["文件夹名称"]] = { "type": "goods_art_no", "name": row["文件夹名称"].upper(), "文件夹名称": row["文件夹名称"], "template_name": row["模板名称"], "data": row.to_dict(), } print("return_dict", return_dict) if not return_dict: message += "\n没有找到任何匹配的数据" return {"code": 99, "message": message, "data": return_dict} else: return {"code": 0, "message": message, "data": return_dict} def get_basic_goods_art_data_form_excel_bak(self, folder_name_list, excel_path, keys): # =====创建虚拟表格并进行连表处理 need_df = pd.DataFrame(columns=["文件夹名称"]) for folder_name in folder_name_list: new_row = { "文件夹名称": str(folder_name), } need_df = need_df._append(new_row, ignore_index=True) need_df = need_df.fillna(value="") # 打开表格并进行匹配 _df = pd.read_excel(excel_path, sheet_name=0, header=0) # 去重数据 duplicates = _df.duplicated(subset=["文件夹名称"], keep="first") _df = _df.loc[~duplicates] _df = _df.fillna(value="") _df = _df.astype(str) # 数据匹配关联,左关联 need_df = pd.merge( need_df, _df, on=["文件夹名称"], how="left", indicator=False, ) # 补全字段 header_list = need_df.columns.values.tolist() for key in keys: if key not in header_list: need_df[key] = "" need_df = need_df.fillna(value="") need_df = need_df.astype(str) # 数据转字典 return_dict = {} message = "" print("need_df.iterrows() <=============> ", need_df.to_json()) for index, row in need_df.iterrows(): if settings.PROJECT == "红蜻蜓": if row["商品货号"] and row["款号"] and row["编号"]: return_dict[row["文件夹名称"]] = { "type": "goods_art_no", "name": row["文件夹名称"].upper(), "文件夹名称": row["文件夹名称"], "template_name": row["模板名称"], "data": row.to_dict(), } else: message = "商品货号、款号、编号为空或列不存在" else: if row["商品货号"] and row["款号"] and row["模板名称"]: return_dict[row["文件夹名称"]] = { "type": "goods_art_no", "name": row["文件夹名称"].upper(), "文件夹名称": row["文件夹名称"], "template_name": row["模板名称"], "data": row.to_dict(), } else: message = "商品货号、款号、模板名称为空或列不存在" print("return_dict", return_dict) if not return_dict: message += "\n没有找到任何匹配的数据" return {"code": 99, "message": message, "data": return_dict} else: return {"code": 0, "message": message, "data": return_dict} def check_goods_is_not_deficiency(self, goods_no_dict: dict): # 数据返回结果为款号列表 error_data = {} for key, value in goods_no_dict.items(): number = value["货号资料"][0]["编号"].replace("NUM", "") number_list = [x["编号"].replace("NUM", "") for x in value["货号资料"]] all_color_name = [ self.get_real_color_name(x["颜色名称"]) for x in value["货号资料"] ] # 本地数据 goods_no = key _t_goods_number, all_goods_number = ( self.get_online_data.get_on_goods_all_art(number=number) ) # all_goods_number------》 [{'number': '14250232', 'goods_art_no': 'AC52001173', 'color': '杏色'}] for i in all_goods_number: if i["number"] not in number_list: # 检查款号+颜色名称是否已经存在 real_color = self.get_real_color_name(i["color"]) if real_color not in all_color_name: if goods_no not in error_data: error_data[goods_no] = {"message": "颜色:"} error_data[goods_no]["message"] += "{}缺失 ".format(real_color) return error_data def get_basic_template_information(self, _goods_no_dict, excel_path: str): # 本地的文件夹数据形成一个虚拟表格 original_df = pd.DataFrame(columns=["款号"]) for goods_no in _goods_no_dict: new_row = {"款号": str(goods_no), "flag": "是"} original_df = original_df._append(new_row, ignore_index=True) original_df = original_df.fillna(value="") # EXCEL表格数据 local_df = pd.read_excel(excel_path, sheet_name=0, header=0) values = { "模板名称": "任意", } # 确保所有模板都有名称 local_df.fillna(value=values, inplace=True) # 分组后取第一个有效值(即不是NaN的值);此处用于获取某个款号的所有基础信息 group_local_df = local_df.groupby(["模板名称", "款号"]).agg( lambda x: x.dropna().iloc[0] if not x.dropna().empty else np.nan ) group_local_df = group_local_df.reset_index() # -----------数据匹配关联,左关联 group_local_df = pd.merge( group_local_df, original_df, on=["款号"], how="left", indicator=False, ) # -----------只取有标记的数据 group_local_df = group_local_df.loc[~group_local_df["flag"].isnull(), :] group_local_df = group_local_df.loc[group_local_df["模板名称"] != "任意", :] # -----------数据规整 group_local_df = group_local_df.fillna(value="") group_local_df = group_local_df.astype(str) # 组装成字典 temp_goods_no_dict = {} for index, row in group_local_df.iterrows(): goods_no = row["款号"] if goods_no not in temp_goods_no_dict: temp_goods_no_dict[goods_no] = {} temp_goods_no_dict[goods_no][row["模板名称"]] = row.to_dict() return temp_goods_no_dict def check_goods_is_not_deficiency_form_excel( self, goods_no_dict: dict, excel_path: str ): # 检查颜色是否齐全,基于Excel处理 """ 步骤: 1、goods_no_dict款号生成一个表格(款号+颜色) 2、excel表格数据进行款号+颜色去重 3、excel表格关联 上述的款号 进行标记,其他删除 4、excel表格关联 上述款号与颜色,进行标记 5、上述未标记的就是没有的颜色(有对应款号)。 6、对对应的款号进行设置为错误数据 返回数据结构 { “A00001--款号”:{“message”:“这个款的错误原因”}, “A00002--款号”:{“message”:“这个款的错误原因”}, } """ def change_to_int(x): if pd.isna(x): return 0 else: try: x = int(x) return str(x) except: return x error_data = {} # -----------------goods_no_dict款号生成一个表格(款号+颜色) new_df = pd.DataFrame(columns=["款号", "颜色名称", "款色标记"]) for key, value in goods_no_dict.items(): goods_no = value["款号"] for color_name in [x["颜色名称"] for x in value["货号资料"]]: new_row = { "款号": goods_no, "颜色名称": self.get_real_color_name(color_name), "款色标记": 1, } new_df = new_df._append(new_row, ignore_index=True) new_df.drop_duplicates(subset=["款号", "颜色名称"], keep="first", inplace=True) # -------------参考的本地excel表格数据进行款号+颜色去重------------ local_df = pd.read_excel(excel_path, sheet_name=0, header=0) local_df.fillna( value={ "颜色名称": "", }, inplace=True, ) local_df = local_df.astype({"颜色名称": str}) header_list = local_df.columns.values.tolist() for key in ["帮高", "鞋宽", "跟高"]: if key in header_list: local_df[key] = local_df[key].apply(change_to_int) # 颜色名称规整 local_df["颜色名称"] = local_df["颜色名称"].apply(self.get_real_color_name) local_df.drop_duplicates( subset=["款号", "颜色名称"], keep="first", inplace=True ) # ------------excel表格关联 上述的款号 进行标记,其他删除 _df = new_df.drop_duplicates(subset=["款号"], keep="first", inplace=False) _df = _df[["款号"]] _df["对应款号"] = 1 local_df = pd.merge( local_df, _df, on=["款号"], how="left", indicator=False, ) local_df = local_df.loc[local_df["对应款号"] == 1, :] # ------------excel表格关联 上述款号与颜色,进行标记;取没有关联的颜色数据--------- local_df = pd.merge( local_df, new_df, on=["款号", "颜色名称"], how="left", indicator=False, ) local_df.fillna( value={ "款色标记": 0, }, inplace=True, ) local_df = local_df.loc[local_df["款色标记"] == 0, :] print("local_df") print(local_df) # ------------数据分组,对对应的款号进行设置为错误数据--------------- grouped_df = ( local_df.groupby("款号")["颜色名称"] .apply(lambda x: "、".join(x)) .reset_index() ) for index, row in grouped_df.iterrows(): error_data[row["款号"]] = { "message": "颜色:{}缺失".format(row["颜色名称"]) } print("======error_data") print(json.dumps(error_data)) return error_data class DataModeUploadPic(DataBaseModel): def __init__(self): super().__init__() self.get_online_data.refresh_headers() 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 ) def upload_pic_list_data(self, data): return self.get_online_data.upload_pic_list_data(data) def upload_pic(self, goods_data): return self.get_online_data.upload_pic(goods_data) def check_is_uploaded(self, goods_art_no=None): return self.get_online_data.check_detail_image(goods_art_no)