[BPMN] ตัวอย่าง multiInstanceLoopCharacteristics

หลังจากโดนมรสุมงานไปจนวันหยุดเดือนเมษา หายวับไปกับรายงานแบงค์ชาติ DataSet เดือนนี้ ผมเริ่มมีเวลาว่างแล้วครับ โดยจาก Blog ตอนก่อนที่เขียนเกี่ยวกับ BPMN ไปในเรื่องของ Loop หรือ การทำซ้ำ ที่จะเน้นไปในตัวของ StandardLoopCharacteristics สำหรับใน Blog ตอนนี้เป็นตัวอย่างของ multiInstanceLoopCharacteristics ครับ

ความแตกต่างระหว่าง StandardLoopCharacteristics  กับ multiInstanceLoopCharacteristics  ครับ

  • StandardLoopCharacteristics - ใช้มองเหมือน for-loop ทั่วไปครับ โดยที่ Activity หรือ Task มีเพียง 1 Instance เท่านั้นครับ
  • multiInstanceLoopCharacteristics - เป็น Loop เหมือนกันครับ แต่ทำงานในลักษณะของขนานกันครับ มีหลาย Instance ทำงานพร้อมๆกันครับ โดยถ้าในมุมของโปรแกรมมิ่ง มันเป็นเรื่องของการแตก Thread จัดการกับพวก Concurrent ครับ ถ้าใน C# ให้นึกถึง Parallel.ForEach ครับ
Parallel.ForEach(collections,
                 currentElement =>
{
   //Process Somethings !!!
});

มาดูตัวอย่างของ multiInstanceLoopCharacteristics กันดีกว่า

อ่านผ่านๆมา หลายคนน่าจะงงครับ คราวนี้ลองมาดูตัวอย่างกันครับ โดยกระบวนการตัวอย่างที่ผมเขียนใน Blog เป็นกระบวนการของการขอเสนอรางวัลให้กับพนักงานดีเด่นครับ โดยผู้จัดการ(Manager) User Mary ต้องเสนอชื่อ เพื่อให้คณะกรรมการ(Reward Commitee) ซึ่งประกอบไปด้วย User Jame, Peter และ John ทำการตรวจสอบ และอนุมัติ ดังรูป

กระบวนการของการขอเสนอรางวัลให้กับพนักงานดีเด่น
- กระบวนการมีขั้นตอน ดังนี้ครับ
  • Task "Enter Employee who shall receive Reward" - เป็นการใส่ข้อมูลของพนักงานที่ควรได้รับรางวัล ได้แก่ ข้อมูลพนักงาน และผลรวมที่ผ่านมารวมทั้งเงินรางวัลที่ต้องการมอบครับ
    Note: อันนี้เป็น Default UI ของ BPMN Engine นะ ถ้าทำพวก Frontend เชี่ยวๆ อย่าง Angular เอามาเสียบได้
Task "Enter Employee who shall receive Reward"
  • Task "Associate Reviews" - ส่งข้อมูลต่อ เพื่อจัดการประชุมครับ โดยมีเงื่อนไขที่จำเป็น ดังนี้
    • Field "RequiredNumOfPeers" - จำนวนคณะกรรมการทั้งหมด ใน BPMN หมายถึงค่า  loopCardinality ที่ใช้กำหนดจำนวน Instance สูงสุดของ Task นั้นๆ
    • Field "RequiredMinNumofPeer" - จำนวนคณะกรรมการขั้นต่ำที่ต้องเข้าร่วมการตัดสินใจ
    • Field "RequiredNumOfApproval" - ผลการประชุมเท่าไหร่ จึงจะถึงว่าคำร้องของมอบรางวัลถึงจะได้รับการอนุมัติ
    • ตัวอย่างจากแบบจำลองได้กำหนดไว้ว่า ต้องมีคณะกรรมการ 3 คน โดยต้องมีอย่างน้อย 2 คนเข้าร่วมตัดสินใจ ซึ่งผลการอนุมัติต้องมีอย่างน้อย 2 คนทำการอนุมัติ
