หลังจากโดนมรสุมงานไปจนวันหยุดเดือนเมษา หายวับไปกับรายงานแบงค์ชาติ 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 "Associate Reviews" - ส่งข้อมูลต่อ เพื่อจัดการประชุมครับ โดยมีเงื่อนไขที่จำเป็น ดังนี้
- Field "RequiredNumOfPeers" - จำนวนคณะกรรมการทั้งหมด ใน BPMN หมายถึงค่า loopCardinality ที่ใช้กำหนดจำนวน Instance สูงสุดของ Task นั้นๆ
- Field "RequiredMinNumofPeer" - จำนวนคณะกรรมการขั้นต่ำที่ต้องเข้าร่วมการตัดสินใจ
- Field "RequiredNumOfApproval" - ผลการประชุมเท่าไหร่ จึงจะถึงว่าคำร้องของมอบรางวัลถึงจะได้รับการอนุมัติ
- ตัวอย่างจากแบบจำลองได้กำหนดไว้ว่า ต้องมีคณะกรรมการ 3 คน โดยต้องมีอย่างน้อย 2 คนเข้าร่วมตัดสินใจ ซึ่งผลการอนุมัติต้องมีอย่างน้อย 2 คนทำการอนุมัติ
- Task "Setup Reviews" - ถ้าเป็นงานสมัยก่อนเตรียมเอกสาร และแบบฟอร์มการอนุมัติครับ แต่นี่เป็น BPMN แล้ว ให้ระบบจัดการเอาครับ โดยผมได้ใช้ List แทนใบอนุมัติของกรรมการทั้ง 3 ท่านครับ
- 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 ท่าน ได้เข้าร่วมการประเมินครับ ซื่งสามารถกำหนดเงื่อนไขได้ ดังนี้
- Loop Cadinality - เอาค่าจากตัวแปร
//เงื่อนไขทาง 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.