Пример #1
0
        /// <summary>
        /// 根据当前用户+请求uri 获取父菜单Id;
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="uri"></param>
        /// <returns></returns>
        public Tuple <string, string, string> GetParentModuleIds(int userId, string uri)
        {
            string sqlstr =
                "select moduleid from moduleinfo where status=0 and moduleid in (SELECT DISTINCT  moduleid FROM RoleModule WHERE roleid IN(select roleid from userrole where userID=@userId and  status=0)) order by level desc";
            //获取用户已经有的 moduleId;
            var userHaveModuleIds = _navigationDapperRepository.QueryBySql <string>(sqlstr, new { userId = userId });

            var sysId   = _configuration["ThisSysID"];
            var nav2or3 =
                _navigationDapperRepository.Find(s =>
                                                 s.Status == 0 && s.SysID == sysId && s.Links.Contains(uri));

            if (nav2or3 == null)
            {
                return(new Tuple <string, string, string>("", "", ""));
            }
            var b = userHaveModuleIds.Contains(nav2or3.ModuleID);

            //三级
            if (nav2or3.ModuleID.Contains("SUB"))
            {
                var moduleId2 = _navigationDapperRepository.Where(s => s.ModuleID == nav2or3.ModuleID).Select(s => s.PID).FirstOrDefault();
                var moduleId1 = _navigationDapperRepository.Where(s => s.ModuleID == moduleId2).Select(s => s.PID).FirstOrDefault();

                return(new Tuple <string, string, string>(moduleId1, moduleId2, nav2or3.ModuleID));
            }
            else
            {
                var moduleId1 = _navigationDapperRepository.Where(s => s.ModuleID == nav2or3.ModuleID).Select(s => s.PID).FirstOrDefault();
                return(new Tuple <string, string, string>(moduleId1, nav2or3.ModuleID, ""));
            }
        }
Пример #2
0
        private List <ExpenseAccount> RedirectSplit(List <ExpenseAccount> models, int year, int month, string period)
        {
            var redirectList = new List <ExpenseAccount>();
            var businessRedirectSplitInfos = _businessRedirectSplitRepository.Where(s => s.Month == month && s.Year == year);
            var departsVersion             = _departRepository.Where(s => s.Period == period);

            foreach (var item in models)
            {
                var count = businessRedirectSplitInfos.Count(s => s.FromDepartId == item.DepartID);
                if (count == 0)
                {
                    item.SourceId   = item.Id;
                    item.Id         = 0;
                    item.CreateTime = DateTime.Now;
                    item.Step       = (int)CommonEnum.EnumCostAccountSplitStep.RedirectSplit;
                    item.Formula   += $"定向:计入---->";
                    redirectList.Add(item);
                }
                else
                {
                    int     i         = 1;
                    decimal sum       = 0;
                    decimal allAmount = item.Amount;
                    foreach (var redict in businessRedirectSplitInfos.Where(s => s.FromDepartId == item.DepartID).OrderBy(s => s.Split))
                    {
                        var toRate = string.IsNullOrEmpty(redict.Split)
                            ? 0
                            : decimal.Round(Convert.ToDecimal(redict.Split) * (decimal)0.01, 2);
                        var temAmount = decimal.Round(item.Amount * toRate, 2); //定向后的钱

                        var tem = JsonConvert.DeserializeObject <ExpenseAccount>(JsonConvert.SerializeObject(item));
                        tem.DepartID       = redict.ToDepartId;
                        tem.DepartNamePath = departsVersion.Where(s => s.DepartID == redict.ToDepartId).Select(s => s.NamePath).FirstOrDefault();
                        tem.Amount         = i == count ? allAmount - sum : temAmount;

                        tem.Ratio    = toRate;
                        tem.SourceId = item.Id;
                        tem.Step     = (int)CommonEnum.EnumCostAccountSplitStep.RedirectSplit;
                        tem.Formula += i == count ? $"定向:({allAmount}-{sum})---->" : $"定向:({item.Amount}*{toRate})---->";

                        redirectList.Add(tem);
                        i++;
                        sum += temAmount;
                    }
                }
            }

            return(redirectList);
        }
