8. Görev Sonuçları (Ağ Geçidi Kararları)

Kural: Eğer bir görev bir Özel Ağ Geçidine (Exclusive Gateway) yönlendiriyorsa, bu görevin kararı yakalamak için enum türünde bir form özelliğine sahip olması zorunludur.

Neden

  • Kullanıcı arayüzü, enum seçeneklerini otomatik olarak radyo düğmeleri (≤4 seçenek) veya açılır liste (>4 seçenek) olarak oluşturur
  • Ağ geçidi koşullarını BPMN XML'inden ayrıştırmaya gerek kalmaz
  • Seçilen seçenek, ağ geçidinin değerlendirdiği bir süreç değişkeni haline gelir

Tam Örnek

<!-- User Task with Decision Enum -->
<userTask id="managerReview" name="Manager Review" flowable:assignee="manager1@workingflow.com">
    <extensionElements>
        <activiti:formProperty id="decision" name="Decision" type="enum" required="true">
            <activiti:value id="approved" name="Approve Request"/>
            <activiti:value id="rejected" name="Reject Request"/>
            <activiti:value id="needinfo" name="Need More Information"/>
        </activiti:formProperty>
    </extensionElements>
</userTask>

<!-- Gateway evaluates the decision variable -->
<exclusiveGateway id="decisionGateway"/>

<sequenceFlow id="flow_approved" sourceRef="decisionGateway" targetRef="approvedTask">
    <conditionExpression xsi:type="tFormalExpression">${decision == 'approved'}</conditionExpression>
</sequenceFlow>

<sequenceFlow id="flow_rejected" sourceRef="decisionGateway" targetRef="rejectedTask">
    <conditionExpression xsi:type="tFormalExpression">${decision == 'rejected'}</conditionExpression>
</sequenceFlow>

<sequenceFlow id="flow_needinfo" sourceRef="decisionGateway" targetRef="requestInfoTask">
    <conditionExpression xsi:type="tFormalExpression">${decision == 'needinfo'}</conditionExpression>
</sequenceFlow>

Desteklenen Ağ Geçidi İfadeleri

Flowable, ifadeleri çalışma zamanında değerlendirir. Hesaplamaları ve karşılaştırmaları, Script/Hizmet Görevlerine (Script/Service Tasks) ihtiyaç duymadan doğrudan ağ geçidi koşullarında kullanabilirsiniz:

İşlem Örnek Açıklama
Aritmetik ${quantity * price > 1000} Toplama, çıkarma, çarpma, bölme
Karşılaştırma ${total > 100}, ${status == 'approved'} Eşittir, eşit değildir, büyüktür/küçüktür
Metin Birleştirme (String Concatenation) ${firstName + ' ' + lastName} Metin değerlerini birleştirir
Metin Yöntemleri (String Methods) ${name.startsWith('A')}, ${email.contains('@')} Java String metotlarını çağırır
Mantıksal İşlemler (Boolean Logic) ${approved && amount < 5000} VE (&&), VEYA (`
Tarih Karşılaştırması ${endDate.after(startDate)}, ${endDate.before(startDate)} java.util.Date değerlerini karşılaştırır

İpucu: Hesaplanan sonuçları önce bir değişkende saklamanıza gerek yoktur; ifadenin tamamını doğrudan <conditionExpression> içine yazabilirsiniz.