# 工作日结_2026-09-17 ## 一、今天做了什么 ### 1. 投资月报需求:确认口径 + 交付格式探测报告与字段映射表草案 用户上午答复了昨天悬置的 4 个口径问题: | # | 问题 | 用户答复 | | --- | --- | --- | | 1 | 编号 4「投资系统每月导入的项目表」文件名/路径 | **已放在「输入」文件夹里**(实测即 `输入\模板_查询结果(投资系统-客运+物流 2026.7).xls`,149 行 × 8 列,B 列「单位」= 项目名称,G 列「自年初-累计完成投资」) | | 2 | 同名项目跨市州怎么处理 | **不能动项目名称**,按市州报上来的项目名称比对更新;一般不会出现,**出现就弹窗提示** | | 3 | 1 月的上月基数从哪取 | **上年 12 月的明细表** | | 4 | 名称不一致怎么办 | **先出一份映射表看看,先不改程序** | | 5 | 输出命名与格式「你怎么看」 | 已按我的建议回复「可以你做」 | 据此完成了需求文档「十一、开工顺序建议」的第 1、2 步(这两步不需要再等业务信息): - **格式探测(确认事项 D)**:全量扫描 2026 年 7 月 27 个市州月报 + 6 张目标表 + 1 个投资系统项目表,产出《市州月报格式差异报告》。 - 20/27 个文件与目标明细表列位完全一致(省统一模板),差异集中在 7 个文件。 - **高风险 4 项**:十堰物流表内混入「武汉」2013—2016 历史区块;潜江/林区工作表名与实际月份不符(7 月数据分别在名为 `潜江传化2022.3`、`2026.7` 的表里);襄阳客运 `.et` 格式且列位右移 1 列;全部文件的数据区都混排着市州行/分类行/小计行/空行。 - 中风险:恩施/黄石物流「建设阶段/形象进度」未分列(黄石 L 列是「完成百分比」);武汉(南山、汉口)客运是另一种简表布局;鄂州/天门 3 行合并表头错位;随州物流数据在 `Sheet2` 且无序号列。 - 另发现:**客运 7 月只有 10 个市州报了文件**,缺黄石、鄂州、随州、天门、潜江、仙桃、荆州。 - **字段映射表草案(确认事项 E)**:产出 `字段映射表_草案_2026-07.xlsx`(7 个 sheet:说明与口径 / 源文件标准列位 / 逐市州列位映射 / 明细表→目标表映射 / 投资系统项目表字段 / 差异与待确认清单 / 输出命名与格式建议)。 - 把用户答复的口径全部固化进映射表:匹配键 = 项目名称(不得改名、冲突弹窗);1 月基数 = 上年 12 月明细表;名称不一致先看映射表后落地。 - 回答「输出命名与格式」:建议**沿用 7 月输出件命名 + 按月分目录 + 原格式原样输出 + 运行前备份 + 日志/报错文件单独输出**,理由与命名清单见映射表 Sheet7。 ### 2. 产出可复跑的探测脚本 - 新增 `docs\投资\工具\格式探测.py`:只读扫描任意月份的源文件,输出 `.md` + `.tsv`。 支持「按表头关键字定位列」「按表头日期选工作表」「无序号列 / 缺序号行识别」「市州行与小计行排除」。 以后换月份直接 `python docs\投资\工具\格式探测.py --month 2026-09` 即可复跑。 ## 二、测试结果摘要 - 《功能测试报告_投资月报格式探测与字段映射表_2026-09-17.md》:TC01–TC11 **全部通过**;生成的 xlsx 复读正常(7 个 sheet)。 - 开发过程中发现并修复 5 个脚本缺陷(闭包延迟绑定、`best[2]` 越界、xlrd 未入 path、无序号行漏判、多工作表取到历史月)。 - 人工抽查 7 个重点文件(十堰物流、潜江/林区、襄阳客运、恩施/黄石物流、随州物流、武汉简表)逐个打开源文件核对,报告结论与源文件一致。 - 本轮**未改动任何业务程序代码**(符合「先不改程序」要求),未写入数据库,未改动任何源文件/目标表。 ## 三、遗留问题与待办 1. **待业务确认(已写入映射表 Sheet6)**: - 汇总表(`2026年全省预安排计划进度情况汇总`)没有「其中:本月完成投资」列(现有 I=自开始建设累计、W=1-X月累计完成投资、X=实际进度),需求文档写的 4 项指标与模板列对不上,第 ③ 项落在哪一列? - 《亿元投资项目》`规上项目表` 没有「自开始建设累计 / 自年初累计」列,需求文档写的「更新 3 项」如何映射? - 恩施、黄石物流的「建设阶段/形象进度」合并列按什么口径写入? - 1 月基数取上年 12 月明细表的**哪一列**(自年初累计跨年会清零)? - 客运缺 7 个市州文件:本期无项目还是漏报?程序遇缺应「跳过+提示」还是「报错中止」? 2. **尚未开工**:Step1–Step3 核心更新主流程(等映射表确认后落地);Step1.5 数据比对模块(文件已到位,可随主流程一起做)。 3. **未提交项**:`docs\投资\` 下用户自己的文件整理(`模板_查询结果...xls` 移到 `输入\`、`X月...` 改名、两个模板被替换等)仍在工作区未提交,等用户确认后再一起提交。 4. 昨日遗留:公司 gitea(`http://61.183.254.94:3000`)仍不通;2026-06 / 2026-09 无汇总大表母版;`h2031` 缺 2025-01;`passenger_individual_monthly` 2026-08 缺黄冈。 ## 四、明天计划 1. 把映射表草案的重点问题(第三节 1)当面/微信逐条与用户确认口径。 2. 口径确认后,按映射表实现 Step1(市州月报 → 两张明细表): - 列位按表头关键字定位 + 按表头日期选工作表 + 项目行判定 + 市州分段校验; - 校验公式「当月自年初累计 = 上月自年初累计 + 其中本月完成」,不通过则弹窗 + 记日志 + 按公式修正并写回; - 输出 `校验报错_<年月>.xlsx` 与 `运行日志_<年月>.md`。 3. 再依次接 Step2(汇总表)、Step3(三张固定表 + 亿元投资项目专属列规则)。 4. 若用户确认 `docs\投资\` 的文件整理,一并提交并补推公司 gitea(若恢复)。 --- ## 五、下午追加(用户核对源文件后) ### 5.1 用户 4 点反馈的核查与处置 | 用户反馈 | 核查结论 | 处置 | | --- | --- | --- | | ① ②「你把表说清楚,是客运站还是物流园区;我看十堰的表没有你说的情况」 | **用户没看错**:那些内容是**隐藏行 / 隐藏表**。例:十堰物流 R11—R63(53 行)是隐藏行,内容为「武汉」历史区块;潜江 26/27 张表被隐藏 | 新增只读工具 `隐藏项探测.py` + 清单《隐藏数据核实清单_2026-07.md》(逐文件写清:品类/文件/工作表/隐藏行区间/隐藏内容/怎么取消隐藏自己验证) | | ③「`.et` 右移不用管,我们只管要更新的字段」 | 与程序实现方向一致 | 差异报告、映射表均标注「不做处理」 | | ④「恩施和黄石也是分了的,只是没在表头写;不更新建设阶段列」 | 与源文件相符 | 该风险项**关闭** | ### 5.2 本轮最重要的技术结论 - **「隐藏行 / 隐藏工作表」不能作为过滤条件**:黄石物流隐藏行 R10 是真实项目行「阳新县焦山物流仓储中心」(无序号),且**已计入**第 5 行「黄石」市州合计——四项数值逐项核对相等(计划总投资 564,991.69 / 自开始建设累计 59,500.20 / 自年初累计 34,978.15 / 本月完成 7,088.90)。 - 反过来,「可见」也不等于「本期数据」:潜江 `潜江2026.07.xlsx` 只有 1 张可见表,表名叫 `潜江传化2022.3`,装的却是 2026 年 7 月数据。 - 所以取数判定只用三条:**① 表头日期选表;② 市州行切段;③ 项目行判定(序号/名称/数值锚点)**。 - 附带发现:咸宁客运隐藏表 `RQYQRYQS` 含 Excel 4.0 宏病毒残留字样(`Classic.Poppy by Vic` / `Infect Workbook`),已建议用户杀毒(我不动源文件)。 ### 5.3 修复与验证 - `格式探测.py` 增加**市州分段**(`CITIES` + `city_segments()`):十堰物流项目行由 **38 行修正为 7 行**;与旧结果逐文件 diff,其余 26 个文件**零变化**(无回归)。 - 差异报告新增 H5 风险项与「七、更正记录」;功能测试报告新增 TC12–TC15,**全部通过**。 ### 5.4 遗留(本轮未闭环) - **映射表 xlsx 未写入**:`字段映射表_草案_2026-07.xlsx` 被 WPS 打开占用(目录下存在 `~$字段映射表_草案_2026-07.xlsx` 锁文件),`PermissionError`。订正脚本 `_qa_out\patch_map.py` 已备好,**关闭该文件后重跑即可**(会补上 Sheet3 的「隐藏项核实」列、修正十堰/林区/潜江/黄石等行,Sheet6 更新十堰、潜江林区、襄阳、恩施黄石,并新增「隐藏行不能当过滤条件」一条)。 - 公司 gitea 仍不通。 --- ## 六、傍晚追加(`.et` 可读性订正 + 待确认清单) ### 6.1 核实「仓库里 4 个被改动的文件」 用户确认要我先核实。逐个把 HEAD 版本与工作区版本做**逐单元格比对**: | 文件 | 结果 | | --- | --- | | `输入\客运(客运站)\7月\2026年7月站场固投(南山、汉口站).xlsx` | 数据 **0 处差异**(10×15 全同) | | `输入\客运(客运站)\7月\襄阳市道路运输服务中心2026年6月投资 (1).et` | 7 张分月表**逐张 0 处差异** | | `模板\模板_全省预安排计划进度情况汇总.xls` | 数据 **0 处差异**(272×28 全同) | | `模板\模板_经济强县投资统计报表.xls` | 数据 **0 处差异**(45×17 全同) | → 字节差异只是 Excel/WPS 重新保存造成的格式重写,**没有数据风险**;是否还原等用户拍板。 ### 6.2 订正一个错误判断:`.et` 其实能读 之前把 `.et` 当成「xlrd/openpyxl 都读不了,必须 Excel COM」。实测文件头是 `D0CF11E0A1B11AE1`——**OLE2 复合文档 / BIFF8**,`xlrd` 直接就能读:襄阳客运 `.et` 的 7 张分月表全部读出(`2026年1月`—`2026年7月 `)。已修两个工具与差异报告/核实清单/映射表,隐藏项探测覆盖由 26 个文件扩到 **27/27**。 ### 6.3 产出《待确认清单_2026-09-17.md》 按用户要求把开工前必须定的口径做成「勾选版」确认表(13 条),每条都给现状 + 选项 + 我的建议: - **阻塞 Step1 的 5 条**:明细表更新哪几列、客运缺 7 市州怎么处理、校验的上月底数从哪来、潜江只有 1 个项目行、武汉简表无建设阶段列; - Step2/3 的 4 条:汇总表更新哪些列(含 `W=1-7月累计` 表头要不要跟着月份改)、亿元投资项目「3 项」是哪三项、1 月基数取哪列、编号 3/4 是否同一份文件; - 收尾 4 条:输出目录/命名/备份、4 个被改文件是否还原、`docs\投资\` 未提交改动是否提交、"每月是否还要做模板"(用户说要请教同事,暂缓)。 ### 6.4 待办 - 等用户把确认表勾完 → 回填映射表 Sheet6 → 立即落地 **Step1**。 --- ## 七、收工前追加(口径确认回填 + Step1 解析引擎) ### 7.1 用户勾完 13 条确认表,已回填映射表 映射表新增 **Sheet8「口径确认_2026-09-17」**,作为 Step1 实现的**唯一依据**: | 项 | 用户答复 | 落地口径 | | --- | --- | --- | | Q1 明细表更新哪几列 | **C** | H/I/J/K/L/M 六列全写 | | Q2 客运缺 7 市州 | **C** | 跳过 + 提示 + 保留上月数据 | | Q3 上月底数来源 | **A** | 从系统目标表读上月值 | | Q4 潜江仅 1 个项目行 | **A** | 照常写 | | Q5 武汉简表 | 留空 | L/M 两列都留空 | | Q6 汇总表 | **A** | 只更 I/W/X;W 表头「1-X月」随月份自动改 | | Q7 亿元投资项目 | 只更 F 列 + 新增「2026年X+1月实际完成投资」列 | Step3 执行 | | Q8 1 月基数 | **A** | 1 月 J = K(跨年清零) | | Q9 编号 3/4 | 同一份文件,放一份 | 唯一文件:`输入\模板_查询结果(投资系统-客运+物流 2026.7).xls` | | Q10 输出目录 | 输出\Y年Y月 | `输出\2026年7月\` | | Q11 4 个被改动文件 | (用户反问)已解释:数据 0 差异,随本次提交 | 不做还原 | | Q12 docs\投资 整理 | **A** | 已提交入库(17 个变更,含 3 个 git 识别出的重命名) | | Q13 每月是否还做模板 | 暂缓 | 等同事结论 | ### 7.2 提交(个人 Gitee) - `2af4d53` → `73a0551`:入库用户整理后的输入/模板/输出文件 + 回填口径确认 - 顺带把 `.gitignore` 补上 `__pycache__/`、`*.pyc` ### 7.3 写完 Step1 的解析引擎(本轮最重的产出) 新增 `docs\投资\工具\市州月报解析.py`(只读):27 个源文件 → **151 个项目行**(客运 48 + 物流 103),输出 `解析结果_2026-07.tsv` + `解析报告_2026-07.md`。 - 每文件做「项目行求和 ⇄ 源文件合计/小计/市州行」对账:**13 个有对账行的文件全部 ✅ 一致,0 不一致**;剩 4 个(十堰客运、襄阳 .et、随州物流、仙桃物流)源文件本身没有小计行。 - 修复 3 个解析缺陷:校验行挑选规则(黄冈合计在 B 列;林区有 3 行小计)、无小计行时用「市州行值」兜底、无城市信息文件(南山汉口)用 `CITY_OVERRIDE` 登记为武汉。 - 测试报告:《功能测试报告_投资月报源文件解析引擎_2026-09-17.md》(P01–P10 全通过)。 ### 7.4 遗留 / 待确认 1. **上月基数口径仍有冲突**:需求文档写「上月值来源:上月数据表」(= 投资系统查询结果文件),用户 Q3 选「从系统目标表读」。而手上那份查询结果是 **2026年7月**的(E=自开始建设至本月底、G=自年初累计、H=当月完成),**不含 6 月底数**。→ 需用户二选一:(a) 每月另放一份**上月**的查询结果;(b) 用目标明细表的 J 列当上月底数。 2. 客运缺 7 市州的缺失原因(真没项目 / 漏报)仍未确认。 3. Step1 的**写入侧**(按名称匹配写 6 列 + 新增项目行 + 校验纠正 + 弹窗 + 日志)尚未实现。 --- ## 八、收工(Step1 写入前的最后一环:匹配 + 校验) ### 8.1 用户确认「上月基数」口径:(a) 用户选定:**每月另放一份「上月」的投资系统查询结果文件**,校验等式 `本月自年初累计 = 上月自年初累计 + 本月完成` 用它的 G 列。程序已按此实现识别(按文件名/「时期」列自动区分本期与上月,本期缺失不影响运行、只跳过校验并提示)。 ### 8.2 新增 `匹配与校验.py`,把 Step1 的三个判断全部算出 | 品类 | 目标表项目行 | 源文件行 | 精确匹配(→更新) | 需新增 | 疑似同一项目(→弹窗) | 目标表独有(保持原值) | 数值不一致 | | --- | --- | --- | --- | --- | --- | --- | --- | | 客运 | 49 | 48 | **45** | 3 | 0 | 4 | **0** | | 物流 | 99 | 103 | **94** | 6 | 3 | 5 | **2** | - 变更清单:`变更清单_2026-07.tsv` 共 **148** 条(更新 139 + 新增 9)。 - **名称匹配做了三层**:精确 → 宽松等价/≥0.90(疑似同一项目,不合并也不重复新增)→ 0.80–0.90(仍新增但提示确认)。这条规则直接来自用户口径「不能动项目名称,按市州报上来的名称比对,出现不一致就弹窗提示」。 - **物流疑似同一项目 3 个**:`鄂湘赣商贸物流中心一期`⇄`(一期)`、`荆门北站顺洋物流基地`⇄`…基地项目`、`荆门智慧冷链物流园`⇄`…园项目` → 不重复新增,等人工确认。 ### 8.3 两个真实数据问题(需业务确认) 1. `九州通沃田国际供应链中心项目` 的**自年初累计**:市州月报 **8000** / 投资系统 **4200**,差 **−3800** —— 这是本期唯一的实质数值不一致。 2. `神农架物流园` 自开始建设累计 7535.45 vs 7535.5(差 0.05,应为舍入)。 3. 另有 4 处名称相似但**实为不同项目**(如 `郑万高铁南漳` vs `郑万高铁巴东`),已按新增处理并提示,避免误合并。 ### 8.4 待办(下一步) 1. **Step1 写入侧**:用 **Excel COM**(本机 Python 无 win32com)把 `变更清单_2026-07.tsv` 写进两张明细表 —— 更新 6 列(H/I/J/K/L/M)、新增项目整行插入(复制相邻行格式)、校验不符按等式纠正并弹窗+记日志、输出到 `输出\2026年7月\`、运行前 `_bak_` 备份。 2. 缺「上月投资系统数据表」——请每月把上月的查询结果一并放进 `docs\投资\输入\`(本期只放了 2026.7 那份)。 3. 客运缺 7 市州的原因(真没项目 / 漏报)仍未确认。 4. 公司 gitea 仍不通,本地领先 gitea 的提交待补推。 ### 8.5 测试报告 《功能测试报告_投资月报匹配与校验引擎_2026-09-17.md》—— M01–M09 **全部通过**。 ## 九、追加(用户核实「九州通沃田」+ 上线《弹窗提示》机制) ### 9.1 用户核实 → 定位出一个真 bug - 用户:「`九州通沃田国际供应链中心项目` 的本年计划投资也是 8000,这个是对的」。 - 复核后确认:**用户是对的,我错了**。源文件 `2026年7月企业月报汇总(鄂州).xls` R15: `G=36000(总投资) H=23504(自开始建设累计) I=8000(本年计划投资) J=4200(自年初累计) K=200(本月完成)`; 投资系统 R97 同样是 `F=8000 / G=4200`。原报告里「8000 vs 4200」是**取列错位**造成的假异常。 - **根因**:该表是**两级表头**——R5 组表头「自年初累计完成投资(万元)」是**合并单元格 I5:K5**, R6 子表头 I=本年计划投资、J=合计、K=其中:本月完成投资。原解析规则「命中最靠上、命中词最短」→ 把「自年初累计」定到了 I 列。 - 同一模板还影响:天门物流(I=36835 是本年计划投资,J=16177.7 才是自年初累计)。 ### 9.2 修复:合并区感知取列 - `格式探测.py` 新增 `sheet_merges(path)` / `merge_span(merges, row, col)`; - `市州月报解析.py` 的 `pick_columns` 改为:命中落在跨多列合并区时,在该区内**排除其它字段更深的子表头所占列**,只剩唯一一列才采用。 - **影响面收敛**:全量复跑 2026-07,`解析结果` 与 `变更清单` **各只有 4 行变化**(鄂州 3 + 天门 1),其余逐字不变;项目行仍是 151 行 / 27 个文件。 ### 9.3 新增《弹窗提示》机制(用户要求:只要有不对的地方就弹窗提示) - 新增 `解析校验_<月>.tsv`(源文件自洽性:项目行求和 vs 合计/小计/市州行、解析状态)。 - `匹配与校验.py` 内置 **14 条检查规则**,产出 **`弹窗提示_<月>.tsv`**(级别/类型/品类/市州/项目名称/来源/详情/建议动作),并把清单置顶到《匹配校验报告》。 - 级别:**阻断**(不能写表)/**警告**(人工确认后再写)/**提示**(仅告知)。 - 规则文档:`docs\投资\弹窗提示规则_2026-09-17.md`(将来搬进 Java 后端按此逐条弹窗,规则不改)。 - 顺带修好 3 个检查项缺陷:「投资系统名称写法不同」漏报、「疑似同一项目」漏报(中国供销.公安)、0.05 舍入被误报为不一致。 ### 9.4 本期(2026-07)弹窗结果 | 级别 | 条数 | 主要内容 | | --- | --- | --- | | 阻断 | 0 | — | | 警告 | 9 | 源文件 vs 投资系统不一致 4、疑似同一项目 4、缺上月投资系统表 1 | | 提示 | 36 | 将新增项目 5、名称写法不同 5、投资系统查无此项目 15、无该市州数据 2、源文件没报的项目 2 等 | - **回归验证(负向)**:把修复前的解析结果喂给程序,会自动弹出 **5 条「疑似取列错位」**,命中的正是 4 个受影响项目 → 这类 bug 以后不会再「静默通过」。 - **确定性**:连跑两次,5 个产出文件 SHA256 完全一致。 ### 9.5 待办 1. 需业务确认的 9 条警告(尤其是 `宜都供销商贸物流园` 本年计划投资 12000 vs 1013、`麻城市农产品综合物流园` 总投资 35000 vs 33000)。 2. 请每月把**上月**的投资系统查询结果也放进 `docs\投资\输入\`,否则月度等式校验一直跳过。 3. 仍待确认:客运缺 8 个市州(真没项目 / 漏报);3 处名称写法不同是否同一项目。 4. Step1 写入侧(Excel COM 写两张明细表)尚未开跑。