소스 검색

完成月结总结

zhangguo 1 일 전
부모
커밋
38369eb275
6개의 변경된 파일1851개의 추가작업 그리고 2개의 파일을 삭제
  1. 1 0
      Dic/README.md
  2. 7 1
      MES_FIN_MONTH/FinMES.md
  3. 111 0
      MES_FIN_MONTH/FinMES202603.md
  4. 690 0
      MES_FIN_MONTH/FinMES202603_ex.md
  5. 1020 0
      MES_FIN_MONTH/月结逻辑交接说明.md
  6. 22 1
      README.md

+ 1 - 0
Dic/README.md

@@ -49,6 +49,7 @@
 
 **API** 也是接箍炉号
 
+**W** 外购管
 
 <h2 id="成品炉号">成品炉号</h2>
 

+ 7 - 1
MES_FIN_MONTH/FinMES.md

@@ -34,6 +34,10 @@
 
 进这个位置获得[**存储过程**](./InitScript)生成脚本
 
+2. 月结交接文档
+
+[牛马月结逻辑交接说明.md](./月结逻辑交接说明.md)
+
 ### 月结传递给产销的视图
 
 视图在**CX_MES**下面,关于CX_YDM
@@ -44,4 +48,6 @@
 
 | 年月      | 状态  | 完成日期       | 备注                        |
 | ------- | --- | ---------- | ------------------------- |
-| 2026-02 | 已完成 | 2026-03-05 | [首次月结](./FinMES202602.md) |
+| 2026-02 | 已完成 | 2026-03-05 | [首次月结](./FinMES202602.md) |
+| 2026-03 | 已完成 | 2026-03-29 | [三月月结总结牛马](./FinMES202603_ex.md) |
+| 2026-03 | 已完成 | 2026-03-29 | [月结过程记录](./FinMES202603.md) |

+ 111 - 0
MES_FIN_MONTH/FinMES202603.md

@@ -0,0 +1,111 @@
+# 2026年3月份财务月结过程
+
+## 月结过程纪事
+
+> 2026-03-22
+> > 将5个项目的结算日期切换为24日并发布
+> > 其中接口发布存在问题
+>
+> 2026-03-24 上午
+> > 发现接口不能工作
+> > 发布牛马版接口,发现可以工作
+> > 比对排查源码和实际存在差异:1、端口不一致,2、缺乏jar包
+> > 按照war包比对,更新替换了war包
+>
+> 2026-03-25 21:00
+> > 开始处理期初期末平衡问题
+> > 处理外购管问题(窦工)
+> > 处理该时间点后钢管要调整结算期问题。
+>
+> 2026-03-26 03:00
+> > 生产部部长们要求我们留下等待,他们很快就完成。
+>
+> 2026-03-26 09:00
+>
+> >  [突然爆发问题](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/47) 严重影响生产,薛排查此问题和解决此问题到 2026-03-25 17:30 **这个问题需要有个明确解释** 客户怀疑此事的性质
+>
+> 2026-03-26 13:00
+> >
+> > 生产部确定不会再有调整
+> > [半成品上结转在问题](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/46)
+>
+> 2026-03-26 18:00
+> >
+> > 正式进入财务月结环节
+>
+> 2026-03-26 20:00
+> >
+> > 完成第一次财务月结脚本
+> > 发现月结脚本存在不正确
+> > > [不正确脚本1](./FinMES202602/mes_cx_ydm_zc_initialnew_hand.md)
+> > > [变量意思含糊脚本1](./FinMES202602/mes_cx_ydm_bc_inlist_new_hand.md)
+> > > [变量意思含糊脚本2](./FinMES202602/mes_cx_ydm_bc_outlist_new_hand.md)
+> > 电话没停过,打得意识都模糊了
+>
+> 2026-03-26 03:00
+>
+> > 财务月结修复数据,问题从400变为200个
+> > 以上时间是姬和薛,在牛马指导下进行操作
+>
+> 2026-03-26 07:30
+>
+> > 起床继续财务月结 (由姬和薛进行说明)
+> > MES故障,有一车钢管开不出单子。杨婧亲自着急[问题](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/48)
+> > 发现MES很多故障虽然不解决bug,但是有成熟的补救方案,请将这些方案和问题全面提供
+>
+> 2026-03-26 22:00
+>
+> > 连续熬夜**3天2夜**,强制大家回去睡觉
+> > 问题还剩下180个
+>
+> 2026-03-27 08:00
+>
+> > 继续处理财务月结问题
+>
+> 2026-03-27 15:00
+>
+> > MES财务月结基本完成
+> > 财务不愿意等待,采取了手动月结
+> > 由于财务人员手动月结,而不操作产销系统,在薛代为操作时,步骤变形(这个环节没得到传承)
+>
+> 2026-03-27 20:00
+>
+> > 财务用他们手算的月结进行了上抛
+> > 薛完成了产销这边的对账
+> > 还遗留部分问题,但不影响本次月结,需要后续处理(由薛说明)
+>
+> 2026-03-27 21:00
+>
+> > 问题基本完成,回家休息
+>
+> 2026-03-28 09:00
+>
+> > 冯会计提出工具有bug,杨杨顺便带了个新需求
+> > 30分钟内修复并上线
+>
+> 2026-03-28 14:00
+>
+> > 杨杨提出数据不准确
+> > > 咨询杨杨得出算法1
+> > > 咨询关家和得出算法2
+> > > 咨询冯会计得出算法3
+> > > 咨询姬,然后从牛马那里得到算法4
+> > > 4种说法都有道理,但是,业务定义不统一是普遍现象
+>
+> 2026-03-28 18:00
+>
+> > 牛马做出这次月结总结文档 [三月月结总结牛马](./FinMES202603_ex.md) 
+> > [牛马月结交接说明](./月结逻辑交接说明.md)
+>
+
+## 月结演习提议
+
+> 让夏工将03-24的数据库MES+ERP一起还原出一套新环境
+> > 给演习参与方各自提供一台跳板机
+> > 演习网络闭环
+> > 演习区域时钟拨回03-24
+> > 演习时长为24小时,中途下班时暂停时间计算
+> > 中间处理的任何问题,必须有切实根据,并落入文档,要求准确,而不是快速
+> > 演习24小时结束,必须停止并分析失败原因,
+> > 重新布置演习环境
+> > 可以考虑增派人手

+ 690 - 0
MES_FIN_MONTH/FinMES202603_ex.md

