本文用于交接 MES 月结执行逻辑,重点说明以下内容:
本文以 2026-03 月结为例说明。后续换月份时,只需要把“当前月 / 次月”替换为对应月份即可。
CX_* 和 HOT_* 是结果。commit,正常执行时直接调用即可。DataValidationResult,不要用历史校验快照判断当前数据。这层是过程直接取数的原始或判定数据,主要包括:
YDM_BC_INITIAL、YDM_BC_INLIST、YDM_BC_OUTLISTYDM_ZC_INITIAL、YDM_ZC_INLIST、YDM_ZC_OUTLIST、YDM_ZC_STOCKTAKINGLISTQCM_ZG_JUGDE_APPLYMVM_ORDER_MATNO_INFOORDERDETAIL_V@TH_CX_LINK来源层的典型特点:
YYYYMM,例如 202603CX 结果表的物料编码这层是月结重建出来的收发存台账结果表:
CX_YDM_BC_INITIALCX_YDM_BC_INLISTCX_YDM_BC_OUTLISTCX_YDM_ZC_INITIALCX_YDM_ZC_INLISTCX_YDM_ZC_OUTLIST这层的典型特点:
YYYY-MM,例如 2026-03这层是生产月报和在产品相关结果表:
HOT_PRODUCTION_MES_JGHOT_HEAT_PRODUCTION_MES_GXHOT_PRODUCTION_MES_RZ这层典型特点:
YYYY-MMDataValidationResult这张表只保存校验结果,不是业务来源。
每次重跑 usp_ValidateProductionData 后,都要以最新一轮结果为准。
系统中常见两种月份格式:
YYYYMM
202603YYYY-MM
2026-03如果本次跑的是 2026-03 月结,则:
2026032026-032026042026-04在产品类过程不是只看单月,而是通常同时涉及:
所以对于 2026-03 月结:
202603 / 2026-03202604 / 2026-04不要把在产品过程里的次月逻辑简单删掉,也不要把所有硬编码月份都机械改成同一个值。
正式删表和跑过程之前,必须先确认相关定时 job 已经停掉、禁用或删除。
原因:
建议执行顺序:
正式月结前,要重点检查存储过程中是否残留以下类型的临时条件:
judge_stove_no = ...judge_stove_no in (...)这类条件通常是在补数据时临时加的,正式月结时应注释掉或忽略。
本次 2026-03 已经处理过一处明确问题:
mes_cx_ydm_zc_inlist_new_hand
202603月结前必须逐个确认相关过程中的硬编码月份是否已经切换到当前月。
对于 2026-03,来源表条件通常应为 202603,结果表或月报过程通常应为 2026-03。
CX_* -> HOT_* -> 校验结果”的顺序排查-- 加工生产月报
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 ('在产品');
-- 半成品期初
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';
-- 成品期初
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';
MES_CX_YDM_BC_INITIAL_hand作用:
CX_YDM_BC_INITIAL主要来源表:
YDM_BC_INITIALMVM_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 写成半成品期初类型mes_cx_ydm_bc_inlist_csjg_hand作用:
CX_YDM_BC_INLIST主要来源表:
YDM_ZC_INLISTORDERDETAIL_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 应理解为车丝加工相关过程mes_cx_ydm_bc_inlist_new_hand作用:
CX_YDM_BC_INLIST主要来源表:
YDM_BC_INLISTMVM_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 取数条件为准mes_cx_ydm_bc_outlist_csjg作用:
CX_YDM_BC_OUTLIST主要来源表:
YDM_ZC_INLISTORDERDETAIL_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_OUTLISTmes_cx_ydm_bc_outlist_new_hand作用:
CX_YDM_BC_OUTLIST主要来源表:
YDM_BC_OUTLISTMVM_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_OUTLISTmes_cx_ydm_zc_initialnew_hand作用:
CX_YDM_ZC_INITIAL主要来源表:
YDM_ZC_INITIALMVM_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_INITIALmes_cx_ydm_zc_inlist_new_hand作用:
CX_YDM_ZC_INLIST主要来源表:
YDM_ZC_INLISTMVM_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% 开头202603写入目标:
insert into CX_YDM_ZC_INLIST月结注意:
202603mes_cx_ydm_zc_outlist_new_hand作用:
CX_YDM_ZC_OUTLIST主要来源表:
YDM_ZC_STOCKTAKINGLISTYDM_ZC_OUTLISTYDM_ZC_INITIALYDM_ZC_INLISTMVM_ORDER_MATNO_INFO主要查询逻辑:
核心条件:
202603写入目标:
insert into CX_YDM_ZC_OUTLISTmes_cx_jg_zxnew_hand作用:
HOT_PRODUCTION_MES_JG主要来源表:
QCM_ZG_JUGDE_APPLYMCH_TWISTINGLY_RESULT_DYDM_ZC_STOCKTAKINGLISTORDERDETAIL_V@TH_CX_LINKSLM_ORDER_HEAD主要查询逻辑:
写入目标:
insert into HOT_PRODUCTION_MES_JGmes_cx_rcl_zxnew_hand作用:
HOT_HEAT_PRODUCTION_MES_GX主要来源表:
QCM_ZG_JUGDE_APPLYYDM_ZC_STOCKTAKINGLISTORDERDETAIL_V@TH_CX_LINKSLM_ORDER_HEAD写入目标:
insert into HOT_HEAT_PRODUCTION_MES_GXmes_cx_rz_zxnew_hand作用:
HOT_PRODUCTION_MES_RZ主要来源表:
QCM_ZG_JUGDE_APPLYYDM_GP_OUTLISTYDM_ZC_STOCKTAKINGLISTORDERDETAIL_V@TH_CX_LINKSLM_ORDER_HEAD写入目标:
insert into HOT_PRODUCTION_MES_RZmes_cx_JG_zzpnew_hand作用:
HOT_PRODUCTION_MES_JG主要来源表:
YDM_HTT_INITIALMCH_LOADING_RESULTPLN_ZY_JGX_MQCM_ZG_JUGDE_APPLYQCM_BC_PASS_APPLYPORT_MCH_BATCH_SAMPLE_RESULTMCH_TWISTINGLY_RESULTYDM_ZC_INLISTORDERDETAIL_V@TH_CX_LINKSLM_ORDER_HEAD月结特点:
写入目标:
insert into HOT_PRODUCTION_MES_JGmes_cx_rcl_zzpnew_hand作用:
HOT_HEAT_PRODUCTION_MES_GX主要来源表:
PLN_ZY_RCL_MPORT_HTT_BATCH_SAMPLE_RESULTQCM_ZG_JUGDE_APPLYORDERDETAIL_V@TH_CX_LINKSLM_ORDER_HEAD写入目标:
insert into HOT_HEAT_PRODUCTION_MES_GXmes_cx_rz_zzpnew_hand作用:
HOT_PRODUCTION_MES_RZ主要来源表:
YDM_ZC_INITIAL_ZGPORT_MIL_BATCH_SAMPLE_RESULTQCM_ZG_JUGDE_APPLYMIL_PLANMIL_SLAB_SCRAPMIL_FURNACES_RESLUT_DETIAMIL_OFFLINE_GROUPORDERDETAIL_V@TH_CX_LINKSLM_ORDER_HEADPLN_ZY_ZG_M写入目标:
insert into HOT_PRODUCTION_MES_RZmes_cx_jg_CSJG_HAND作用:
HOT_PRODUCTION_MES_JG主要来源表:
QCM_ZG_JUGDE_APPLYMCH_TWISTINGLY_RESULT_DORDERDETAIL_V@TH_CX_LINKSLM_ORDER_HEAD说明:
CSJG 表示车丝加工相关过程写入目标:
insert into HOT_PRODUCTION_MES_JG半成品与月报对比时,不能直接把半成品入库原表或 CX_YDM_BC_INLIST 全量拿去和月报对比。
原因:
本次交接确认的规则:
改判入库 不参与与月报直接对比红冲入库 不参与与月报直接对比因此半成品与月报核对时,必须先按入库类型拆开,再决定哪些类型参与比较。 实操上建议先按结果表中的入库类型字段分组,再决定哪些分组参与月报比较。
成品与月报对比也遵循同样思路。
本次交接确认的规则:
改判入库 不参与与月报直接对比红冲入库 不参与与月报直接对比因此成品月报与成品入库结果核对时,也必须先看入库类型,而不是直接拿结果表全量求和。 实操上建议先按结果表中的入库类型字段分组,再决定哪些分组参与月报比较。
-- 阶段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;
/
begin
usp_ValidateProductionData('2026-03');
end;
/
select problem, yearmonth, material_no, create_time, problem_type
from DataValidationResult t
where t.yearmonth = '2026-03';
统一校验入口是:
usp_ValidateProductionData(p_YearMonth)入口逻辑分三步:
DataValidationResult 中当前月份已有的历史校验结果DataValidationResult当前入口中实际启用的校验函数有 5 个:
validate_inventory_vs_mesvalidate_opening_balancevalidate_production_reportvalidate_goods_ledgervalidate_material_existence代码里还预留了 2 个校验函数,但当前默认未启用:
validate_process_chainvalidate_group_uniqueness因此,如果后面有人说“为什么过程已经存在,但结果里没有这类校验”,首先要确认入口过程里是否真的把该函数打开了。
validate_inventory_vs_mes作用:
主要取数表:
cx_ydm_zc_inlisthot_production_mes_rzhot_heat_production_mes_gxhot_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)写入结果:
DataValidationResultproblem_type = '生产月报与成品台账差异'月结理解要点:
validate_opening_balance作用:
主要取数表:
cx_ydm_zc_initialcx_ydm_zc_inlistcx_ydm_zc_outlistcx_ydm_bc_initialcx_ydm_bc_inlistcx_ydm_bc_outlist核心公式:
成品重量口径:
上月出库重量 = act_out_weight - nvl(differential, 0)半成品重量口径:
上月出库重量 = act_out_weight还会额外检查:
写入结果:
DataValidationResultproblem_type = '台账期初差异'月结理解要点:
validate_production_report作用:
主要取数表:
hot_production_mes_rzhot_heat_production_mes_gxhot_production_mes_jg检查内容:
RESOURCE_TYPEMATE_CODEMATE_NAME 拆分结果PROD_VARIETYSTEEL_LEVELSTEEL_NO写入结果:
problem_type 会落到钢坯编码规则、非空字段校验、物料名称校验等类别月结理解要点:
validate_goods_ledger作用:
主要取数表:
cx_ydm_zc_initialcx_ydm_zc_inlistcx_ydm_zc_outlistcx_ydm_bc_initialcx_ydm_bc_inlistcx_ydm_bc_outlist检查内容:
IS_LLJGMATERIAL_NOMATERIAL_NAME 拆分后PRODUCNAMESTEELNAMEGRADENAME写入结果:
problem_type 主要是非空字段校验、物料名称校验月结理解要点:
validate_material_existence作用:
主要取数表:
cx_ydm_zc_initialcx_ydm_zc_inlistcx_ydm_zc_outlistcx_ydm_bc_initialcx_ydm_bc_inlistcx_ydm_bc_outlisthot_production_mes_rzhot_heat_production_mes_gxhot_production_mes_jg取数逻辑:
material_nomate_code 是否包含在这个集合中mate_weight <> 0 且 prod_type <> '在产品' 的月报记录写入结果:
problem_type = '物料编码存在性'月结理解要点:
代码中还存在但默认未在入口中启用的校验:
validate_process_chainvalidate_group_uniqueness交接时要注意:
usp_ValidateProductionData 里打开,就不会产生结果先确认是否存在以下情况:
重点确认:
重点检查:
来源表排查时要注意:
很多结果不是直接拿原表 material_no,而是:
所以遇到物料对不上时,不要只按原表物料编码查,必须把炉号、合同、映射链一起看。
很多问题不是数据真错,而是对比口径不一致。
特别是月报与收发存对比时,要先确认比较范围和业务类型。
*_CSJG_* 过程应理解为车丝加工相关过程_NEW_HAND 不要单凭名字判断业务口径,必须以 SQL 取数条件为准这样后续接手人只需要确认:
即可继续完成月结。