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:
@@ -37,19 +37,21 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
... print(f"Deleted: {stats['deleted']}, Inserted: {stats['inserted']}")
|
||||
"""
|
||||
if df.empty:
|
||||
return {'deleted': 0, 'inserted': 0}
|
||||
return {"deleted": 0, "inserted": 0}
|
||||
|
||||
# Remove duplicates based on PlanNumber and SequenceNumber
|
||||
original_count = len(df)
|
||||
df = df.drop_duplicates(subset=['备料计划单号', '序号'], keep='first')
|
||||
df = df.drop_duplicates(subset=["备料计划单号", "序号"], keep="first")
|
||||
duplicates_removed = original_count - len(df)
|
||||
|
||||
if duplicates_removed > 0:
|
||||
print(f"[INFO] 检测到 {duplicates_removed} 条重复记录(相同计划单号和序号),已自动去重")
|
||||
print(
|
||||
f"[INFO] 检测到 {duplicates_removed} 条重复记录(相同计划单号和序号),已自动去重"
|
||||
)
|
||||
|
||||
with get_connection() as db:
|
||||
# Get unique plan numbers
|
||||
plan_numbers = df['备料计划单号'].unique().tolist()
|
||||
plan_numbers = df["备料计划单号"].unique().tolist()
|
||||
|
||||
# Delete existing records
|
||||
deleted = self._delete_by_plan_numbers(db, plan_numbers)
|
||||
@@ -57,7 +59,7 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
# Insert new records in batches
|
||||
inserted = self._batch_insert(db, df)
|
||||
|
||||
return {'deleted': deleted, 'inserted': inserted}
|
||||
return {"deleted": deleted, "inserted": inserted}
|
||||
|
||||
def _delete_by_plan_numbers(self, db, plan_numbers: List[str]) -> int:
|
||||
"""
|
||||
@@ -79,12 +81,12 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
total_deleted = 0
|
||||
|
||||
for i in range(0, len(plan_numbers), batch_size):
|
||||
batch = plan_numbers[i:i + batch_size]
|
||||
batch = plan_numbers[i : i + batch_size]
|
||||
placeholder = self._get_placeholder()
|
||||
placeholders = ','.join([placeholder for _ in batch])
|
||||
placeholders = ",".join([placeholder for _ in batch])
|
||||
|
||||
# 根据数据库类型选择表名
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
sql = f"DELETE FROM {table_name} WHERE PlanNumber IN ({placeholders})"
|
||||
|
||||
deleted = db.execute_update(sql, tuple(batch))
|
||||
@@ -108,7 +110,7 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
Total number of records inserted
|
||||
"""
|
||||
# 根据数据库类型选择表名
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
placeholder = self._get_placeholder()
|
||||
|
||||
sql = f"""
|
||||
@@ -126,7 +128,7 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
records = self._convert_df_to_records(df)
|
||||
|
||||
for i in range(0, len(records), batch_size):
|
||||
batch = records[i:i + batch_size]
|
||||
batch = records[i : i + batch_size]
|
||||
for record in batch:
|
||||
db.execute_update(sql, record)
|
||||
total_inserted += 1
|
||||
@@ -150,20 +152,44 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
"""
|
||||
# Column order must match INSERT statement
|
||||
column_order = [
|
||||
'工厂', '备料状态', '备料计划单号', '来源单号', '备料类型', '产品编码',
|
||||
'产品名称', '产品单位', '产品计划数量', '用料部门', '备注', '制单人',
|
||||
'制单日期', '审批人', '审批日期', '序号', '材料编码', '材料名称',
|
||||
'规格', '型号', '图号', '物料材质', '计划数量', '单位', '需用日期',
|
||||
'发料仓库', '单位用量', '累计出库数量', 'BOM版本'
|
||||
"工厂",
|
||||
"备料状态",
|
||||
"备料计划单号",
|
||||
"来源单号",
|
||||
"备料类型",
|
||||
"产品编码",
|
||||
"产品名称",
|
||||
"产品单位",
|
||||
"产品计划数量",
|
||||
"用料部门",
|
||||
"备注",
|
||||
"制单人",
|
||||
"制单日期",
|
||||
"审批人",
|
||||
"审批日期",
|
||||
"序号",
|
||||
"材料编码",
|
||||
"材料名称",
|
||||
"规格",
|
||||
"型号",
|
||||
"图号",
|
||||
"物料材质",
|
||||
"计划数量",
|
||||
"单位",
|
||||
"需用日期",
|
||||
"发料仓库",
|
||||
"单位用量",
|
||||
"累计出库数量",
|
||||
"BOM版本",
|
||||
]
|
||||
|
||||
# Numeric columns with their default values and data types
|
||||
numeric_columns = {
|
||||
'产品计划数量': (0, int),
|
||||
'序号': (0, int),
|
||||
'计划数量': (0, int),
|
||||
'单位用量': (0.0, float),
|
||||
'累计出库数量': (0, int),
|
||||
"产品计划数量": (0, int),
|
||||
"序号": (0, int),
|
||||
"计划数量": (0, int),
|
||||
"单位用量": (0.0, float),
|
||||
"累计出库数量": (0, int),
|
||||
}
|
||||
|
||||
records = []
|
||||
@@ -172,7 +198,11 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
for col in column_order:
|
||||
value = row.get(col)
|
||||
# Handle NaN, None, or empty string values
|
||||
if pd.isna(value) or value is None or (isinstance(value, str) and value.strip() == ''):
|
||||
if (
|
||||
pd.isna(value)
|
||||
or value is None
|
||||
or (isinstance(value, str) and value.strip() == "")
|
||||
):
|
||||
if col in numeric_columns:
|
||||
# Use default value for numeric columns
|
||||
record.append(numeric_columns[col][0])
|
||||
@@ -209,7 +239,7 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
List of dictionaries representing records
|
||||
"""
|
||||
with get_connection() as db:
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
placeholder = self._get_placeholder()
|
||||
sql = f"SELECT * FROM {table_name} WHERE PlanNumber = {placeholder}"
|
||||
return db.execute_query(sql, (plan_number,))
|
||||
@@ -227,8 +257,8 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
if not plan_numbers:
|
||||
return []
|
||||
placeholder = self._get_placeholder()
|
||||
placeholders = ','.join([placeholder for _ in plan_numbers])
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
placeholders = ",".join([placeholder for _ in plan_numbers])
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
sql = f"SELECT * FROM {table_name} WHERE PlanNumber IN ({placeholders})"
|
||||
with get_connection() as db:
|
||||
return db.execute_query(sql, tuple(plan_numbers))
|
||||
@@ -244,7 +274,7 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
List of dictionaries representing records
|
||||
"""
|
||||
with get_connection() as db:
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
placeholder = self._get_placeholder()
|
||||
sql = f"SELECT * FROM {table_name} WHERE SourceNumber = {placeholder}"
|
||||
return db.execute_query(sql, (order_id,))
|
||||
@@ -260,11 +290,11 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
Number of records
|
||||
"""
|
||||
with get_connection() as db:
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
placeholder = self._get_placeholder()
|
||||
sql = f"SELECT COUNT(*) as count FROM {table_name} WHERE PlanNumber = {placeholder}"
|
||||
result = db.execute_query(sql, (plan_number,))
|
||||
return result[0]['count'] if result else 0
|
||||
return result[0]["count"] if result else 0
|
||||
|
||||
def count_all(self) -> int:
|
||||
"""
|
||||
@@ -274,10 +304,10 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
Total number of records
|
||||
"""
|
||||
with get_connection() as db:
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
sql = f"SELECT COUNT(*) as count FROM {table_name}"
|
||||
result = db.execute_query(sql)
|
||||
return result[0]['count'] if result else 0
|
||||
return result[0]["count"] if result else 0
|
||||
|
||||
def delete_by_plan_numbers(self, plan_numbers: List[str]) -> int:
|
||||
"""
|
||||
@@ -301,7 +331,7 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
unique plans, unique orders, and date range
|
||||
"""
|
||||
with get_connection() as db:
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
sql = f"""
|
||||
SELECT
|
||||
COUNT(*) as total_records,
|
||||
@@ -324,7 +354,7 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
List of dictionaries representing all records
|
||||
"""
|
||||
with get_connection() as db:
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
sql = f"SELECT * FROM {table_name}"
|
||||
return db.execute_query(sql)
|
||||
|
||||
@@ -346,10 +376,10 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
all_results = []
|
||||
|
||||
for i in range(0, len(source_numbers), batch_size):
|
||||
batch = source_numbers[i:i + batch_size]
|
||||
batch = source_numbers[i : i + batch_size]
|
||||
placeholder = self._get_placeholder()
|
||||
placeholders = ','.join([placeholder for _ in batch])
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
placeholders = ",".join([placeholder for _ in batch])
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
sql = f"SELECT * FROM {table_name} WHERE SourceNumber IN ({placeholders})"
|
||||
with get_connection() as db:
|
||||
results = db.execute_query(sql, tuple(batch))
|
||||
@@ -368,7 +398,7 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
List of dictionaries representing deduplicated records
|
||||
"""
|
||||
with get_connection() as db:
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
|
||||
sql = f"""
|
||||
WITH RankedRecords AS (
|
||||
@@ -414,10 +444,10 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
all_results = []
|
||||
|
||||
for i in range(0, len(source_numbers), batch_size):
|
||||
batch = source_numbers[i:i + batch_size]
|
||||
batch = source_numbers[i : i + batch_size]
|
||||
placeholder = self._get_placeholder()
|
||||
placeholders = ','.join([placeholder for _ in batch])
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
placeholders = ",".join([placeholder for _ in batch])
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
|
||||
sql = f"""
|
||||
WITH RankedRecords AS (
|
||||
@@ -458,23 +488,23 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
Returns:
|
||||
List of unique material names
|
||||
"""
|
||||
table_name = self._convert_sql('[dbo].[DiscreteMaterialPlanData]')
|
||||
table_name = self._convert_sql("[dbo].[DiscreteMaterialPlanData]")
|
||||
|
||||
if source_numbers is None or not source_numbers:
|
||||
# No filter - get all unique material names
|
||||
sql = f"SELECT DISTINCT MaterialName FROM {table_name} WHERE MaterialName IS NOT NULL"
|
||||
with get_connection() as db:
|
||||
results = db.execute_query(sql)
|
||||
return [r['MaterialName'] for r in results if r.get('MaterialName')]
|
||||
return [r["MaterialName"] for r in results if r.get("MaterialName")]
|
||||
else:
|
||||
# Filter by SourceNumber list
|
||||
batch_size = 2000
|
||||
all_material_names = set()
|
||||
|
||||
for i in range(0, len(source_numbers), batch_size):
|
||||
batch = source_numbers[i:i + batch_size]
|
||||
batch = source_numbers[i : i + batch_size]
|
||||
placeholder = self._get_placeholder()
|
||||
placeholders = ','.join([placeholder for _ in batch])
|
||||
placeholders = ",".join([placeholder for _ in batch])
|
||||
sql = f"""
|
||||
SELECT DISTINCT MaterialName
|
||||
FROM {table_name}
|
||||
@@ -483,7 +513,9 @@ class DiscreteMaterialPlanDAO(BaseDAO):
|
||||
"""
|
||||
with get_connection() as db:
|
||||
results = db.execute_query(sql, tuple(batch))
|
||||
batch_materials = [r['MaterialName'] for r in results if r.get('MaterialName')]
|
||||
batch_materials = [
|
||||
r["MaterialName"] for r in results if r.get("MaterialName")
|
||||
]
|
||||
all_material_names.update(batch_materials)
|
||||
|
||||
return list(all_material_names)
|
||||
|
||||
Reference in New Issue
Block a user