private void AddVariableParameters(ref string sqlQuery, List <SqlParameter> queryParams) { if (!string.IsNullOrWhiteSpace(sqlQuery)) { IDataManageEngine dataManageEngine = new DataManageEngine(base.EngineSharedModel, base.UnitOfWork); List <string> extractedParams = DomainUtility.GetParameters(sqlQuery); foreach (string parameter in extractedParams) { if (!queryParams.Any(c => c.ParameterName == parameter.Replace(".", "_")) && Regex.Matches(sqlQuery, "declare(\\s*?)" + parameter).Count == 0) { var result = dataManageEngine.GetValueByBinding(parameter.TrimStart('@')); if (result != null) { queryParams.Add(new SqlParameter(parameter.Replace(".", "_"), result)); sqlQuery = sqlQuery.Replace(parameter, parameter.Replace(".", "_")); } } } } }
public ResultOperation SendMessage(sysBpmsEvent senderEvent) { ResultOperation resultOperation = new ResultOperation(); EventService eventService = new EventService(base.UnitOfWork); ThreadEventService threadEventService = new ThreadEventService(base.UnitOfWork); DataManageEngine dataManageEngine = new DataManageEngine(base.EngineSharedModel, base.UnitOfWork); string senderKey = string.Empty; switch ((SubTypeMessageEventModel.e_KeyType)senderEvent.SubTypeMessageEventModel.KeyType) { case SubTypeMessageEventModel.e_KeyType.Static: senderKey = senderEvent.SubTypeMessageEventModel.Key; break; case SubTypeMessageEventModel.e_KeyType.Variable: senderKey = dataManageEngine.GetValueByBinding(senderEvent.SubTypeMessageEventModel.Key).ToStringObj(); break; } sysBpmsMessageType messageType = new MessageTypeService(base.UnitOfWork).GetInfo(senderEvent.MessageTypeID.Value); Dictionary <string, object> listParameter = senderEvent.SubTypeMessageEventModel.MessageParams.ToDictionary(c => c.Name, c => { return(dataManageEngine.GetValueByBinding(c.Variable)); }); //start events List <sysBpmsEvent> sysStartEvents = eventService.GetListStartMessage(senderEvent.ProcessID, senderKey, senderEvent.MessageTypeID.Value); foreach (sysBpmsEvent item in sysStartEvents) { Dictionary <string, object> listDefaultVariables = item.SubTypeMessageEventModel.MessageParams.ToDictionary(c => c.Variable, c => { return(listParameter.FirstOrDefault(d => d.Key == c.Name).Value); }); new ProcessEngine(new EngineSharedModel(currentThread: null, item.ProcessID, base.EngineSharedModel.BaseQueryModel, base.EngineSharedModel.CurrentUserName, base.EngineSharedModel.ApiSessionID), base.UnitOfWork).StartProcessBySystem(listDefaultVariables); return(resultOperation); } //intermediate and boundary events List <sysBpmsThreadEvent> sysBpmsThreadEvents = threadEventService.GetMessageActive(senderEvent.ProcessID, senderEvent.MessageTypeID.Value, new string[] { nameof(sysBpmsThreadEvent.Event), nameof(sysBpmsThreadEvent.Thread) }); foreach (sysBpmsThreadEvent item in sysBpmsThreadEvents) { DataManageEngine receiverDataManage = new DataManageEngine(new EngineSharedModel(item.Thread, item.Event.ProcessID, base.EngineSharedModel.BaseQueryModel, base.EngineSharedModel.CurrentUserName, base.EngineSharedModel.ApiSessionID), base.UnitOfWork); string receiverKey = string.Empty;; switch ((SubTypeMessageEventModel.e_KeyType)item.Event.SubTypeMessageEventModel.KeyType) { case SubTypeMessageEventModel.e_KeyType.Static: receiverKey = item.Event.SubTypeMessageEventModel.Key; break; case SubTypeMessageEventModel.e_KeyType.Variable: receiverKey = receiverDataManage.GetValueByBinding(item.Event.SubTypeMessageEventModel.Key).ToStringObj(); break; } if (senderKey == receiverKey) { Dictionary <string, object> listDefaultVariables = item.Event.SubTypeMessageEventModel?.MessageParams?.Where(c => !string.IsNullOrWhiteSpace(c.Variable)).ToDictionary(c => c.Variable, c => { return(listParameter.FirstOrDefault(d => d.Key == c.Name).Value); }); new ProcessEngine(new EngineSharedModel(item.Thread, item.Event.ProcessID, base.EngineSharedModel.BaseQueryModel, base.EngineSharedModel.CurrentUserName, base.EngineSharedModel.ApiSessionID), base.UnitOfWork).ContinueProcess(item, true, listDefaultVariables); //Even if there is a error , this method must continue and log that error. return(resultOperation); } } return(resultOperation); }
private void SetThreadEventOnInterval(sysBpmsEvent _event, sysBpmsThreadEvent newThreadEvent, sysBpmsThreadEvent lastExecutedThreadEvent) { IDataManageEngine dataManageEngine = new DataManageEngine(base.EngineSharedModel, base.UnitOfWork); string variableData = _event.SubTypeTimerEventModel.VariableData; ThreadEventService threadEventService = new ThreadEventService(base.UnitOfWork); int executedCount = 0; if (_event.TypeLU == (int)sysBpmsEvent.e_TypeLU.StartEvent) { executedCount = threadEventService.GetCount(null, _event.ID, base.EngineSharedModel.CurrentProcessID, (int)sysBpmsThreadEvent.e_StatusLU.Done); } else { executedCount = threadEventService.GetCount(base.EngineSharedModel.CurrentThreadID, _event.ID, null, (int)sysBpmsThreadEvent.e_StatusLU.Done); } PersianCalendar pc = new PersianCalendar(); if (_event.SubTypeTimerEventModel.RepeatTimes.ToIntObj() == 0 || _event.SubTypeTimerEventModel.RepeatTimes > executedCount) { switch ((SubTypeTimerEventModel.e_IntervalType)_event.SubTypeTimerEventModel.IntervalType) { case SubTypeTimerEventModel.e_IntervalType.SpecificMinute: switch ((SubTypeTimerEventModel.e_SetType)_event.SubTypeTimerEventModel.SetType) { case SubTypeTimerEventModel.e_SetType.Static: newThreadEvent.ExecuteDate = DateTime.Now.AddMinutes(_event.SubTypeTimerEventModel.Minute.ToIntObj()); break; case SubTypeTimerEventModel.e_SetType.Variable: newThreadEvent.ExecuteDate = DateTime.Now.AddMinutes(dataManageEngine.GetValueByBinding(variableData).ToIntObj()); break; } break; case SubTypeTimerEventModel.e_IntervalType.EveryMonth: int lastDayExecuted = DateTime.Now.Day - 1; if (lastExecutedThreadEvent != null && lastExecutedThreadEvent.ExecuteDate.AreInTheSameMonth(DateTime.Now)) { lastDayExecuted = lastExecutedThreadEvent.ExecuteDate.Day; } List <int> MonthDays = null; switch ((SubTypeTimerEventModel.e_SetType)_event.SubTypeTimerEventModel.SetType) { case SubTypeTimerEventModel.e_SetType.Static: MonthDays = _event.SubTypeTimerEventModel.GetListMonthDays; break; case SubTypeTimerEventModel.e_SetType.Variable: MonthDays = dataManageEngine.GetValueByBinding(variableData).ToStringObj().Split(',').Where(c => !string.IsNullOrWhiteSpace(c)).Select(c => c.ToIntObj()).ToList(); break; } int?persianMonthDay = MonthDays.FirstOrDefault(c => c > lastDayExecuted); //if persianMonthDay is null ,monthDate must be filled by next month ,otherwise it is filled by current month. DateTime monthDate = persianMonthDay.HasValue ? DateTime.Now : DateTime.Now.AddMonths(1); if (!persianMonthDay.HasValue) { //if lastDayExecuted is not in the same month with persianMonthDay persianMonthDay = MonthDays.FirstOrDefault(); } newThreadEvent.ExecuteDate = pc.ToDateTime(monthDate.Year, monthDate.Month, persianMonthDay.Value, _event.SubTypeTimerEventModel.TimeHour.ToIntObj(), _event.SubTypeTimerEventModel.TimeMinute.ToIntObj(), 0, 0); break; case SubTypeTimerEventModel.e_IntervalType.EveryWeek: lastDayExecuted = DateTime.Now.GetDayOfWeekBy7() - 1; if (lastExecutedThreadEvent != null && lastExecutedThreadEvent.ExecuteDate.AreInTheSameWeek(DateTime.Now)) { lastDayExecuted = lastExecutedThreadEvent.ExecuteDate.GetDayOfWeekBy7(); } List <int> weekDays = null; switch ((SubTypeTimerEventModel.e_SetType)_event.SubTypeTimerEventModel.SetType) { case SubTypeTimerEventModel.e_SetType.Static: weekDays = _event.SubTypeTimerEventModel.GetListWeekDays; break; case SubTypeTimerEventModel.e_SetType.Variable: weekDays = dataManageEngine.GetValueByBinding(variableData).ToStringObj().Split(',').Where(c => !string.IsNullOrWhiteSpace(c)).Select(c => c.ToIntObj()).ToList(); break; } //if weekDays has a day bigger than last day executed int?weekDay7 = weekDays.FirstOrDefault(c => c > lastDayExecuted); //if need to go next week because ther is no greater day of week in weekDays and start from the first day of week selected by user after monday. if (!weekDay7.HasValue) { weekDay7 = weekDays.FirstOrDefault(); //lastDayExecuted is not in the same week with persianWeekDay newThreadEvent.ExecuteDate = DateTime.Now.AddDays(weekDay7.Value + (7 - DateTime.Now.GetDayOfWeekBy7())); } else { //lastDayExecuted is in the same week with persianWeekDay newThreadEvent.ExecuteDate = DateTime.Now.AddDays(weekDay7.Value - lastDayExecuted); } break; } } }
public ResultOperation SendEmail(sysBpmsEvent _event) { ResultOperation resultOperation = new ResultOperation(); SubTypeEmailEventModel email = _event.SubTypeMessageEventModel.Email; sysBpmsEmailAccount fromEmailAccount = new sysBpmsEmailAccount(); DataManageEngine dataManageEngine = new DataManageEngine(base.EngineSharedModel, base.UnitOfWork); List <string> toEmailList = new List <string>(); switch (email.From.ToIntObj()) { case (int)SubTypeEmailEventModel.e_FromType.CurrentUser: sysBpmsUser user = new UserService(base.UnitOfWork).GetInfo(base.EngineSharedModel.CurrentUserName); if (user != null) { fromEmailAccount = new EmailAccountService(base.UnitOfWork).GetList((int)sysBpmsEmailAccount.e_ObjectTypeLU.User, user.ID, null).LastOrDefault(); } break; case (int)SubTypeEmailEventModel.e_FromType.CurrentThreadUser: user = base.EngineSharedModel.CurrentThread != null && base.EngineSharedModel.CurrentThread.UserID.HasValue ? new UserService(base.UnitOfWork).GetInfo(base.EngineSharedModel.CurrentThread.UserID.Value) : null; if (user != null) { fromEmailAccount = new EmailAccountService(base.UnitOfWork).GetList((int)sysBpmsEmailAccount.e_ObjectTypeLU.User, user.ID, null).LastOrDefault(); } break; default: fromEmailAccount = new EmailAccountService(base.UnitOfWork).GetInfo(email.From.ToGuidObj()); break; } switch ((SubTypeEmailEventModel.e_ToType)email.ToType) { case SubTypeEmailEventModel.e_ToType.Static: toEmailList = email.To.Split(',').Where(c => !string.IsNullOrWhiteSpace(c)).ToList(); break; case SubTypeEmailEventModel.e_ToType.Systemic: switch ((SubTypeEmailEventModel.e_ToSystemicType)email.To.ToIntObj()) { case SubTypeEmailEventModel.e_ToSystemicType.CurrentUser: sysBpmsUser user = new UserService(base.UnitOfWork).GetInfo(base.EngineSharedModel.CurrentUserName); if (user != null) { toEmailList.Add(user.Email); } break; case SubTypeEmailEventModel.e_ToSystemicType.CurrentThreadUser: user = base.EngineSharedModel.CurrentThread != null && base.EngineSharedModel.CurrentThread.UserID.HasValue ? new UserService(base.UnitOfWork).GetInfo(base.EngineSharedModel.CurrentThread.UserID.Value) : null; if (user != null) { toEmailList.Add(user.Email); } break; } break; case SubTypeEmailEventModel.e_ToType.Variable: toEmailList = dataManageEngine.GetValueByBinding(email.To).ToStringObj().Split(',').Where(c => !string.IsNullOrWhiteSpace(c)).ToList(); break; } string subject = email.Subject; string content = email.Content; if (!string.IsNullOrWhiteSpace(subject)) { foreach (string item in DomainUtility.GetRegularValue("[", "]", subject).Distinct()) { subject = subject.Replace("[" + item + "]", dataManageEngine.GetValueByBinding(item.Trim()).ToStringObj()); } } if (!string.IsNullOrWhiteSpace(content)) { foreach (string item in DomainUtility.GetRegularValue("[", "]", content).Distinct()) { content = content.Replace("[" + item + "]", dataManageEngine.GetValueByBinding(item.Trim()).ToStringObj()); } } new EmailService().SendEmailAsync(fromEmailAccount.Email, fromEmailAccount.MailPassword, fromEmailAccount.SMTP, fromEmailAccount.Port.ToIntObj(), toEmailList, "", "", subject, content); return(resultOperation); }