Workflow Error Retry with Coding

View story at Medium.com

ไปติดตามกันได้ที่ https://medium.com/k2-dev-th/workflow-error-retry-with-coding-b4ab2b3f24ff นะครับ

Advertisements

How to update Folio from workflow management dll

พอดีได้ Requirements จากลูกค้ามาว่า ต้องการที่จะ Update Folio ของ Process Instance ที่วิ่งอยู่ในกระบวนการ เพื่อให้คนที่ได้รับงาน สามารถรับทราบถึง Status ของงานผ่าน Folio ได้ จึงได้มาศึกษาเรื่องของการใช้ dll เพื่อไป Update Folio

ซึ่ง dll ที่จะต้องใช้มีประมาณนี้ครับ

  • SourceCode.HostClientAPI เอาไว้ใช้ในการสร้าง Connection String และ Open Connection ไปหา K2 Server
  • SourceCode.SmartObject.Client เอาไว้ใช้ Query ข้อมูล SmartObject
  • SourceCode.Workflow.Client เอาไว้ใช้ในการเข้าถึงข้อมูลของแต่ Process Instance เพื่อทำการ Update ค่าต่างๆ
  • SourceCode.Workflow.Management เอาไว้ใช้ในการจัดการ Process Instance เช่น Start, Delete Process

ใน Requirements นี้ ได้ตัดสินใจไปใช้แนวทางสร้าง Custom Assembly ขึ้นมา เพื่อทำการ Update ครับ

เริ่มแรก เมื่อเราสร้าง Class Library project ขึ้นมาแล้ว ก็ให้ Add Reference ที่บอกข้างต้น โดย dll เหล่านี้ อยู่ที่ %K2_Home%/Bin

ต่อสร้าง ConnectionString จาก Object SCConnectionStringBuilder ประมาณนี้

SCConnectionStringBuilder K2Con = new SCConnectionStringBuilder();
K2Con.Host = “localhost”;
K2Con.Port = 5252;
K2Con.IsPrimaryLogin = true;
K2Con.Integrated = true;

สังเกตว่าจะใช้ Port 5252 เพราะว่า Port 5252 นี้จะเชื่อมต่อกับ Port Workflow Management

ในกรณีที่เราต้องการเชื่อมต่อ SmartObject ก็ใช้ Port 5555 ตามปกติครับ

หลังจากนั้นทำการเปิด Connection ไปหา K2 Server ด้วย Connection String ที่ set ไว้

SourceCode.Workflow.Client.Connection connection = new SourceCode.Workflow.Client.Connection();
connection.Open(“localhost”, K2Con.ToString());

ต่อมาก็ get Process Instance ที่ต้องการ โดยจะต้องอ้างอิง ID แล้วก็สั่ง update ได้ตรงๆเลย

SourceCode.Workflow.Client.ProcessInstance processInstance = connection.OpenProcessInstance(processInstanceID);
processInstance.Folio = “NEW FOLIO”;
processInstance.Update();

สุดท้ายอย่าลืม add try catch แล้วก็ปิด Connection ทุกครั้งด้วยนะครับ

พอเราได้ dll ตัวนี้มาแล้ว ก็เอาเข้าไป Register กับ EndPointAssembly แล้วก็สร้าง SmartObject มาใช้งานได้เลย

ของแถม

บางกรณีเราต้องการ Delete Process Instance บ้าง วิธีทำก็คล้ายๆข้างต้นเลยครับ แต่ต้องใช้ SourceCode.Workflow.Management เพราะเป็นตัวจัดการ ของแต่ละ Process Instance

วิธีทำก็สร้าง Connection String และ  Open Connection คล้ายๆเดิม

SourceCode.Workflow.Management.WorkflowManagementServer wms = new SourceCode.Workflow.Management.WorkflowManagementServer();
wms.Open(K2ConProcess.ToString());

หลังจากนั้นก็ลบได้เลยยยยยย

wms.DeleteProcessInstances(deleteProcessInstanceID, true);

วันนี้ก็พอแค่นี้ครับ น่าจะสามารถ update folio, ลบ Process Instance ผ่าน dll กันได้ล่ะ

