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:
Misaka
2026-02-26 22:44:03 +08:00
parent 1b16842a2c
commit 3b7c00377f
46 changed files with 1488 additions and 974 deletions

View File

@@ -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)