@@ -0,0 +1,690 @@
+# 两天台账排查逻辑与案例总结
+
+## 1. 这次排查覆盖了哪些对象
+
+这两天实际排查的对象,分成 5 类:
+
+1. 半成品收发存原表  
+   `YDM_BC_INITIAL / YDM_BC_INLIST / YDM_BC_OUTLIST`
+
+2. 半成品中间表  
+   `CX_YDM_BC_INITIAL / CX_YDM_BC_INLIST / CX_YDM_BC_OUTLIST`
+
+3. 成品收发存原表  
+   `YDM_ZC_INITIAL / YDM_ZC_INLIST / YDM_ZC_OUTLIST / YDM_ZC_STOCKTAKINGLIST`
+
+4. 成品中间表  
+   `CX_YDM_ZC_INITIAL / CX_YDM_ZC_INLIST / CX_YDM_ZC_OUTLIST`
+
+5. 月报与接口
+   - 热轧月报:`HOT_PRODUCTION_MES_RZ`
+   - 加工月报:`HOT_PRODUCTION_MES_JG`
+   - 判定表:`QCM_ZG_JUGDE_APPLY`
+   - 接口日志:`CX_TO_MES_LOG`
+   - 提单表:`YDM_ZC_BILL_M / YDM_ZC_BILL_C / YDM_ZC_LOADVEHICLE_MAT`
+
+这 5 类对象里,最容易混淆的是:
+
+- 原表 `YDM_*`:更像“当前业务真实源头”
+- 中间表 `CX_*`:更像“给校验/接口/月报使用的结果表”
+- `DataValidationResult`:只是某一时点的校验快照,不代表当前库里实时值
+
+所以排查时第一原则是:
+
+**永远先分清“是原表错了,还是 CX 表错了,还是校验结果只是旧快照”。**
+
+
+## 2. 核对的基本公式
+
+### 2.1 半成品/成品跨月连续性
+
+最常用的判断公式是:
+
+`本月期初 = 上月期初 + 上月入库 - 上月出库 (+ 调差)`
+
+其中:
+
+- 半成品常用:
+  - 期初:`YDM_BC_INITIAL`
+  - 入库:`YDM_BC_INLIST`
+  - 出库:`YDM_BC_OUTLIST`
+
+- 成品常用:
+  - 期初:`YDM_ZC_INITIAL`
+  - 入库:`YDM_ZC_INLIST`
+  - 出库:`YDM_ZC_OUTLIST`
+  - 调差:`YDM_ZC_STOCKTAKINGLIST`
+
+### 2.2 月报和台账对比
+
+月报不是直接跟“成品量”比,而是要先明确过程口径。
+
+这次已经确认过一类典型问题:
+
+- 有些第三方是直接拿 `PROD_WEIGHT`
+- 但系统过程实际用的是 `PROD_WEIGHT - NVL(LC_WEIGHT, 0)`
+
+所以月报类问题第二原则是:
+
+**先确认“月报值的生成公式”,再谈是不是对不上。**
+
+
+## 3. 标准排查流程
+
+后面再遇到类似问题,建议固定按下面 8 步走。
+
+### 第 1 步:先确认问题是“哪一层”报出来的
+
+先看报错来自哪里:
+
+- `DataValidationResult`
+- 第三方接口校验
+- 人工 Excel 对账
+- 月报和台账比对
+
+这一步的目的,是避免把“汇总口径问题”误当成“明细错误”。
+
+### 第 2 步:先做月度总额复核
+
+先按物料或全口径聚合,确认差多少。
+
+例如:
+
+- `202601 -> 202602` 成品只差 `0.020t`
+- `202603 -> 202604` 成品差 `2支 / 3.969t`
+
+这一步只回答一个问题:
+
+**到底是“大面积错”,还是“少数几条炉号造成的总差”。**
+
+### 第 3 步:再下钻到炉号
+
+总额确认后,一定要立刻切到炉号级。
+
+因为物料级报错里,常见会混进:
+
+- 改判
+- 换物料编码
+- 红冲
+- 月末 0 支尾重
+- 同炉号跨工序迁移
+
+这些问题在物料级看起来像“差了很多”,但炉号级一拆就能分出:
+
+- 真错
+- 改判
+- 历史残留
+
+### 第 4 步:同一炉号同时看原表和 CX 表
+
+每个异常炉号至少要看 2 套数据:
+
+1. 原表  
+   `YDM_*`
+
+2. 中间表  
+   `CX_*`
+
+这一步的目的是把问题分型成:
+
+- 原表错,CX 只是抄过去
+- 原表已经对了,但 CX 还是旧值
+- 原表没有,CX 多了
+- 原表有,CX 漏了
+
+### 第 5 步:看是不是“改判/换物料编码”
+
+这一类在这次排查里占比很高。
+
+表现形式通常是:
+
+- 同一个炉号
+- 上月在物料 A
+- 下月或同月出库在物料 B
+
+如果炉号本身是平的,只是物料变了,那通常不应该按“库存错误”处理,而应该按:
+
+**改判说明**
+
+### 第 6 步:看是不是“重复插入”
+
+这次也遇到过非常典型的重复灌数:
+
+- 原表应有 1 条
+- `CX` 里被插了 4 次
+
+这种问题最明显的特征是:
+
+- 原表和业务逻辑都解释不出来这么大的数
+- 同一炉号、同一月份、同一数量重量,`CX` 里出现多条
+
+### 第 7 步:确定该改哪一层
+
+这个很重要。
+
+不是所有问题都该改原表。
+
+判断规则:
+
+- 原表正确,CX 错:改 `CX`
+- 原表月份挂错:改原表,必要时同步 `CX`
+- 属于改判:不改库存,出说明
+- 属于月报算法问题:改过程逻辑或月报结果,不改收发存
+
+### 第 8 步:修完以后一定复核
+
+修完至少做 3 次复核:
+
+1. 行级是否对平
+2. 物料汇总是否对平
+3. 相关校验过程重跑后是否符合预期
+
+
+## 4. 这次遇到的典型错误类型与案例
+
+下面把这两天碰到的典型问题,按类型整理。
+
+---
+
+## 4.1 期初带错
+
+### 典型案例:半成品 202601 -> 202602
+
+涉及炉号:
+
+- `A26010132`
+- `A26010135`
+- `A26010139`
+- `C26010317`
+
+问题表现:
+
+- `2026-01` 期末和 `2026-02` 期初对不上
+- 这 4 个炉号在 `202602` 的 `YDM_BC_INITIAL` 被写成了“上月入库量”
+- 不是“上月期末量”
+
+例如:
+
+`A26010132`
+
+- 1 月实际期末:`1支 / 1.48吨`
+- 2 月期初却写成:`64支 / 97.188吨`
+
+最终处理:
+
+- 修 `202602` 的 `YDM_BC_INITIAL`
+- 再核 `202601 -> 202602 -> 202603 -> 202604`
+
+经验结论:
+
+**如果某月期初恰好等于上月某类入库,而不是上月期末,优先怀疑期初生成逻辑错把“入库承接”当成“结存承接”。**
+
+
+## 4.2 原表已改正,CX 还停留在旧值
+
+### 典型案例:`TQ9618310507410B`
+
+涉及炉号:
+
+- `A26010109`
+- `A26010113`
+- `A26010120`
+- `A26010132`
+- `A26010135`
+- `A26010139`
+- `C26010317`
+
+问题表现:
+
+- 当前原表已经改正
+- 但 `CX_YDM_BC_*` 里还是旧数据
+- 导致 `check_material_balance` 或 `DataValidationResult` 继续报错
+
+处理方式:
+
+- 不回头再改原表
+- 直接把 `CX` 按当前原表同步
+
+经验结论:
+
+**先看“现在的原表”是不是已经对了,再决定要不要动源表。很多时候问题只是结果表没刷新。**
+
+
+## 4.3 重复插入
+
+### 典型案例:`TQ0218312001410B`
+
+涉及炉号:
+
+- `A25070249`
+- `A25070271`
+- `A25080210`
+
+原表应有:
+
+- `A25070249`:`1支 / 1.305吨`
+- `A25070271`:`1支 / 1.646吨`
+- `A25080210`:`2支 / 3.213吨`
+
+`CX_YDM_BC_OUTLIST` 实际却是每条 4 次:
+
+- `A25070249`:`4行 / 4支 / 5.220吨`
+- `A25070271`:`4行 / 4支 / 6.584吨`
+- `A25080210`:`4行 / 8支 / 12.852吨`
+
+处理方式:
+
+- 保留最早 1 条
+- 删除后面 3 条重复数据
+
+经验结论:
+
+**同一炉号、同一月份、同一数量重量重复出现时,不要先怀疑业务,先怀疑 `CX` 持久化被重复执行。**
+
+
+## 4.4 改判/换物料编码
+
+### 典型案例 1:`TQ9618310507410B` 与 `TQ9618312007410B`
+
+表现:
+
+- 同一批炉号
+- `2026-02` 在 `TQ9618312007410B`
+- `2026-03` 期初挂到了 `TQ9618310507410B`
+
+这类问题在物料级会表现为:
+
+- 一个物料突然多
+- 另一个物料突然少
+
+但炉号级看是平的,只是物料变了。
+
+这种情况更适合:
+
+- 出“改判说明”
+- 不按普通库存错账处理
+
+### 典型案例 2:`TD0719312307411B`
+
+涉及炉号:
+
+- `C26010494`
+
+历史 `CX` 快照里:
+
+- `TD0719312307411B` 表面剩 `5支 / 12.618吨`
+- 同炉号又有 `TQ5612412301411B` 出库 `5支 / 12.618吨`
+
+这就是典型“同炉号跨物料改判”。
+
+经验结论:
+
+**只要同一炉号跨物料迁移且炉号级自平,优先归类为改判,不要急着补期初。**
+
+
+## 4.5 尾重
+
+### 典型案例 1:成品 `A22070051`
+
+问题:
+
+- `202601` 期末到 `202602` 期初只差 `0.020吨`
+
+最后处理:
+
+- 在 `YDM_ZC_STOCKTAKINGLIST` 补了一条 `202601` 调差
+- 重量 `-0.02`
+- 后来又把规格调整成正确的 `533.8x24.5`
+
+### 典型案例 2:`TB8818212001411C`
+
+涉及炉号:
+
+- `A25050280`
+
+原始情况:
+
+- 期初:`1支 / 2.258吨`
+- 负入库:`-1支 / -2.095吨`
+- 导致期末形成 `0支 / 0.163吨` 尾重
+
+处理方式:
+
+- 把负入库重量改成和期初一致
+- `-2.095 -> -2.258`
+
+经验结论:
+
+**只差零点几吨、支数为 0 的,优先按尾重处理。**
+
+
+## 4.6 红冲导致跨月不平
+
+### 典型案例:成品 `A25100221`、`A25100033`
+
+表现:
+
+- `202603` 没有期初、没有入库
+- 但出现了 `800806` 负出库红冲
+
+例如:
+
+`A25100221`
+
+- `2026-03` 出现 `800806 = -1支 / -2.265吨`
+- 会把库存冲回成 `1支 / 2.265吨`
+- 但 `202604` 期初没承接
+
+`A25100033`
+
+- `202602` 本来已清零
+- `202603` 又有 `800806 = -1支 / -1.704吨`
+- 又被冲回 `1支 / 1.704吨`
+- `202604` 也没承接
+
+经验结论:
+
+**没有期初、没有入库,不代表不可能有库存。只要有负出库红冲,就可能把历史库存冲回来。**
+
+
+## 4.7 月份挂错
+
+### 典型案例:`TQ4577615272411B / C26030094`
+
+问题:
+
+- 月报里 `2026-03` 该有 `24支 / 23.233吨`
+- `CX_YDM_BC_INLIST` 里只有 `12支 / 11.393吨`
+
+后来追到原表发现:
+
+- 另一半 `12条 / 11.84吨` 被挂在了 `202604`
+- 实际应属于 `202603`
+
+处理方式:
+
+- 把原表 `YDM_BC_INLIST` 那 `12` 条的 `BAL_YEAR_MONTH`
+  - `202604 -> 202603`
+- 再同步 `CX`
+
+处理后:
+
+- 月报 `72.867`
+- 台账 `72.867`
+- 对平
+
+经验结论:
+
+**如果差值能完整在相邻月份找到,优先怀疑 `BAL_YEAR_MONTH` 挂错,而不是重量算错。**
+
+
+## 4.8 月报来料重量算法错误
+
+### 典型案例:加工月报 `TQ9618310507203B`
+
+问题表:
+
+- `HOT_PRODUCTION_MES_JG`
+- 来源过程:`MES_CX_JG_ZXNEW_HAND`
+
+异常表现:
+
+- `mate_weight` 只有 `2~3吨`
+- `prod_weight` 却有 `90~125吨`
+- `steel_waste` 被算成 `3900%`
+
+根因:
+
+- 过程用的是  
+  `mate_weight = sum(qcm.input_weight) + 接箍重量`
+- 但这批 `G` 工序记录里,`QCM_ZG_JUGDE_APPLY.INPUT_WEIGHT` 大量为 0
+- 结果只剩接箍重量
+
+后来按你的业务逻辑核定:
+
+**前一道工序的成品量 = 下一道工序的投料量**
+
+示例:
+
+`A24120546`
+
+`D` 工序合计:
+
+- `ACT_COUNT = 76`
+- `ACT_WEIGHT = 94.992`
+
+`G` 工序当前:
+
+- `ACT_COUNT = 76`
+- `ACT_WEIGHT = 99.307`
+- `INPUT_WEIGHT = 0`
+
+所以应补:
+
+- `G.INPUT_WEIGHT = 94.992`
+
+对应月报重算:
+
+- 原 `MATE_WEIGHT = 2.509`
+- 改后 `MATE_WEIGHT = 94.992 + 2.509 = 97.501`
+- 原 `STEEL_WASTE = 3958.0311`
+- 改后 `STEEL_WASTE = 101.8523`
+
+最后处理:
+
+- 改了 `QCM_ZG_JUGDE_APPLY`
+- 同时改了 `HOT_PRODUCTION_MES_JG`
+- 并做了可回滚备份
+
+经验结论:
+
+**月报“来料重量很离谱”时,不要直接改结果表,先追来源公式。**
+
+
+## 4.9 接口重复接收与提单异常
+
+### 典型案例:`KHFT260325016`
+
+日志顺序:
+
+1. `GetYdmZcBillDate`
+2. `BillRevoke`
+3. `GetYdmZcBillDate`
+
+另外核到:
+
+- 两次 `GetYdmZcBillDate` 的 `SOCKET_PARMER`
+- 除 `planStartTime / planEndTime` 外,其余完全一致
+- 也就是同一张提单被重复推送了一次
+
+同时还发现:
+
+- 提单主表曾出现过两条
+- 明细只有 25 条,不是重复 50 条
+- `BillClose` 传参里的炉号和库里的 `JUDGE_STOVE_NO` 对不上
+- `YDM_ZC_BILL_C.LOADVEHICLE_FLAG` 还有 14 支没同步成已装车
+
+经验结论:
+
+**接口问题一定要同时看:接口日志、主表、明细表、装车表、代码匹配字段。只看一张表很容易误判。**
+
+
+## 5. 如何判断“该补数据”还是“该出说明”
+
+后面再碰到问题,可以直接按下面判断。
+
+### 应该补数据
+
+满足以下任一:
+
+- 原表月份挂错
+- `CX` 重复插入
+- `CX` 漏同步
+- 尾重非常明确,且能精确落到一条记录
+- 红冲/调差值能明确定位到某行
+
+### 不建议直接补数据
+
+满足以下任一:
+
+- 同炉号跨物料改判
+- 月报来源逻辑本身不对
+- 当前原表已经查不到来源,只剩历史快照
+- 只能看出总差,无法落到具体炉号和具体行
+
+### 应该出说明
+
+满足以下任一:
+
+- 炉号级平衡,只是物料编码变了
+- 外部按物料汇总报错,但内部按炉号级不算错
+- 第三方校验口径和系统口径不一致
+
+
+## 6. 一个实战排查模板
+
+后面你自己核某个问题,可以直接照这个顺序:
+
+1. 先写下问题对象  
+   物料、合同、月份、报错内容
+
+2. 先做月度总额对账  
+   `期初 + 入库 - 出库 (+ 调差) = 期末`
+
+3. 再拆到炉号  
+   找出差异是哪些炉号造成的
+
+4. 同时查原表和 `CX`
+
+5. 判断是以下哪类:
+   - 期初带错
+   - 原表已改,`CX` 未同步
+   - 重复插入
+   - 改判
+   - 尾重
+   - 红冲
+   - 月份挂错
+   - 月报算法问题
+   - 接口重复或字段错配
+
+6. 决定处理方式:
+   - 改原表
+   - 改 `CX`
+   - 改月报来源表
+   - 仅出说明
+
+7. 修完后复核:
+   - 行级
+   - 炉号级
+   - 物料级
+   - 校验结果
+
+
+## 7. 可直接复用的 SQL 思路
+
+下面不是最终 SQL,只是核对时最常用的模式。
+
+### 7.1 查某物料某月原表入出
+
+```sql
+select *
+from ydm_bc_inlist t
+where t.bal_year_month = '202603'
+  and t.material_no = '物料编码';
+```
+
+```sql
+select *
+from ydm_bc_outlist t
+where t.bal_year_month = '202603'
+  and t.material_no = '物料编码';
+```
+
+### 7.2 查某炉号 1-4 月全链路
+
+```sql
+select 'INITIAL' src, t.bal_year_month, t.material_no, t.judge_stove_no,
+       t.act_count, t.act_weight
+from ydm_bc_initial t
+where t.judge_stove_no = '炉号'
+union all
+select 'INLIST', t.bal_year_month, t.material_no, t.judge_stove_no,
+       t.act_count, t.act_weight
+from ydm_bc_inlist t
+where t.judge_stove_no = '炉号'
+union all
+select 'OUTLIST', t.bal_year_month, t.material_no, t.judge_stove_no,
+       t.act_count, t.act_weight
+from ydm_bc_outlist t
+where t.judge_stove_no = '炉号';
+```
+
+### 7.3 查原表和 CX 是否一致
+
+做法不是只比汇总,而是至少比:
+
+- 月份
+- 物料
+- 炉号
+- 合同
+- 支数
+- 重量
+
+如果汇总一样但明细不一样,后面还是会炸。
+
+
+## 8. 这次已经被验证过的经验
+
+最后把这两天最有用的结论压成几句话,后面很好用。
+
+1. 先看炉号,再看物料。  
+   很多“物料不连续”,其实是炉号改判。
+
+2. 先看原表,再看 `CX`。  
+   很多问题只是结果表旧了,不是源头错了。
+
+3. 尾差优先看调差和红冲。  
+   尤其是 `0支 非0吨`,十有八九不是正常库存。
+
+4. 月报不要直接拿结果说话。  
+   先搞清楚是从哪张判定表、按什么公式写出来的。
+
+5. 接口问题一定要串日志、代码、数据库。  
+   只看其中一块,很容易得出错结论。
+
+
+## 9. 当前还值得继续追的点
+
+截至当前,这几类仍然属于“后续可以继续排查”的方向:
+
+- 当前库里完全没有、但外部说有的数据  
+  例如某些销售结算接口物料
+
+- 月报有值、原表当前查不到来源的数据  
+  例如曾遇到的 `TQ5612510601412B`
+
+- 改判链跨了多个月、当前只剩历史快照的数据
+
+这类问题的共同点是:
+
+**不能只靠当前原表,还要追历史快照、过程、接口源表。**
+
+
+## 10. 一句话版总结
+
+这两天所有问题,归根到底都是下面几类:
+
+- 承接错
+- 月份挂错
+- `CX` 没同步
+- `CX` 重复插入
+- 红冲/尾重
+- 改判
+- 月报公式取错来源
+- 接口重复推送或匹配字段不一致
+
+只要后面排查时固定坚持:
+
+**先总额、再炉号、再原表/CX 对照、最后再决定改数据还是出说明**
+
+大多数问题都能很快定位清楚。