Пример #3
0
        public bool DoSplit(string poCode = "", string period = null)
        {
            /**
             * 1、获取所有拆分前数据             *
             * 2、获取定向数据 拆分比例
             */
            //计入日期
            period = (string.IsNullOrEmpty(period) || period.Length != 7) ? DateTime.Now.AddMonths(-1).ToString("yyyy-MM") : period;
            int month = (string.IsNullOrEmpty(period) || period.Length != 7) ? DateTime.Now.AddMonths(-1).Month : Convert.ToInt32(period.Split('-')[1]);
            int year  = (string.IsNullOrEmpty(period) || period.Length != 7) ? DateTime.Now.AddMonths(-1).Year : Convert.ToInt32(period.Split('-')[0]);

            //更新状态
            var dic = EnumHelper.GetValueAndDesc <CommonEnum.EnumCostAccountSplitStep>();

            dic.Remove((int)CommonEnum.EnumCostAccountSplitStep.BeforeSplit);
            var steps = dic.Select(s => s.Key).ToList();

            Expression <Func <CostAccount, bool> > delExpression = s => s.Status == 0 && s.Period == period && steps.Contains(s.Step);

            if (!string.IsNullOrEmpty(poCode))
            {
                delExpression = delExpression.And(s => s.POCode == poCode);
            }

            var cc = _costAccountRepository.UpdateWhere(delExpression, new CostAccount()
            {
                Status = -1, LastUpdateTime = DateTime.Now
            }, t => t.Status, t => t.LastUpdateTime);

            //1
            var be      = (int)CommonEnum.EnumCostAccountSplitStep.BeforeSplit;
            var befores = _costAccountRepository.Where(s => s.Period == period && s.Status == 0 && s.Step == be)
                          .WhereIf(!string.IsNullOrEmpty(poCode), s => s.POCode == poCode)
                          .ToList();

            //2
            var businessRedirectSplitInfos = _businessRedirectSplitRepository.Where(s => s.Month == month && s.Year == year);

            #region 公共成本拆分
            //拆分
            //拆到末级集合;
            var lastDepInfo = new List <CostAccount>();
            //循环递归---到末级
            CommonSplit(befores, lastDepInfo, month, year);
            var commonSplits = _costAccountRepository.Add(lastDepInfo);
            if (commonSplits == 0)
            {
                return(false);
            }
            #endregion

            #region 定向拆分
            //定向
            //查询出所有已经 完成公共成本拆分的
            var ss = (int)CommonEnum.EnumCostAccountSplitStep.CommonSplit;
            var hasCommonSplits = _costAccountRepository.Where(s => s.Step == ss && s.Period == period && s.Status == 0)
                                  .WhereIf(!string.IsNullOrEmpty(poCode), s => s.POCode == poCode)
                                  .ToList();
            var departsVersion = _departRepository.Where(s => s.Period == period);
            var redirectList   = new List <CostAccount>();
            foreach (var item in hasCommonSplits)
            {
                var count = businessRedirectSplitInfos.Count(s => s.FromDepartId == item.DepartID);
                if (count == 0)
                {
                    item.SourceId   = item.Id;
                    item.Id         = 0;
                    item.CreateTime = DateTime.Now;
                    item.Step       = (int)CommonEnum.EnumCostAccountSplitStep.RedirectSplit;
                    item.Formula   += $"定向:计入---->";
                    redirectList.Add(item);
                }
                else
                {
                    int     i         = 1;
                    decimal sum       = 0;
                    decimal allAmount = item.Amount;
                    foreach (var redict in businessRedirectSplitInfos.Where(s => s.FromDepartId == item.DepartID).OrderBy(s => s.Split))
                    {
                        var toRate = string.IsNullOrEmpty(redict.Split)
                            ? 0
                            : decimal.Round(Convert.ToDecimal(redict.Split) * (decimal)0.01, 2);
                        var temAmount = decimal.Round(item.Amount * toRate, 2); //定向后的钱

                        var tem = JsonConvert.DeserializeObject <CostAccount>(JsonConvert.SerializeObject(item));
                        tem.DepartID       = redict.ToDepartId;
                        tem.DepathNamePath = departsVersion.Where(s => s.DepartID == redict.ToDepartId).Select(s => s.NamePath).FirstOrDefault();
                        tem.Amount         = i == count ? allAmount - sum : temAmount;

                        tem.Ratio    = toRate;
                        tem.SourceId = item.Id;
                        tem.Step     = (int)CommonEnum.EnumCostAccountSplitStep.RedirectSplit;
                        tem.Formula += i == count ? $"定向:({allAmount}-{sum})---->" : $"定向:({item.Amount}*{toRate})---->";

                        redirectList.Add(tem);
                        i++;
                        sum += temAmount;
                    }
                }
            }
            var num = _costAccountRepository.Add(redirectList);
            if (num == 0)
            {
                return(false);
            }
            #endregion

            #region 业务--》管理
            //业务---》管理关系
            var ss1         = (int)CommonEnum.EnumCostAccountSplitStep.RedirectSplit;
            var hasRedirect = _costAccountRepository.Where(s => s.Step == ss1 && s.Period == period && s.Status == 0)
                              .WhereIf(!string.IsNullOrEmpty(poCode), s => s.POCode == poCode)
                              .ToList();
            var achs = _achMappingRepository.Where(s => s.Status == 0 && s.Month == month && s.Year == year);

            foreach (var item in hasRedirect)
            {
                var ach = achs.FirstOrDefault(s => s.BusinessDepartID == item.DepartID);

                item.SourceId       = item.Id;
                item.Id             = 0;
                item.Step           = (int)CommonEnum.EnumCostAccountSplitStep.BusinessToAchDepartSplit;
                item.DepartID       = ach?.AchievementDepartID;
                item.DepathNamePath = ach?.AchievementDepartName;
                item.CreateTime     = DateTime.Now;
            }
            var n = _costAccountRepository.Add(hasRedirect);

            if (n == 0)
            {
                return(false);
            }
            #endregion

            return(true);
        }
