/// <summary> /// این تابع به عنوان تابع مجری برای نخ ها استفاده می شود. /// برای ارسال پارمتر به این تابع حتما باید از کلاس "کمک کننده" استفاده شود /// </summary> /// <param name="state">حاوی "پرسنلی" است که محاسبات برای آن باید انجام شود</param> public void Execute(decimal ExecutablePrsCalcId, decimal PersonId, DateTime FromDate, DateTime ToDate) { RuleCalculator RuleCalc = null; Stopwatch MainStopWatch = new Stopwatch(); Stopwatch RuleStopWatch = new Stopwatch(); MainStopWatch.Start(); Person prs = Person.GetPersonRepository(false).GetById(PersonId, false); IRuleRepository ruleRep = Rule.GetRuleRepository(false); if (prs.Active) { try { DateRange CalcDateZone = null; //در اينجا "تراکنش" نيازي نيست تنها به دليل اينکه در بازيابي داده ها //اتصال" مدام باز و بسته نشود از "تراکنش" استفاده شده است" using (NHibernateSessionManager.Instance.BeginTransactionOn(FlushMode.Never)) { this.DateOfBeginYear = Utility.GetDateOfBeginYear(FromDate, BLanguage.CurrentSystemLanguage); this.DateOfEndYear = Utility.GetDateOfEndYear(FromDate, BLanguage.CurrentSystemLanguage); CalcDateZone = prs.InitializeForExecuteRule(FromDate, ToDate, this.DateOfBeginYear, this.DateOfEndYear); IList <AssignedRuleParameter> ruleParameterList = ruleRep.GetAssginedRuleParamList(FromDate, ToDate); var ruleUserDefinedList = ruleRep.GetRuleUserDefined(); foreach (DateTime dt in CalcDateZone) { #region Execute person's rules foreach (AssignedRule AsgRule in prs.AssignedRuleList) { AsgRule.RuleParameterList = ruleParameterList; this.GetRuleCalculator(this.engineEnvironment, ref RuleCalc, prs, dt, AsgRule, CalcDateZone); if (RuleCalc != null) { try { if (ruleDurationDebug) { RuleStopWatch.Reset(); RuleStopWatch.Start(); } if (ruleUserDefinedList.Any(x => x.IdentifierCode.Equals(AsgRule.IdentifierCode))) { try { string ruleName = "R" + AsgRule.IdentifierCode.ToString(CultureInfo.InvariantCulture); //DesignedCalculator.DesignedRuleCalculator a = new DesignedCalculator.DesignedRuleCalculator(); Assembly asm = typeof(DesignedRuleCalculator).Assembly; Type type = typeof(RuleCalculator); MethodInfo info = type.GetExtensionMethod(asm, ruleName); if (info != null) { info.Invoke(RuleCalc, new object[] { RuleCalc, AsgRule }); } else { throw new BaseException(String.Format("قانون شماره {0} در فايل اسمبلي کاربر يافت نشد", AsgRule.IdentifierCode), "ExecuteRule.UserDefiendRule"); } } catch (ExecuteRuleException ex) { gtsRuleLogger.Error(prs.PersonCode, "UserDefiend ExecuteRule: " + ex.StackTrace, ex); gtsRuleLogger.Flush(); //توسط صلواتي در خطا بايد محاسبات خاتمه پيدا کند throw; } } else { try { RuleCalc.ExecuteRule(); } catch (ExecuteRuleException ex) { gtsRuleLogger.Error(prs.PersonCode, "ExecuteRule: " + ex.StackTrace, ex); gtsRuleLogger.Flush(); //توسط صلواتي در خطا بايد محاسبات خاتمه پيدا کند throw; } } if (ruleDurationDebug) { gtsRuleLogger.Info(prs.BarCode, String.Format("Rule:R{0}, Duration:{1}, Date:{2}", RuleCalc.AssignedRule.IdentifierCode, RuleStopWatch.Elapsed.ToString(), dt)); } } catch (BaseException ex) { if (ex.InnerException != null && ex.InnerException is BaseException && ((BaseException)ex.InnerException).InsertedLog) { ex.InsertedLog = true; } BaseException.GetLog(gtsRuleLogger, prs.PersonCode, ex); //gtsRuleLogger.Error(prs.PersonCode, "ExecuteRule: " + ex.StackTrace, ex); //gtsRuleLogger.Flush(); throw; } finally { RuleCalc.Dispose(); } } } #endregion } NHibernateSessionManager.Instance.CommitTransactionOn(); } using (NHibernateSessionManager.Instance.BeginTransactionOn(FlushMode.Auto)) { try { mut.WaitOne(); IPersonRepository PrsRepository = Person.GetPersonRepository(false); PrsRepository.DeleteScndCnpValue(prs.ID, CalcDateZone.FromDate, CalcDateZone.ToDate); prs.ScndCnpValueList.DoInsert(NHibernateSessionManager.Instance.GetSession().Connection, NHibernateSessionManager.Instance.GetTransaction().GetDbTransaction); PrsRepository.RunSQL(prs.ScndCnpValueList.UpdateQuery); UpdateExecutablePersonCalculation(ExecutablePrsCalcId, PersonId, ToDate); //throw new Exception("اين خطا براي تست عقب گرد تراکنش ايجاد شده است"); NHibernateSessionManager.Instance.CommitTransactionOn(); } catch (Exception ex) { try { BaseException.GetLog(gtsRuleLogger, prs.BarCode, ex, "Rollback -- ExecuteRule(Insert Results): " + ex.StackTrace); //gtsRuleLogger.Error(prs.PersonCode, "Rollback -- ExecuteRule(Insert Results): " + ex.StackTrace, ex); //gtsRuleLogger.Flush(); NHibernateSessionManager.Instance.RollbackTransactionOn(); } catch (Exception except) { BaseException.GetLog(gtsRuleLogger, prs.BarCode, except, ex.StackTrace); //gtsRuleLogger.Error(prs.BarCode, except.StackTrace, except); //gtsRuleLogger.Flush(); } throw; } finally { mut.ReleaseMutex(); } } } catch (Exception ex) { BaseException.GetLog(gtsRuleLogger, prs.BarCode, ex); //gtsRuleLogger.Error(prs.BarCode, ex.StackTrace, ex); //gtsRuleLogger.Flush(); throw; } } MainStopWatch.Stop(); gtsRuleLogger.Info(prs.BarCode, String.Format("Person {0} Duration : {1}", prs.BarCode, MainStopWatch.Elapsed.ToString())); gtsRuleLogger.Flush(); }