# 投资月报《弹窗提示》规则(定稿 2026-09-17) > 用户要求:「程序里面设置一个提示,只要有不对的地方就弹窗提示」。 > 本文件把**所有检查项、级别、弹窗文案、建议动作**写死成一张表; > 《匹配校验报告_.md》开头与 `弹窗提示_.tsv` 都按本表产出。 > 将来搬进 Java 后端/网页时**按此逐条弹窗,规则一字不改**。 ## 一、级别定义 | 级别 | 含义 | 程序行为 | | --- | --- | --- | | **阻断** | 数据不齐/解析失败,不能写表 | 不执行写入,必须先处理 | | **警告** | 数据有疑点,需人工确认 | 可写入,但必须人工确认后再写 | | **提示** | 仅告知,不阻断 | 记录备查,可继续 | ## 二、检查项清单(14 项) | 编号 | 类型 | 级别 | 触发条件 | 数据来源 | 建议动作 | | --- | --- | --- | --- | --- | --- | | 1 | 缺本期投资系统表 | 阻断 | 「输入」目录里找不到本期《模板_查询结果》(按文件名或『时期』列识别) | 输入目录 | 把本期投资系统导出放进 `docs\投资\输入\` 后重跑 | | 2 | 缺上月投资系统表 | 警告 | 找不到上月《模板_查询结果》→ 月度校验无法执行 | 输入目录 | 每月把上月、本月两份都放进 `输入\` | | 3 | 缺源文件解析校验 | 阻断 | 没有 `解析校验_<月>.tsv` | 输出目录 | 先跑 `市州月报解析.py --month <月>` | | 4 | 源文件解析异常 | 阻断/警告 | 源文件「未选中工作表」(警告) 或「解析失败」(阻断) | `解析校验_<月>.tsv` | 人工打开源文件确认表头/数据;必要时登记特例 | | 5 | 源文件内部对不上 | 警告 | 项目行求和 ≠ 合计/小计/市州行 | `解析校验_<月>.tsv` | 让市州核对源文件(合计行或项目行有错) | | 6 | 源文件与投资系统不一致 | 警告 | 5 个数值字段任一:市州月报 vs 投资系统 差额 > 1 | 源文件 + 投资系统 | 人工确认以哪个为准 | | 7 | **疑似取列错位** | 警告 | 市州月报某字段的值**恰好等于**投资系统另一个字段 | 源文件 + 投资系统 | 检查源文件表头(组表头合并单元格最易错位),修取列规则后重跑 | | 8 | 投资系统名称写法不同 | 提示 | 名称去间隔号/括注后能对上投资系统记录 | 源文件 + 投资系统 | 已按投资系统记录做数值对照(项目名称不动) | | 9 | 投资系统查无此项目 | 提示 | 投资系统本期没有这个项目名 | 投资系统 | 知悉即可;如需以系统为准请人工核对名称 | | 10 | 疑似同一项目(名称写法不同) | 警告 | 与目标表已有项目「宽松等价」或「去括注/间隔号后相同」或相似度 ≥ 0.90 | 目标表 + 源文件 | 人工确认:是同一项目 → **不改名称**、按投资系统名称更新;否 → 整行新增 | | 11 | 将新增项目 | 提示 | 目标表没有该项目(且不构成第 10 条) | 目标表 + 源文件 | 确认是真实新项目后整行插入(复制相邻行格式);相似度 0.80–0.90 会在详情里附提示 | | 12 | 月度等式不符 | 警告 | 本月自年初累计 ≠ 上月自年初累计 + 本月完成 | 上月/本月投资系统 | 写入时按等式纠正,并让市州确认 | | 13 | 本期无该市州数据 | 提示 | 某市州本期一个项目行都没有 | 源文件 | 确认是「确实没有项目」还是「漏报」,漏报则让市州补报 | | 14 | 本期源文件里没有的项目 | 提示 | 目标表有、本期源文件没报 | 目标表 + 源文件 | 按口径保持上月原值;若已停建请人工确认是否保留 | ## 三、2026-07 期实际触发情况(跑 `匹配与校验.py --month 2026-07`) 共 **45 项**:**阻断 0 / 警告 9 / 提示 36**。 - 警告 9:源文件与投资系统不一致 4(宜都供销商贸物流园、巴东青龙桥、松滋星络、麻城农产品综合物流园)、疑似同一项目 4(鄂湘赣一期、中国供销公安、荆门北洋、荆门智慧冷链)、缺上月投资系统表 1。 - 提示 36:将新增项目 5、投资系统名称写法不同 5、投资系统查无此项目 15、本期无该市州数据 2、本期源文件里没有的项目 2、其它 7。 ## 四、2026-09-17 取列错位修复记录(对应第 7 条规则) - **现象**:报告里出现「`九州通沃田国际供应链中心项目` 自年初累计 市州月报 8000 / 投资系统 4200」。 - **根因**:鄂州《2026年7月企业月报汇总(鄂州).xls》表头是**两级表头**:R5 组表头「自年初累计完成投资(万元)」是**合并单元格 I5:K5**,R6 子表头 I=本年计划投资、J=合计、K=其中:本月完成投资。 原解析规则只认「命中最靠上、词最短」,于是把「自年初累计」定位到了 **I 列(本年计划投资)** → 8000。 - **用户核实**:`九州通沃田国际供应链中心项目` 的**本年计划投资就是 8000,是对的**(与投资系统 F 列 8000 一致)。 - **修复**:`市州月报解析.py` 改为**合并区感知**:如果某字段的命中落在跨多列的合并单元格里,就在该合并区内排除「其它字段更深的子表头」所占的列,只剩唯一一列时才用它。 → 「自年初累计」落在 **J 列**,值与投资系统 G 列(4200)、目标明细表 J 列(4200)三方一致。 - **影响面**:全量复跑 2026-07,**只有 4 行变化**(鄂州 3 行 + 天门 1 行),其余 147 行逐字不变; 天门那行同样有 I5:K5 组表头(源文件 I=36835 是本年计划投资,J=16177.7 才是自年初累计,与目标表一致)。 - **防复发**:新增第 7 条「疑似取列错位」自动告警。回归验证:把修复前的解析结果喂给程序,会自动弹出 5 条「疑似取列错位」,命中的正是 4 个受影响项目。 ## 五、怎么跑 ```powershell python docs\投资\工具\市州月报解析.py --month 2026-07 # 产出 解析结果 / 解析报告 / 解析校验 python docs\投资\工具\匹配与校验.py --month 2026-07 # 产出 变更清单 / 匹配校验报告 / 弹窗提示 ``` 产出(`docs\投资\输出\`): | 文件 | 用途 | | --- | --- | | `解析结果_<月>.tsv` | 一行一个项目(机器可读) | | `解析报告_<月>.md` | 人读:每个文件的市州/项目数/字段求和/一致性 | | `解析校验_<月>.tsv` | 每个源文件的自洽性(项目行求和 vs 合计行) | | `变更清单_<月>.tsv` | 给写入侧:动作/目标行号/6 列新值 | | `匹配校验报告_<月>.md` | 人读:弹窗总览 + 匹配统计 + 三方比对 + 月度校验 | | **`弹窗提示_<月>.tsv`** | **机器可读弹窗清单(级别/类型/品类/市州/项目名称/来源/详情/建议动作)** |