Пример #4
0
        public List <CostAccount> GetAllBeforeSplits()
        {
            var models = _costAccountRepository.Where(s => s.Status == 0).ToList();

            return(models);
        }
Пример #5
0
        public bool AddCostAccountBeforeSplit(string poCode = "", string period = null)
        {
            //计入日期
            if (string.IsNullOrEmpty(period) || period.Length != 7)
            {
                period = DateTime.Now.AddMonths(-1).ToString("yyyy-MM");
            }


            #region 获取范围数据

            Expression <Func <PurchaseOrderLineConfirmHistory, bool> >          histExp = s => s.Status == 0 && s.Period == period;
            Expression <Func <PurchaseRequirementDeptShareRatioVersion, bool> > verExp  = s =>
                                                                                          s.Status == 0 && s.Period == period;
            if (!string.IsNullOrEmpty(poCode))
            {
                histExp = histExp.And(s => s.POCode == poCode);
                verExp  = verExp.And(s => s.POCode == poCode);
            }

            var historys = _polchRepository.Where(histExp);
            var versions = _purchaseRequirementDeptShareRatioVersionRepository.Where(verExp);
            #endregion

            var configs  = _costAccountConfigRepository.Where(s => s.Status == 0);
            var dicInfos = _commonDataService.GetDicInfos();

            //1.历史记录表
            var models = new List <PurchaseOrderLineConfirmHistory>();
            foreach (var confirmHistory in historys)
            {
                var count = versions.Count(s => s.POCode == confirmHistory.POCode && s.POLineNum == confirmHistory.POLineNum);
                if (count > 0)
                {
                    int     i         = 1;
                    decimal sum       = 0;
                    decimal allAmount = confirmHistory.Amount;
                    foreach (var ver in versions.Where(s => s.POCode == confirmHistory.POCode && s.POLineNum == confirmHistory.POLineNum))
                    {
                        var toDepartId = ver.DepartID;
                        var toRate     = ver.ShareProportion * (decimal)0.01;

                        var tem = Newtonsoft.Json.JsonConvert.DeserializeObject <PurchaseOrderLineConfirmHistory>(Newtonsoft.Json.JsonConvert.SerializeObject(confirmHistory));// JsonConvert (confirmHistory);
                        tem.DepartID       = toDepartId;
                        tem.DepartNamePath = ver.DepartNamePath;
                        tem.Amount         = i == count ? allAmount - sum : decimal.Round(confirmHistory.Amount * toRate, 2);//满足总和一致

                        tem.Ratio    = toRate;
                        tem.Formula += i == count ? $"拆分前:({allAmount}-{sum})---->" : $"拆分前:({confirmHistory.Amount}*{toRate})---->";

                        models.Add(tem);
                        i++;
                        sum += tem.Amount;
                    }
                }
                else
                {
                    models.Add(confirmHistory);
                }
            }

            var costAccounts = new List <CostAccount>();
            foreach (var item in models)
            {
                var tem = configs.Where(s => (s.CompanyCode == item.CompanyCode || s.CompanyCode == "-99") &&
                                        s.ContentType == item.ContentType &&
                                        s.ProductCat1 == item.MaterialClassCode &&
                                        (s.ProductCat2 == item.MaterialCode || s.ProductCat2 == "-99")).ToList();
                var costAccountConfig = tem.OrderByDescending(s => s.CompanyCode).ThenByDescending(s => s.ProductCat2).FirstOrDefault() ?? new CostAccountConfig();
                var ca = new CostAccount
                {
                    POCode              = item.POCode,
                    POLineNum           = item.POLineNum,
                    DepartID            = item.DepartID,
                    DepathNamePath      = item.DepartNamePath,
                    Period              = item.Period,
                    Amount              = item.Amount,
                    MaterialClassCode   = item.MaterialClassCode,
                    MaterialClassName   = item.MaterialClassName,
                    MaterialCode        = item.MaterialCode,
                    MaterialName        = item.MaterialName,
                    ExpenseItem         = item.ExpenseItem,
                    ExpenseItemName     = item.ExpenseItemName,
                    ProjectCode         = item.ProjectCode,
                    ProjectName         = item.ProjectName,
                    CompanyCode         = item.CompanyCode,
                    CompanyName         = item.CompanyName,
                    SupplierID          = item.SupplierID,
                    SupplierName        = item.SupplierName,
                    ContentType         = item.ContentType,
                    ContentTypeName     = item.ContentTypeName,
                    CostAccountConfigID = costAccountConfig.Id,
                    SubjectCode         = costAccountConfig.PayOutType1,
                    SubjectName         = costAccountConfig.PayOutType1 == 0?null:dicInfos.FirstOrDefault(s => s.DictId == costAccountConfig.PayOutType1)?.DictName,
                    SecondSubjectCode   = costAccountConfig.PayOutType2,
                    SecondSubjetName    = costAccountConfig.PayOutType2 == 0 ? null : costAccountConfig.PayOutType2 == -99?"缺省" :dicInfos.FirstOrDefault(s => s.DictId == costAccountConfig.PayOutType2)?.DictName,
                    Status              = 0,
                    CreateTime          = DateTime.Now,

                    Ratio   = item.Ratio,
                    Step    = (int)CommonEnum.EnumCostAccountSplitStep.BeforeSplit,
                    Formula = string.IsNullOrEmpty(item.Formula) ? "拆分前:计入---->" : item.Formula,


                    PRCode           = item.PRCode,
                    PRDepartID       = item.PRDepartID,
                    PRDepartNamePath = item.PRDepartNamePath,
                    POCreateTime     = item.POCreateTime,
                    POLineAmount     = item.POLineAmount,
                    POLineBeginTime  = item.POLineBeginTime,
                    POLineEndTime    = item.POLineEndTime,
                    CustID           = item.CustID,
                    CustName         = item.CustName,
                    OrderEnum        = item.OrderEnum,
                    OrderEnumName    = item.OrderEnumName,
                    TaxCode          = item.TaxCode
                };
                costAccounts.Add(ca);
            }



            using (var uow = _uowCrm.Create())
            {
                //更新状态
                Expression <Func <CostAccount, bool> > delExpression = s => s.Status == 0 && s.Period == period;
                if (!string.IsNullOrEmpty(poCode))
                {
                    delExpression = delExpression.And(s => s.POCode == poCode);
                }
                var cc = _costAccountRepository.UpdateWhere(delExpression, new CostAccount()
                {
                    Status = -1, LastUpdateTime = DateTime.Now
                }, t => t.Status, t => t.LastUpdateTime);
                var num = _costAccountRepository.Add(costAccounts);
                uow.SaveChanges();
                return(true);
            }
        }
