طرح مسئله: فرض کنید در فرایند نیاز است درخواستها توسط مدیریت میانی و مدیریت ارشد مورد بررسی قرار گیرند. اما در صورت ثبت یک درخواست توسط مدیر میانی، با توجه به اینکه درخواست تنها توسط مدیریت ارشد بررسی میشود، نیازی به اجرای مرحله بررسی دوم مدیریتی نیست.
یک راهحل: در ابتدا در مرکز مدیریت، از منوی روابط سازمانی، رابطه سازمانی مورد نظر را ایجاد میکنیم (شکل 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