[BPMN] เพิ่มเติมเกี่ยวกับ multiInstanceLoopCharacteristics

จาก Blog ที่แล้วที่ผมได้เขียนเกี่ยวกับตัวอย่างของ multiInstanceLoopCharacteristics โดยใช้ตัวอย่างเรื่อง กระบวนการของการขอเสนอรางวัลให้กับพนักงานดีเด่น ซึ่งลองเล่นไป เล่นมาแล้วพบปัญหา ดังนี้

  • Task "Evaluate Award" ได้ถูก Assign ให้เป็น Group โดยที่กรรมการแต่ละท่านเลือกไปทำครับ แต่มันสามารถ Claim ซ้ำกันได้ครับ แบบนี้ไม่ดีแน่ครับ
  • ทางแก้ไขหล่ะ
    - แบบที่ 1: แก้ไข Object ของ MultiInstance แล้วให้กำหนด User เป็น Assignee สำหรับ Task นั้นเลย
    - แบบที่ 2: แก้ไขโดยการเพิ่ม Listener แล้วเขียน Code ขึ้นมาตรวจสอบครับ

สำหรับใน Blog นี้ ผมใช้วิธีแรกครับ แต่จะแทรก ตัวอย่างของ Listener เข้าไปด้วยครับ

ลุยกันเลยครับ

สำหรับภาพรวมของกระบวนการ (Process) เหมือนเดิมครับ แต่จะแก้ Coding และ Config ข้างในมากกว่าครับ มาเริ่มกันเลยครับ

ใน Script Task "Setup Reviews" ผมแก้จากการใช้ List มาเป็น Dictionary ครับ โดยให้

  • key = ชื่อคณะกรรมการ
  • และ value = ผลการประเมินครับ ตาม Code ตัวอย่างเลย
//create a collection to hold our multi-instance results.
//ดึงข้อมูลผู้ใช้ออกมา
def committee = [ 'jame', 'john', 'peter'];
//สร้าง MAP เป็นข้อมูลแบบ Key/Value
def reviewResultMap = [:];
for (i = 0; i <RequiredNumOfPeers; i++) {
    reviewResultMap.put(committee[i], "NOT_REVIEW");
}

execution.setVariable ("reviewResultMap", reviewResultMap);
//ดึง Id ของ Process มาแสดงผล
RequestNo= execution.getProcessInstanceId();
execution.setVariable ("RequestNo", RequestNo);

มาที่พระเอกของแรกแล้วครับ ตรง Sub-Process "EvaluateProcess" ที่ถูกกำหนดเป็น MultiInstance ครับ มีการปรับแก้ตามนี้ครับ

1. แก้ไข MultiInstance ครับ

แล้วที่นี้กำหนดข้อมูลของแต่ะส่วน ดังนี้ครับ

  • Loop Cadinality - อันนี้เหมือนเดิมครับ คือ เอาค่าจากตัวแปร ${RequiredNumOfPeers} ที่กำหนดมาจาก Task Associate Reviews 
  • Collection - Data ที่ใช้ใน multiInstanceLoopCharacteristics ครับ โดยช้อมูลชุดนี้เกิดจาก Task Setup Reviews ที่สร้าง MAP ชื่อ ${reviewResultMap} ที่มีขนาดเท่ากับ ${RequiredNumOfPeers} ถ้าในตัวอย่างเท่ากับ 3 ซึ่งในแต่ละ Instance ของ Task เห็นข้อมูล reviewsResult(Object แต่ละอันใน MAP reviewsResults โดยดึงมาเฉพาะ Key ถ้าดูในแบบจำลองในส่วน Collection กำหนดให้ค่าเท่ากับ ${reviewResultMap.keySet()}  ) ซึ่งประกาศไว้ในส่วน element ในรูปแบบ 1 Instance ต่อ 1 Object ครับ
  • completionCondition ครับ ซึ่งถ้าเงื่อนไขเป็นจริง ก็จะออกจาก  multiInstanceLoopCharacteristics ครับ โดยเงื่อนไขทาง Business คือ กรรมการ 2 ใน 3 ท่าน ได้เข้าร่วมการประเมินครับ ซื่งสามารถกำหนดเงื่อนไขได้ ดังนี้
//เงื่อนไขทาง Business คือ กรรมการ 2 ใน 3 ท่าน ได้เข้าร่วมการประเมินครับ ส่วนอันหลังผมกำหนดขึ้น เพราะตรวจสอบว่าระหว่างที่ทำ Process ข้อมูลไม่ได้ถูกเพิ่มปรับแต่งอะไร
${(nrOfCompletedInstances >= RequiredMinNumofPeer) && (reviewResultMap.size() == nrOfInstances)}

2. เพิ่ม Listener เพื่อกำหนดตัวแปรระดับ Local ให้ Engine รู้จักครับ

เพิ่ม Listener เพื่อกำหนดตัวแปรระดับ Local ให้ Engine รู้จักครับ โดยผมเพิ่มตัวแปร reviewer(ชื่อผู้ประเมิน) และ reviewResult(ผลการประเมิน) ซื้อยู่ใน Scope ของ Sub-Process "EvaluateProcess" ดังนี้ครับ

ในส่วนของ Script มีการแก้ไข โดยจะ Execute ต่อเมื่อมีการเรียกใช้ Sub Process "EvaluateProcess" ครับ โดยมีรายละเอียดของ Script ดังนี้

execution.setVariable("reviewer", theCommitee,"EvaluateProcess");
execution.setVariable("reviewResult", "NOT_REVIEW","EvaluateProcess");

Note: อย่าลืมแก้ไขชื่อตัวแปรให้ครับนะครับ ถ้าไป Run ที่ตัว BPMN Engine แล้วเสียเวลาพอสมควรครับ

ทดสอบกันเลยครับ

Mary ได้เริ่มการทำงานของ Reward Process แล้วครับ

  • Start Workflow
  • Mary กรอกข้อมูลเพื่อเสนอชื่อของผมไปครับ (ในชีวิตจริงๆ ก็อยากได้เงินก้อนแบบนี้บ้าง T__T)
  • กำหนดรายละเอียดของ Task Associate Reviews  ครับ

สังเกตุดีๆว่าตอนนี้ Task "Evaluate Award" ได้ถูก Assign เข้าไปที่คณะกรรมการแต่ละท่านแล้วครับ เมื่อ Mary ได้เขียน Flow มาจนถึง Sub Process "EvaluateProcess" พบว่า User ที่เป็นกรรมการทั้ง 3 ท่านได้ถูก Assign Task เรียบร้อยครับ

  • User jame
  • User john
  • User peter

และเมื่อ 2 ใน 3 ของคณะกรรมการได้พิจารณา Task เรียบร้อยแล้ว พบว่าระบบทำการ Clear อีก 1 Instance ให้อัตโนมัติครับ

เมื่อจบการตัดสินของคณะกรรมการ ระบบตัดสินผลลัพธ์ และแจ้งให้ Mary รับทราบผลลัพธ์ครับ

สำหรับ Source Code ของแบบจำลองครับ

มาดูที่ Github ได้เลยครับ


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.