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:
120
scripts/compare_vehicle_delivery_status.py
Normal file
120
scripts/compare_vehicle_delivery_status.py
Normal file
@@ -0,0 +1,120 @@
|
||||
#!/usr/bin/env python3
|
||||
"""车辆信息(车辆状态) vs 交车任务(交车许可):同车牌「已交车」是否一致,不一致仅输出车牌"""
|
||||
|
||||
import re
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
import pandas as pd
|
||||
from openpyxl import load_workbook
|
||||
from openpyxl.styles import PatternFill
|
||||
|
||||
FILE_VEHICLE = Path("/Users/sylvawong/Downloads/车辆信息-1779792181510.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")
|
||||
STATUS = "已交车"
|
||||
|
||||
|
||||
def norm_plate(v) -> str:
|
||||
if pd.isna(v):
|
||||
return ""
|
||||
return re.sub(r"[\s\-·]", "", str(v).strip().upper())
|
||||
|
||||
|
||||
def plate_sets(df, plate_col, status_col):
|
||||
"""返回:已交车车牌集合、该表全部车牌->状态(取首条)"""
|
||||
df = df.copy()
|
||||
df["_plate"] = df[plate_col].map(norm_plate)
|
||||
df = df[df["_plate"] != ""]
|
||||
status_map = df.drop_duplicates(subset=["_plate"], keep="first").set_index("_plate")[
|
||||
status_col
|
||||
].astype(str).str.strip()
|
||||
delivered = set(status_map[status_map == STATUS].index)
|
||||
return delivered, status_map
|
||||
|
||||
|
||||
def run():
|
||||
df_v = pd.read_excel(FILE_VEHICLE, sheet_name=0)
|
||||
df_t = pd.read_excel(FILE_TASK, sheet_name=0)
|
||||
|
||||
set_v, map_v = plate_sets(df_v, "车牌号", "车辆状态")
|
||||
set_t, map_t = plate_sets(df_t, "车牌号", "交车许可")
|
||||
|
||||
both_ok = sorted(set_v & set_t)
|
||||
only_v = sorted(set_v - set_t) # 车辆信息=已交车,交车任务≠已交车
|
||||
only_t = sorted(set_t - set_v) # 交车任务=已交车,车辆信息≠已交车
|
||||
inconsistent = sorted(set(only_v) | set(only_t))
|
||||
|
||||
row_v = len(df_v[df_v["车辆状态"].astype(str).str.strip() == STATUS])
|
||||
row_t = len(df_t[df_t["交车许可"].astype(str).str.strip() == STATUS])
|
||||
consistent = len(only_v) == 0 and len(only_t) == 0
|
||||
|
||||
summary = pd.DataFrame(
|
||||
[
|
||||
["比对说明", "同车牌:车辆信息「车辆状态=已交车」与交车任务「交车许可=已交车」是否一致"],
|
||||
["车辆信息 已交车行数", row_v],
|
||||
["交车任务 已交车行数", row_t],
|
||||
["车辆信息 已交车唯一车牌", len(set_v)],
|
||||
["交车任务 已交车唯一车牌", len(set_t)],
|
||||
["两边均已交车(一致)", len(both_ok)],
|
||||
["是否完全一致", "是" if consistent else "否"],
|
||||
["不一致车牌合计", len(inconsistent)],
|
||||
["仅车辆信息为已交车(任务侧非已交车)", len(only_v)],
|
||||
["仅交车任务为已交车(车辆信息侧非已交车)", len(only_t)],
|
||||
],
|
||||
columns=["项目", "结果"],
|
||||
)
|
||||
|
||||
def display_plate(key: str) -> str:
|
||||
mask_v = df_v["车牌号"].map(norm_plate) == key
|
||||
mask_t = df_t["车牌号"].map(norm_plate) == key
|
||||
if mask_v.any():
|
||||
return str(df_v.loc[mask_v, "车牌号"].iloc[0])
|
||||
if mask_t.any():
|
||||
return str(df_t.loc[mask_t, "车牌号"].iloc[0])
|
||||
return key
|
||||
|
||||
def plates_df(keys, diff_type):
|
||||
if not keys:
|
||||
return pd.DataFrame(columns=["差异类型", "车牌号"])
|
||||
return pd.DataFrame(
|
||||
{"差异类型": diff_type, "车牌号": [display_plate(k) for k in keys]}
|
||||
)
|
||||
|
||||
df_only_v = plates_df(only_v, "车辆信息=已交车,交车任务≠已交车")
|
||||
df_only_t = plates_df(only_t, "交车任务=已交车,车辆信息≠已交车")
|
||||
df_all_bad = pd.concat([df_only_v, df_only_t], ignore_index=True)
|
||||
df_both_ok = plates_df(both_ok, "两边均为已交车(一致)")
|
||||
|
||||
with pd.ExcelWriter(OUT, engine="openpyxl") as w:
|
||||
summary.to_excel(w, sheet_name="比对汇总", index=False)
|
||||
df_all_bad.to_excel(w, sheet_name="不一致车牌", index=False)
|
||||
if len(only_v):
|
||||
df_only_v.to_excel(w, sheet_name="仅车辆信息已交车", index=False)
|
||||
if len(only_t):
|
||||
df_only_t.to_excel(w, sheet_name="仅交车任务已交车", index=False)
|
||||
df_both_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