Ejemplo n.º 1
0
        /// <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();
        }