How to use “Workflow management service” (K2 Five)

สวัสดีเพื่อน ๆ ชาว K2 Ranger ทุกท่านครับ วันนี้มีโอกาสได้รับบทความจากคุณเบนซ์ Thattaporn Setsittichoke มาช่วยเขียน blog แชร์ประสบการณ์ การทำงานบน K2 Five

จะมี feature อะไรใหม่บน K2 Five มาช่วยเราทำงานกันบ้าง เชิญติดตามได้เลยครับผม


ผมจะมาแชร์บทความที่บางคนอาจจะรู้อยู่แล้วนะครับ (ที่เคยลองใช้งาน) ซึ่ง k2 management เท่าที่จำได้ และใช้งานมาจะมีเกิดขึ้นตั้งแต่ Version 4.7 ขึ้นไปครับ แต่มันพิเศษตรงที่ มี Service Object (ไม่แน่ใจนะครับว่าก่อนหน้านี้มีให้ใช้ไหม ถ้ามีต้องขออภัย) ให้เราใช้งานด้วย

ซึ่งแต่ก่อนเราจะต้องทำการพึ่งพา API เช่นตัวที่ผมมีการใช้งานคือพวก Redirect, Delegate หรือ Goto Activity ต่างๆ ต้องทำการ Custom เพื่อช่วยการทำงานในส่วนนี้ เช่นการ Goto Activity จะต้องเขียนแบบนี้เป็นต้น (หลายคนคงเคยทำเหมือนกัน)

b1.png

แต่ใน SmartObjects – Service – Tester (หลายคนคงเคยใช้แล้วจะอยู่ใน C:\Program Files (x86)\K2 blackpearl\Bin นะครับ) มีให้ใช้งานกันแล้วครับ ซึ่งมีอะไรให้ใช้งานบ้างสามารถเข้าไปดูกันได้เลยครับ ดังภาพ

b2

จะมี method GotoActivity ให้ใช้ได้เลย ไม่ต้องเขียน API เองแล้ว 🙂

S__6545428.jpg

นอกจาก Workflow ที่ผมเข้า ยังมีตัวอื่นอยากให้ลองเอาไปใช้งานตามชื่อที่ต้องการได้เลยครับ มีให้ใช้งานเยอะมากครับ กันอีกเยอะเลยนะครับลองเล่นกันดูครับ และสามารถนำมาแชร์กันได้ครับ

เพิ่มเติมนะครับ ถ้ามีเกิดคำถามขึ้นว่า แล้วนำไปใช้งานยังไง? สามารถที่จะ Create เป็น SmartObject ตาม Category ที่ต้องการได้เลยครับ โดยการคลิกขวา และทำการ Create Smart Object ครับ

b3.png

หวังว่าบทความนี้เป็นประโยชน์ครับ และไม่ต้องเสียเวลาในการมา Custom กันครับ (ซึ่งผมทำได้เสียเวลาทำไปแล้ว 555)

ใครมีตัวไหนที่ใช้งานเจ๋งๆและมีประโยชน์ บอกกันด้วยนะครับ ขอบคุณครับ ^^


สุดท้ายนี้ ขอขอบคุณเบนซ์อีกรอบ สำหรับบทความดีๆ แบบนี้ครับ

benz

รูปประกอบคุณเบนซ์ เผื่อเจอหน้าจะทักทาย สอบถามได้เต็มที่ครับ 🙂

[Management] – Search Role in K2 [EN Version]

Today we’ll take about role in K2. We know that K2 Role use to manage group of user when we didn’t use AD group. We can create and manage role using Management console in workspace (K2 version prior to K2 Five) or using K2 Management site (K2 version 4.7 and K2 Five). But the thing that still missing is search function.

Imagine that if we have more than 100 roles in system and want to add/remove user in role or want to know which user belong to which role? How can we solve this problem? Today I got a tool for you. Please follow below step

  • Create stored procedure using script below in any database that can reach K2. You can also create in K2 database but please be aware. Because when we upgrade version or patch the stored procedure may be disappear.

