در طراحی بعضی از فرایندها برای مثال فرایندهای از جنس مدیریت ارتباط با مشتریان، پشتیبانی و ...، معمولا بعضی از کاربران در آن واحد بیش از یک کار باز دارند و تعداد کارهای در دست انجام، پارامتر مهمی است برای ارجاع کار به این افراد. به عبارت دیگر مدیر واحد پشتیبانی برای ارجاع کار نیاز دارد در هر لحظه فهرست کارهای در دست انجام هر کارشناس را در دست داشته باشد و براساس این اطلاعات بتواند کار را به کارتابل کارشناسی که اصطلاحا آزادتر است منتقل کد. البته بدیهی است که تعداد کارهای یک کارشناس تنها پارامتر برای این تصمیم گیری نیست و عوامل دیگری مثل میزان تخصص، مهارت، تجربه و ... نیز در ارجاع کار موثرند اما بهرحال تعداد کارهای باز، یک پارامتر اساسی و موثر برای تصمیم گیری مدیران در توزیع و تقسیم کارها میان کاربران می باشد. برای تهیه این فهرست در سیستم مدیریت فرایندها، یک متد با نام GetUserNotifyList در ابزارهای مدیریت کاربران (WorkUserUtils) پیاده سازی شده است که در ادامه، جزئیات این متد شرح داده می شود:
الگوی تابع فهرست کارهای یک کاربر (GetUserNotifyList)
این تابع در حالت کلی به شکل زیر است:
function GetUserNotifyList(userNum or username, kind, workflowCode)
شرح پارامترهای این تابع
همانطور که مشاهده می کنید، در این تابع، سه پارامتر به شرح زیر وجود دارد:
userNum or username: در اینجا می توانید به انتخاب خود، کلید کاربر یا نام کاربر را درج کنید. توضیح اینکه نام کاربر باید به صورت machinename\\username پاس شود که در اینجا machinename نام رایانه است. (اگر machinename پاس نشود نام رایانه سرور به جای آن لحاظ خواهد شد).
Kind: در اینجا نوع درگیری کاربر با کارها تعیین می شود که از جنس UserEnums.NotifyKind است و میتواند یکی از مقادیر DoTask(انجام کارها) و یا Report(اطلاع از وضعیت کارها) را قبول کند. به عبارت دیگر در اینجا تعیین می کنیم منظورمان کارهایی است که قرار است وضعیت آنها به اطلاع کاربر برسد (در کارتابل اطلاع رسانی اوست) یا به دنبال فهرست کارهایی هستیم که کاربر مورد نظر قرار است وظیفه ای را در آن کار انجام دهد (در کارتابل انجام کارهای اوست).
نکته : به این ترتیب اگر بخواهیم دقیق تر بیان کنیم، توسط این تابع، فهرست کارهایی که کاربر با آنها درگیر است، استخراج می شود و فقط منحصر به کارهای قابل انجام توسط کاربر نیست.
: workflowCode منظور کد گردش کار مورد نظر است. اگر در این جا مقدار صفر پاس شود (یا اصلا پاس نشود) به معنی تمام گردش کارهاست .
خروجی این تابع یک آرایه از موجوداتی از جنس زیر است:
{wf: کد گردش کار, wk: کلید کار, st: کلید وضعیت گردش کار}
حال ممکن است در اینجا این سوال پیش بیاید که آیا بهتر نیست بجای نوشتن کد و برنامه، از گزارشهای سیستم این فهرست را تهیه کنیم؟
سوال: آیا گزارشهای تعریف شده در سیستم، این فهرست را تولید نمی کند؟
با بررسی گزارشهای سیستم که از منوی "گزارشهای گردش کار" قابل دسترسی است. مشخص می شود که این گزارشها مناسب تهیه فهرست کارهای در دست انجام کاربران نیست. در گزارشهایی مانند گزارش محوری، و گزارش محوری انجام وظایف، می توانیم گزارشهای با محتوای زیر را تهیه کنیم:
- کارهایی را که یک کاربر خاص آغاز کرده
- کارهایی را که آخرین کاربر آن یک کاربر خاص است
- کارهایی را که کاربر مورد نظر یکی از وظایف آن کار را از ابتدا تا وضعیت حاضر انجام داده است.
بنابراین واضح است که هیچکدام از گزارشهای بالا، دربردارنده فهرست کارهای در دست انجام کاربر (که هنوز انجام نشده) نیست. حال سوال این است که چه راه حلی برای تهیه فهرست کاربران مناسب است؟
راه حل : استفاده از فهرست کارهای مبتنی بر برنامه
از آنجایی که این گزارش در سطح گردش کار تهیه می شود لذا برای این کار بهتر است از امکان گزارشهای مبتنی بر برنامه استفاده کنیم. البته برای ساده تر کردن گزارش، ابتدا این فهرست را برای یک کاربر خاص تهیه می کنیم و به همین دلیل، گزارش مبتنی بر برنامه را به شکل پارامتریک تعریف می کنیم که پارامتر مورد نظر در واقع نام کارشناس خواهد بود.
یک مثال
فرض کنید در گردش کار "کالاها" می خواهیم فهرست کارهای در دست انجام یک کاربر خاص را به دست بیاوریم. به این ترتیب، در گردش کار کالاها، یک گزارش مبتنی بر برنامه به شکل زیر تعریف می کنیم :
همانطور که مشاهده می کنید، این گزارش به گروه پارامتر "مشخصات کارشناس" مرتبط شده و مبتنی بر تابع برنامه WorkScriptRepWorksToDo است. در ادامه، جزئیات این تابع شرح داده شده است:
تابع برنامه فهرست کارهای در دست انجام یک کاربر (WorkScriptRepWorksToDo)
function WorkScriptRepWorksToDo(p) {
var wKeys=[];
var toDoWorks=WorkUserUtils.GetUserNotifyList(p.expertName, 0, 1);
for (var i=0; i
wKeys={};
wKeys=toDoWorks.wk;
}
return JSON.stringify(wKeys);
}
مطابق معمول مطالب آموزشی، این تابع را هم بخش به بخش بررسی می کنیم:
var wKeys=[];
از آنجایی که این تابع باید یک آرایه حاوی کلیدهای کار تولید کند، لذا در اینجا یک متغیر با نام wKeys از نوع آرایه تعریف می کنیم و در بخشهای بعدی این آرایه را از کلیدهای کار مرتبط با کاربر پر می کنیم.
var toDoWorks=WorkUserUtils.GetUserNotifyList(p.expertName, 0, 1);
در این مرحله خروجی تابع فهرست کارهای یک کاربر (GetUserNotifyList) را در یک متغیر ذخیره می کنیم. دقت کنید پارامتر نوع درگیری کاربر با کار در این مثال، عدد 0 (کارهای داخل کارتابل انجام کار) انتخاب شده است (این پارامتر با رنگ سبز مشخص شده است) و پارامتر مربوط به کد گردش کار هم برابر 1 (گردش کار کالاها) می باشد (این پارامتر با رنگ قرمز مشخص شده است). یادآوری می شود که خروجی این تابع، یک آرایه با ساختار زیر است:
{wf: کد گردش کار, wk: کلید کار, st: کلید وضعیت گردش کار}
مشاهده می کنید که یکی از عناصر این آرایه، کلید کار است که در مرحله بعدی باید استخراج شود و در آرایه ای که در ابتدا تعریف کردیم (wKeys) ذخیره شود. به بیان دیگر ما برای تهیه گزارش کارهای در دست انجام کاربر فقط به این عنصر (کلید کار) نیاز داریم.
for (var i=0; i
wKeys={};
wKeys=toDoWorks.wk;
}
در این مرحله، و در یک حلقه for تمام کلیدهای کار از آرایه toDoWorks در آرایه کلیدهای کار (wKeys) ذخیره می شود.
return JSON.stringify(wKeys);
در این مرحله، طبق قاعده گزارشهای مبتنی برنامه، کلیدهای کار به فرمت JSON تولید می شود.
اخذ گزارش
برای تکمیل این مطلب، بهتر است بطور عملی این گزارش را تهیه و نتیجه آن را مشاهده کنیم. برای این کار:
- از منوی "کردش کار" گزینه "فهرست کالا مبتنی بر برنامه گردش کار" را انتخاب کنید (مطابق شکل زیر):
به این ترتیب محاوره گزارشهای مبتنی بر برنامه به شکل زیر روی صفحه باز می شود:
- مطابق شکل بالا، در ناحیه گردش کار، "کالاها" و در ناحیه گزارش، "فهرست کارهای در دست انجام کاربران" را انتخاب کنید.
- در این محاوره و در ناحیه پارامترها ، کارشناس مورد نظر را وارد کنید (شکل زیر):
- تکمه "نمایش گزارش" را کلیک کنید تا گزارش کارهای در دست انجام کاربر Tariverdi در گردش کار کالاها به شکل زیر نمایش داده شود:
نتیجه: گزارش کارهای در دست انجام یک کاربر تنها از طریق گزارشهای مبتنی بر برنامه و در هر لحظه تنها برای یک گردش کار قابل تهیه است. به عبارت دیگر امکان تهیه این گزارش بصورت درهمکرد و همزمان در چند گردش کار وجود ندارد.