+ 1020 - 0
MES_FIN_MONTH/月结逻辑交接说明.md

@@ -0,0 +1,1020 @@
+# 月结逻辑交接说明
+
+## 1. 文档目的
+本文用于交接 MES 月结执行逻辑,重点说明以下内容:
+
+- 月结前需要先处理什么前置条件
+- 月结时哪些结果表需要先观察、再删除、再重建
+- 各阶段存储过程分别负责什么
+- 每个存储过程主要查询哪些原表
+- 每个存储过程有哪些核心过滤条件
+- 每个存储过程最终写入到哪张结果表
+- 月报与收发存对比时需要注意哪些业务口径
+- 月结完成后如何校验,以及异常时怎么排查
+
+本文以 `2026-03` 月结为例说明。后续换月份时,只需要把“当前月 / 次月”替换为对应月份即可。
+
+## 2. 核心原则
+
+1. 月结重建的是结果表,不是来源表。来源表、判定表是输入,`CX_*` 和 `HOT_*` 是结果。
+2. 月结必须先清旧结果,再跑过程;不要在已有结果上重复叠加。
+3. 正式月结前,必须先确认相关定时 job 已停掉、禁用或删除,否则删表后结果会被后台任务重新写回。
+4. 正式月结前,必须检查存储过程中是否残留“临时补数据用的炉号条件”;如果有,正式月结时应注释掉或忽略。
+5. 存储过程内部本身带事务和 `commit`,正常执行时直接调用即可。
+6. 月结后统一执行校验过程,再看 `DataValidationResult`,不要用历史校验快照判断当前数据。
+
+## 3. 数据分层
+
+### 3.1 来源层
+这层是过程直接取数的原始或判定数据,主要包括:
+
+- 半成品来源表:`YDM_BC_INITIAL`、`YDM_BC_INLIST`、`YDM_BC_OUTLIST`
+- 成品来源表:`YDM_ZC_INITIAL`、`YDM_ZC_INLIST`、`YDM_ZC_OUTLIST`、`YDM_ZC_STOCKTAKINGLIST`
+- 判定表:`QCM_ZG_JUGDE_APPLY`
+- 工艺和在产品相关表:例如加工、热处理、热轧、装车、取样、计划等表
+- 物料映射表:`MVM_ORDER_MATNO_INFO`
+- 订单映射视图:`ORDERDETAIL_V@TH_CX_LINK`
+
+来源层的典型特点:
+
+- 月份字段大多使用 `YYYYMM`,例如 `202603`
+- 原表中的物料编码不一定是最终进入 `CX` 结果表的物料编码
+- 很多过程是先按炉号反查合同,再按合同去映射表找最终物料编码
+
+### 3.2 收发存结果层
+这层是月结重建出来的收发存台账结果表:
+
+- 半成品:
+  - `CX_YDM_BC_INITIAL`
+  - `CX_YDM_BC_INLIST`
+  - `CX_YDM_BC_OUTLIST`
+- 成品:
+  - `CX_YDM_ZC_INITIAL`
+  - `CX_YDM_ZC_INLIST`
+  - `CX_YDM_ZC_OUTLIST`
+
+这层的典型特点:
+
+- 月份字段通常是 `YYYY-MM`,例如 `2026-03`
+- 是后续校验、对账、接口取数的主要结果层
+- 如果同月重复执行过程而没有先删旧结果,最容易出现重复数据
+
+### 3.3 月报结果层
+这层是生产月报和在产品相关结果表:
+
+- `HOT_PRODUCTION_MES_JG`
+- `HOT_HEAT_PRODUCTION_MES_GX`
+- `HOT_PRODUCTION_MES_RZ`
+
+这层典型特点:
+
+- 结果是通过判定表、工艺过程表、库存表等重新汇总生成
+- 月份字段通常是 `YYYY-MM`
+- 生产月报不等于收发存原表简单求和,必须按过程定义的逻辑理解
+
+### 3.4 校验结果层
+
+- `DataValidationResult`
+
+这张表只保存校验结果,不是业务来源。  
+每次重跑 `usp_ValidateProductionData` 后,都要以最新一轮结果为准。
+
+## 4. 月份口径
+
+### 4.1 月份格式
+系统中常见两种月份格式:
+
+- 来源表、判定表常用:`YYYYMM`
+  - 例如 `202603`
+- 结果表、月报表、校验过程常用:`YYYY-MM`
+  - 例如 `2026-03`
+
+### 4.2 2026-03 月结时的口径
+如果本次跑的是 `2026-03` 月结,则:
+
+- 当前月来源口径:`202603`
+- 当前月结果口径:`2026-03`
+- 次月来源口径:`202604`
+- 次月结果口径:`2026-04`
+
+### 4.3 在产品过程的特殊性
+在产品类过程不是只看单月,而是通常同时涉及:
+
+- 当前月
+- 次月
+
+所以对于 `2026-03` 月结:
+
+- 当前月用 `202603 / 2026-03`
+- 次月用 `202604 / 2026-04`
+
+不要把在产品过程里的次月逻辑简单删掉,也不要把所有硬编码月份都机械改成同一个值。
+
+## 5. 正式月结前的前置检查
+
+### 5.1 先处理定时 job
+正式删表和跑过程之前,必须先确认相关定时 job 已经停掉、禁用或删除。
+
+原因:
+
+- 月结删除的是结果表,不是来源表
+- 如果 job 仍在运行,删表后它可能会立刻重新写入结果表
+- 这样会导致手工月结和后台任务并发写数,出现重复、错月或半重建状态
+
+建议执行顺序:
+
+1. 停掉、禁用或按现场要求删除相关 job
+2. 确认结果表不会再被后台自动写入
+3. 再执行删表
+4. 删表后手工按阶段跑月结过程
+
+### 5.2 检查是否有临时炉号条件
+正式月结前,要重点检查存储过程中是否残留以下类型的临时条件:
+
+- `judge_stove_no = ...`
+- `judge_stove_no in (...)`
+- 其他只针对少量炉号的临时补数过滤条件
+
+这类条件通常是在补数据时临时加的,正式月结时应注释掉或忽略。  
+本次 2026-03 已经处理过一处明确问题:
+
+- `mes_cx_ydm_zc_inlist_new_hand`
+  - 已将过程中的月份改为 `202603`
+  - 已将临时炉号过滤注释掉
+
+### 5.3 检查硬编码月份
+月结前必须逐个确认相关过程中的硬编码月份是否已经切换到当前月。  
+对于 2026-03,来源表条件通常应为 `202603`,结果表或月报过程通常应为 `2026-03`。
+
+## 6. 建议的执行顺序
+
+1. 停 job
+2. 检查过程里的月份和临时过滤条件
+3. 观察旧结果表数据
+4. 删除旧结果表数据
+5. 执行阶段 1:半成品台账
+6. 执行阶段 2:成品台账
+7. 执行阶段 3:生产月报
+8. 执行阶段 4:在产品及结构性结果
+9. 执行统一校验
+10. 查看校验结果
+11. 如有异常,再按“来源表 -> `CX_*` -> `HOT_*` -> 校验结果”的顺序排查
+
+## 7. 结果表观察与删除
+
+### 7.1 生产月报结果
+```sql
+-- 加工生产月报
+select sum(t.prod_weight), sum(t.lc_weight)
+  from hot_production_mes_jg t
+ where t.acct_period = '2026-03'
+   and t.prod_type in ('在产品');
+
+delete hot_production_mes_jg t
+ where t.acct_period = '2026-03';
+
+-- 热处理生产月报
+select count(1)
+  from HOT_HEAT_PRODUCTION_MES_GX t
+ where t.acct_period = '2026-03'
+   and t.prod_type in ('在产品');
+
+delete HOT_HEAT_PRODUCTION_MES_GX t
+ where t.acct_period = '2026-03';
+
+-- 热轧生产月报
+select *
+  from HOT_PRODUCTION_MES_RZ t
+ where t.acct_period = '2026-03'
+   and t.prod_type in ('在产品');
+
+delete HOT_PRODUCTION_MES_RZ t
+ where t.acct_period = '2026-03'
+   and t.prod_type in ('在产品');
+```
+
+### 7.2 半成品收发存结果
+```sql
+-- 半成品期初
+select count(1)
+  from CX_YDM_BC_INITIAL t
+ where t.bal_year_month = '2026-03';
+
+delete CX_YDM_BC_INITIAL t
+ where t.bal_year_month = '2026-03';
+
+-- 半成品入库
+select count(1), sum(t.act_in_weight), sum(t.act_in_count)
+  from CX_YDM_BC_INLIST t
+ where t.bal_year_month = '2026-03';
+
+delete CX_YDM_BC_INLIST t
+ where t.bal_year_month = '2026-03';
+
+-- 半成品出库
+select count(1), sum(t.act_out_weight), sum(t.act_out_count)
+  from CX_YDM_BC_OUTLIST t
+ where t.bal_year_month = '2026-03';
+
+delete CX_YDM_BC_OUTLIST t
+ where t.bal_year_month = '2026-03';
+```
+
+### 7.3 成品收发存结果
+```sql
+-- 成品期初
+select count(1)
+  from CX_YDM_ZC_INITIAL t
+ where t.bal_year_month = '2026-03';
+
+delete CX_YDM_ZC_INITIAL t
+ where t.bal_year_month = '2026-03';
+
+-- 成品入库
+select count(1), sum(t.act_in_weight), sum(t.act_in_count)
+  from CX_YDM_ZC_INLIST t
+ where t.bal_year_month = '2026-03';
+
+delete CX_YDM_ZC_INLIST t
+ where t.bal_year_month = '2026-03';
+
+-- 成品出库
+select count(1), sum(t.act_out_weight), sum(t.act_out_count), sum(t.differential)
+  from CX_YDM_ZC_OUTLIST t
+ where t.bal_year_month = '2026-03';
+
+delete CX_YDM_ZC_OUTLIST t
+ where t.bal_year_month = '2026-03';
+```
+
+## 8. 阶段 1:半成品收发存
+
+### 8.1 `MES_CX_YDM_BC_INITIAL_hand`
+作用:
+
+- 持久化半成品期初结果到 `CX_YDM_BC_INITIAL`
+
+主要来源表:
+
+- `YDM_BC_INITIAL`
+- `MVM_ORDER_MATNO_INFO`
+
+主要查询逻辑:
+
+- 先从 `YDM_BC_INITIAL` 取当前月半成品期初
+- 通过合同号或 `get_cp_order(judge_stove_no)` 反查合同
+- 再去 `MVM_ORDER_MATNO_INFO` 映射最终物料编码和物料名称
+
+核心条件:
+
+- `t1.bal_year_month in ('202603')`
+- `t1.belong_code = '002023005'`
+- 合同不在一批排除名单内
+- 合同不以 `ZZBY%` 开头
+
+写入目标:
+
+- `insert into CX_YDM_BC_INITIAL`
+
+结果特点:
+
+- 月份会转换成 `2026-03` 这种格式
+- `bc_type` 写成半成品期初类型
+- 结果层已经是最终用于对账和校验的半成品期初
+
+### 8.2 `mes_cx_ydm_bc_inlist_csjg_hand`
+作用:
+
+- 处理车丝加工相关的半成品入库结果,写入 `CX_YDM_BC_INLIST`
+
+主要来源表:
+
+- `YDM_ZC_INLIST`
+- `ORDERDETAIL_V@TH_CX_LINK`
+
+主要查询逻辑:
+
+- 以车丝加工相关来源表记录为基础
+- 结合订单视图做物料和订单关联
+- 汇总后写入半成品入库结果表
+
+核心条件:
+
+- `instock_type_code in ('800701', '800702', '800706')`
+- `bal_year_month = '202603'`
+- `belong_code in ('100101', '100102', '100105')`
+- `supply_unit_code = '120504'`
+- 合同不以 `ZZBY%` 开头
+- `PLINE_CODE = 'C108'`
+
+写入目标:
+
+- `insert into CX_YDM_BC_INLIST`
+
+说明:
+
+- 名称中的 `CSJG` 应理解为车丝加工相关过程
+
+### 8.3 `mes_cx_ydm_bc_inlist_new_hand`
+作用:
+
+- 持久化半成品入库结果到 `CX_YDM_BC_INLIST`
+
+主要来源表:
+
+- `YDM_BC_INLIST`
+- `MVM_ORDER_MATNO_INFO`
+
+主要查询逻辑:
+
+- 从 `YDM_BC_INLIST` 取当前月半成品入库数据
+- 按炉号反查合同
+- 再用合同去 `MVM_ORDER_MATNO_INFO` 映射物料编码
+
+核心条件:
+
+- `t1.bal_year_month in ('202603')`
+- `t1.belong_code = '002023005'`
+- `instock_type_code in ('800704', '800706', '800709')`
+- 合同不以 `ZZBY%` 开头
+
+写入目标:
+
+- `insert into CX_YDM_BC_INLIST`
+
+月结注意:
+
+- 正式月结前,如果过程里有临时炉号过滤,应注释掉
+- 名称中的 `_NEW_HAND` 不作为业务口径判断依据,实际以 SQL 取数条件为准
+
+### 8.4 `mes_cx_ydm_bc_outlist_csjg`
+作用:
+
+- 处理车丝加工相关的半成品出库结果,写入 `CX_YDM_BC_OUTLIST`
+
+主要来源表:
+
+- `YDM_ZC_INLIST`
+- `ORDERDETAIL_V@TH_CX_LINK`
+
+主要查询逻辑:
+
+- 以车丝加工相关记录为来源
+- 结合订单视图获取最终物料归属
+- 汇总生成半成品出库结果
+
+核心条件:
+
+- `instock_type_code in ('800701', '800702', '800706')`
+- `bal_year_month in ('202603')`
+- `belong_code in ('100101', '100102', '100105')`
+- `supply_unit_code = '120504'`
+- 合同不以 `ZZBY%` 开头
+- `PLINE_CODE = 'C108'`
+
+写入目标:
+
+- `insert into CX_YDM_BC_OUTLIST`
+
+### 8.5 `mes_cx_ydm_bc_outlist_new_hand`
+作用:
+
+- 持久化半成品出库结果到 `CX_YDM_BC_OUTLIST`
+
+主要来源表:
+
+- `YDM_BC_OUTLIST`
+- `MVM_ORDER_MATNO_INFO`
+
+主要查询逻辑:
+
+- 从 `YDM_BC_OUTLIST` 取当前月出库数据
+- 按炉号反查合同
+- 用合同映射最终物料编码
+
+核心条件:
+
+- `t1.bal_year_month in ('202603')`
+- `t1.belong_code = '002023005'`
+- `outstock_type_code in ('800809', '800808', '800806')`
+- 合同不以 `ZZBY%` 开头
+
+写入目标:
+
+- `insert into CX_YDM_BC_OUTLIST`
+
+## 9. 阶段 2:成品收发存
+
+### 9.1 `mes_cx_ydm_zc_initialnew_hand`
+作用:
+
+- 持久化成品期初到 `CX_YDM_ZC_INITIAL`
+
+主要来源表:
+
+- `YDM_ZC_INITIAL`
+- `MVM_ORDER_MATNO_INFO`
+
+主要查询逻辑:
+
+- 从成品期初原表取当前月数据
+- 按合同号映射最终物料编码
+- 形成成品期初结果
+
+核心条件:
+
+- `t1.handle_log = '1'`
+- `t1.bal_year_month in ('202603')`
+- `belong_code in ('100101', '100102', '100105')`
+- `supply_unit_code = '120504'`
+- 合同不以 `ZZBY%` 开头
+
+写入目标:
+
+- `insert into CX_YDM_ZC_INITIAL`
+
+### 9.2 `mes_cx_ydm_zc_inlist_new_hand`
+作用:
+
+- 持久化成品入库到 `CX_YDM_ZC_INLIST`
+
+主要来源表:
+
+- `YDM_ZC_INLIST`
+- `MVM_ORDER_MATNO_INFO`
+
+主要查询逻辑:
+
+- 从成品入库原表取当前月入库
+- 按 `pro_order_no` 或 `get_cp_order(judge_stove_no)` 反查合同
+- 用 `MVM_ORDER_MATNO_INFO` 映射最终成品物料编码
+- 再写入 `CX_YDM_ZC_INLIST`
+
+核心条件:
+
+- `instock_type_code in ('800701', '800702', '800706', '800704')`
+- `belong_code in ('100101', '100102', '100105')`
+- `supply_unit_code = '120504'`
+- 合同不以 `ZZBY%` 开头
+- 当前 2026-03 月结时,过程内月份应为 `202603`
+
+写入目标:
+
+- `insert into CX_YDM_ZC_INLIST`
+
+月结注意:
+
+- 这是本次已经明确修正过的过程之一
+- 正式月结前必须再次确认过程内月份仍是 `202603`
+- 正式月结时不允许保留临时炉号过滤条件
+
+### 9.3 `mes_cx_ydm_zc_outlist_new_hand`
+作用:
+
+- 持久化成品出库到 `CX_YDM_ZC_OUTLIST`
+
+主要来源表:
+
+- `YDM_ZC_STOCKTAKINGLIST`
+- `YDM_ZC_OUTLIST`
+- `YDM_ZC_INITIAL`
+- `YDM_ZC_INLIST`
+- `MVM_ORDER_MATNO_INFO`
+
+主要查询逻辑:
+
+- 组合成品出库、调差、期初、入库等来源
+- 统一映射物料编码
+- 汇总后写入成品出库结果表
+
+核心条件:
+
+- 当前月口径为 `202603`
+- 具体业务类型由过程内部 SQL 控制
+
+写入目标:
+
+- `insert into CX_YDM_ZC_OUTLIST`
+
+## 10. 阶段 3:生产月报
+
+### 10.1 `mes_cx_jg_zxnew_hand`
+作用:
+
+- 生成加工生产月报,写入 `HOT_PRODUCTION_MES_JG`
+
+主要来源表:
+
+- `QCM_ZG_JUGDE_APPLY`
+- `MCH_TWISTINGLY_RESULT_D`
+- `YDM_ZC_STOCKTAKINGLIST`
+- `ORDERDETAIL_V@TH_CX_LINK`
+- `SLM_ORDER_HEAD`
+
+主要查询逻辑:
+
+- 以判定表和加工工艺结果为主
+- 结合订单和调差信息汇总加工月报
+
+写入目标:
+
+- `insert into HOT_PRODUCTION_MES_JG`
+
+### 10.2 `mes_cx_rcl_zxnew_hand`
+作用:
+
+- 生成热处理生产月报,写入 `HOT_HEAT_PRODUCTION_MES_GX`
+
+主要来源表:
+
+- `QCM_ZG_JUGDE_APPLY`
+- `YDM_ZC_STOCKTAKINGLIST`
+- `ORDERDETAIL_V@TH_CX_LINK`
+- `SLM_ORDER_HEAD`
+
+写入目标:
+
+- `insert into HOT_HEAT_PRODUCTION_MES_GX`
+
+### 10.3 `mes_cx_rz_zxnew_hand`
+作用:
+
+- 生成热轧生产月报,写入 `HOT_PRODUCTION_MES_RZ`
+
+主要来源表:
+
+- `QCM_ZG_JUGDE_APPLY`
+- `YDM_GP_OUTLIST`
+- `YDM_ZC_STOCKTAKINGLIST`
+- `ORDERDETAIL_V@TH_CX_LINK`
+- `SLM_ORDER_HEAD`
+
+写入目标:
+
+- `insert into HOT_PRODUCTION_MES_RZ`
+
+## 11. 阶段 4:在产品及结构性结果
+
+### 11.1 `mes_cx_JG_zzpnew_hand`
+作用:
+
+- 生成加工在产品及相关结构性结果,写入 `HOT_PRODUCTION_MES_JG`
+
+主要来源表:
+
+- `YDM_HTT_INITIAL`
+- `MCH_LOADING_RESULT`
+- `PLN_ZY_JGX_M`
+- `QCM_ZG_JUGDE_APPLY`
+- `QCM_BC_PASS_APPLY`
+- `PORT_MCH_BATCH_SAMPLE_RESULT`
+- `MCH_TWISTINGLY_RESULT`
+- `YDM_ZC_INLIST`
+- `ORDERDETAIL_V@TH_CX_LINK`
+- `SLM_ORDER_HEAD`
+- 以及部分热轧成品来源表
+
+月结特点:
+
+- 这类过程通常同时涉及当前月和次月
+- 不能把次月逻辑删掉
+
+写入目标:
+
+- `insert into HOT_PRODUCTION_MES_JG`
+
+### 11.2 `mes_cx_rcl_zzpnew_hand`
+作用:
+
+- 生成热处理在产品及相关结构性结果,写入 `HOT_HEAT_PRODUCTION_MES_GX`
+
+主要来源表:
+
+- `PLN_ZY_RCL_M`
+- `PORT_HTT_BATCH_SAMPLE_RESULT`
+- `QCM_ZG_JUGDE_APPLY`
+- `ORDERDETAIL_V@TH_CX_LINK`
+- `SLM_ORDER_HEAD`
+
+写入目标:
+
+- `insert into HOT_HEAT_PRODUCTION_MES_GX`
+
+### 11.3 `mes_cx_rz_zzpnew_hand`
+作用:
+
+- 生成热轧在产品及相关结构性结果,写入 `HOT_PRODUCTION_MES_RZ`
+
+主要来源表:
+
+- `YDM_ZC_INITIAL_ZG`
+- `PORT_MIL_BATCH_SAMPLE_RESULT`
+- `QCM_ZG_JUGDE_APPLY`
+- `MIL_PLAN`
+- `MIL_SLAB_SCRAP`
+- `MIL_FURNACES_RESLUT_DETIA`
+- `MIL_OFFLINE_GROUP`
+- `ORDERDETAIL_V@TH_CX_LINK`
+- `SLM_ORDER_HEAD`
+- `PLN_ZY_ZG_M`
+
+写入目标:
+
+- `insert into HOT_PRODUCTION_MES_RZ`
+
+### 11.4 `mes_cx_jg_CSJG_HAND`
+作用:
+
+- 生成车丝加工相关结果,写入 `HOT_PRODUCTION_MES_JG`
+
+主要来源表:
+
+- `QCM_ZG_JUGDE_APPLY`
+- `MCH_TWISTINGLY_RESULT_D`
+- `ORDERDETAIL_V@TH_CX_LINK`
+- `SLM_ORDER_HEAD`
+
+说明:
+
+- 名称中的 `CSJG` 表示车丝加工相关过程
+
+写入目标:
+
+- `insert into HOT_PRODUCTION_MES_JG`
+
+## 12. 月报与收发存对比口径
+
+### 12.1 半成品与月报对比
+半成品与月报对比时,不能直接把半成品入库原表或 `CX_YDM_BC_INLIST` 全量拿去和月报对比。
+
+原因:
+
+- 月报反映的是当月生产形成的产出
+- 半成品入库结果里可能混有非当月生产形成的业务类型
+
+本次交接确认的规则:
+
+- `改判入库` 不参与与月报直接对比
+- `红冲入库` 不参与与月报直接对比
+
+因此半成品与月报核对时,必须先按入库类型拆开,再决定哪些类型参与比较。
+实操上建议先按结果表中的入库类型字段分组,再决定哪些分组参与月报比较。
+
+### 12.2 成品与月报对比
+成品与月报对比也遵循同样思路。
+
+本次交接确认的规则:
+
+- `改判入库` 不参与与月报直接对比
+- `红冲入库` 不参与与月报直接对比
+
+因此成品月报与成品入库结果核对时,也必须先看入库类型,而不是直接拿结果表全量求和。
+实操上建议先按结果表中的入库类型字段分组,再决定哪些分组参与月报比较。
+
+## 13. 建议执行脚本顺序
+```sql
+-- 阶段1 半成品
+begin MES_CX_YDM_BC_INITIAL_hand; end;
+/
+begin mes_cx_ydm_bc_inlist_csjg_hand; end;
+/
+begin mes_cx_ydm_bc_inlist_new_hand; end;
+/
+begin mes_cx_ydm_bc_outlist_csjg; end;
+/
+begin mes_cx_ydm_bc_outlist_new_hand; end;
+/
+
+-- 阶段2 成品
+begin mes_cx_ydm_zc_initialnew_hand; end;
+/
+begin mes_cx_ydm_zc_inlist_new_hand; end;
+/
+begin mes_cx_ydm_zc_outlist_new_hand; end;
+/
+
+-- 阶段3 生产月报
+begin mes_cx_jg_zxnew_hand; end;
+/
+begin mes_cx_rcl_zxnew_hand; end;
+/
+begin mes_cx_rz_zxnew_hand; end;
+/
+
+-- 阶段4 在产品及结构
+begin mes_cx_JG_zzpnew_hand; end;
+/
+begin mes_cx_rcl_zzpnew_hand; end;
+/
+begin mes_cx_rz_zzpnew_hand; end;
+/
+begin mes_cx_jg_CSJG_HAND; end;
+/
+```
+
+## 14. 统一校验
+
+### 14.1 执行校验
+```sql
+begin
+  usp_ValidateProductionData('2026-03');
+end;
+/
+```
+
+### 14.2 查看校验结果
+```sql
+select problem, yearmonth, material_no, create_time, problem_type
+  from DataValidationResult t
+ where t.yearmonth = '2026-03';
+```
+
+### 14.3 校验入口逻辑
+统一校验入口是:
+
+- `usp_ValidateProductionData(p_YearMonth)`
+
+入口逻辑分三步:
+
+1. 先删除 `DataValidationResult` 中当前月份已有的历史校验结果
+2. 依次执行各个校验函数
+3. 把各类问题数量和总问题数重新写回 `DataValidationResult`
+
+当前入口中实际启用的校验函数有 5 个:
+
+- `validate_inventory_vs_mes`
+- `validate_opening_balance`
+- `validate_production_report`
+- `validate_goods_ledger`
+- `validate_material_existence`
+
+代码里还预留了 2 个校验函数,但当前默认未启用:
+
+- `validate_process_chain`
+- `validate_group_uniqueness`
+
+因此,如果后面有人说“为什么过程已经存在,但结果里没有这类校验”,首先要确认入口过程里是否真的把该函数打开了。
+
+### 14.4 `validate_inventory_vs_mes`
+作用:
+
+- 校验生产月报与成品收发存入库是否一致
+
+主要取数表:
+
+- `cx_ydm_zc_inlist`
+- `hot_production_mes_rz`
+- `hot_heat_production_mes_gx`
+- `hot_production_mes_jg`
+
+取数逻辑:
+
+- 先从 `cx_ydm_zc_inlist` 按 `material_no + process_name` 汇总当月成品入库重量
+- 只统计 `act_in_weight > 0` 且 `act_in_count > 0` 的记录
+- 再根据 `process_name` 分别去不同月报表取值:
+  - `热轧` -> `hot_production_mes_rz`
+  - `热处理` -> `hot_heat_production_mes_gx`
+  - `加工 / 车丝` -> `hot_production_mes_jg`
+
+当前比较口径:
+
+- 月报使用 `sum(prod_weight - nvl(lc_weight, 0))`
+- 成品台账使用 `sum(act_in_weight)`
+
+写入结果:
+
+- 如果两边不等,则写入 `DataValidationResult`
+- `problem_type = '生产月报与成品台账差异'`
+
+月结理解要点:
+
+- 这条校验是“月报 vs 成品入库”
+- 它不是比成品期初或出库
+- 对外解释差异时,必须先明确是否沿用这个净值口径
+
+### 14.5 `validate_opening_balance`
+作用:
+
+- 校验台账跨月连续性
+- 同时检查成品和半成品
+
+主要取数表:
+
+- 成品:
+  - `cx_ydm_zc_initial`
+  - `cx_ydm_zc_inlist`
+  - `cx_ydm_zc_outlist`
+- 半成品:
+  - `cx_ydm_bc_initial`
+  - `cx_ydm_bc_inlist`
+  - `cx_ydm_bc_outlist`
+
+核心公式:
+
+- 本月期初 = 上月期初 + 上月入库 - 上月出库
+
+成品重量口径:
+
+- `上月出库重量 = act_out_weight - nvl(differential, 0)`
+
+半成品重量口径:
+
+- `上月出库重量 = act_out_weight`
+
+还会额外检查:
+
+- 上月有业务,但本月没有期初的物料缺失问题
+
+写入结果:
+
+- 成品和半成品的跨月不连续都会写入 `DataValidationResult`
+- `problem_type = '台账期初差异'`
+
+月结理解要点:
+
+- 这是最核心的跨月连续性校验
+- 只要月结重建后发现“2 月末不等于 3 月初”这类问题,优先看这一类结果
+- 但要注意,这里是按物料汇总口径校验,不等于子炉号明细一定不平
+
+### 14.6 `validate_production_report`
+作用:
+
+- 校验生产月报本身字段是否规范
+
+主要取数表:
+
+- `hot_production_mes_rz`
+- `hot_heat_production_mes_gx`
+- `hot_production_mes_jg`
+
+检查内容:
+
+1. 钢坯编码规则
+   - 首字母是否为指定类型
+   - 不同类型长度是否符合规则
+2. 关键字段是否为空
+   - 例如 `RESOURCE_TYPE`
+   - `MATE_CODE`
+3. 物料名称拆分后是否和月报字段一致
+   - `MATE_NAME` 拆分结果
+   - 对比 `PROD_VARIETY`
+   - 对比 `STEEL_LEVEL`
+   - 对比 `STEEL_NO`
+
+写入结果:
+
+- `problem_type` 会落到钢坯编码规则、非空字段校验、物料名称校验等类别
+
+月结理解要点:
+
+- 这条校验不比较台账
+- 它是月报自身格式和字段一致性的校验
+
+### 14.7 `validate_goods_ledger`
+作用:
+
+- 校验收发存结果表自身字段是否规范
+
+主要取数表:
+
+- 成品:
+  - `cx_ydm_zc_initial`
+  - `cx_ydm_zc_inlist`
+  - `cx_ydm_zc_outlist`
+- 半成品:
+  - `cx_ydm_bc_initial`
+  - `cx_ydm_bc_inlist`
+  - `cx_ydm_bc_outlist`
+
+检查内容:
+
+1. 非空字段检查
+   - `IS_LLJG`
+   - `MATERIAL_NO`
+2. 物料名称拆分校验
+   - `MATERIAL_NAME` 拆分后
+   - 对比 `PRODUCNAME`
+   - 对比 `STEELNAME`
+   - 对比 `GRADENAME`
+
+写入结果:
+
+- `problem_type` 主要是非空字段校验、物料名称校验
+
+月结理解要点:
+
+- 这条校验的是结果表质量
+- 如果字段是空、物料名称拆分不一致,说明生成结果本身不规范
+
+### 14.8 `validate_material_existence`
+作用:
+
+- 校验月报里的物料编码是否存在于当月收发存结果中
+
+主要取数表:
+
+- 收发存结果表:
+  - `cx_ydm_zc_initial`
+  - `cx_ydm_zc_inlist`
+  - `cx_ydm_zc_outlist`
+  - `cx_ydm_bc_initial`
+  - `cx_ydm_bc_inlist`
+  - `cx_ydm_bc_outlist`
+- 月报结果表:
+  - `hot_production_mes_rz`
+  - `hot_heat_production_mes_gx`
+  - `hot_production_mes_jg`
+
+取数逻辑:
+
+- 先收集当月所有收发存结果表里出现过的 `material_no`
+- 再逐个检查月报表中的 `mate_code` 是否包含在这个集合中
+- 只检查 `mate_weight <> 0` 且 `prod_type <> '在产品'` 的月报记录
+
+写入结果:
+
+- `problem_type = '物料编码存在性'`
+
+月结理解要点:
+
+- 这条适合发现“月报有,但收发存没有”的物料
+- 遇到这类问题时,优先追映射、来源表月份、以及收发存过程是否漏跑
+
+### 14.9 当前默认未启用的两类校验
+代码中还存在但默认未在入口中启用的校验:
+
+- `validate_process_chain`
+- `validate_group_uniqueness`
+
+交接时要注意:
+
+- 这两类函数如果没有在 `usp_ValidateProductionData` 里打开,就不会产生结果
+- 所以后续若有人要增加校验范围,需要同时修改入口过程,而不是只创建函数
+
+## 15. 异常排查顺序
+
+### 15.1 先看是否重复重跑
+先确认是否存在以下情况:
+
+- 没先删结果表就重跑过程
+- job 在后台又自动重写了一轮
+- 同月跑了多轮,结果叠加
+
+### 15.2 再看过程月份
+重点确认:
+
+- 是否有过程仍停留在旧月份
+- 在产品过程是否误删了次月逻辑
+
+### 15.3 再看是否残留临时过滤
+重点检查:
+
+- 是否有临时炉号条件没有注释
+- 是否把全量月结误缩成了补数月结
+
+### 15.4 再看来源表
+来源表排查时要注意:
+
+- 原表月份是否挂错
+- 是否存在跨月残留
+- 是否存在改判、红冲等不应直接参与月报对比的记录
+
+### 15.5 再看映射逻辑
+很多结果不是直接拿原表 `material_no`,而是:
+
+- 炉号
+- 反查合同
+- 合同映射物料编码
+
+所以遇到物料对不上时,不要只按原表物料编码查,必须把炉号、合同、映射链一起看。
+
+### 15.6 最后看校验口径
+很多问题不是数据真错,而是对比口径不一致。  
+特别是月报与收发存对比时,要先确认比较范围和业务类型。
+
+## 16. 交接时必须提醒的事项
+
+- 月结前先停 job
+- 月结前先确认过程月份
+- 月结前先确认没有临时炉号条件
+- 删的是结果表,不是来源表
+- `*_CSJG_*` 过程应理解为车丝加工相关过程
+- `_NEW_HAND` 不要单凭名字判断业务口径,必须以 SQL 取数条件为准
+- 半成品与成品和月报对比时,改判、红冲不直接参与对比
+- 在产品过程自带跨月逻辑,不能机械把所有月份都改成当前月
+
+## 17. 建议交接时一并保留的文件
+
+- 本文档
+- 当月过程调整脚本
+- 当月执行脚本
+- 校验 SQL
+- 结果查询 SQL
+
+这样后续接手人只需要确认:
+
+1. 本次跑的是哪一个月份
+2. 当前月和次月分别是多少
+3. 是否还有临时过滤条件未清理
+
+即可继续完成月结。

