طرح مسئله:فرض کنید در فرایند نیاز است درخواستها توسط مدیریت میانی و مدیریت ارشد مورد بررسی قرار گیرند. اما در صورت ثبت یک درخواست توسط مدیر میانی، با توجه به اینکه درخواست تنها توسط مدیریت ارشد بررسی میشود، نیازی به اجرای مرحله بررسی دوم مدیریتی نیست.
یک راهحل: در ابتدا در مرکز مدیریت، از منوی روابط سازمانی، رابطه سازمانی مورد نظر را ایجاد میکنیم (شکل 1).
شکل 1
در تعریف رابطه سازمانی لازم است به این نکته توجه داشت که یک سمت مانند سمت کارشناس چارگون (یک سمت بدون استفاده در فرایند) در بالاترین سطح در رابطه سازمانی قرار داده شود و دیگر سمتهای مورد نظر طبق سلسله مراتب مورد نیاز زیر مجموعه این سمت قرار گیرند (شکل 2).
شکل 2
در فرایند ایجاد شده در قسمت اقدامکننده فعالیت بررسی مدیر، از رابطه سازمانی ایجاد شده استفاده میکنیم (شکل 3).
شکل 3
در نظر داریم هنگام رسیدن فرایند به درگاه، در صورتی که اقدامکننده فعالیت بررسی مدیر، آخرین سمت قبل از سمت کارشناس چارگون در رابطه سازمانی باشد، فرایند میبایست از مسیر خیر ادامه پیدا کند (شکل 4).
شکل 4
به این منظور بر روی مسیر خیر در قسمت نوع شرط، کدنویسی را انتخاب مینماییم (شکل 5).
شکل 5
|در قسمت کدنویسی، کد ارائه شده را وارد و ذخیره میکنیم.
;using System
;using Chargoon.Didgah.BPMS.CommonApi
;using System.Data
;using System.Data.SqlClient
namespace Chargoon.Didgah.BPMS.Runtime
}
public class ConditionalFlow : IConditionalFlow
}
public IExecution Execution { get; set; }
()public bool Evaluate
}
;int ManagerStaffId
;SqlConnection conn = new SqlConnection(Execution.GetConnectionString(“BPMS”))
using (SqlCommand cmd = new SqlCommand())
}
;cmd.Connection = conn
cmd.CommandType = CommandType.Text;
cmd.CommandText = @”–declare @staffid int=1,@guid uniqueidentifier
select @guid=guid from [Didgah_Common].[dbo].[com_Staff]
where id =@staffid
select @guid=SubjectStaffGuid from [Didgah_Common].[dbo].[com_AssociationDetails]
where AssociationGuid=’E8CBA93E-A1BD-4E91-882F-51197600A352′ and ObjectStaffGuid=@guid
select isnull(id,0) as id from [Didgah_Common].[dbo].[com_Staff]
;”where guid=isnull(@guid,’04DB9489-43AF-4AF0-A18F-822499BE2154′)
;cmd.Parameters.AddWithValue(“@staffid”, Execution.IntegerValue(“___LastIntractorStaffId”))
;cmd.Parameters.AddWithValue(“@guid”, Guid.Empty)
;()conn.Open
;ManagerStaffId = Int32.Parse(cmd.ExecuteScalar().ToString())
;()conn.Close
{
if (ManagerStaffId == 23161)
}
;return true
{
else
;return false
{
{
{
کد ارائه شده عملیات زیر را انجام میدهد:
- تعریف یک متغیر از نوع عدد صحیح جهت نگهداری مقدار خروجی کوئری.
- تعریف یک رشته اتصال جهت اجرای کوئری استفاده شده در کد.
- کوئری استفاده شده در کد شناسه سمت بالادستی آخرین اقدامکننده فرایند را (اقدامکننده فعالیت کاربر بررسی مدیر) از رابطه سازمانی پیشتر ایجاد شده استخراج میکند. این شناسه همان StaffId است که برابر با ستون Id در جدول Staff در پایگاه داده Didgah_Common میباشد. شناسه آخرین اقدامکننده فرایند به صورت پارامتر @StaffId در کوئری قرار گرفته است که مقدار آن با دستور AddWithValue و متغیر عمومی مربوطه به کوئری فرستاده میشود. رابطه سازمانی پیشتر ایجاد شده با شناسه AssociationGuid مشخص میشود که از ستون Guid در جدول Associations در پایگاه داده Didgah_Common برای رابطه سازمانی پیشتر ایجاد شده استخراج شده است.
- خروجی کوئری که شناسه StaffId سمت بالادستی آخرین اقدامکننده در فرایند است با دستور ExecuteScalar در متغیر عدد صحیح پیشتر تعریف شده ذخیره میشود.
- در نهایت در یک دستور If مقدار این متغیر را با شناسه StaffId بالاترین سمت قرار گرفته در رابطه سازمانی مورد نظر (در این مثال کارشناس چارگون) مقایسه میکنیم. در صورت برابر بودن این مقادیر نتیجه true برگشت خواهد خورد که منجر به ادامه فرایند از مسیر خیر میشود و در غیر این صورت false که باعث ادامه فرایند از مسیر بلی میشود. شناسه StaffId سمت مورد استفاده در بالاترین سطح رابطه سازمانی از ستون Id جدول Staff در پایگاه داده Didgah_Common استخراج شده است.
پس از اجرای فرایند در صورتی که اقدامکننده فعالیت بررسی مدیر، زیرمجموعه مستقیم سمت کارشناس چارگون در رابطه سازمانی باشد، فرایند بدون انجام فعالیت بررسی مدیر بالاتر، از مسیر خیر ادامه پیدا خواهد کرد (شکل 6).
شکل 6