feat: support multiple managers in DiscreteMaterialPlanCleaner

- Add get_materials_to_delete_by_managers() function in db/materials_to_delete.py
  - Supports querying by single manager, multiple managers, or all managers
  - Uses IN clause for multi-manager queries
- Refactor DiscreteMaterialPlanCleaner to accept manager_names parameter
  - Accepts str, List[str], or None (for all managers)
  - Automatically normalizes parameter types in __init__
  - Updates preload_data() with appropriate log messages

Co-Authored-By: Claude (glm-5) <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-02-26 10:01:48 +08:00
parent c5f48eb7c8
commit 167fa2893f
2 changed files with 68 additions and 8 deletions

View File

@@ -11,6 +11,7 @@ import os
import re
import time
import logging
from typing import Union, List, Optional
from playwright.sync_api import sync_playwright, TimeoutError
# 统一顶部导入
@@ -19,7 +20,7 @@ from db.production_order_query import (
read_production_ids,
query_production_order_numbers,
)
from db.materials_to_delete import get_materials_to_delete
from db.materials_to_delete import get_materials_to_delete_by_managers
# --- 日志配置 ---
logging.basicConfig(
@@ -33,12 +34,27 @@ logger = logging.getLogger(__name__)
class DiscreteMaterialPlanCleaner:
"""离散备料计划维护数据清理器"""
def __init__(self, username, password, manager_name, headless=False, verbose=True):
def __init__(
self,
username,
password,
manager_names: Union[str, List[str], None] = None,
headless=False,
verbose=True,
):
self.username = username
self.password = password
self.manager_name = manager_name
self.headless = headless
self.verbose = verbose
# 参数规范化:支持 str、List[str]、None
if manager_names is None:
self.manager_names = None # 表示全部
elif isinstance(manager_names, str):
self.manager_names = [manager_names] if manager_names.strip() else None
else:
self.manager_names = manager_names if manager_names else None
# 核心优化:使用 set 存储待删除编码,查询复杂度为 $O(1)$
self.to_delete_set = set()
@@ -71,9 +87,13 @@ class DiscreteMaterialPlanCleaner:
def preload_data(self):
"""批量预取数据库数据"""
self._log(f"正在从数据库提取负责人 [{self.manager_name}] 的待删除物料清单...")
# 假设返回的是 material_code 列表
raw_list = get_materials_to_delete(self.manager_name)
if self.manager_names is None:
self._log("正在从数据库提取所有负责人的待删除物料清单...")
else:
names_str = "".join(self.manager_names)
self._log(f"正在从数据库提取负责人 [{names_str}] 的待删除物料清单...")
raw_list = get_materials_to_delete_by_managers(self.manager_names)
self.to_delete_set = set(raw_list)
self._log(f"预加载完成,共计 {len(self.to_delete_set)} 条不合规物料编码。")
@@ -305,7 +325,7 @@ def main():
cleaner = DiscreteMaterialPlanCleaner(
username="BLDpengqiangqiang",
password="your_password_here",
manager_name="彭羽",
manager_names="彭羽", # 支持字符串、列表或 None
headless=False,
)