新增判断条件,增加出入库单,进货单等,写入的时候新增厂家供货商以及产品类别

This commit is contained in:
DXC
2026-01-22 16:29:11 +08:00
parent d94f8e1b90
commit 8c0c357511

View File

@ -24,7 +24,7 @@ MAX_WORKERS = 10
# --- 文件配置 --- # --- 文件配置 ---
TEMPLATE_FILE = "产品-导入模板.csv" TEMPLATE_FILE = "产品-导入模板.csv"
OUTPUT_FILE = "最终导出数据.xlsx" OUTPUT_FILE = "最终导出数据_含供应商厂家.xlsx"
# =========================================== # ===========================================
@ -164,32 +164,25 @@ class CRMFetcher:
with STATS_LOCK: STATS["skipped_api_error"] += 1 with STATS_LOCK: STATS["skipped_api_error"] += 1
return None return None
data1 = resp1.json() # 拿到完整的 JSON 字典,例如 {'36': '0', '37': '5', ...} data1 = resp1.json() # 拿到完整的 JSON 字典
# === 修改核心逻辑 ===
# 定义需要检查的 Key 列表 # 定义需要检查的 Key 列表
target_keys = ["36", "37", "325", "523", "561"] target_keys = ["36", "37", "325", "523", "561"]
# 只要这些 Key 中有一个值不为 "0",就直接判定为“有关联”,立即跳过 # 只要这些 Key 中有一个值不为 "0",就直接判定为“有关联”,立即跳过
for key in target_keys: for key in target_keys:
# 获取值(兼容 key 可能是 int 或 str 的情况)
val = data1.get(key) val = data1.get(key)
if val is None: if val is None:
# 尝试用 int 获取(防止 json 解析自动转 int
try: try:
val = data1.get(int(key)) val = data1.get(int(key))
except: except:
pass pass
# 如果获取不到,默认为 0 (即 None 视为 0)
# 否则转字符串进行比较
val_str = str(val) if val is not None else "0" val_str = str(val) if val is not None else "0"
if val_str != "0": if val_str != "0":
# 只要有一个不为0命中规则直接跳过无需检查后续 Key
with STATS_LOCK: STATS["skipped_has_relations"] += 1 with STATS_LOCK: STATS["skipped_has_relations"] += 1
return None return None
# === 逻辑结束 ===
# 4. 【恢复】筛选第三步:检查仓库历史 (必须为空) # 4. 【恢复】筛选第三步:检查仓库历史 (必须为空)
check2_params = { check2_params = {
@ -207,14 +200,31 @@ class CRMFetcher:
with STATS_LOCK: STATS["skipped_has_history"] += 1 with STATS_LOCK: STATS["skipped_has_history"] += 1
return None return None
# === 全部通过 === # === 全部通过,提取详细数据 ===
with STATS_LOCK: with STATS_LOCK:
STATS["success"] += 1 STATS["success"] += 1
clean_name = re.sub(r'<[^>]+>', '', raw_name).strip()
# --- 数据清洗与提取 ---
# 1. 产品名称 (去除 HTML)
clean_name = re.sub(r'<[^>]+>', '', str(raw_name)).strip()
# 2. 厂家 (cf_2128) - 直接获取文本
manufacturer = str(item.get("cf_2128", "")).strip()
# 3. 供应商名称 (vendorid) - 去除 HTML 标签,提取文本
raw_vendor = item.get("vendorid", "")
clean_vendor = re.sub(r'<[^>]+>', '', str(raw_vendor)).strip()
# 4. 产品类别 (catalogid) - 根据要求不含HTML直接获取文本
clean_catalog = str(item.get("catalogid", "")).strip()
return { return {
"产品名称": clean_name, "产品名称": clean_name,
"产品编码": product_code "产品编码": product_code,
"厂家": manufacturer,
"供应商名称": clean_vendor,
"产品类别": clean_catalog
} }
except Exception as e: except Exception as e:
@ -268,9 +278,23 @@ def main():
result_dict = future.result() result_dict = future.result()
if result_dict: if result_dict:
# 动态映射:只有模板里有的列,才会被写入
row_data = {col: None for col in columns} row_data = {col: None for col in columns}
if "产品名称" in columns: row_data["产品名称"] = result_dict["产品名称"]
if "产品编码" in columns: row_data["产品编码"] = result_dict["产品编码"] # 映射关系配置 (Excel列名 : 数据字典Key)
# 请确保您的CSV模板中包含 "厂家", "供应商名称", "产品类别" 这几列,否则不会写入
mapping = {
"产品名称": "产品名称",
"产品编码": "产品编码",
"厂家": "厂家",
"供应商名称": "供应商名称",
"产品类别": "产品类别"
}
for col_name in columns:
if col_name in mapping:
row_data[col_name] = result_dict.get(mapping[col_name])
valid_rows.append(row_data) valid_rows.append(row_data)
if processed_count % 20 == 0 or processed_count == total_count: if processed_count % 20 == 0 or processed_count == total_count: