feat: sync full workspace including web modules, docs, and configurations to Gitea
Optimized the root .gitignore to exclude virtual environments, node modules, and temp folders to ensure clean and lightweight version tracking. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
148
scripts/compare_prod_vs_task_delivered.py
Normal file
148
scripts/compare_prod_vs_task_delivered.py
Normal file
@@ -0,0 +1,148 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
以交车任务列表(交车许可=已交车)为正确基准,
|
||||
比对生成环境-交车数据(delivery_status_text=已完成 视为已交车),
|
||||
输出已交车状态不一致的车牌号。
|
||||
"""
|
||||
|
||||
import re
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
import pandas as pd
|
||||
from openpyxl import load_workbook
|
||||
from openpyxl.styles import PatternFill
|
||||
|
||||
FILE_PROD = Path(
|
||||
"/Users/sylvawong/Library/Containers/com.tencent.xinWeChat/Data/Documents/"
|
||||
"xwechat_files/wxid_l80gh7d3x7u012_385c/temp/drag/生成环境-交车数据.xlsx"
|
||||
)
|
||||
FILE_TASK = Path(
|
||||
"/Users/sylvawong/Library/Containers/com.tencent.xinWeChat/Data/Documents/"
|
||||
"xwechat_files/wxid_l80gh7d3x7u012_385c/temp/drag/"
|
||||
"交车任务列表-导出-2026-05-26 (5).xlsx"
|
||||
)
|
||||
OUT = Path("/Users/sylvawong/Desktop/生成环境交车状态差异报告.xlsx")
|
||||
OUT_PROJ = Path("/Users/sylvawong/Desktop/CURSOR/ONE-OS/生成环境交车状态差异报告.xlsx")
|
||||
|
||||
RED = PatternFill(start_color="FF9999", end_color="FF9999", fill_type="solid")
|
||||
|
||||
# 基准侧
|
||||
TASK_DELIVERED = "已交车"
|
||||
# 生成环境侧:已完成 对应 已交车
|
||||
PROD_DELIVERED = "已完成"
|
||||
|
||||
|
||||
def norm_plate(v) -> str:
|
||||
if pd.isna(v):
|
||||
return ""
|
||||
return re.sub(r"[\s\-·]", "", str(v).strip().upper())
|
||||
|
||||
|
||||
def delivered_plates(df, plate_col, status_col, delivered_val):
|
||||
df = df.copy()
|
||||
df["_plate"] = df[plate_col].map(norm_plate)
|
||||
df = df[df["_plate"] != ""]
|
||||
df["_status"] = df[status_col].astype(str).str.strip()
|
||||
# 每车牌取一条代表状态(若多行状态不一致则标为混合)
|
||||
g = df.groupby("_plate")["_status"].agg(lambda s: "|".join(sorted(set(s))))
|
||||
delivered = set(g[g == delivered_val].index)
|
||||
mixed = {p for p, st in g.items() if delivered_val in st and st != delivered_val}
|
||||
return delivered, mixed, df
|
||||
|
||||
|
||||
def display_plate(key, df_prod, df_task):
|
||||
m = df_prod["plate_number"].map(norm_plate) == key
|
||||
if m.any():
|
||||
return str(df_prod.loc[m, "plate_number"].iloc[0])
|
||||
m = df_task["车牌号"].map(norm_plate) == key
|
||||
if m.any():
|
||||
return str(df_task.loc[m, "车牌号"].iloc[0])
|
||||
return key
|
||||
|
||||
|
||||
def run():
|
||||
df_prod = pd.read_excel(FILE_PROD, sheet_name=0)
|
||||
df_task = pd.read_excel(FILE_TASK, sheet_name=0)
|
||||
|
||||
set_task, _, df_task_all = delivered_plates(
|
||||
df_task, "车牌号", "交车许可", TASK_DELIVERED
|
||||
)
|
||||
set_prod, prod_mixed, df_prod_all = delivered_plates(
|
||||
df_prod, "plate_number", "delivery_status_text", PROD_DELIVERED
|
||||
)
|
||||
|
||||
# 基准=交车任务已交车;生成环境应对齐为已完成
|
||||
# 不一致1:任务已交车,生成环境不是已完成(含无记录、其他状态)
|
||||
bad_vs_baseline = sorted(set_task - set_prod)
|
||||
# 不一致2:生成环境已完成,任务不是已交车(生成环境多记)
|
||||
extra_in_prod = sorted(set_prod - set_task)
|
||||
all_bad = sorted(set(bad_vs_baseline) | set(extra_in_prod))
|
||||
both_ok = sorted(set_task & set_prod)
|
||||
|
||||
def plate_rows(keys, diff_type):
|
||||
if not keys:
|
||||
return pd.DataFrame(columns=["差异类型", "车牌号"])
|
||||
return pd.DataFrame(
|
||||
{
|
||||
"差异类型": diff_type,
|
||||
"车牌号": [display_plate(k, df_prod, df_task) for k in keys],
|
||||
}
|
||||
)
|
||||
|
||||
df_bad1 = plate_rows(
|
||||
bad_vs_baseline,
|
||||
"交车任务=已交车(基准),生成环境≠已完成或无记录",
|
||||
)
|
||||
df_bad2 = plate_rows(
|
||||
extra_in_prod,
|
||||
"生成环境=已完成,交车任务≠已交车",
|
||||
)
|
||||
df_all = pd.concat([df_bad1, df_bad2], ignore_index=True)
|
||||
df_ok = plate_rows(both_ok, "两边一致(任务已交车且生成环境已完成)")
|
||||
|
||||
task_rows = len(df_task[df_task["交车许可"].astype(str).str.strip() == TASK_DELIVERED])
|
||||
prod_rows = len(
|
||||
df_prod[df_prod["delivery_status_text"].astype(str).str.strip() == PROD_DELIVERED]
|
||||
)
|
||||
|
||||
summary = pd.DataFrame(
|
||||
[
|
||||
["正确数据基准", "交车任务列表 · 交车许可=已交车"],
|
||||
["生成环境已交车判定", "delivery_status_text=已完成"],
|
||||
["交车任务 已交车行数 / 唯一车牌", f"{task_rows} / {len(set_task)}"],
|
||||
["生成环境 已完成行数 / 唯一车牌", f"{prod_rows} / {len(set_prod)}"],
|
||||
["两边状态一致车牌", len(both_ok)],
|
||||
["已交车状态不一致车牌合计", len(all_bad)],
|
||||
["└ 基准有已交车,生成环境未对齐", len(bad_vs_baseline)],
|
||||
["└ 生成环境已完成,基准无已交车", len(extra_in_prod)],
|
||||
["生成环境同车牌多状态(含已完成)", len(prod_mixed)],
|
||||
],
|
||||
columns=["项目", "结果"],
|
||||
)
|
||||
|
||||
with pd.ExcelWriter(OUT, engine="openpyxl") as w:
|
||||
summary.to_excel(w, sheet_name="比对汇总", index=False)
|
||||
df_all.to_excel(w, sheet_name="不一致车牌", index=False)
|
||||
if len(bad_vs_baseline):
|
||||
df_bad1.to_excel(w, sheet_name="基准有生成环境未对齐", index=False)
|
||||
if len(extra_in_prod):
|
||||
df_bad2.to_excel(w, sheet_name="生成环境多记已完成", index=False)
|
||||
df_ok.to_excel(w, sheet_name="一致车牌", index=False)
|
||||
|
||||
wb = load_workbook(OUT)
|
||||
for sn in ["不一致车牌", "基准有生成环境未对齐", "生成环境多记已完成"]:
|
||||
if sn in wb.sheetnames:
|
||||
ws = wb[sn]
|
||||
for r in range(2, ws.max_row + 1):
|
||||
for c in range(1, ws.max_column + 1):
|
||||
ws.cell(row=r, column=c).fill = RED
|
||||
wb.save(OUT)
|
||||
shutil.copy(OUT, OUT_PROJ)
|
||||
|
||||
print(f"已输出: {OUT}")
|
||||
print(summary.to_string(index=False))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run()
|
||||
Reference in New Issue
Block a user