+ 22 - 1
README.md

@@ -4,6 +4,7 @@
 
 | 版本号  | 变更日期       | 变更内容                   | 变更人 |
 | ---- | ---------- | ---------------------- | --- |
+| v1.8 | 2026-03-29 | 挂载牛马关于3月份的月结的总结  | 张果  |
 | v1.7 | 2026-03-17 | 首次月结的内容里,完成第一个存储过程的解读  | 张果  |
 | v1.6 | 2026-03-12 | 增加第三课的视频解读             | 薛渗  |
 | v1.5 | 2026-03-11 | 增加第二课的视频解读             | 张果  |
@@ -31,10 +32,30 @@
 
 ## 财务月结
 
-MES生产部月结
+[MES生产部月结]
 
 [MES财务月结](./MES_FIN_MONTH/FinMES.md)
 
+## 月结尚未总结问题
+
+[月报中成材率1075.381%的情况](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/50)
+
+[C26020471等炉号有问题,期初丢失](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/39)
+
+[程赵龙-RBK20260130040入库单,修改单价,把之前多结算的钱扣回来(入库出库都要改)](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/31)
+
+[有一批半成品经过加工委外出去做接箍了,但是mes和产销都没有体现出来](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/16)
+
+[25年的开票量差明细,红冲结算后续](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/15)
+
+[生产管理-工序排产二级-轧管排产二级,突然多出上万条实际已生产的,执行状态为计划的数据](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/47)
+
+[运行年月收发存汇总报表(制造部) 结转时,部门不匹配](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/46)
+
+[宋丹:这炉外购管,我没有查到,帮我看看啥原因啊=用户对软件业务同样不熟悉](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/29)
+
+[需要一个稳定的期初期末平衡的处理方式](http://172.54.8.21:3000/zhangguo/MES_DOC/issues/44)
+
 ## 相关软件
 
 [Git使用指南](./Git/GitRead.md)