docs(比对口径): 差异清单口径固化——货运新增行/U列草稿/无表头列/浮点尾差/排名表当月块/市州短名均按设计忽略;清单转本地不入库;HANDOFF 收敛结论
3个文件已删除
3个文件已修改
2242 ■■■■■ 已修改文件
.gitignore 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HANDOFF.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/工具/汇总大表差异比对.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/问题汇总/汇总大表_差异明细_2026-08_20260928.csv 1275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/问题汇总/汇总大表_差异明细_2026-08_20260928.md 452 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/问题汇总/汇总大表_差异明细_2026-08_20260928_桌面导出版.md 449 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -110,3 +110,7 @@
docs/工作日结/
# ==== æœ¬åœ°å¤‡ä»½ï¼ˆä¸å…¥åº“,2026-09-27)====
_backups/
# æ±‡æ€»å¤§è¡¨å·®å¼‚比对清单(过程产物,只留本地)
docs/问题汇总/_*.md
docs/问题汇总/_*.csv
HANDOFF.md
@@ -15,12 +15,10 @@
- **✅ ç­çº¿åŒ…车回补完成(09-28 ä¸‹åˆï¼‰**:用户确认后按 09-27 æ¯ç‰ˆå¤‡ä»½ï¼ˆ`_bak_202608母版文本数字转数值前_20260927.xlsx`)XML ç²¾å‡†å›žè¡¥ã€Šç­çº¿åŒ…车》2019/2020 å— â€”— **该页与 09-27 æ¯ç‰ˆé€æ ¼ä¸€è‡´ï¼ˆ0 å·®å¼‚)**,错误值回到 `#REF!` 8 / `#DIV/0!` 228;母版其它页未受影响。验收生成:与 09-27 ç”Ÿæˆä»¶ (6) æ¯”对错误值逐页一致,差异仅剩既定改动(` è´§è¿` 78 æ ¼æ¸… 0、中口径明细 4915 æ ¼åˆ åˆ—位移、中口径排名 672 æ ¼å—位移、班线包车 82 æ ¼æµ®ç‚¹å°¾å·®/0-空)。
- **差异清单口径更新(09-28,用户确认)**:① ` è´§è¿` æ–°å¢žçš„「规上+规下货运量」「规下货运量」各 17 è¡Œï¼ˆæ¯ç‰ˆè®¾è®¡ï¼Œå…± 34 è¡Œï¼‰ä¸è®¡å·®å¼‚;② ` è´§è¿!U5:U112` æ— è¡¨å¤´è‰ç¨¿åˆ—不计;③ æŽ’名表「当月块」为母版设计不计;④ å¸‚州短名/全名不影响(工具归一化);⑤ å°å·®å¼‚(取整尾差/文本型数字)只计数,只列差异大的并附原因。工具 `docs/工具/汇总大表差异比对.py` å·²æŒ‰æ­¤æ›´æ–°ï¼Œä¸¤ä»½æ¸…单已重生成。
- **新发现(待核对)**:`班线包车!EO36/FN36/FO36`(荆门 å®¢è¿é‡ 2020 ç´¯è®¡/累计同比)**程序生成时重算为 -2731.41 / -1.0008 / -1.0002**,而母版与手工定稿均为 0.181777 / 2312.2199 / -0.586419 â†’ ç–‘母版 2020 å¹´å—分母为 0,需核对公式与数据。
- **新增差异清单工具(09-28)**:`docs/工具/汇总大表差异比对.py`(逐页按行标签/列表头序列对齐,可处理多列/多行/重复表头),产物 `docs/问题汇总/汇总大表_差异明细_2026-08_20260928.md` + `.csv`(1401 æ¡æ˜Žç»†ï¼ŒæŒ‰ å®žè´¨æ•°å€¼å·®å¼‚|仅手工有|仅程序有|取整尾差|文本型数字|文本不同|错误值 åˆ†ç±»ï¼‰ã€‚
  - ç»“论:` è´§è¿` å®žè´¨æ•°å€¼å·®å¼‚ **10 æ¡**(2022 å¹´å„市州累计同比,业务已确认软件对);`公交/城市客运/中口径明细/中口径客运量` çš„"仅手工有"即手工侧**草稿列**(72/36/90/180 æ ¼ï¼‰ï¼›`公交/轨道轮渡` çš„"文本型数字"= å€¼ç›¸åŒä»…类型不同;`货运量排名/货运周转量排名/班线包车` çš„差异含**行块错位假差异**(已在该清单"阅读提示"中标注,需按行标签核对)。
  - æ›´æ­£ï¼š09-28 ä¸Šåˆä¸€åº¦è®¤ä¸º"2020 ç´¯è®¡/累计同比"有差异,实为对齐脚本误配列所致——按位置逐格核对两边一致,未做改动。
- **差异清单已实跑(09-28 æ™šï¼‰**:按当前母版重新生成 2026-08(生成件存 `docs/生成汇总大表/输出/_复核生成_2026-08_20260928.xlsx`,该目录被忽略不入库),产出两份清单:
  - `docs/问题汇总/汇总大表_差异明细_2026-08_20260928.md/.csv`(母版最新生成件 vs æ‰‹å·¥å®šç¨¿ï¼Œ1401 æ¡ï¼‰
  - `docs/问题汇总/汇总大表_差异明细_2026-08_20260928_桌面导出版.md/.csv`(桌面导出版 vs æ‰‹å·¥å®šç¨¿ï¼Œ1333 æ¡ï¼›è¯¥ä»½å¯¼å‡ºè¾ƒæ—©ã€` è´§è¿` å•边格少 74 æ ¼ï¼Œå¤æ ¸ä»¥æ¯ç‰ˆæœ€æ–°ç”Ÿæˆä»¶ä¸ºå‡†ï¼‰
- **汇总大表差异比对(09-28,工具已固化口径)**:`docs/工具/汇总大表差异比对.py`(逐页按行/列标签序列对齐,可处理多列/多行/重复表头)。**清单属过程产物只留本地**(`docs/问题汇总/_清单_*.md/.csv`,已 gitignore ä¸å…¥åº“)。
  - å·²ç¡®è®¤å£å¾„(不再重复确认/上报):① è´§è¿æ¯å¸‚å·ž 6 è¡Œ vs æ‰‹å·¥ 4 è¡Œï¼ˆæ–°å¢žã€Œè§„上+规下货运量」「规下货运量」各 17 è¡Œï¼‰å±žæ¯ç‰ˆè®¾è®¡ï¼Œè¡Œå·åç§»æŒ‰"地区+指标"对齐后一致;② ` è´§è¿` U åˆ—(U2:U118)为人工草稿;③ ä»…手工有且**无表头**的列 = è‰ç¨¿ï¼›â‘£ æµ®ç‚¹å°¾å·®ã€æ–‡æœ¬åž‹æ•°å­—忽略;⑤ æŽ’名表「当月块」为母版设计;⑥ å¸‚州短名/全名不影响。
  - **需处理(数值)**:`班线包车!EO36/FN36/FO36`(荆门 å®¢è¿é‡ 2020 ç´¯è®¡/累计同比)——程序生成时重算为 -2731.41 / -1.0008 / -1.0002,母版与手工定稿均为 0.181777 / 2312.2199 / -0.586419(疑母版 2020 å¹´å—分母为 0),待核对;` è´§è¿` 2022 å¹´å„市州「累计同比」10 æ¡ï¼ˆä¸šåŠ¡å·²ç¡®è®¤**软件对**,不改)。
  - å…¶ä½™å¾…办:手工侧 4 å¤„脏数据(`班线包车!IL4/IL5` æ–­é“¾ã€`IL50` åå¼•号、` è´§è¿!EA93/EA111` çš„ `#DIV/0!`)、286 æ ¼æ–‡æœ¬åž‹æ•°å­—、304 æ ¼è‰ç¨¿åˆ—;母版 11 ä¸ª `#REF!` + 356 ä¸ª `#DIV/0!`;`城市客运` ç¬¬ 2 è¡Œç¬¬ 3 ä¸ªæœˆèµ·è¡¨å¤´ä¸ºæ—¥æœŸåºåˆ—号;缺 2026-09 æ¯ç‰ˆï¼›å¯¼å‡ºå‰åŸºæ•°ä½“检(P0-3)。
- **待办**:① æŽ’名页结构(块顺序、标题措辞、市州名短名/全名、周转量排名多 7 è¡Œï¼‰ï¼›â‘¡ æŽ’名页结构(块顺序、标题措辞、市州名短名/全名、周转量排名多 7 è¡Œï¼‰ï¼›â‘¢ ç¼º 2026-09 æ¯ç‰ˆã€å¯¼å‡ºå‰åŸºæ•°ä½“检(P0-3)。
## æœ€æ–°ï¼ˆ2026-09-27)
docs/¹¤¾ß/»ã×Ü´ó±í²îÒì±È¶Ô.py
@@ -109,6 +109,19 @@
"""
def main(gen, dgf, prefix):
    ACTION = ("实质数值差异", "错误值(程序)", "错误值(手工)", "文本不同")
    IGNORE = ("已忽略(单边有值)", "已忽略(结构/设计)", "取整尾差(可忽略)", "文本型数字(可忽略)",
              "已知设计(母版新增行)", "已知设计(无表头草稿列)", "已知设计(排名表当月/累计块)", "其它")
    cats = list(ACTION) + list(IGNORE)
    REASON = {(" è´§è¿", "EA"): "2022年各市州累计同比:业务已确认软件口径正确(手工那列错)",
              ("班线包车", "EO"): "程序生成时重算(疑母版2020年块分母为0):母版/手工为 0.1818,待核对",
              ("班线包车", "FN"): "同上:母版/手工为 2312.2199",
              ("班线包车", "FO"): "同上:母版/手工为 -0.5864"}
    def reason_of(x):
        ref = x[1]
        col = "".join(ch for ch in ref if ch.isalpha())
        return REASON.get((x[0], col), "")
    g = load_workbook(gen, data_only=True); d = load_workbook(dgf, data_only=True)
    rows_out = []
    per_sheet = []
@@ -131,24 +144,26 @@
            if c < 2: continue
            if cl_g[c] == "(无表头列)":
                bump("已知设计(无表头草稿列)"); continue
            bump("仅程序有(列)"); rows_out.append([sh, "%s*" % get_column_letter(c+1), "(整列)", cl_g[c], "仅程序有(列)", "", "", "生成件多出此列"])
            bump("已忽略(结构/设计)")
        for c in unmatched_cols_d:
            if c < 2: continue
            if cl_d[c] == "(无表头列)":
                bump("已知设计(无表头草稿列)"); continue
            bump("仅手工有(列)"); rows_out.append([sh, "(无)", "(整列)", cl_d[c], "仅手工有(列)", "", "", "手工定稿多出此列"])
            bump("已忽略(结构/设计)")
        for r in unmatched_rows_g:
            if r < 4: continue
            rowb = "%s" % wg.cell(row=r+1, column=2).value
            if is_known_extra_row(sh, rowb, "程序"):
                bump("已知设计(母版新增行)"); continue
            bump("仅程序有(行)"); rows_out.append([sh, "第%d行" % (r+1), rl_g[r], "(整行)", "仅程序有(行)", "", "", "生成件多出此区段"])
            bump("已忽略(结构/设计)")
        for r in unmatched_rows_d:
            if r < 4: continue
            if "当月块" in rl_d[r] or "累计块" in rl_d[r]:
                bump("已知设计(排名表当月/累计块)"); continue
            bump("仅手工有(行)"); rows_out.append([sh, "(无)", rl_d[r], "(整行)", "仅手工有(行)", "", "", "手工定稿多出此区段"])
            bump("已忽略(结构/设计)")
        for i, j in sorted(colmap.items()):
            if cl_g[i] == "(无表头列)" or cl_d[j] == "(无表头列)":
                bump("已知设计(无表头草稿列)"); continue
            for p, q in sorted(rowmap.items()):
                vg = wg.cell(row=p+1, column=i+1).value; vd = wd.cell(row=q+1, column=j+1).value
                if vg == vd: continue
@@ -165,9 +180,9 @@
                    else: cat = "实质数值差异"
                    note = "å·®=%.6g" % diff
                elif num(vg) and (vd is None):
                    cat = "仅程序有";
                    cat = "已忽略(单边有值)"
                elif num(vd) and (vg is None):
                    cat = "仅手工有"
                    cat = "已忽略(单边有值)"
                elif tg is not None and num(vd) and abs(tg - vd) <= 1e-9:
                    cat = "文本型数字(可忽略)"; note = "手工为文本'%s'" % vg
                elif td is not None and num(vg) and abs(td - vg) <= 1e-9:
@@ -190,9 +205,9 @@
    with io.open(csv, "w", encoding="utf-8-sig", newline="") as f:
        f.write("页签,生成件单元格,行标签,列表头,类别,生成件值,手工值,备注\n")
        for x in rows_out:
            if x[4] not in ACTION: continue
            f.write(",".join('"%s"' % str(v).replace('"', "'") for v in x) + "\n")
    # è¾“出 MD
    cats = ["实质数值差异", "错误值(程序)", "错误值(手工)", "文本不同", "仅手工有", "仅程序有", "仅程序有(列)", "仅手工有(列)", "仅程序有(行)", "仅手工有(行)", "取整尾差(可忽略)", "文本型数字(可忽略)", "已知设计(母版新增行)", "已知设计(无表头草稿列)", "已知设计(排名表当月/累计块)", "其它"]
    md = prefix + ".md"
    with io.open(md, "w", encoding="utf-8", newline="\n") as f:
        f.write("# æ±‡æ€»å¤§è¡¨å·®å¼‚明细(生成件 vs æ‰‹å·¥å®šç¨¿ï¼‰\n\n")
@@ -200,17 +215,20 @@
        f.write("## é€é¡µæ±‡æ€»\n\n| é¡µç­¾ | " + " | ".join(cats[:7]) + " |\n|---|" + "---|"*7 + "\n")
        for sh, cnt in per_sheet:
            f.write("| %s | %s |\n" % (sh, " | ".join(str(cnt.get(c, 0)) for c in cats[:7])))
        f.write("\n## å®žè´¨æ•°å€¼å·®å¼‚(全部)\n\n")
        subs = [x for x in rows_out if x[4] == "实质数值差异"]
        f.write("\n## éœ€å¤„理差异(全部,含原因)\n\n")
        subs = [x for x in rows_out if x[4] in ACTION and x[4] != "文本不同"]
        if not subs: f.write("(无)\n")
        for x in subs[:200]:
            f.write("- %s %s [%s] ç”Ÿæˆä»¶=%s æ‰‹å·¥=%s(%s)\n" % (x[0], x[1], x[2], x[5], x[6], x[7]))
        f.write("\n## ä»…手工有(前 200 æ¡ï¼‰\n\n")
        for x in [y for y in rows_out if y[4] in ("仅手工有", "仅手工有(列)")][:200]:
            f.write("- %s %s [%s] %s æ‰‹å·¥=%s\n" % (x[0], x[1], x[2], x[3], x[6]))
        f.write("\n## ä»…程序有(前 200 æ¡ï¼‰\n\n")
        for x in [y for y in rows_out if y[4] in ("仅程序有", "仅程序有(列)", "仅程序有(行)")][:200]:
            f.write("- %s %s [%s] %s ç”Ÿæˆä»¶=%s\n" % (x[0], x[1], x[2], x[3], x[5]))
        for x in subs[:300]:
            f.write("- **%s** %s [%s] ç”Ÿæˆä»¶=%s æ‰‹å·¥=%s%s\n" % (x[0], x[1], x[2], x[5], x[6],
                    ("(原因:%s)" % reason_of(x)) if reason_of(x) else ""))
        f.write("\n## æ ‡é¢˜/表头措辞差异\n\n")
        tt = [x for x in rows_out if x[4] == "文本不同"]
        if not tt: f.write("(无)\n")
        for x in tt[:50]:
            f.write("- %s %s [%s] ç”Ÿæˆä»¶=%s æ‰‹å·¥=%s\n" % (x[0], x[1], x[2], x[5], x[6]))
        f.write("\n## å·²æŒ‰å£å¾„忽略(仅计数,明细见 CSV ä¹‹å¤–不列出)\n\n| é¡µç­¾ | " + " | ".join(IGNORE) + " |\n|---|" + "---|"*len(IGNORE) + "\n")
        for sh, cnt in per_sheet:
            f.write("| %s | %s |\n" % (sh, " | ".join(str(cnt.get(c, 0)) for c in IGNORE)))
    print("已输出:", md, "|", csv, "| æ˜Žç»†æ¡æ•°:", len(rows_out))
    for sh, cnt in per_sheet:
        if cnt: print("   %-12s %s" % (sh, dict(cnt)))
docs/ÎÊÌâ»ã×Ü/»ã×Ü´ó±í_²îÒìÃ÷ϸ_2026-08_20260928.csv
File was deleted
docs/ÎÊÌâ»ã×Ü/»ã×Ü´ó±í_²îÒìÃ÷ϸ_2026-08_20260928.md
File was deleted
docs/ÎÊÌâ»ã×Ü/»ã×Ü´ó±í_²îÒìÃ÷ϸ_2026-08_20260928_×ÀÃæµ¼³ö°æ.md
File was deleted