شرح صورت مسئلهفرض کنید در یک فرآیند نیاز است هر فرد دریک بازه زمانی مشخص و تعداد مشخصی فرآیند را شروع کند:
در همان ابتدای فرآیند بعد از رویداد شروع با استفاده از کد زیر بررسی میکنم که اگر زمان شروع فرآیند در بازه زمانی مورد نظر است (دراین مثال بازه ۱ ساله) و همچنین فرد شروع کننده فرآیند هنوز به تعداد مدنظر ما فرایند را شروع نکرده است. (در این مثال 5)، آنگاه فرآیند ادامه پیدا کند و در غیر این صورت فرآیند خاتمه پیدا کند.
کد زیر را بر روی مسیر ترتیبی همانند تصویر زیر مینویسیم.
و برای مسیر خاتمه مانند تصویر زیر روی مسیر ترتیبی کلیک میکنیم و با انتخاب تغییر نوع، مسیر پیش فرض را انتخاب میکیم تا در صورتی که فرآیند از مسیر قبلی نرود از این مسیر برود و فرایند خاتمه یابد.
using System;
using System.Data;
using System.Data.SqlClient;
using Chargoon.Didgah.BPMS.CommonApi;
using System.Globalization;
namespace Chargoon.Didgah.BPMS.Runtime
{
public class ConditionalFlow : IConditionalFlow
{
public IExecution Execution { get; set; }
public bool Evaluate()
{
// تعریف یک متغییر عدد صحیح به نام NumberExecuted که در آن تعداد فرایند های اجرا شده توسط این شروع کننده را میرزیزیم.//
int NumberExecuted=0;
// اتصال به دیتا بیس. BPMSConnectionنام رشته اتصال میباشد.//
SqlConnection conn=new
SqlConnection(Execution.GetConnectionString(“BPMSConnection”));
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
// در کوئری SQL به جای X باید ProcessId فرایند را درج کنیم که از دیتابیس آن را دریافت میکنیم
//و بعد از محاسبه مقدار @ Permittedبه جای Y تعداد مجاز مد نظر را درج میکنیم (در این مثال 5) و بررسی میکنیم اگر مقدار @ Permitted
//بیشترو یا مساوی با Y باشد مقدار متغییر @result را 1 و درغیراینصورت 2 درج میکنیم.//
cmd.CommandText =@”
DECLARE @result int ,@ Permitted int= (SELECT COUNT([StarterStaffId])
FROM [Didgah_BPMS].[dbo].[bpm_ProcessInstances]
WHERE [StarterStaffId] = ANY (SELECT [StarterStaffId] FROM
[Didgah_BPMS].[dbo].[bpm_ProcessInstances]
WHERE [ProcessId]=X AND [StarterStaffId]= @StaffID))
if(@Permitted >= Y)
SET @result = 1
else
SET @result = 2
select @result” ;
//متغییر @StaffID را در این بخش مقداردهی میکنیم. برای مثال در این بخش ___StarterStaffId که مقدار StaffIdفرد شروع کننده میباشد را درون این متغییر میریزیم.//
cmd1.Parameters.AddWithValue(“@StaffID”,Execution.IntegerValue(“___StarterStaffId”));
conn.Open();
NumberExecuted = Convert.ToInt32(cmd.ExecuteScalar());
conn.Close();
}
}
// حالا برای بررسی اینکه در بازه زمانی مورد نظر باشیم(1ساله) ، تاریخ ابتدا و انتها بازه زمانی مورد نظر را به ترتیب درون متغییر های date1//
//و date2 میریزیم و تاریخ لحظه را درون متغییر date3 درج میکنیم و در آخر نتیجه مقایسه تاریخ هارا درون متغییر های result1//
//و result2 میریزیم .//
DateTime date1= new DateTime (2021,3,20);
DateTime date2 = new DateTime(2022,3,19);
DateTime date3 = DateTime.Now;
int result1 = DateTime.Compare(dt1, dt3);
int result2 = DateTime.Compare(dt2, dt3);
// در نهایت بررسی میکنیم اگر زمان در بازه زمانی مورد نظر باشد و هنوز به تعداد مورد نظر نرسیده باشیم فرایند ادامه پیدا کند.//
if (result2 > 0 && result1 < 0 && NumberExecuted == 0 )
return true;
else
return false;
}
}
}