Riski parça listesinde değil, ağaçta gör
Modern bir jet motoru on binlerce parçadan oluşur ve her parçanın iki gizli boyutu vardır: parası nereye gidiyor, ve hangi ülkeye bağımlı. Bir hammadde tedarikçisi yaptırım uygulanan bir ülkedeyse, bu risk yerel kalmaz — o parçayı kullanan her alt sistem üzerinden yukarı doğru sessizce yayılır. Bu proje, bu yayılımı 6 gerçek TEI motor ailesi üzerinde canlı olarak hesaplayan ve görselleştiren uçtan uca bir SAP sistemi kuruyor: özyinelemeli bir ABAP rollup sınıfı, tedarikçi bilgisiyle zenginleştirilmiş bir CDS hiyerarşisi ve freestyle bir SAPUI5 TreeTable arayüzü.
Bu motorun gerçek maliyeti ne, tedarik zinciri ne kadar yerli, ve hangi tek tedarikçi ambargoya girse tüm motoru riske atar?
Neler kuruldu
-
Özyinelemeli BOM rollup'ı
Bir ABAP OOP sınıfı ağacı kökten aşağıdan yukarıya dolaşıp her düğüm için — kök dahil — toplam maliyet, yerlilik oranı ve risk bayrağını hesaplıyor.
-
6 gerçek motor ailesi
TEI-TF6000, PD170, TS1400, TF10000, TJ90 ve TP38 tek sistemde — 159 BOM düğümü, 13 tedarikçi, her motorun rakamları gerçek kamuya açık verilerle bağımsız doğrulandı.
-
Bağımsız risk vs. yerlilik metrikleri
Bir parça yabancı-ama-güvenli (AB/müttefik tedarikçi) veya yerli-ama-riskli (hammaddesi ambargolu yerli dövme bir parça) olabiliyor — veri modeli bu iki boyutu gerçekten ayrı tutuyor.
-
Canlı what-if simülasyonu
Bir tedarikçinin ambargo anahtarını aç, riskin ağaçta yaprak parçadan köke doğru nasıl yayıldığını (bubble-up) anında izle.
-
What-if için gerçek SAP kaydı
"SAP'ye Kaydet" sadece simüle etmiyor —
SupplierSetüzerinde gerçek ODataMERGEçağrısı gönderiyor, CSRF token yönetimiyle birlikte. -
Tedarikçi risk tooltip'i
Bir risk ikonunun üzerine gelmek, yaprak parçalar için gerçek tedarikçi/ülke/risk notunu, üst düğümler için ise riskin bir alt parçadan miras alındığını gösteriyor.
-
Excel'e aktarma
Hem Genel Bakış özeti hem de herhangi bir motorun tam BOM ağacı, doğru ondalık biçimlendirmesiyle filtrelenebilir bir
.xlsxdosyasına aktarılabiliyor.
Kökten yaprağa değil, yapraktan köke
Rollup algoritması ZCL_TEI_BOM_ROLLUP'ın kalbi — her düğüm için önce kendi maliyeti/yerliliği/riski hesaplanıyor, sonra tüm alt düğümlerden özyinelemeli olarak gelen sonuçlar toplanıp yukarı taşınıyor.
Düğümün kendi maliyeti hesaplanır
own_cost = unit_cost × quantity — ve eğer düğümün kendi tedarikçisi varsa, ülkesi TR mi diye bakılır (yerlilik) ve ambargolu mu diye bakılır (risk) — iki bağımsız kontrol.
Her alt düğüm için özyineleme
process_node, PARENT_NODE_ID = iv_node_id olan her çocuk için kendini tekrar çağırıyor ve dönen total_cost/local_cost/is_risky değerlerini kendi toplamına ekliyor.
Risk asla aşağı gizlenmez
Hiçbir alt parça ambargolu değilse, düğüm yeşil işaretlenir.
Herhangi bir alt parça ambargoluysa, is_risky köke kadar true olarak taşınır.
Üç tablo, kendine referans veren bir ağaç
BOM_ID içinde bir motoru, kendine referans veren NODE_ID/PARENT_NODE_ID çifti ağacın tamamını, ve her kalemin isteğe bağlı SUPPLIER_ID'si risk verisini taşıyor.
- BOM_ID (key)
- PRODUCT_NAME · PRODUCT_TYPE
- CREATED_BY · CREATED_ON
- NODE_ID (key) · PARENT_NODE_ID
- PART_NUMBER · PART_DESC
- QUANTITY · UNIT_COST · CURRENCY
- SUPPLIER_ID →
- SUPPLIER_ID (key)
- SUPPLIER_NAME · COUNTRY_CODE
- IS_EMBARGOED · RISK_LEVEL
- RISK_NOTE
Simülasyondan gerçek SAP kaydına
What-if anahtarı önce tamamen istemci tarafında çalışıyor — hiçbir şey kaydedilmeden riskin ağaçta nasıl yayıldığını serbestçe deneyebiliyorsun. Değişiklik gerçek olmalıysa, "SAP'ye Kaydet" bunu gerçek bir OData yazma işlemine dönüştürüyor.
Neyle inşa edildi
| Kalem | Bileşen | Detay |
|---|---|---|
| B-01 | SAP Gateway servisi | OData V2, klasik SEGW — ZTEI_BOM_SRV_SRV |
| B-02 | Rollup motoru | Özyinelemeli ABAP OOP sınıfı, ZCL_TEI_BOM_ROLLUP |
| B-03 | Güncellenebilir entity | SupplierSet — GetEntity + UpdateEntity (MERGE) implementasyonu |
| B-04 | Hiyerarşi view'ı | CDS View, self-association'lar, ZTEI_I_BOM_HIERARCHY |
| Kalem | Bileşen | Detay |
|---|---|---|
| F-01 | UI framework | Freestyle SAPUI5 — Fiori Elements değil, hiyerarşik TreeTable için |
| F-02 | Runtime | SAPUI5 / OpenUI5 1.120.0 |
| F-03 | Ağaç kontrolü | sap.ui.table.TreeTable, client-side ClientTreeBinding |
| F-04 | Excel'e aktarma | sap.ui.export.Spreadsheet, doğru EdmType/scale ayarı |
CDS View: tedarikçi bilgisiyle zenginleştirilmiş hiyerarşi
ZTEI_I_BOM_HIERARCHY, her BOM kalemini tedarikçisiyle birleştiriyor ve ağacı self-association'lar üzerinden modelliyor — OData katmanı bunu ABAP rollup'ın dolaştığı JSON hiyerarşisini kurmak için kullanıyor.
define view ZTEI_I_BOM_HIERARCHY as select from ztei_bom_item as item left outer join ztei_supplier_ri as supplier on item.supplier_id = supplier.supplier_id association [0..1] to ZTEI_I_BOM_HIERARCHY as _Parent on $projection.ParentNodeId = _Parent.NodeId and $projection.BomId = _Parent.BomId association [0..*] to ZTEI_I_BOM_HIERARCHY as _Children on _Children.ParentNodeId = $projection.NodeId and _Children.BomId = $projection.BomId { key item.bom_id as BomId, key item.node_id as NodeId, item.parent_node_id as ParentNodeId, … supplier.is_embargoed as IsEmbargoed, supplier.risk_note as RiskNote, _Parent, _Children }
Neyin gerçek, neyin kurgusal olduğu
Demo motoru TEI-TF6000 uydurma bir isim olarak başladı ve gerçek bir TEI ürünü olduğu ortaya çıktı: Türkiye'nin yerli geliştirilen ilk askeri turbofan'ı. Risk modeli o andan sonra rastgele sayılar yerine kaynak gösterilmiş gerçek olaylar (VSMPO-AVISMA'nın Rusya titanyum hakimiyeti, ABD GAO'nun Çin sahte elektronik parça raporu, OFAC İran yaptırımları, TEI'nin kendi 20+ yerli süperalaşım Ar-Ge iddiası) etrafında yeniden kuruldu.
SupplierSet.IsEmbargoed'u yazıyor; BOM yapısını değiştirmiyor.Uygulamalı bir SAP Fiori · ABAP OOP · CDS öğrenme ve portföy projesi olarak geliştirilmiştir.