style: format all Python files with Black
Apply Black formatter to the entire codebase for consistent code style. Co-Authored-By: Claude (glm-5) <noreply@anthropic.com>
This commit is contained in:
@@ -23,19 +23,22 @@ from db.discrete_material_plan_dao import DiscreteMaterialPlanDAO
|
||||
from db.materials_to_be_deleted_dao import MaterialsTypeToBeDeletedDAO
|
||||
from db.materials_to_be_deleted_records_dao import MaterialsToBeDeletedDAO
|
||||
|
||||
|
||||
# ==================== DATA STRUCTURES ====================
|
||||
|
||||
|
||||
@dataclass
|
||||
class MaterialValidationResult:
|
||||
"""Enhanced material validation result with complete record information"""
|
||||
|
||||
material_name: str
|
||||
material_code: str
|
||||
specification: Optional[str] = None
|
||||
model: Optional[str] = None
|
||||
manager_name: Optional[str] = None
|
||||
is_marked_for_deletion: bool = False
|
||||
matched_type_keyword: Optional[str] = None # Matched keyword from MaterialsTypeToBeDeleted
|
||||
matched_type_keyword: Optional[str] = (
|
||||
None # Matched keyword from MaterialsTypeToBeDeleted
|
||||
)
|
||||
|
||||
|
||||
class MaterialStatusValidator:
|
||||
@@ -261,13 +264,11 @@ class MaterialStatusValidator:
|
||||
Returns:
|
||||
List[str]: 输入项列表(可能是总排号或生产订单号)
|
||||
"""
|
||||
with open(production_id_file, 'r', encoding='utf-8') as f:
|
||||
with open(production_id_file, "r", encoding="utf-8") as f:
|
||||
items = [line.strip() for line in f if line.strip()]
|
||||
return items
|
||||
|
||||
def _get_source_numbers_from_inputs(
|
||||
self, inputs: List[str]
|
||||
) -> List[str]:
|
||||
def _get_source_numbers_from_inputs(self, inputs: List[str]) -> List[str]:
|
||||
"""
|
||||
根据输入列表智能获取 SourceNumber(生产订单号)列表
|
||||
|
||||
@@ -281,7 +282,7 @@ class MaterialStatusValidator:
|
||||
List[str]: 生产订单号列表
|
||||
"""
|
||||
production_ids = [] # 需要查询数据库的
|
||||
order_numbers = [] # 直接使用的
|
||||
order_numbers = [] # 直接使用的
|
||||
|
||||
for item in inputs:
|
||||
input_type = self._identify_input_type(item)
|
||||
@@ -298,7 +299,9 @@ class MaterialStatusValidator:
|
||||
|
||||
# 查询数据库获取总排号对应的生产订单号
|
||||
if production_ids:
|
||||
self._print(f"[INFO] 正在查询 {len(production_ids)} 个总排号对应的生产订单号...")
|
||||
self._print(
|
||||
f"[INFO] 正在查询 {len(production_ids)} 个总排号对应的生产订单号..."
|
||||
)
|
||||
contract_dao = ProductionContractDataDAO()
|
||||
db_order_numbers = contract_dao.get_source_numbers_by_总排号(production_ids)
|
||||
self._print(f"[INFO] 从数据库获取到 {len(db_order_numbers)} 个生产订单号")
|
||||
@@ -307,7 +310,9 @@ class MaterialStatusValidator:
|
||||
# 去重
|
||||
unique_order_numbers = list(dict.fromkeys(order_numbers))
|
||||
if len(unique_order_numbers) != len(order_numbers):
|
||||
self._print(f"[INFO] 去重后得到 {len(unique_order_numbers)} 个唯一生产订单号")
|
||||
self._print(
|
||||
f"[INFO] 去重后得到 {len(unique_order_numbers)} 个唯一生产订单号"
|
||||
)
|
||||
|
||||
return unique_order_numbers
|
||||
|
||||
@@ -326,7 +331,9 @@ class MaterialStatusValidator:
|
||||
if source_numbers is None or not source_numbers:
|
||||
self._print("[INFO] 查询所有材料的名称...")
|
||||
else:
|
||||
self._print(f"[INFO] 查询 {len(source_numbers)} 个生产订单对应的材料名称...")
|
||||
self._print(
|
||||
f"[INFO] 查询 {len(source_numbers)} 个生产订单对应的材料名称..."
|
||||
)
|
||||
|
||||
dao = DiscreteMaterialPlanDAO()
|
||||
material_names = dao.get_unique_material_names(source_numbers)
|
||||
@@ -338,7 +345,7 @@ class MaterialStatusValidator:
|
||||
self,
|
||||
production_id_file: str = None,
|
||||
full_table: bool = False,
|
||||
output_file: str = None
|
||||
output_file: str = None,
|
||||
) -> str:
|
||||
"""
|
||||
使用数据库作为数据源执行校验
|
||||
@@ -392,9 +399,7 @@ class MaterialStatusValidator:
|
||||
# 3. 获取材料名称
|
||||
material_names = self._get_material_names_from_db(source_numbers)
|
||||
else:
|
||||
raise ValueError(
|
||||
"必须指定 full_table=True 或提供 production_id_file 参数"
|
||||
)
|
||||
raise ValueError("必须指定 full_table=True 或提供 production_id_file 参数")
|
||||
|
||||
# 从数据库获取待删除物料
|
||||
self._print("\n从数据库获取待删除物料...")
|
||||
@@ -426,7 +431,9 @@ class MaterialStatusValidator:
|
||||
self,
|
||||
material_records: List[Dict[str, Any]],
|
||||
type_keywords: List[Dict[str, Any]],
|
||||
marked_codes_dict: Dict[str, str] # Changed: MaterialCode -> ManagerName mapping
|
||||
marked_codes_dict: Dict[
|
||||
str, str
|
||||
], # Changed: MaterialCode -> ManagerName mapping
|
||||
) -> List[MaterialValidationResult]:
|
||||
"""
|
||||
Match materials with detailed information.
|
||||
@@ -442,14 +449,16 @@ class MaterialStatusValidator:
|
||||
results = []
|
||||
|
||||
for record in material_records:
|
||||
material_name = record.get('MaterialName', '') or ''
|
||||
material_code = record.get('MaterialCode', '') or ''
|
||||
specification = record.get('Specification', '') or None
|
||||
model = record.get('Model', '') or None
|
||||
material_name = record.get("MaterialName", "") or ""
|
||||
material_code = record.get("MaterialCode", "") or ""
|
||||
specification = record.get("Specification", "") or None
|
||||
model = record.get("Model", "") or None
|
||||
|
||||
# Priority 1: Check MaterialsToBeDeleted (MaterialCode exact match)
|
||||
# This has highest priority - if MaterialCode exists, use its ManagerName
|
||||
manager_name = marked_codes_dict.get(material_code) if material_code else None
|
||||
manager_name = (
|
||||
marked_codes_dict.get(material_code) if material_code else None
|
||||
)
|
||||
is_marked = manager_name is not None
|
||||
matched_keyword = None
|
||||
|
||||
@@ -457,10 +466,10 @@ class MaterialStatusValidator:
|
||||
# (MaterialName contains match)
|
||||
if not manager_name:
|
||||
for type_record in type_keywords:
|
||||
type_material_name = type_record.get('MaterialName', '')
|
||||
type_material_name = type_record.get("MaterialName", "")
|
||||
if type_material_name and type_material_name in material_name:
|
||||
matched_keyword = type_material_name
|
||||
manager_name = type_record.get('ManagerName')
|
||||
manager_name = type_record.get("ManagerName")
|
||||
break
|
||||
|
||||
result = MaterialValidationResult(
|
||||
@@ -470,7 +479,7 @@ class MaterialStatusValidator:
|
||||
model=model,
|
||||
manager_name=manager_name,
|
||||
is_marked_for_deletion=is_marked,
|
||||
matched_type_keyword=matched_keyword
|
||||
matched_type_keyword=matched_keyword,
|
||||
)
|
||||
results.append(result)
|
||||
|
||||
@@ -480,7 +489,7 @@ class MaterialStatusValidator:
|
||||
self,
|
||||
production_id_file: str = None,
|
||||
full_table: bool = False,
|
||||
output_file: str = None
|
||||
output_file: str = None,
|
||||
) -> tuple:
|
||||
"""
|
||||
Enhanced database validation with complete record information.
|
||||
@@ -510,7 +519,9 @@ class MaterialStatusValidator:
|
||||
# Get material records (complete records, not just MaterialName)
|
||||
if full_table:
|
||||
self._print("\n模式: 全表校验")
|
||||
self._print("[INFO] 查询 DiscreteMaterialPlanData 表中的所有完整记录(启用 MaterialCode 去重)...")
|
||||
self._print(
|
||||
"[INFO] 查询 DiscreteMaterialPlanData 表中的所有完整记录(启用 MaterialCode 去重)..."
|
||||
)
|
||||
dao = DiscreteMaterialPlanDAO()
|
||||
|
||||
# Get original count for deduplication statistics
|
||||
@@ -521,7 +532,9 @@ class MaterialStatusValidator:
|
||||
|
||||
self._print(f"[INFO] 获取到 {len(material_records)} 条记录")
|
||||
if dedup_count > 0:
|
||||
self._print(f"[INFO] 基于 MaterialCode 去重:移除了 {dedup_count} 条重复记录")
|
||||
self._print(
|
||||
f"[INFO] 基于 MaterialCode 去重:移除了 {dedup_count} 条重复记录"
|
||||
)
|
||||
elif production_id_file:
|
||||
self._print("\n模式: 输入过滤校验")
|
||||
self._print(f"[INFO] 读取输入文件: {production_id_file}")
|
||||
@@ -542,7 +555,9 @@ class MaterialStatusValidator:
|
||||
return output_file, []
|
||||
|
||||
# 3. Get complete material records with deduplication
|
||||
self._print(f"[INFO] 查询 {len(source_numbers)} 个生产订单对应的完整物料记录(启用 MaterialCode 去重)...")
|
||||
self._print(
|
||||
f"[INFO] 查询 {len(source_numbers)} 个生产订单对应的完整物料记录(启用 MaterialCode 去重)..."
|
||||
)
|
||||
dao = DiscreteMaterialPlanDAO()
|
||||
|
||||
# Get original count for deduplication statistics
|
||||
@@ -554,7 +569,9 @@ class MaterialStatusValidator:
|
||||
self._print(f"[INFO] 获取到 {len(material_records)} 条记录")
|
||||
|
||||
if dedup_count > 0:
|
||||
self._print(f"[INFO] 基于 MaterialCode 去重:移除了 {dedup_count} 条重复记录")
|
||||
self._print(
|
||||
f"[INFO] 基于 MaterialCode 去重:移除了 {dedup_count} 条重复记录"
|
||||
)
|
||||
|
||||
# 如果没有找到物料记录,给出友好提示
|
||||
if not material_records:
|
||||
@@ -563,7 +580,9 @@ class MaterialStatusValidator:
|
||||
self._print("[ERROR] 1. 这些生产订单的物料数据还没有提取到数据库")
|
||||
self._print("[ERROR] 2. 请先运行【正式备料计划数据提取】工具")
|
||||
self._print("[ERROR] 3. 提取时勾选【持久化到数据库】选项")
|
||||
self._print(f"[ERROR] 4. 将这些输入项的物料数据保存到 DiscreteMaterialPlanData 表")
|
||||
self._print(
|
||||
f"[ERROR] 4. 将这些输入项的物料数据保存到 DiscreteMaterialPlanData 表"
|
||||
)
|
||||
else:
|
||||
raise ValueError("必须指定 full_table=True 或提供 production_id_file 参数")
|
||||
|
||||
@@ -580,15 +599,17 @@ class MaterialStatusValidator:
|
||||
|
||||
# Build dictionary: MaterialCode -> ManagerName
|
||||
marked_codes_dict = {
|
||||
r['MaterialCode']: r['ManagerName']
|
||||
r["MaterialCode"]: r["ManagerName"]
|
||||
for r in marked_records
|
||||
if r.get('MaterialCode') and r.get('ManagerName')
|
||||
if r.get("MaterialCode") and r.get("ManagerName")
|
||||
}
|
||||
self._print(f"获取到 {len(marked_codes_dict)} 个已标记的物料代码")
|
||||
|
||||
# Match materials
|
||||
self._print("\n匹配物料...")
|
||||
results = self.match_materials_detailed(material_records, type_keywords, marked_codes_dict)
|
||||
results = self.match_materials_detailed(
|
||||
material_records, type_keywords, marked_codes_dict
|
||||
)
|
||||
|
||||
# Output to Excel
|
||||
self._print("\n输出结果...")
|
||||
@@ -596,15 +617,17 @@ class MaterialStatusValidator:
|
||||
# Convert to DataFrame for Excel export
|
||||
df_data = []
|
||||
for r in results:
|
||||
df_data.append({
|
||||
"材料名称": r.material_name,
|
||||
"材料代码": r.material_code,
|
||||
"规格": r.specification or '',
|
||||
"型号": r.model or '',
|
||||
"负责人": r.manager_name or '',
|
||||
"已标记删除": "是" if r.is_marked_for_deletion else "否",
|
||||
"匹配的关键词": r.matched_type_keyword or ''
|
||||
})
|
||||
df_data.append(
|
||||
{
|
||||
"材料名称": r.material_name,
|
||||
"材料代码": r.material_code,
|
||||
"规格": r.specification or "",
|
||||
"型号": r.model or "",
|
||||
"负责人": r.manager_name or "",
|
||||
"已标记删除": "是" if r.is_marked_for_deletion else "否",
|
||||
"匹配的关键词": r.matched_type_keyword or "",
|
||||
}
|
||||
)
|
||||
|
||||
result_df = pd.DataFrame(df_data)
|
||||
result_df.to_excel(output_file, index=False)
|
||||
|
||||
Reference in New Issue
Block a user