Skip to content

本页来源

以「2026 年年度预算 G&A 编制 V0→V1」为例,按流程表驱动的顺序还原报表使用顺序、挂载程序、数据流转,以及数据丢失与颗粒度不一致的高风险场景。

内容同步自知识库:20-多项目管理\P2026-01-海油-运维\海油-预算-输出\2026年度预算-GA编制-V0到V1链路解析-20260911-V2流程表驱动版.md


2026年度预算 G&A 编制 V0→V1 全链路解析(流程表驱动版)

本版修正了上一版的分析逻辑。上一版从程序出发反查报表("用户保存 → 触发程序 → 看程序写了什么"), 因果倒置。正确的主链是:流程表约定用哪些报表 → 用户按序打开录入 → 保存动作触发报表挂载的程序。 程序是报表的属性,不是链路的起点。


〇、方法论:为什么必须"流程表优先"

0.1 两种分析路径的差异

上一版(程序驱动)❌ 本版(流程表驱动)✅
起点 存储过程(CPM_SP_GA_* 流程表(导航页)
中段 反查哪些报表挂了这个 SP 报表使用顺序(轮次 × 角色)
终点 报表 报表挂载的程序 → 程序链
能回答 "这个程序会改哪些数据" "这条业务链上,谁在什么时候填哪张表,填完发生什么"
失掉什么 业务语义、角色归属、先后顺序

结论:程序驱动只能做排障(某个 SP 出错影响谁),不能做链路设计(这条链是怎么组织的)。 本版全部结论以流程表为骨架重建。

0.2 ⚠️ 适用范围声明

"流程表(导航页)约定报表清单"是海油项目的落地方式(环境配置),不是 Tagetik 通用机制。

  • Tagetik 平台不强制用导航页来组织报表使用顺序;
  • 平台自带的流程机制是 RACCOLTA 采集流程族(流程 → 类型 → 阶段 → 报表绑定), 但海油没有用它来区分 V0/V1 或部门(实测见 §1.4);
  • 其他项目可能:不用导航页、用 RACCOLTA 正经配置、或干脆靠文档/人工约定。
  • 迁移到别的客户时,必须重新确认"哪张表/哪个页面承载使用约定",不能照搬本报告。

0.3 流程表的载体:不是 RACCOLTA,而是三张导航报表

我先按"流程表 = 数据库流程表"做了排查,实测否定了这个假设:

检验项 实测结果 结论
RACCOLTA 流程实例 仅 5 条($$PROCESSCI_PROCESSCI_BGT_ADJUSTCI_ESTIMATE 是平台标准采集流程,非海油业务约定
RACCOLTA_TIPO 节点类型 只有 $PDM(Standard data model)一种 没有 V0/V1、BU/FD/Planning 节点
RACCOLTA_PROSPETTO 绑定 CI_PROCESS1774 张、CI_BGT_ADJUST1772 张(≈全库) 绑定范围过宽,不具备"选用"语义
COD_FASE 阶段取值 $STEP / PLETL / STEP1 不是 LO/IC/CA 三阶段
RACCOLTA_ATTIVITA 挂的是平台标准动作(CFP/DISGNOSTIC/CLOSING),FLAG_ESEGUI 多为 0 未用于海油自研程序

真正的流程表 = 三张流程引导报表(用户已确认):

导航页 名称 角色 页数 超链接 可达报表 目录分布佐证
A1501_01 WorkFlow_WP&B BU 编制 6 214 187 COMMON 47 / BU INPUT 46 / BU 32 / BU OUTPUT 18
A1502_01 WorkFlow_WP&B_FD 专业部门(FD)编制 10 425 281 FD 73 / FD ADJ 40 / FD OUTPUT 31 / FD INPUT 22
A1500 WorkFlow_WP&B_Planning Planning 统筹 5 301 232 横跨 P&L/FD/BU/敏感性分析,最均衡

三者去重共 700 张报表,941 条链接明细(CSV 见交付物)。

技术实现:导航页不用 PROSPETTO.FLAG_REPORT_LIST(全库 0 条), 而是靠 actionLists 里的 HyperlinkNN 动作节点承载,每条链接携带维度上下文做跳转。


一、流程表的内部结构(怎么读它)

1.1 页(模板)= 轮次/主题分组

导航页的每个 ReportTemplateVO 是一"页",页内挂若干超链接。页号是版面序号,不是业务步骤序号—— A1502_01 的页#00 是 V3FINAL、页#01 才是 V1,光看页号会判错顺序。

正确的读法:按页内报表的版本后缀归组

1.2 版本信息藏在哪

排查结果:

假设载体 实测 结论
模板名 Template00~Template13无语义 ❌ 不是
超链接的 CAT_$ 上下文 普遍是多版本集合(如 V0×37 / V1×33 / V2×33 / V3×20 / V4×17 同现) ❌ 不按版本过滤
报表编码 + 名称后缀 A070205_01(-V1)、A070205_039(-V2)、A070205_040(-V3FINAL)、A070205_041(-V4) 版本由报表自身承载

所以:"V0/V1 用哪些报表"这个约定,落地形态是——导航页的某一页(Tab)内,列着该轮次要用的报表,报表名自带版本后缀。 用户在页面上从第一条点到最末一条。

1.3 解析工具(新增)

技能 tagetik-app-anatomy 新增脚本 tk_flow.py,一条命令把导航页翻译成可读清单:

PY=~/binaries/python/envs/default/Scripts/python.exe   # 托管 Python
S=~/.workbuddy/skills/tagetik-app-anatomy

# 三张流程表全量 → 页级清单(含每张报表挂载的程序)
$PY $S/scripts/tk_flow.py home_hy_app --nav A1501_01 A1502_01 A1500 --csv flow.csv

# 按版本切分
$PY $S/scripts/tk_flow.py home_hy_app --nav A1502_01 --by-version

# 单页细看
$PY $S/scripts/tk_flow.py home_hy_app --nav A1502_01 --page 1

脚本按目标报表名/编码自动归类主题(装载/ETL、录入/编制、输出/报告、提交/锁定), 并自动关联 launchers.csv 缓存里的挂载程序。加 --live 可对未命中缓存的报表实时解析(注意内存)。

1.4 页级全貌

导航页 链接 报表 主题构成 业务含义
A1501_01(BU) #00 22 22 装载/ETL 26 数据装载(所有 ETL)
#01 8 8 输出 7 / 录入 1 BU 输出报告
#03 47 46 录入 28 / 其他 16 / 输出 5 / 提交 2 V0 录入主战场
#05 65 58 录入 51 / 其他 23 / 提交 2 V3 调整录入
#06 50 49 输出 39 / 其他 11 输出报告
#07 22 21 录入 35 / 其他 10 / 提交 1 主数据(Asset/WI-PI/项目)
A1502_01(FD) #00 45 41 V3FINAL
#01 74 64 V1
#02 76 65 V2
#04 28 26 V3
#05 35 32 V4 / Released
#07 19 19 压实版专项
#09 42 35 汇总/输出
#11 83 78 多版本总览(V0~V5 同现)
A1500(Planning) #05 84 81 输出 48 Planning 输出
#07 176 121 录入 95 / 其他 87 / 输出 17 / 提交 5 各版本调整总览(V1~V3 全套)
#08 15 15 压实版(Planning)
#09 21 20 录入 36 / 其他 10 补充录入

脏链:A1501_01 指向的 A0702_041A0702_042A1502_01 指向的 A0805_02A1602_04 已不在 PROSPETTO 主档(共 4 条悬空链接)。


二、G&A 编制链的报表使用顺序(核心)

2.1 总览:轮次 × 角色 × 报表

                       ┌──────────────── V0 轮 ────────────────┐
  ETL 装载 ──►  BU 线(A1501_01 页#00+#03)   ┐
               部门线(A1500 页#07)           ├─► 双轨并行,同轮
                       ┌──────────────── V1 轮(专业部门修正)────────────────┐
   办公类(规划计划部)│ A070205_01 / _011 / _012 / _013 / _038              │
   人工成本(人力资源部)│ A0704_02 / A0704_03                                │
   IT 费(科技与数智化部)│ A1102_06 / A1103_08                              │
   总部参考            │ A070105_13                                        │
                       └───────────────────────────────────────────────────┘
                       V2(目标拆分 A070205_021~026)→ V3(A0703_13/14/15、A070205_031~033、A0704_040、A1102_09)
                       V3FINAL(A070205_034/040、A070205_05/06、A1102_092)
                       V4(A070205_041)→ Released(A070205_04/07/08/09、A1102_10)
                       压实版专项(A230131~136 调整 / A230231~234 输出)

2.2 V0 轮:BU 线与部门线双轨并行

2.2.1 步骤 0 — 数据装载(A1501_01 页#00)

22 张 ETL 表,其中与本链相关: A1704_01 Direct G&A ETLA1708_01 IT G&A ETL。 (ETL 表本身不挂自研程序,是 Tagetik 标准数据装载入口。)

2.2.2 步骤 1 — BU 填报(A1501_01 页#03,46 张)

报表 名称 挂载程序(槽位顺序)
1 A070104_01 Direct G&A WP&B-Input (Just for V0)V0 主入口 GA_001(N) → AW_001(S,btn) → GA_008_2(S,btn,ref) → A02(S,btn)
2 A070105_22 Consulting Fee Input-V0 GA_AW_015(S) · GA_RUN01(S) · AW_DELETE(S,ref)
3 A070105_23 General Service Fee Input-V0 _22
4 A070105_26 Audit Fee Input-V0 _22
A0701_01 Direct G&A Submit 无程序(纯提交态)
A070104_02 WP&B - INPUT IFRS16 -G&A
A070104_04 合作油田管理费
A070105_02 Direct_Net G&A GA_008_2(N)
A070105_11 Direct G&A Actual Data - Input GA600(N)
A070105_13 总部参考G&A GA_009(S,ref)
A070105_16~21 上级管理费 / 租赁费 / 差旅费 / 宣传费 / 物业管理费 / 人工成本First Spend 均无程序
A1101_01 IT G&A WP&B Input IT_002(S) → GA_002(S,ref) → A03(S,btn)

A070104_01 是 V0 的原点:用户在这张表录入 → 保存触发 GA_001(部门/Office 归集 + INP 整合)→ AW_001(行转列回填表单)→ GA_008_2(各层级 BU_INP)→ A02

2.2.3 步骤 2 — 部门填报(A1500 页#07)

报表 名称 挂载程序
A0703_10 Direct G&A Input by Department-V0 GA_001(N) · GA_RUN03(S,btn) · A05(S,btn)
A0703_11 Consulting Fee Input By Department-V0 GA900(N) · GA_AW_004(N) · AW_DELETE(S,ref) · GA_RUN02(S,btn)
A0703_12 General Service Fee Input by Department-V0 GA_RUN02(S,btn) · AW_DELETE(S,ref)
A0703_16 Audit Fee Input by Department-V0 GA_RUN02(S,btn) · AW_DELETE(S,ref) · AW_DELETE(S,ref) ← 重复挂载

部门线走的是 GA_RUN02(内含 GA_AW_004 + GA900),把部门明细转到 BU 表的美元/人民币账套要素 ——这正是 AW_BGT_GA0001 里本部行的来源。 注意 V3 版同族表 A0703_13/14/15 结构相同,只是版本不同。

2.3 V1 轮:专业部门修正(分四条线)

入口页 = A1502_01 页#01(74 条链接 / 64 张报表)。

线 1:办公类(不含 IT)— 规划计划部

报表 名称 挂载程序
A070205_01 G&A WP&B-ADJ-V1V1 主入口 GA_007(S) · GA_005(S,ref) · GA_006(N) · WORKFLOW1(S,ref)
A070205_011 Direct G&A WP&B-ADJ1 - By BU GA_003(S,ref) · WORKFLOW1(S,ref)
A070205_012 Direct G&A WP&B-ADJ1 - By Office GA_004(S) · GA_008(S,ref) · WORKFLOW1(S,ref)
A070205_013 G&A WP&B-ADJ-V1 (Batch) GA_005(S) · GA_007(S,ref) · GA_006(N)
A070205_038 Direct G&A 办公类(不含IT)-ADJ-V1 AW_005(S,btn) · AW_006(S,btn)
A070105_13 总部参考G&A GA_009(S,ref)

线 2:人工成本 — 人力资源部

报表 名称 挂载程序
A0704_02 HR Direct G&A ADJ V1-By BU GA_003(S,ref) · WORKFLOW1(S,ref)
A0704_03 HR Direct G&A ADJ V1-By Office GA_004(S) · GA_008(S,ref) · WORKFLOW1(S,ref)
A0704_04 人工成本First Spend调整表

线 3:IT 费 — 科技与数智化部

报表 名称 挂载程序
A1102_06 IT G&A WP&B-ADJ-V1 GA700(N) · IT_004(S) · IT_002(S) · GA_002(S,ref) · A03(S,btn) · WORKFLOW1(S,ref)
A1103_08 IT G&A WP&B Input

2.4 V2 轮(A1502_01 页#02)

报表 名称 挂载程序
A070205_021 G&A Target Split WP&B-ADJ-V2 GA141(N)
A070205_022 Direct G&A WP&B-ADJ-V2 - By BU GA_003(S) · WORKFLOW1(S,ref)
A070205_023 Direct G&A WP&B-ADJ-V2 - By Office GA_008(S,ref) · GA_004(S) · WORKFLOW1(S,ref)
A070205_024 Net G&A WP&B -ADJ-V2 GA_005(S) · GA_007(S) · GA_006(N) · WORKFLOW1(S,ref)
A070205_025 HR Direct G&A ADJ V2-By BU WORKFLOW1(S,ref) · GA_003(S,ref)
A070205_026 HR Direct G&A ADJ V2-By Office GA_004(S) · GA_008(S,ref)
A070205_039 Direct G&A 办公类(不含IT)-ADJ-V2 AW_005(S,btn) · AW_006(S,btn) · RUN04(S,btn)
A0704_07 合作油田管理费调整表-V2
A1102_07 IT G&A WP&B-ADJ-V2-FD IT_005(S) · A03(S,btn) · WORKFLOW1(S,ref)

2.5 V3 轮(A1502_01 页#04)

报表 名称 挂载程序
A070205_031 合作油田管理费-ADJ-V3 GA058(N)
A070205_032 Direct G&A WP&B-ADJ-V3(by BU)
A070205_033 Net G&A WP&B-ADJ-V3 GA_006(N)
A0703_13 Direct G&A Input by Department-V3 GA_RUN03(S,btn)
A0703_14 Consulting Fee Input By Department-V3 GA900(N) · GA_AW_004(N) · AW_DELETE(S,ref) · GA_RUN02(S,btn)
A0703_15 General Service Fee Input by Department-V3 GA_RUN02(S,btn) · AW_DELETE(S,ref)
A0704_040 行政办公设备-ADJ-V3 GA600(S,ref)
A1102_09 IT G&A WP&B-ADJ-V3 IT_002(S) · GA_002(S,ref)

2.6 V3FINAL / V4 / Released

轮次 报表 名称 挂载程序
V3FINAL A070205_034 Net G&A-FD-V3Final GA_006(N) · WORKFLOW1(S)
V3FINAL A070205_040 办公类(不含IT)-ADJ-V3FINAL AW_005(S,btn) · AW_006(S,btn) · RUN04(S,btn)
V3FINAL A070205_05 Direct G&A-FD-V3Fin WORKFLOW1(S,ref)
V3FINAL A070205_06 Direct G&A-HR-V3Fin WORKFLOW1(S,ref)
V3FINAL A1102_092 IT G&A WP&B-ADJ-FD-V3Fin IT_002 · GA_002 · A03 · WORKFLOW1
V4 A070205_041 办公类(不含IT)-ADJ-V4 AW_005(N ← 已停用!) · AW_006(S,btn) · RUN04(S,btn)
Released A070205_04 G&A-WP&B-Budget Released WORKFLOW1(S,ref)
Released A070205_07 HR Direct G&A-WP&B-Budget Released GA_008_2(S,btn) · A02(S,btn) · WORKFLOW1(S,ref)
Released A070205_08 Direct G&A-WP&B-Budget Released GA_008_2(S,btn) · WORKFLOW1(S,ref)
Released A070205_09 Direct G&A-WP&B-Budget Released-CI HQ RUN03(S) · WORKFLOW1(S,ref)
Released A1102_10 IT G&A WP&B-Budget Released IT_002 · GA_002 · A03 · WORKFLOW1

2.7 压实版专项(A1502_01 页#07 / A1500 页#08)

报表 名称 挂载程序
A230131 分摊前管理费压实版调整表-规划计划部 AW_005(S,btn) · AW_006(S,btn)
A230132 分摊前管理费压实版调整表-行政管理部
A230133 分摊前管理费压实版调整表-科技与数智化部(IT G&A)
A230134 分摊前管理费压实版调整表-人力资源部 AW_005 · AW_006
A230135 分摊前管理费压实版调整表-其他归口部门 AW_005 · AW_006
A230136 分摊前到分摊后管理费压实版调整表 GA_008_2(N) · GA_008_YS(S,btn)
A230231 分摊前管理费压实版输出表-规划计划部 AW_005·AW_006·AW_005·AW_006重复挂载两遍
A230232 分摊前管理费压实版输出表-行政管理部 AW_005 · AW_006

三、程序清单与职责定型

3.1 G&A 链全部程序(32 个)

程序 官方注释(使用场景) 目标 粒度 调用方
GA_001 Direct 按部门/Office 收集 → INP 整合;各 INP 加总到合计节点 部门/Office 明细 DATI_SALDI_LORDI(FW) 科目×月 RUN03RUN04、报表挂载
GA_002 IT G&A 3 个明细科目汇总 GA05-INP GA05.01/02/03 GA05_INP 科目×月 A1102_*A1101_01
GA_003 将 BU 层面六大类年度值拆解到办公室层面 BU 六大类 Office 六大类 A070205_011/022A0704_02
GA_004 V1+:Office 上 Direct G&A 六大类拆到明细、全年拆到月 Office 六大类 明细×月 A070205_012/023/026A0704_03
GA_005 V1+ 分摊:取 Reclass 差值 → 等比例缩放至 Reclass 科目 Reclass 科目 Reclass 科目 A070205_01/013/024
GA_006 Net 作为 Direct 上报;取配置表需合计上报口径的 Asset Net G&A / Direct 冲抵 + INP 合成 A070205_01/024/033/034A0700_08A0703_08
GA_007 V1+:拆分 Indirect 和 Net G&A 从年度到月 年度 A070205_01/013/024
GA_008 计算 G&A 各层级 BU_INP 明细 BU_INP 科目×月 A070205_012/023/026A0704_03
GA_008_2 计算 G&A 各层级 BU_INP 明细 BU_INP 科目×月 A070104_01A0700_07RUN03RUN04
GA_008_YS GA_008(压实版专用变体) 明细 BU_INP 科目×月 A230136
GA_009 计算 BU_INP,只适用伊拉克、乌干达DEST5='ZH20402_02' 录入明细 BU_INP 科目×月 A070105_13A0700_0x
GA058 所有版本:将 location 数据存储到相应 Office 节点 location Office A070205_031
GA141 V2:E_NONE 上五大类目标值拆分到各办公室/资产(不含 IT;不处理伊拉克/乌干达) E_NONE Office/资产 A070205_021
GA600 G&A 各表总的调用程序 A0704_040A070105_11
GA700 预算调整总调用程序 A1102_06
GA800 咨询费/一般服务费 → FW(写 AW_BGT_GA0001 AW 表单 FW RUN04
GA900 同类(写 AW_BGT_GA0003 AW 表单 FW RUN02RUN04A0703_11/14
AW_001 行转列回填表单(FW → AW 表单 FW AW_BGT_GA0001 行级 A070104_01A0700_07
AW_002 组织映射(GA01 + GA03 双表);FW 往 GA03 传输时的组织架构处理 FW AW 表单 RUN03
AW_003 部门数据更新到美元/人民币账套 部门 双账套 RUN03RUN04
AW_004 调用 A06 + 科目处理 AW FW A0703_11/14
AW_005 V1 拆分:把"正式/待批合计"摊到 12 个月 合计列 月份列 A070205_038~041A230131~135/231/232
AW_006 V1 传输:AW 表单 39 列 unpivot → 回写 FW + AW03 AW 表单 FW AW_005
AW_015 匹配 BU(UPDATE AW_BGT_GA0001 SET BU=LEFT(AIH_ENTITY,7) AW 表单 A070105_22/23/26
AW_DELETE 提交即删:动态 SQL 删空行 任意 AW 表 全表 A070105_22/23/24/25/26A0703_11/12/14/15/16
RUN01 编排:咨询费/一般服务费 → FW A070105_22/23/24/25/26
RUN02 编排:部门明细 → BU 双账套 A0703_11/12/14/15/16
RUN03 编排(按版本分支):见 §5.3 A0703_10/13A070205_09
RUN04 编排:GA900×2 → GA800×2 → AW_003GA_001GA_008_2(全 E0 A070205_039/040/041
WORKFLOW1 流程状态机:见 §5.4 DATI_SALDI_LORDI V1+ 几乎所有表单
A02 / A03 / A05 清理+重算类(DELETE ... WHERE COD_SCENARIO=… AND COD_CATEGORIA=… 见上表
IT_002 / IT_004 / IT_005 IT G&A 明细汇总 / 年度拆月 / ITEM 拆月 A1102_*A1101_01

3.2 三个编排器调用了什么

-- CPM_SP_GA_RUN01 → 咨询费/一般服务费回填
EXEC CPM_SP_GA_AW_001 ... / CPM_SP_GA_AW_004 ...

-- CPM_SP_GA_RUN02 → 部门 → BU 双账套
EXEC CPM_SP_GA_AW_004 ...  -- 部门明细
EXEC CPM_SP_GA900 ...      -- → AW_BGT_GA0003

-- CPM_SP_GA_RUN03(按版本分支,见 §5.3)
EXEC CPM_SP_GA_AW_003   -- 部门数据更新到美元/人民币账套(无条件)
EXEC CPM_SP_GA_AW_002   -- 更新 GA01(无条件)
IF @PI_CATEGORIA='V0'  EXEC CPM_SP_GA_001 @ENTITY=LEFT(@ENTITY,10)
IF @PI_CATEGORIA='V1'  EXEC CPM_SP_GA_001 @ENTITY='E00000101'  (人民币套)
                         EXEC CPM_SP_GA_001 @ENTITY='E00000100'  (美元套)
EXEC CPM_SP_GA_008_2 @ENTITY=LEFT(@ENTITY,7)   -- 无条件

-- CPM_SP_GA_RUN04(无 @ENTITY 参数 → 一律全量 E0)
EXEC CPM_SP_GA900 @PI_DEST2='GA04.15', @ENTITY='E11_E000001'
EXEC CPM_SP_GA900 @PI_DEST2='GA04.16', @ENTITY='E11_E000001'
EXEC CPM_SP_GA800 @PI_DEST2='GA04.15', @ENTITY='E0'
EXEC CPM_SP_GA800 @PI_DEST2='GA04.16', @ENTITY='E0'
EXEC CPM_SP_GA_AW_003
EXEC CPM_SP_GA_001     @ENTITY='E0'
EXEC CPM_SP_GA_008_2   @ENTITY='E0'

四、关键调用链与数据流转路径

4.1 分层视图

┌─ 用户操作层 ─────────────────────────────────────────────────────────┐
│  流程表(A1501_01/A1502_01/A1500) → 定位报表 → 打开 → 录入 → 【保存】  │
└──────────────────────────────┬───────────────────────────────────────┘
                               │ launcher(onSave=S)
┌─ 程序层 ─────────────────────▼───────────────────────────────────────┐
│  V0 :  GA_001 ─► AW_001 ─► GA_008_2 ─► A02        (BU 主入口)      │
│        部门线: GA_RUN02/AW_004/GA900 + AW_DELETE                   │
│  V1 :  GA_007 ─► GA_005 ─► GA_006 ─► WORKFLOW1     (办公类主入口)  │
│        HR: GA_003 / GA_004+GA_008 + WORKFLOW1                      │
│        IT: IT_004 ─► IT_002 ─► GA_002 ─► A03 + WORKFLOW1           │
│        办公类专用线: AW_005 ─► AW_006 ─► RUN04                     │
│  V2+:  增加 GA141(目标拆分)、RUN04 归集重算                        │
└──────────────────────────────┬───────────────────────────────────────┘
                               │ INSERT / DELETE / UPDATE
┌─ 数据层 ─────────────────────▼───────────────────────────────────────┐
│  FW 层  DATI_SALDI_LORDI(主体) / DATI_SALDI_IC(往来) / DATI_NOTE │
│  AW 表单层  AW_BGT_GA0001_000001(GA01)/ GA0002 / GA0003 / GA0004/5 │
│  流程状态层 DATI_SALDI_LORDI 内 A_COM_028 + WF02/WF03 + DEST5=预算类 │
└──────────────────────────────────────────────────────────────────────┘

4.2 V0 → V1 的完整数据流向

① V0 BU 填报
   A070104_01 录入  ──保存──► GA_001(部门归集 → INP)
                              ──► AW_001(FW → AW_BGT_GA0001 行转列回填)
                              ──► GA_008_2(各层级 BU_INP)
                              ──► A02(清理)
② V0 部门填报
   A0703_10/11/12/16 ──保存──► GA_RUN02 / GA900 / AW_004
                              ──► AW_DELETE(删空行)
③ V1 专业部门修正(四条线并行,互不感知)
   办公类 A070205_01 ──保存──► GA_007(年度→月)
                              ──► GA_005(Reclass 重分摊)
                              ──► GA_006(Net 作 Direct 上报)
                              ──► WORKFLOW1(置提交流程状态)
   办公类 A070205_038 ─保存──► AW_005(合计→12 月)
                              ──► AW_006(AW 表单 unpivot → FW)
   HR    A0704_02/03 ─保存──► GA_003 → GA_004+GA_008 → WORKFLOW1
   IT    A1102_06    ─保存──► IT_004 → IT_002 → GA_002 → A03 → WORKFLOW1
④ V2/V3/V4 逐轮重复③,办公类额外触发 RUN04(全量归集重算)

方向要点(必须分清): - AW_001/AW_002/GA800/GA900FW → AW 表单回填 - AW_006AW 表单 → FW 传输(方向相反,构成闭环) - GA_001/GA_008/GA_003/GA_004:FW 内部层级搬运 - WORKFLOW1:只写流程状态行(A_COM_028),不动业务金额


五、数据流转的关键机制

5.1 粒度坐标:三层正交切片

所有 G&A 数据都由这组坐标唯一定位:

CONTO(2 值)      ×  DEST4(3 值)        ×  PERIODO(12 值)
A_COM_003(年度)     ZH1_001               01…12
A_COM_004(月度)     ZH1_002
                      ZH1_003
        ×  DEST5(口径)  ×  DEST2(科目)× AZIENDA(实体)× CATEGORIA(版本)
        ZH20402_01 编制版G&A抵消
        ZH20402_02 G&A 补充明细
        ZZ2_NONE   默认
        ZH20406_07/08 提交状态位

5.2 粒度变换的四个动作

程序 变换 风险
GA_001 明细 → LEFT(COD_DEST2,4)+'_INP' 汇总 写入集合 ≠ 删除集合时,写而不删
GA_003 BU 六大类 → Office 六大类(年内)
GA_004 Office 六大类 → 明细;年 → 月 除以 0 / NULL
AW_005 合计 → 12 个月(按比例) 分母为 0 时整体清零
GA_005 Reclass 差值等比例缩放 分母为 0 时跳过

5.3 RUN03 的版本分支(重要)

IF @PI_CATEGORIA = 'V0' BEGIN
    EXEC CPM_SP_GA_001 @ENTITY = @AZI          -- LEFT(@ENTITY,10),用传入实体
END
IF @PI_CATEGORIA = 'V1' BEGIN
    EXEC CPM_SP_GA_001 @ENTITY = 'E00000101'   -- 人民币账套
    EXEC CPM_SP_GA_001 @ENTITY = 'E00000100'   -- 美元账套
END
EXEC CPM_SP_GA_008_2 @ENTITY = @AZI02          -- LEFT(@ENTITY,7)

V0 与 V1 的归集范围不同:V0 按传入实体归集,V1 强制归集到本部双账套。 这是"版本间口径差异"的合法来源之一,但也意味着——同一条数据在 V0 和 V1 会被归到不同实体节点

5.4 WORKFLOW1:流程状态不在流程表里

状态存储位置DATI_SALDI_LORDI - COD_CONTO = 'A_COM_028'(状态专用科目) - COD_DEST2 ∈ {WF02, WF03}(两个状态位) - COD_DEST5 = 预算类别(CAP_xx / ZH20406_07 / ZH20406_08…) - IMPORTO = 1 表示"已提交"

源码注释原文:"如果专业部门已提交,则自动更新状态(保证专业部门不能撤回状态)"。 程序会按 DEST5_GERARCHIA_ABBIZH204/ZH20406 层次做状态传播 (勘探投资提交 → 5 个预算类型连带提交;生产资本化提交 → 7 个预算类型连带提交)。

认知修正:真正的"流程动作"承接者是挂在业务表单上的 WORKFLOW1不是那三张导航页。导航页只做导航。


六、数据丢失高风险场景

判定口径:"删除范围 ⊋ 重建范围"即构成丢失风险。 「已发生」= 当前库中已能查到异常数据;「潜在」= 当前数据恰好成立,但无校验保护。

🔴 P0-1 GA_006 全实体删除 × 2 实体白名单(本版新发现,最严重

-- 第 1 段:删除(L95-98)—— 只限版本+场景+DEST5,不限实体、不限科目、不限 DEST2
DELETE FROM DATI_SALDI_LORDI
WHERE COD_CATEGORIA = @PI_CATEGORIA
AND COD_SCENARIO = @PI_SCENARIO
AND COD_DEST5 = 'ZH20402_01'

-- 第 1 段:重建(L162-201)—— 限 #AZI 实体
INSERT INTO DATI_SALDI_LORDI ...
FROM DATI_SALDI_LORDI TA
WHERE ... AND COD_AZIENDA IN (SELECT COD_AZIENDA FROM #AZI) ...

#AZI 来源(L23-34):

SELECT COD_AZIENDA INTO #AZI FROM DATI_NOTE
WHERE COD_CATEGORIA='$AMOUNT' AND COD_CONTO='A_COM_028' AND COD_PERIODO='01'
  AND COD_SCENARIO='S_NONE' AND COD_DEST2='GAH00_022' AND NOTE='Y'

实测项
白名单实体数 2E0000050001 米桑油田项目 / E0000050002 阿拉伯湾勘探项目)
实际带 DEST5='ZH20402_01' 数据的实体数 21
涉及的(场景,版本)组合 29 / 26
总行数 141,731
数据的写入方 GA_006_3.1(3 实体) / GA_008_1(2 实体) / GA_006_1.3(2 实体)

触发条件:任何实体(非 E0000050001/2)在该场景该版本执行 GA_006 时。 后果: 1. 超出白名单的实体的 ZH20402_01 数据被删除且不重建; 2. 其他程序(GA_008)写入的行也被一并删除——因为它们同样带 DEST5='ZH20402_01'

实例2023BGT/V2):该口径下 3 个实体有 GA_006 数据、2 个实体有 GA_008 数据, 执行 GA_006 会清掉全部,只重建白名单内的部分。

这是整条链路上最严重的数据丢失风险,且与"用户保存"直接绑定A070205_01 保存即触发)。

🔴 P0-2 GA07_INP 写而不删 → 已实测 18 倍重复

GA_001 写入 LEFT(COD_DEST2,4)+'_INP'(7 项),DELETE 白名单(W05/GAH0201)只有 6 项,缺口 GA07_INP

实测
重复键 COD_DEST2='GA07_INP' 同一业务键 18 条重复行
PROVENIENZA CPM_SP_COPYRF_NEW__3.1
影响 任何 SUM 聚合虚增 18 倍

🔴 P0-3 AW_001 删除范围 > 重建范围

DELETE 不限 CONTO/DEST4INSERT 限定 CONTO IN ('A_COM_003','A_COM_004') + DEST4 IN ('ZH1_001','ZH1_002','ZH1_003')

实测缺口(FW 层 GA04.01 下存在但进不了表单): A_COM_220 / A_COM_219 / A_COM_223 × ZH1_OTHER_003/004/005 = 6 类切片

🔴 P0-4 AW_005 结构性清零(潜在)

  • Wave① 比例 = GA01024 / NULLIF(Σ月份, 0)GA01024=0 时比例 = 0 → 12 个月被整体清零
  • GA01037=0 → Wave② 不触发 → 永久丢失
  • @PI_AT06 传空 → #AT06 空 → UPDATE 命中 0 行,静默"成功"

当前状态:不变量(合计 = 月份和)在 21,481 行上 0 偏离,尚未触发。 触发条件:用户只填合计列后清空 / 参数传空。

🟠 P1-1 AW_DELETE 参数未生效(动态 SQL)

CREATE PROCEDURE CPM_SP_AW_DELETE @TableName AS VARCHAR(80), @PI_SCE AS VARCHAR(80), @PI_CAT AS VARCHAR(80)
...
SET @SqlQuery = N'DELETE FROM ' + @TableName + N' WHERE ISNULL(GA01011,0)=0 AND GA01001 IS NULL ... '

@PI_SCE / @PI_CAT 传入但 WHERE 中完全未使用 → 作用域只有表名: 一个 BU 提交会清掉所有场景/版本/实体的空行。 且判空漏了 GA01024(正式合计)/GA01037(待批合计)/GA01052(备注) → "GA01011=0GA01024≠0"的行被当空行删除(这正是 AW_005 清零路径的产物,两个缺陷会叠加)。

当前实测 0 行命中,但已有 39 行"预算合计为 0 而备注非空"擦边。

🟠 P1-2 WORKFLOW1 全实体删状态

DELETE FROM DATI_SALDI_LORDI WHERE COD_CONTO='A_COM_028' AND COD_DEST2='WF03'
  AND COD_CATEGORIA=@CATEGORY AND COD_SCENARIO=@SCENARIO   -- 不限实体
一个用户提交 → 清掉该版本该场景下所有实体的流程状态 → 只重建满足条件者。 其他实体的"已提交"标记会丢失 → 流程可被重复打开/重复提交。

🟠 P1-3 CPM_SP_GA_007 当前不可运行

L127 引用未声明的临时表 #DEST2_DIRECTGA(未注释)→ Invalid object name。 另含 NULL 除法字符串拼接 JOIN 键TA.COD_DEST2 + TC.COD_DEST2)。 挂在 A070205_013 G&A WP&B-ADJ-V1 (Batch) 上,用户点按钮即报错。

🟠 P1-4 同族报表行为不一致

报表 版本 AW_005 开关 后果
A070205_038 V1 onSave=S 拆分 + 传输,无 RUN04
A070205_039 V2 onSave=S 拆分 + 传输 + RUN04
A070205_040 V3FINAL onSave=S 同 V2
A070205_041 V4 onSave=N(已停用) 跳过拆分,只传输 + RUN04

V4 版保存时口径与前序版本分叉(月份列不更新,直接传输旧值)。

🟠 P1-5 重复挂载(同一程序挂两遍)

报表 重复项
A0703_16(审计费 V0) AW_DELETE × 2
A230231(压实版输出表) AW_005 + AW_006 各 × 2

后果:同一保存动作重复执行全表删除,窗口内并发时可能清掉对方刚写入的数据

🟠 P1-6 备份目录的报表仍挂生产程序

A0705_10(Direct G&A By Office)位于「备份」目录,却挂着 AW_001 + GA_001 + GA_008_2 三个生产程序。 在备份表上点保存 → 直接写生产 FW。

⚪ P2 GA_006 大段逻辑被注释

L202-364 整段("没有 Direct G&A 的,按默认科目等分到六大类")在 /* */ 中, 但文件头注释仍宣称该功能存在 → 文档与实现不一致,维护时易误判。


七、颗粒度不一致的成因

7.1 三层正交切片 × 硬编码 CASE 矩阵

AW_006 把表单 39 列映射到 CONTO(2) × DEST4(3) × PERIODO(12) = 72 个组合, 全部靠 CASE WHEN Product IN (...) 手工枚举

7.2 字段物理列序 ≠ 语义月序(已实锤)

AW_001 源码中 10 月/11 月待批字段写反: - 应:10 月 → GA01047、11 月 → GA01048 - 实现:错位,10 月与 11 月的待批值互换

根因:映射靠人工对照列序,无元数据校验。

7.3 三层实体粒度未打通

形态 用途
明细实体 E00000100_01~_22(本部 22 部门)、海外项目实体 录入
7 位公司级 LEFT(COD_AZIENDA,7) 归集
_INP 影子实体 GAxx_INP / Exxxxxxx_INP 汇总

GA_008_2DELETECI03 白名单校验而 INSERT 没有 → 结构上不对称 (当前 38/38 全覆盖,属潜在)。

7.4 版本分支导致同数据不同归集

RUN03:V0 用传入实体、V1 用本部双账套(§5.3)→ 同一条明细在 V0/V1 落在不同节点

7.5 四条 V1 专业线互不感知

办公类 / 人力资源 / IT / 总部参考四条线各挂各的程序, 没有任何一处做"四条线合并后的完整性校验"。 任一条线的版本或参数不一致,就会出现"同一张汇总表里办公类对、IT 类是旧的"。

7.6 配置外置带来的静默失败

  • GA_006 依赖 DATI_NOTEGAH00_022 / NOTE='Y')→ 配置缺失则 #AZI 为空 → 全程序静默 0 行,不报错
  • AW_001 依赖 AW_BGT_GA0002 映射表做 INNER JOIN → 缺一行即静默丢一个科目 (当前 20/20 对齐,无外键保护)
  • GA_141 依赖 DEST2_RATIOA_COM_146 / NOTE='Y'

7.7 统计口径分叉

  • GA_009DEST5='ZH20402_02'(G&A 补充明细),GA_006ZH20402_01(编制版G&A抵消)
  • 同一个 BU_INP 节点,可能同时有两条口径的数据 → DEST5 汇总与不按 DEST5 汇总结果不同

八、依赖与冲突点

8.1 同表多写方(冲突源)

表 / 切片 写入方 冲突说明
DATI_SALDI_LORDI @ DEST5='ZH20402_01' GA_006GA_008 GA_006DELETE 会清掉 GA_008 的结果
DATI_SALDI_LORDI @ A_COM_028(状态) WORKFLOW1 全实体删除,先提交者状态可能被后来者清掉
AW_BGT_GA0001_000001 AW_001GA800AW_015GA_002 多方写同一数据集
DATI_SALDI_LORDI @ 月份列 AW_005(拆分)、GA_004(年→月)、GA_007(年→月) 三套拆月逻辑并存,先后顺序影响结果
DATI_SALDI_LORDI @ _INP GA_001GA_008GA_008_2GA_008_YSGA_009GA_002 6 个程序写同一命名族

8.2 执行顺序敏感

场景 顺序要求 违反后果
A070205_039/040/041 保存 AW_005AW_006RUN04 RUN04 内含 GA_001+GA_008_2(全量 E0),而 AW_006 已写过同一批 _INP重复计算
A0703_11/14 保存 GA900/GA_AW_004GA_RUN02AW_DELETE AW_DELETE 最后跑会删掉刚写入的空行(当前恰好安全,但脆弱)
V1 四条线 办公类 / HR / IT 无顺序约定 汇总表可能读取到部分更新状态

8.3 版本间行为矩阵(实测)

行为 V0 V1 V2 V3 V3FINAL V4
归集实体(RUN03) 传入实体 本部双账套
WORKFLOW1 状态 ❌ 无
办公类拆分 AW_005 ❌ 已停用
归集重算 RUN04 ❌ 无

九、整合方案与建议

9.1 紧急修复(按优先级)

# 对象 问题 修复建议 验证方式
1 GA_006 L95 删除不限实体 DELETEAND COD_AZIENDA IN (SELECT COD_AZIENDA FROM #AZI)把重建范围扩到全实体 修复前后对比 DEST5='ZH20402_01' 的行数与实体数
2 GA07_INP 写而不删 → 18 倍重复 GA07_INP 补进 GA_001DELETE 白名单;并清理存量重复行 HAVING COUNT(*)>1 应为 0
3 AW_DELETE @PI_SCE/@PI_CAT 未用 + 判空漏列 WHERE 补 COD_SCENARIO=@PI_SCE AND COD_CATEGORIA=@PI_CAT;判空补 GA01024/GA01037/GA01052 单实体提交后其他实体行数不变
4 AW_001 删了不回填 统一 DELETEINSERTCONTO/DEST4 口径 6 类切片能否进表单
5 GA_007 引用未声明临时表 SELECT ... INTO #DEST2_DIRECTGA 声明 A070205_013 上点按钮
6 A070205_041 AW_005 已停用 确认 V4 是否应拆分;若应,恢复 onSave=S 对比 V3FINAL/V4 月份列
7 A0703_16 / A230231 重复挂载 去掉重复的 launcher 槽位 保存后日志只执行一次
8 A0705_10 备份目录挂生产程序 摘除三个 launcher,或移出生产环境

9.2 结构性方案

方案 A — 给每个"删除+重建"程序加统一护栏

-- 在程序的删除段之前插入范围一致性断言
DECLARE @del_cnt INT, @ins_cnt INT;
-- 删除前统计将被删除的行数(与 DELETE 同条件)
-- 执行后统计重建行数
IF (@ins_cnt < @del_cnt * 0.5)   -- 阈值可调
    RAISERROR('GA_xxx: 重建行数显著少于删除行数,可能存在数据丢失', 16, 1);
收益:把"静默丢失"变成"显式报错"。成本:改动 6–8 个程序。

方案 B — 统一"配置驱动"的实体/科目白名单

现状:#AZI 藏在 DATI_NOTE、映射藏在 AW_BGT_GA0002、比例藏在 DEST2_RATIO, 且缺失时静默降级为 0 行

建议:建一张显式配置表(如 CFG_GA_SCOPE),字段 程序名 / 场景 / 版本 / 实体范围 / 生效日期, 程序启动时校验"范围非空",否则抛错。

方案 C — 消除重复的拆月逻辑

AW_005(合计→月)、GA_004(年→月)、GA_007(年→月)三套并存。 建议收敛为一套公共拆月程序,按 DEST5 区分口径。

方案 D — 四条 V1 线的合并校验

在 V1 结束、V2 开始前,增加一个跨线完整性校验: 校验对象 = 办公类 / 人力资源 / IT / 总部参考四条线的目标集合是否全部有值。 收益:把"某条线没跑/跑错"从"汇总表看着不对"变成"明确报错"。

方案 E — 流程状态集中化

WORKFLOW1 把状态写在 DATI_SALDI_LORDI(业务数据表)里, 导致每次删状态是全实体扫描、每次查状态是全表条件扫描。 建议独立状态表(实体 / 场景 / 版本 / 预算类别 / 状态 / 时间 / 用户), DELETEINSERT 都限实体。

9.3 运维建议

  1. 建立"保存动作影响面清单":把本报告 §2 的「报表 → 程序」表交付业务, 标注哪些报表保存即触发全量重算A070205_039/040/041RUN04)。
  2. 轮次切换时做数据快照:每轮次(V0→V1→V2…)开始前备份 DATI_SALDI_LORDI 的相关切片 (按 COD_SCENARIO + COD_CATEGORIA + COD_DEST2 LIKE 'GA%')。
  3. 监控三张关键视图
  4. DEST5='ZH20402_01' 的实体数是否等于白名单实体数(P0-1 哨兵)
  5. GA07_INP 是否出现重复键(P0-2 哨兵)
  6. A_COM_028 状态的实体覆盖度(P1-2 哨兵)
  7. 并发窗口管控A0703_16A230231 重复挂载 + 全表删除, 避免多人同时保存同一轮次。
  8. 配置变更评审DATI_NOTEAW_BGT_GA0002DEST2_RATIO 三张配置表 建议纳入变更审批(改动即影响全链路)。
  9. 代码评审要点:新写 G&A 程序时,强制检查 ① DELETEINSERT 的 WHERE 条件是否等价;② 分母是否做了 0 保护;③ 配置为空是否会静默。
  10. 修复回归清单:修复后重跑一轮 V0→V1,对比"修复前后各版本 DEST2 × DEST4 × PERIODO 汇总值"。

9.4 待业务确认(5 项)

# 问题 影响
1 A_COM_219/220/223ZH1_OTHER_003/004/005 这 6 类切片是否属于 G&A 上报口径 决定 P0-3 是"加校验拦截"还是"扩大程序口径"
2 GA_006#AZI 只放 2 个海外项目实体,是设计意图还是配置遗漏 决定 P0-1 的修复方向(收窄删除 vs 扩大重建)
3 A070205_041(V4)的 AW_005 停用是有意简化还是误操作 决定 P1-4
4 V1 四条专业线(办公/HR/IT/总部)的完成顺序是否有业务约定? 决定方案 D 的校验时机
5 压实版(A2301xx)与常规版本(A070205_xxx)的数据是否应隔离 两者用同一套 AW_005/AW_006,可能互相覆盖

十、附录

10.1 复现命令

PY=~/binaries/python/envs/default/Scripts/python.exe
S=~/.workbuddy/skills/tagetik-app-anatomy

# ① 流程表 → 报表清单(含挂载程序)
$PY $S/scripts/tk_flow.py home_hy_app --nav A1501_01 A1502_01 A1500 --csv flow_table.csv
$PY $S/scripts/tk_flow.py home_hy_app --nav A1502_01 --by-version

# ② 单张报表全息解剖(模板×矩阵 / launcher / 超链接 / 流程 / 权限)
$PY $S/scripts/tk_report.py home_hy_app A070104_01

# ③ 批量导出程序源码
$PY $S/scripts/tk_app.py home_hy_app sp-dump --names "CPM_SP_GA_001,CPM_SP_GA_005,CPM_SP_GA_006"

# ④ 全库报表×程序挂载映射
$PY $S/scripts/tk_scan_launchers.py home_hy_app --out launchers.csv

10.2 关键 SQL

-- 流程表(导航页)的链接清单:直接从 XML 抽 Hyperlink
-- 见 tk_flow.py 的 parse_nav():遍历 templates → ReportTemplateVO → actionLists → HyperlinkNN
-- 目标报表由 DimensionOid 的 PROSPETTO 前缀给出

-- ① P0-1 哨兵:白名单外实体
SELECT COUNT(DISTINCT COD_AZIENDA) AS 实际实体数 FROM DATI_SALDI_LORDI
WHERE COD_DEST5='ZH20402_01' AND COD_CONTO IN ('A_COM_003','A_COM_004');
-- 对比 DATI_NOTE 中 GAH00_022 / NOTE='Y' 的实体数

-- ② P0-2 哨兵:GA07_INP 重复
SELECT COD_SCENARIO, COD_CATEGORIA, COD_AZIENDA, COD_PERIODO, COD_CONTO, COD_DEST4, COUNT(*)
FROM DATI_SALDI_LORDI WHERE COD_DEST2='GA07_INP'
GROUP BY COD_SCENARIO, COD_CATEGORIA, COD_AZIENDA, COD_PERIODO, COD_CONTO, COD_DEST4
HAVING COUNT(*) > 1;

-- ③ P0-3 缺口:FW 层有、表单口径外
SELECT COD_CONTO, COD_DEST4, COUNT(*) FROM DATI_SALDI_LORDI
WHERE COD_DEST2='GA04.01' AND COD_DEST1='PART000' AND COD_DEST3='PRO_NONE' AND COD_DEST5='ZZ2_NONE'
GROUP BY COD_CONTO, COD_DEST4 ORDER BY 3 DESC;

-- ④ P1-2 哨兵:流程状态覆盖
SELECT COUNT(DISTINCT COD_AZIENDA) FROM DATI_SALDI_LORDI
WHERE COD_CONTO='A_COM_028' AND COD_DEST2 IN ('WF02','WF03')
AND COD_CATEGORIA=@CAT AND COD_SCENARIO=@SCE;

10.3 交付物清单

文件 内容
2026年度预算-GA编制-V0到V1链路解析-20260911-V2流程表驱动版.md 本报告
流程表-报表使用清单-A1500-A1502_01-A1501_01-20260911.csv 三张流程表的链接级明细(1176 行,含版本上下文与挂载程序)
报表挂载程序全库扫描-TGK_PROD-20260911.csv 全库报表 × 程序挂载映射
FW-AW归属全库扫描-TGK_PROD-20260910.csv 全库矩阵级 FW/AW 归属

10.4 与上一版报告的差异

上一版(20260911.md) 本版
分析起点 存储过程 流程表(导航页)
链路骨架 程序调用链 轮次 × 角色 × 报表
V0 部门线 缺失 ✅ 补入(A0703_10/11/12/16
V1 主入口 A070205_039/040/041 ✅ 补入 A070205_01/011/012/013/038
HR / IT / 总部线 未覆盖 ✅ 四线齐备
压实版 未覆盖 ✅ 补入(A2301xx
GA_006 P0 风险 未发现 新增,最严重
V1 vs V2+ 的 RUN04 差异 未识别 ✅ 识别
GA_006 官方注释的"等分六大类" ✅ 识别为已注释(文档与实现不符)

上一版报告保留作为程序视角的补充材料,但链路结论以本版为准