CREATE PROCEDURE [dbo].[sp_FindRoleByUser] (

@pUserName NVARCHAR(447)

) AS

BEGIN

SELECT i.[Name]

FROM   [K2].[Identity].[Identity] i

INNER JOIN    [K2].[Identity].[RoleItem] r

ON     i.ID = r.IdentityID

WHERE  i.[Type] = 2

AND    r.[FQN] = @pUserName

END

After deploy you can use form at {url}/Runtime/Runtime/Form/UserRole.Form/

Hope this can help you when working with role 🙂

[Management] – Search Role ใน K2 [TH Version]

สวัสดีครับ ไม่ได้มา update blog ซะนาน วันนี้มาด้วยเรื่องของ role ใน K2 หลายๆ คนคงทราบอยู่แล้วว่า Role ไว้ใช้เวลาที่เราอยากส่งงานไปหาคนหลายๆ คน แต่เราไม่มี group บน AD ก็เลยมาใช้ระบบจัดการใน K2 แทน วิธีใช้งานก็ไม่ยาก สามารถเข้าไปเพิ่ม Role ผ่านหน้า workspace (ก่อน K2 Five) หรือผ่านหน้า Management (K2 4.7 และ K2 Five) ได้เลย แต่สิ่งที่หายไปสำหรับ Role ใน K2 นี้ก็คือ ไม่มี function ในการ search นั่นเอง

ลองนึกถึงเวลาที่เรามี Role เยอะๆ มากกว่า  100 ขึ้นไป (จริงๆ แค่ประมาณสิบปลายๆ ก็แย่แล้ว) แล้วต้องการเข้าไปแก้ไขคนใน role หรืออยากจะรู้ว่า user นี้อยู่ใน Role ไหนบ้าง จะทำยังไงดี?? วันนี้เรามี tool มีนำเสนอ โดยทำตาม step ด้านล่าง

  • สร้าง stored procedure ตาม script ด้านล่างใน database ที่เห็น database K2 จะสร้างไว้ใน database K2 ก็ได้ แต่ว่า ถ้ามีการ upgrade version หรือ patch stored procedure นี้อาจจะหายไปได้

CREATE PROCEDURE [dbo].[sp_FindRoleByUser] (

@pUserName NVARCHAR(447)

) AS

BEGIN

SELECT i.[Name]

FROM   [K2].[Identity].[Identity] i

INNER JOIN    [K2].[Identity].[RoleItem] r

ON     i.ID = r.IdentityID

WHERE  i.[Type] = 2

AND    r.[FQN] = @pUserName

END

เมื่อ deploy แล้วสามารถใช้งาน form ได้ที่ {url}/Runtime/Runtime/Form/UserRole.Form/

หวังว่า จะช่วยทำให้ชีวิตในการใช้ Role ของทุกคนง่ายขึ้นนะครับ 🙂

[K2 Five] – Workflow REST & SMO OData

สวัสดีครับ วันนี้เราจะมาพูดถึง API ที่เราน่าจะได้ใช้กันบ่อยๆ คือ REST service ของ Workflow และ SmartObject

Workflow REST API

โดยสิ่งที่จะต้องทำเป็นอย่างแรกเลยคือ ไป enable service ใน Management site ก่อน

Workflow REST API Setting

หลังจากเปิดแล้วจะได้ตามด้านล่าง

Workflow REST API Setting Enable

เราสามารถทดสอบ API ได้จาก Swagger URL ด้วย

Workflow Swagger URL

Workflow Swagger Result

โดยตัวอย่างการใช้งานโดยเรียกจาก application อื่นๆ สามารถดูได้จาก https://help.k2.com/onlinehelp/k2five/DevRef/5.0/default.htm#Runtime/WF-REST/REST-Samples.htm

SmartObject OData API

