4.11. Kural Tabloları#
BPMN uygulamasında; belirli girdilerin belirli ön şartları sağlamasına bağlı olarak, belirli çıktıları verdiği kural (karar) tablolarını tanımlama ve girdilere göre kuralları işleterek beklenen çıktıyı verme yeteneği vardır. Bu yetenek, Flowable'in DMN modülü ile sağlanır.
DMN Nedir?#
DMN (Decision Model and Notation), iş kurallarını ve karar tablolarını standart bir formatta tanımlamak için kullanılan bir modeldir. Flowable BPMN motoru, DMN formatındaki karar tablolarını çalıştırarak iş süreçlerinde otomatik kararlar alınmasını sağlar.
Yetenekler#
-
Excel formatında hazırlanan karar tabloları içe aktarılarak, arka planda otomatik olarak Flowable DMN formatına dönüştürülür ve sisteme yüklenir. Böylece; teknik bilgi gerektirmeden karar tabloları oluşturulabilir.
-
Standart DMN formatındaki dosyalar içe aktarılabilir.
-
bpmn-lib library'si ile listeleme ve yükleme işlemleri arayüzden yönetilebilir.
-
Uygulamanın
/executerest ucu çağırılarak, tanımlı kural tabloları çalıştırılabilir. Örnek istek aşağıdaki gibidir:
``` http request POST /process/decision/execute Content-Type: application/json { "key": "krediRiskHesaplama", "variables": { "yas": 30, "gelir": 7500, "calismaDurumu": "SERBEST" } }
Bu istek sonucunda beklenen çıktı aşağıdaki gibidir:
``` json
{
"body": {
"key": "krediRiskHesaplama",
"variables": {
"riskSeviyesi": "DUSUK",
"krediLimiti": 50000
}
}
}
- Süreç Yöneticisi yetkisine (
bpmn) sahip kullanıcılar, kural tablosu yükleme ve silme işlemlerini yönetir. Süreç Görüntüleyicisi (bpmn:designer:view) yetkisine sahip kullanıcılar, sadece kural tablolarını listeleme işlemi yapabilir. Kural tablosunun çalıştırılıp çıktı alınması işlemi ise herhangi bir yetkiye bağlı değildir.
Uyarı
Bu yeteneklerin Bpmn uygulamasında kullanılabilmesi için "BPMN_DMN_ENABLED" parametresi true olmalıdır.
EXCEL DOSYASI YAPISI#
Excel dosyanız mutlaka iki sheet içermelidir:
⚠️ ÖNEMLİ: Sheet isimleri tam olarak
CONFIGveDECISION_TABLEolmalıdır. Büyük/küçük harf duyarlıdır.
CONFIG SHEET#
CONFIG SHEET'i karar tablonuzun temel ayarlarını içerir.
Parametre Tablosu:#
| Parametre | Zorunlu | Varsayılan | Açıklama |
|---|---|---|---|
| DMN_KEY | ✅ Evet | - | Sistemde bu karar tablosunu tanımlayan benzersiz anahtar. Execute işleminde bu değer kullanılır. |
| DMN_NAME | ✅ Evet | - | Karar tablosunun kullanıcı dostu adı. |
| HIT_POLICY | ❌ Hayır | FIRST | Birden fazla kural eşleştiğinde nasıl davranılacağını belirler. |
| FORCE_DMN11 | ❌ Hayır | true | DMN 1.1 standardına uyumluluk. |
DMN_KEY Yazım Kuralları:#
✅ DOĞRU ÖRNEKLER:
- krediRiskHesaplama
- otvOranBelirle
- musteriSegmentasyon
- risk_hesaplama_v2
❌ YANLIŞ ÖRNEKLER:
- Kredi Risk Hesaplama (boşluk var)
- krediRiskHesaplaması (Türkçe karakter)
- 123kredi (sayı ile başlıyor)
HIT_POLICY Seçenekleri:#
| Policy | Davranış | Kullanım Alanı |
|---|---|---|
| FIRST | İlk eşleşen kural sonucunu döndürür | En yaygın kullanım. Öncelik sırasına göre kurallar |
| UNIQUE | Sadece bir kural eşleşmeli, birden fazla eşleşme hata verir | Kuralların çakışmaması gereken durumlar |
| ANY | Birden fazla kural eşleşebilir ama aynı sonucu vermeli | Tutarlılık kontrolü gereken durumlar |
| PRIORITY | En yüksek öncelikli sonucu döndürür | Öncelik bazlı kararlar |
| COLLECT | Tüm eşleşen kuralların sonuçlarını liste olarak döndürür | Çoklu sonuç gereken durumlar |
CONFIG Örneği:#
┌─────────────┬─────────────────────────┐
│ DMN_KEY │ musteriKrediLimiti │
├─────────────┼─────────────────────────┤
│ DMN_NAME │ Müşteri Kredi Limiti │
├─────────────┼─────────────────────────┤
│ HIT_POLICY │ FIRST │
├─────────────┼─────────────────────────┤
│ FORCE_DMN11 │ true │
└─────────────┴─────────────────────────┘
DECISION_TABLE#
Satır Yapısı:#
┌─────────────────────────────────────────────────────────┐
│ Satır 1: Kolon Tipleri (INPUT / OUTPUT) │
├─────────────────────────────────────────────────────────┤
│ Satır 2: Etiketler (Görünen İsimler) │
├─────────────────────────────────────────────────────────┤
│ Satır 3: Değişken Adları (Kod İsimleri) │
├─────────────────────────────────────────────────────────┤
│ Satır 4: Veri Tipleri (string/number/boolean/date) │
├─────────────────────────────────────────────────────────┤
│ Satır 5: Kural 1 │
├─────────────────────────────────────────────────────────┤
│ Satır 6: Kural 2 │
├─────────────────────────────────────────────────────────┤
│ ... ... │
└─────────────────────────────────────────────────────────┘
Kolon Tipleri (Satır 1):#
| Tip | Açıklama |
|---|---|
| INPUT | Karar vermek için kullanılan giriş değişkenleri |
| OUTPUT | Karar sonucunda döndürülecek çıkış değerleri |
💡 İpucu: Önce tüm INPUT kolonlarını, sonra OUTPUT kolonlarını sıralayın.
Değişken Adı Yazım Kuralları (Satır 3):#
✅ DOĞRU ÖRNEKLER:
- musteriYasi
- aylikGelir
- aktifMi
- krediNotu
❌ YANLIŞ ÖRNEKLER:
- müşteri yaşı (Türkçe karakter ve boşluk)
- Müşteri-Yaşı (Türkçe karakter ve tire)
- 1musteriYasi (sayı ile başlıyor)
Veri Tipleri (Satır 4):#
| Veri Tipi | Açıklama | Örnek Değerler |
|---|---|---|
| string | Metin değerleri | "YUKSEK", "DUSUK", "AKTIF" |
| number | Sayısal değerler (tam sayı veya ondalık) | 100, 3.14, -50 |
| boolean | Mantıksal değerler | true, false |
| date | Tarih değerleri | 2024-01-15 |
OPERATÖR KULLANIM KILAVUZU#
📌 BOŞ DEĞER / HERHANGİ BİR DEĞER#
Hücreyi boş bırakın veya - yazın. Bu, "herhangi bir değer olabilir" anlamına gelir.
┌──────────────┬─────────────┬──────────────┐
│ Yaş (INPUT) │ Gelir │ Sonuç │
├──────────────┼─────────────┼──────────────┤
│ - │ > 5000 │ "ONAY" │ ← Yaş ne olursa olsun, gelir > 5000 ise ONAY
│ │ <= 5000 │ "RED" │ ← Boş hücre de aynı anlama gelir
└──────────────┴─────────────┴──────────────┘
📌 EŞİTLİK OPERATÖRÜ (==)#
Belirli bir değere eşit olup olmadığını kontrol eder.
Yazım Formatı:
Ek olarak; hücrede herhangi bir operator olmaması durumunda da eşitlik kontrolü uygulanır.
┌──────────────┬─────────────┬──────────────┐
│ Yaş (INPUT) │ Kredi Notu │ Sonuç │
├──────────────┼─────────────┼──────────────┤
│ - │ Geçerli │ "ONAY" │ ← =="Geçerli" demektir
│ │ Geçersiz │ "RED" │ ← =="Geçersiz" demektir
└──────────────┴─────────────┴──────────────┘
Örnekler:
| Veri Tipi | Excel'de Yazım | Anlamı |
|---|---|---|
| string | == "ALTIN" | Değer "ALTIN" mı? |
| number | == 100 | Değer 100'e eşit mi? |
| boolean | == true | Değer true mu? |
┌─────────────────┬─────────────┬──────────────┐
│ Segment (INPUT) │ VIP (INPUT) │ İndirim │
├─────────────────┼─────────────┼──────────────┤
│ == "ALTIN" │ == true │ 20 │
│ == "GUMUS" │ == true │ 15 │
│ == "BRONZ" │ - │ 5 │
└─────────────────┴─────────────┴──────────────┘
📌 EŞİT DEĞİL OPERATÖRÜ (!=)#
Belirli bir değere eşit olmadığını kontrol eder.
Yazım Formatı:
Örnekler:
┌─────────────────┬──────────────┐
│ Durum (INPUT) │ İşlem │
├─────────────────┼──────────────┤
│ != "IPTAL" │ "DEVAM" │ ← Durum "IPTAL" değilse DEVAM
│ == "IPTAL" │ "DURDUR" │ ← Durum "IPTAL" ise DURDUR
└─────────────────┴──────────────┘
📌 KARŞILAŞTIRMA OPERATÖRLERİ (<, <=, >, >=)#
Sayısal değerleri karşılaştırmak için kullanılır.
Yazım Formatı:
Örnekler:
┌─────────────────┬─────────────────┬──────────────┐
│ Yaş (INPUT) │ Gelir (INPUT) │ Risk │
├─────────────────┼─────────────────┼──────────────┤
│ < 25 │ < 5000 │ "YUKSEK" │ ← Yaş 25'ten küçük VE Gelir 5000'den az
│ >= 25 │ >= 5000 │ "DUSUK" │ ← Yaş 25 veya üzeri VE Gelir 5000 veya üzeri
│ < 18 │ - │ "RED" │ ← Yaş 18'den küçükse (gelir fark etmez)
│ > 65 │ - │ "OZEL" │ ← Yaş 65'ten büyükse
└─────────────────┴─────────────────┴──────────────┘
📌 ARALIK OPERATÖRÜ (BETWEEN)#
Bir değerin belirli bir aralıkta olup olmadığını kontrol eder. Sınır değerler dahildir.
Yazım Formatı:
Örnekler:
┌─────────────────────┬──────────────┐
│ Puan (INPUT) │ Not │
├─────────────────────┼──────────────┤
│ BETWEEN:90,100 │ "AA" │ ← 90 ile 100 arasında (90 ve 100 dahil)
│ BETWEEN:80,89 │ "BA" │ ← 80 ile 89 arasında
│ BETWEEN:70,79 │ "BB" │ ← 70 ile 79 arasında
│ BETWEEN:60,69 │ "CB" │ ← 60 ile 69 arasında
│ BETWEEN:0,59 │ "FF" │ ← 0 ile 59 arasında
└─────────────────────┴──────────────┘
⚠️ DİKKAT: Virgülden önce ve sonra boşluk bırakmayın:
BETWEEN:10,100✅ |BETWEEN: 10, 100❌
📌 LİSTE İÇİNDE OPERATÖRÜ (IS_IN)#
Bir değerin belirli bir liste içinde olup olmadığını kontrol eder.
Yazım Formatı:
Örnekler:
┌────────────────────────────┬─────────────────┬──────────────┐
│ Sehir (INPUT) │ Bolge (INPUT) │ Kargo Ucreti │
├────────────────────────────┼─────────────────┼──────────────┤
│ IS_IN:Istanbul,Ankara,Izmir│ - │ 15 │ ← 3 büyük şehir
│ IS_IN:Bursa,Antalya,Adana │ - │ 25 │ ← Diğer büyük şehirler
│ - │ == "DOGU" │ 45 │ ← Doğu bölgesi
│ - │ - │ 35 │ ← Varsayılan
└────────────────────────────┴─────────────────┴──────────────┘
Araç Sınıfı Örneği (OTV Hesaplama gibi):
┌──────────────────────────────────┬──────────────┐
│ AracSinifi (INPUT) │ OTV Orani │
├──────────────────────────────────┼──────────────┤
│ IS_IN:M1,M1G │ "45" │ ← Binek araçlar
│ IS_IN:N1,N1G,N2,N3 │ "18" │ ← Ticari araçlar
│ IS_IN:M2,M2G,M3 │ "1" │ ← Otobüsler
│ IS_IN:L1,L2,L3 │ "22" │ ← Motosikletler
└──────────────────────────────────┴──────────────┘
📌 LİSTE DIŞINDA OPERATÖRÜ (NOT_IN)#
Bir değerin belirli bir liste içinde olmadığını kontrol eder.
Yazım Formatı:
Örnekler:
┌────────────────────────────┬──────────────┐
│ Durum (INPUT) │ İşlem │
├────────────────────────────┼──────────────┤
│ NOT_IN:IPTAL,ASKIDA,BEKLE │ "ISLE" │ ← Bu durumlardan biri değilse işle
│ IS_IN:IPTAL,ASKIDA,BEKLE │ "BEKLET" │ ← Bu durumlardan biriyse beklet
└────────────────────────────┴──────────────┘
OUTPUT (ÇIKIŞ) DEĞERLERİ YAZIM KURALLARI#
String (Metin) Çıkışlar:#
Mutlaka çift tırnak içinde yazın:
Sayısal Çıkışlar:#
Tırnak kullanmadan yazın:
Boolean Çıkışlar:#
KURAL SIRASI VE HIT POLICY#
FIRST Policy ile Kural Sırası:#
HIT_POLICY: FIRST kullandığınızda, kurallar yukarıdan aşağıya değerlendirilir ve ilk eşleşen kural uygulanır. Bu nedenle:
YANLIŞ Sıralama:
┌─────────────────┬──────────────┐
│ Yaş (INPUT) │ Kategori │
├─────────────────┼──────────────┤
│ - │ "STANDART" │ ← Her şey buna eşleşir!
│ < 18 │ "COCUK" │ ← Buraya hiç ulaşılmaz
│ > 65 │ "YASLI" │ ← Buraya hiç ulaşılmaz
└─────────────────┴──────────────┘
DOĞRU Sıralama:
┌─────────────────┬──────────────┐
│ Yaş (INPUT) │ Kategori │
├─────────────────┼──────────────┤
│ < 18 │ "COCUK" │ ← Önce spesifik kurallar
│ > 65 │ "YASLI" │
│ - │ "STANDART" │ ← En son varsayılan kural
└─────────────────┴──────────────┘
GERÇEK DÜNYA ÖRNEKLERİ#
Örnek 1: Kredi Risk Değerlendirme#
CONFIG:
| A | B |
|---|---|
| DMN_KEY | krediRiskDegerlendirme |
| DMN_NAME | Kredi Risk Değerlendirme |
| HIT_POLICY | FIRST |
| FORCE_DMN11 | true |
DECISION_TABLE:
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| INPUT | INPUT | INPUT | INPUT | OUTPUT | OUTPUT |
| Yaş | Aylık Gelir | Kredi Notu | Mevcut Borç | Risk Seviyesi | Max Kredi |
| yas | aylikGelir | krediNotu | mevcutBorc | riskSeviyesi | maxKredi |
| number | number | number | number | string | number |
| < 21 | - | - | - | "RED" | 0 |
| - | < 5000 | < 500 | - | "YUKSEK" | 10000 |
| - | < 5000 | >= 500 | - | "ORTA" | 25000 |
| - | >= 5000 | < 500 | > 50000 | "YUKSEK" | 15000 |
| - | >= 5000 | >= 500 | <= 50000 | "DUSUK" | 100000 |
| - | >= 10000 | >= 700 | <= 20000 | "COK_DUSUK" | 250000 |
| - | - | - | - | "ORTA" | 50000 |
Örnek 2: Kargo Ücreti Hesaplama#
CONFIG:
| A | B |
|---|---|
| DMN_KEY | kargoUcretiHesaplama |
| DMN_NAME | Kargo Ücreti Hesaplama |
| HIT_POLICY | FIRST |
| FORCE_DMN11 | true |
DECISION_TABLE:
| A | B | C | D | E |
|---|---|---|---|---|
| INPUT | INPUT | INPUT | OUTPUT | OUTPUT |
| Şehir | Ağırlık (kg) | Üyelik Tipi | Kargo Ücreti | Tahmini Süre |
| sehir | agirlik | uyelikTipi | kargoUcreti | tahminiSure |
| string | number | string | number | string |
| IS_IN:Istanbul,Ankara,Izmir | <= 5 | == "PREMIUM" | 0 | "1-2 gün" |
| IS_IN:Istanbul,Ankara,Izmir | <= 5 | - | 15 | "2-3 gün" |
| IS_IN:Istanbul,Ankara,Izmir | > 5 | == "PREMIUM" | 10 | "1-2 gün" |
| IS_IN:Istanbul,Ankara,Izmir | > 5 | - | 25 | "2-3 gün" |
| - | <= 5 | == "PREMIUM" | 15 | "3-5 gün" |
| - | <= 5 | - | 35 | "4-6 gün" |
| - | > 5 | - | 50 | "5-7 gün" |
Örnek 3: OTV Oranı Belirleme (Karmaşık Örnek)#
CONFIG:
| A | B |
|---|---|
| DMN_KEY | otvOraniBelirleme |
| DMN_NAME | OTV Oranı Belirleme |
| HIT_POLICY | FIRST |
| FORCE_DMN11 | true |
DECISION_TABLE:
| A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|
| INPUT | INPUT | INPUT | INPUT | INPUT | INPUT | OUTPUT |
| Araç Sınıfı | Motor Hacmi | Elektrikli Mi | Koltuk Sayısı | Azami Ağırlık | 4x4 Mü | OTV Oranı |
| aracSinifi | motorHacmi | elektrikliMi | koltukSayisi | azamiAgirlik | dortCekenMi | otvOrani |
| string | number | boolean | number | number | boolean | string |
| IS_IN:M1,M1G | <= 1600 | == false | - | - | == false | "45" |
| IS_IN:M1,M1G | <= 1600 | == false | - | - | == true | "50" |
| IS_IN:M1,M1G | BETWEEN:1601,2000 | == false | - | - | - | "50" |
| IS_IN:M1,M1G | > 2000 | == false | - | - | - | "80" |
| IS_IN:M1,M1G | - | == true | - | - | - | "10" |
| IS_IN:N1,N1G | - | == false | - | <= 3500 | - | "15" |
| IS_IN:N1,N1G | - | == true | - | - | - | "1" |
| IS_IN:M2,M3 | - | - | >= 26 | - | - | "1" |
| IS_IN:M2,M3 | - | - | BETWEEN:10,25 | - | - | "4" |
| - | - | - | - | - | - | "18" |
HATA ÇÖZÜMLEME REHBERİ#
Sık Karşılaşılan Hatalar ve Çözümleri:#
| Hata Mesajı | Olası Sebep | Çözüm |
|---|---|---|
CONFIG sheet bulunamadı | Sheet adı yanlış | Sheet adını tam olarak "CONFIG" yapın |
DECISION_TABLE sheet bulunamadı | Sheet adı yanlış | Sheet adını tam olarak "DECISION_TABLE" yapın |
DMN_KEY değeri tanımlanmamış | CONFIG'de DMN_KEY yok | CONFIG sheet'e DMN_KEY satırı ekleyin |
Geçersiz dosya formatı | .xls veya başka format | Dosyayı .xlsx olarak kaydedin |
En az bir INPUT kolonu tanımlanmalı | INPUT kolonu yok | İlk satırda en az bir INPUT ekleyin |
En az bir OUTPUT kolonu tanımlanmalı | OUTPUT kolonu yok | İlk satırda en az bir OUTPUT ekleyin |
Geçersiz HIT_POLICY | Yanlış policy adı | FIRST, UNIQUE, ANY, PRIORITY veya COLLECT kullanın |
Bu DMN_KEY değerine sahip tablo mevcut | Aynı key ile kayıt var | Farklı DMN_KEY kullanın veya mevcut olanı silin |
BETWEEN operatörü için geçersiz format | Virgül hatası | BETWEEN:10,100 formatında yazın (boşluksuz) |
SIK SORULAN SORULAR (SSS)#
Soru: Aynı DMN_KEY ile yeni versiyon yükleyebilir miyim?#
Cevap: Hayır, önce mevcut karar tablosunu silmeniz gerekir. Ardından aynı key ile yeni tablo yükleyebilirsiniz.
Soru: Kaç tane INPUT/OUTPUT kullanabilirim?#
Cevap: Teknik olarak sınır yoktur, ancak performans için 20'den fazla kolon önerilmez.
Soru: Türkçe karakter kullanabilir miyim?#
Cevap: DMN_NAME ve Label (Satır 2) alanlarında kullanabilirsiniz. DMN_KEY ve Değişken Adı (Satır 3) alanlarında kullanamazsınız.
Soru: Excel'de formül kullanabilir miyim?#
Cevap: Hayır, tüm değerler sabit metin/sayı olmalıdır. Formüller çalışmaz.
Soru: Boş satır bırakabilir miyim?#
Cevap: Evet, kurallar arasında boş satır bırakabilirsiniz. Boş satırlar atlanır.