Apply Black formatter to the entire codebase for consistent code style. Co-Authored-By: Claude (glm-5) <noreply@anthropic.com>
119 lines
3.4 KiB
Python
119 lines
3.4 KiB
Python
"""
|
||
待删除物料查询组件
|
||
从数据库查询指定负责人需要删除的物料编码
|
||
"""
|
||
|
||
from typing import List, Dict, Any, Optional
|
||
from db.connection import get_connection
|
||
|
||
|
||
def get_materials_to_delete(manager_name):
|
||
"""
|
||
根据负责人名称查询待删除物料编码列表
|
||
|
||
Args:
|
||
manager_name: 负责人姓名
|
||
|
||
Returns:
|
||
物料编码列表
|
||
"""
|
||
query = """
|
||
SELECT [MaterialCode]
|
||
FROM [dbo].[MaterialsToBeDeleted]
|
||
WHERE [ManagerName] = ?
|
||
"""
|
||
|
||
with get_connection() as conn:
|
||
results = conn.execute_query(query, (manager_name,))
|
||
# 提取物料编码并去除空值
|
||
material_codes = [row["MaterialCode"] for row in results if row["MaterialCode"]]
|
||
return material_codes
|
||
|
||
|
||
def get_all_materials_to_delete() -> List[Dict[str, Any]]:
|
||
"""
|
||
获取所有待删除物料记录
|
||
|
||
Returns:
|
||
List[Dict[str, Any]]: 包含MaterialCode和ManagerName的记录列表
|
||
"""
|
||
query = """
|
||
SELECT [MaterialCode], [ManagerName]
|
||
FROM [dbo].[MaterialsToBeDeleted]
|
||
WHERE [MaterialCode] IS NOT NULL
|
||
ORDER BY [ManagerName], [MaterialCode]
|
||
"""
|
||
|
||
with get_connection() as conn:
|
||
results = conn.execute_query(query)
|
||
return results
|
||
|
||
|
||
def get_materials_to_delete_by_managers(
|
||
manager_names: Optional[List[str]] = None,
|
||
) -> List[str]:
|
||
"""
|
||
根据负责人列表查询待删除物料编码
|
||
|
||
Args:
|
||
manager_names: 负责人姓名列表
|
||
- None 或空列表:返回所有物料编码
|
||
- 有值:返回指定负责人的物料编码
|
||
|
||
Returns:
|
||
物料编码列表
|
||
"""
|
||
if not manager_names:
|
||
# 查询所有物料编码
|
||
query = """
|
||
SELECT [MaterialCode]
|
||
FROM [dbo].[MaterialsToBeDeleted]
|
||
WHERE [MaterialCode] IS NOT NULL
|
||
"""
|
||
with get_connection() as conn:
|
||
results = conn.execute_query(query)
|
||
material_codes = [
|
||
row["MaterialCode"] for row in results if row["MaterialCode"]
|
||
]
|
||
return material_codes
|
||
else:
|
||
# 使用 IN 子句查询多个负责人
|
||
placeholders = ", ".join(["?"] * len(manager_names))
|
||
query = f"""
|
||
SELECT [MaterialCode]
|
||
FROM [dbo].[MaterialsToBeDeleted]
|
||
WHERE [MaterialCode] IS NOT NULL
|
||
AND [ManagerName] IN ({placeholders})
|
||
"""
|
||
with get_connection() as conn:
|
||
results = conn.execute_query(query, tuple(manager_names))
|
||
material_codes = [
|
||
row["MaterialCode"] for row in results if row["MaterialCode"]
|
||
]
|
||
return material_codes
|
||
|
||
|
||
def should_delete_material(manager_name: str, material_code: str) -> bool:
|
||
"""
|
||
检查指定物料编码是否需要删除
|
||
|
||
直接在数据库层面查询,避免将大量数据加载到内存
|
||
|
||
Args:
|
||
manager_name: 负责人姓名
|
||
material_code: 物料编码
|
||
|
||
Returns:
|
||
bool: 如果物料需要删除返回 True,否则返回 False
|
||
"""
|
||
query = """
|
||
SELECT COUNT(*) as count
|
||
FROM [dbo].[MaterialsToBeDeleted]
|
||
WHERE [ManagerName] = ?
|
||
AND [MaterialCode] = ?
|
||
"""
|
||
|
||
with get_connection() as conn:
|
||
results = conn.execute_query(query, (manager_name, material_code))
|
||
return results[0]["count"] > 0 if results else False
|