پرش به محتوای اصلی

هر فرد در بازه زمانی مشخص فقط یک بار فرآیند را شروع کند

بازه زمانی مشخص

شرح صورت مسئله

فرض کنید در یک فرآیند نیاز است هر فرد دریک بازه زمانی مشخص و تعداد مشخصی فرآیند را شروع کند:

در همان ابتدای فرآیند بعد از رویداد شروع با استفاده از کد زیر بررسی می‌‌کنم که اگر زمان شروع فرآیند در بازه زمانی مورد نظر است (دراین مثال بازه ۱ ساله) و همچنین فرد شروع کننده فرآیند هنوز به تعداد مدنظر ما فرایند را شروع نکرده است. (در این مثال 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;

}

}

}


[ratemypost]