Пример #6
0
        public List <DepartMentVersion> GetDepartMentsByVersion(string period)
        {
            var departMentVersions = _departVersionRepository.Where(s => s.Period == period).ToList();

            return(departMentVersions);
        }
Пример #7
0
        public List <DepartMent> GetDepartMents()
        {
            var tem = _departMentRepository.Where(s => s.Status == 0).ToList();

            return(tem);
        }
Пример #8
0
        /// <summary>
        /// 费用进行拆分
        /// </summary>
        /// <param name="expenseType">费用类型</param>
        /// <param name="expenseCode"></param>
        /// <param name="period"></param>
        /// <returns></returns>
        public bool ExpenseAccountDoSplit(int expenseType, string expenseCode = "", string period = null)
        {
            //计入日期
            period = (string.IsNullOrEmpty(period) || period.Length != 7) ? DateTime.Now.AddMonths(-1).ToString("yyyy-MM") : period;
            int month = (string.IsNullOrEmpty(period) || period.Length != 7) ? DateTime.Now.AddMonths(-1).Month : Convert.ToInt32(period.Split('-')[1]);
            int year  = (string.IsNullOrEmpty(period) || period.Length != 7) ? DateTime.Now.AddMonths(-1).Year : Convert.ToInt32(period.Split('-')[0]);


            //更新删除
            #region 修改为删除状态
            var dic = EnumHelper.GetValueAndDesc <CommonEnum.EnumCostAccountSplitStep>();
            dic.Remove((int)CommonEnum.EnumCostAccountSplitStep.BeforeSplit);
            var steps = dic.Select(s => s.Key).ToList();
            Expression <Func <ExpenseAccount, bool> > exptem = s => s.Status == 0 && s.Period == period && s.ExpenseType == expenseType && steps.Contains(s.Step);
            if (!string.IsNullOrEmpty(expenseCode))
            {
                exptem = exptem.And(s => s.ExpenseCode == expenseCode);
            }



            var cc = _expenseAccountRepository.UpdateWhere(exptem
                                                           , new ExpenseAccount()
            {
                Status = -1, LastUpdateTime = DateTime.Now
            }, t => t.Status, t => t.LastUpdateTime);

            #endregion

            var step = (int)CommonEnum.EnumCostAccountSplitStep.BeforeSplit;
            Expression <Func <ExpenseAccount, bool> > expression1 = s => s.Period == period && s.Step == step && s.ExpenseType == expenseType;
            if (!string.IsNullOrEmpty(expenseCode))
            {
                expression1 = expression1.And(s => s.ExpenseCode == expenseCode);
            }
            //获取数据
            var models1 = _expenseAccountRepository.Where(expression1);
            //拆到末级转换
            var entities2 = CommonSplit(models1, month, year);
            //插入数据库
            var num2 = _expenseAccountRepository.Add(entities2);
            if (num2 == 0)
            {
                return(false);
            }

            //-------定向
            var step2 = (int)CommonEnum.EnumCostAccountSplitStep.CommonSplit;
            Expression <Func <ExpenseAccount, bool> > expression2 = s => s.Period == period && s.Step == step2 && s.ExpenseType == expenseType;
            if (!string.IsNullOrEmpty(expenseCode))
            {
                expression2 = expression2.And(s => s.ExpenseCode == expenseCode);
            }
            //获取数据
            var models2   = _expenseAccountRepository.Where(expression2);
            var entities3 = RedirectSplit(models2, year, month, period);
            //插入数据库
            var num3 = _expenseAccountRepository.Add(entities3);
            if (num3 == 0)
            {
                return(false);
            }


            //-----管理架构
            var step3 = (int)CommonEnum.EnumCostAccountSplitStep.RedirectSplit;
            Expression <Func <ExpenseAccount, bool> > expression3 = s => s.Period == period && s.Step == step3 && s.ExpenseType == expenseType;
            if (!string.IsNullOrEmpty(expenseCode))
            {
                expression3 = expression3.And(s => s.ExpenseCode == expenseCode);
            }

            var hasRedirect = _expenseAccountRepository.Where(expression3);
            var achs        = _achMappingRepository.Where(s => s.Status == 0 && s.Month == month && s.Year == year);

            foreach (var item in hasRedirect)
            {
                var ach = achs.FirstOrDefault(s => s.BusinessDepartID == item.DepartID);

                item.SourceId       = item.Id;
                item.Id             = 0;
                item.Step           = (int)CommonEnum.EnumCostAccountSplitStep.BusinessToAchDepartSplit;
                item.DepartID       = ach?.AchievementDepartID;
                item.DepartNamePath = ach?.AchievementDepartName;
                item.CreateTime     = DateTime.Now;
            }
            var num4 = _expenseAccountRepository.Add(hasRedirect);

            if (num4 == 0)
            {
                return(false);
            }

            return(num2 + num3 + num4 > 0);
        }