เหมือนกับ Workflow REST API ต้องไปเปิดใน management site ก่อน (ถ้าเป็น version ก่อนๆ เราจะต้องไปเปิดใน config ตามวิธีใน  https://help.k2.com/onlinehelp/k2blackpearl/DevRef/4.7/default.htm#Configuration2.html)

SMO Service Setting

หลังจากเปิดแล้วจะเป็นตามด้านล่าง เราสามารถเลือก SmartObject ที่ต้องการ exposed เป็น REST service ได้ด้วย

SMO Server Setting Enable

ทีนี้พอเปิดแล้วเราก็มาลองกันซักหน่อย วิธีง่ายที่สุดคือ ใช้ Excel โดยเลือก Import Data From OData Data Feed

Excel OData

ใส่ link และ credential

Excel Data Connection Wizard

ใน wizard จะมี SmartObject ให้เลือก

List SMO

จากนั้นจะให้เลือก Import Data เป็นแบบไหน

Excel Import Data

จากนั้นก็จะได้ข้อมูลอย่างที่เราต้องการ 🙂

Excel

สำหรับรายละเอียด สามารถดูเพิ่มเติมได้จาก https://help.k2.com/onlinehelp/k2five/DevRef/5.0/default.htm#Runtime/SmO-REST/SmORESTServices.htm%3FTocPath%3DRuntime%2520APIs%2520and%2520Services%7CSmartObjects%7CSmartObject%2520REST%2520Services%7C_____0 ครับ

[K2API] SmartObject Error ว่า Exception of type ‘SourceCode.SmartObjects.Client.SmartObjectException’ was thrown.???

วันนี้เรากลับมานำเสนอ KB สำหรับเหล่าชาวขาเดฟผู้เรียกใช้งาน K2 API ในส่วนของการต่อ SmartObjects กันบ้างนะครับ

เริ่มด้วยตัวอย่างจากโค้ดข้างล่าง เป็นการดึงข้อมูลจาก SmartObjects ที่ชื่อว่า Comments ขึ้นมาเก็บใน DataTable

SMOGetList1

ทำงานไปก็ใช้งานได้ปกติครับ แต่วันดีคืนร้าย เกิดมี error ขึ้นมาในส่วนนี้จะทำยังไง …ไม่ต้องตกใจเราเขียน try-catch ให้มี exception ออกมาแล้วนี่นา เดี๋ยวไปเช็คใน log เอาละกัน

SMOGetListError0

SMOGetListError

อ่าว..แย่ล่ะสิ Exception ที่ใช้กันมานมนาน ฟ้องว่า “Exception of type ‘SourceCode.SmartObjects.Client.SmartObjectException’ was thrown.” แต่ดันไม่ได้บอกว่ามัน error ที่ไหน ใน InnerException ก็ไม่มีซะด้วย

พระเอกข้างเราคือโค้ดด้านล่างนี้เลยครับ เอาไปใส่แทน catch (Exception ex) ไปเลย

catch (SmartObjectException soe)
 {
 StringBuilder errorMessage = new StringBuilder();
 foreach (SmartObjectExceptionData smartobjectExceptionData in soe.BrokerData)
 {
 string message = smartobjectExceptionData.Message;
 string service = smartobjectExceptionData.ServiceName;
 string serviceGuid = smartobjectExceptionData.ServiceGuid;
 string severity = smartobjectExceptionData.Severity.ToString();
 string innermessage = smartobjectExceptionData.InnerExceptionMessage;
 errorMessage.AppendLine("Service: " + service);
 errorMessage.AppendLine("Service Guid: " + serviceGuid);
 errorMessage.AppendLine("Severity: " + severity);
 errorMessage.AppendLine("Error Message: " + message);
 errorMessage.AppendLine("InnerException Message: " + innermessage);
 }
 throw soe;
 }

มาทดสอบใหม่อีกครั้งกันครับ

SMOGetListError2

คราวนี้เห็นรายละเอียดครบเลย ว่า error ที่ SmartBoxService และ error ฟ้องว่าชื่อคอลัมน์ของ smartobjects ที่ชื่อ “Comments” มันไม่ถูกนะ ..สงสัยจะมีคนเปลี่ยนชื่อคอลัมน์ใน database

หวังว่าจะช่วยให้ debug กันง่ายขึ้นครับ ผมขอไปหาคนที่มาเปลี่ยนชื่อคอลัมน์ก่อน -“-