Task "Associate Reviews"
  • Task "Setup Reviews" - ถ้าเป็นงานสมัยก่อนเตรียมเอกสาร และแบบฟอร์มการอนุมัติครับ แต่นี่เป็น BPMN แล้ว ให้ระบบจัดการเอาครับ โดยผมได้ใช้ List แทนใบอนุมัติของกรรมการทั้ง 3 ท่านครับ
Sub-Process "Evaluate Process"
  • Sub-Process "Evaluate Process" - เป็น Sub Process ครับ ซึ่งเป็น  multiInstanceLoopCharacteristics โดยกิจกรรมนี้ จะสิ้นสุดเมื่อมีกรรมการ 2 ใน 3 ท่านเข้าร่วมครับ โดยในแบบจำลองมีการตั้งค่า ดังนี้ครับ
    • Loop Cadinality - เอาค่าจากตัวแปร ${RequiredNumOfPeers} ที่กำหนดมาจาก Task Associate Reviews
    • Collection - Data ที่ใช้ใน multiInstanceLoopCharacteristics ครับ โดยช้อมูลชุดนี้เกิดจาก Task Setup Reviews ที่สร้าง List ชื่อ ${reviewsResults} ที่มีขนาดเท่ากับ ${RequiredNumOfPeers} ถ้าในตัวอย่างเท่ากับ 3 ซึ่งในแต่ละ Instance ของ Task เห็นตัวแปร reviewsResult(Object แต่ละอันใน List reviewsResults) ซึ่งประกาศไว้ในส่วน  element ในรูปแบบ 1 Instance ต่อ 1 Object ครับ
    • completionCondition ครับ ซึ่งถ้าเงื่อนไขเป็นจริง ก็จะออกจาก  multiInstanceLoopCharacteristics ครับ โดยเงื่อนไขทาง Business คือ กรรมการ 2 ใน 3 ท่าน ได้เข้าร่วมการประเมินครับ ซื่งสามารถกำหนดเงื่อนไขได้ ดังนี้
//เงื่อนไขทาง Business คือ กรรมการ 2 ใน 3 ท่าน ได้เข้าร่วมการประเมินครับ ส่วนอันหลังผมกำหนดขึ้น เพราะตรวจสอบว่าระหว่างที่ทำ Process ข้อมูลไม่ได้ถูกเพิ่มปรับแต่งอะไร
${(nrOfCompletedInstances >= RequiredMinNumofPeer) && (reviewsResults.size() == nrOfInstances)}

กลับมาดูที่กิจกรรมย่อยๆ ภายใน Sub-Process "Evaluate Process"

  • Task "Evaluate Award" - งานในส่วนนี้เป็นของ RewardCommittee (กำหนดเป็น Group ไว้ในตัว BPMN Engine) ที่เข้ามาเลือก Task และรับงานไปทำต่อ (Claim Task) ซึ่งในงานของกรรมการแต่ละท่าน คือ ตรวจสอบข้อมูล และทำการอนุมัติครับ
  • Task "Update Result" - บันทึกผมการอนุมัติเข้าระบบครับ

Note: เมื่อ Execute Process มาจนถึง Step "Evaluate Process" สิ่งที่ระบบทำ คือ สร้าง Instance ขึ้นมา 3 Instance ครับ เพื่อให้คณะกรรมการ 3 ท่าน เข้ามาพิจารณารับงานไปทำต่อ (Claim Task) ครับ

หลังจากผ่าน Sub Process เรียบร้อยมาทำงานในส่วนที่เหลือตาม Flow ได้แก่ Task "Calculate results" / Excustive Gateway "Is Approved Award"

  • Task "Calculate results" - นำผลลัพธ์ของกรรมการทุกท่าน มาคำนวณคะแนนสุดท้ายครับ นำคะแนนที่ได้ไปผ่านเงื่อนไขตาม Sequence Flow ครับ
  • Excustive Gateway "Is Approved Award" - ตรวจผลการอนุมัติ โดยเงื่อนไขอยู่ใน conditionExpression ของ Sequence Flow ครับ
    • Task "Note Personnel File Approved" - อนุมัติ
    • Task "Note Personnel File Rejected" - ไม่อนุมัติ
- Source Code (BPMN File)

อ่านมานานแล้วมาดู Source Code ใน GitHub ดีกว่าครับ


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.