public Result <List <AttendanceBranchCountView> > GetBranchUserCount(string ProName, string companyId, string startTime, string endTime, string userName, int pageIndex, int pageSize)
        {
            Result <List <AttendanceBranchCountView> > result = new Result <List <AttendanceBranchCountView> >();

            var query = from a in context.Epm_Project.Where(p => p.IsDelete == false)
                        join b in context.Epm_SignInformation.Where(p => p.IsDelete == false) on a.Id equals b.projectId into temp
                        from tt in temp.DefaultIfEmpty()
                        select new
            {
                a,
                tt,
                OperateDate = DbFunctions.TruncateTime(tt.SignTime)
            };

            // query = query.OrderByDescending(t => t.a.CompanyName).Where(t => string.IsNullOrEmpty(projectNature) || projectNature.Contains(t.a.ProjectNature));

            if (!string.IsNullOrEmpty(companyId))
            {
                query = query.Where(p => p.a.CompanyId.ToString() == companyId);
            }
            if (!string.IsNullOrEmpty(startTime))
            {
                DateTime stime = Convert.ToDateTime(startTime);
                query = query.Where(p => p.tt.SignTime >= stime);
            }
            if (!string.IsNullOrEmpty(endTime))
            {
                DateTime stime = Convert.ToDateTime(endTime);
                query = query.Where(p => p.tt.SignTime <= stime);
            }
            if (!string.IsNullOrEmpty(ProName))
            {
                query = query.Where(p => p.a.Name.Contains(ProName));
            }
            if (!string.IsNullOrEmpty(userName))
            {
                query = query.Where(p => p.tt.userName.Contains(userName));
            }
            List <AttendanceBranchCountView> listView = new List <AttendanceBranchCountView>();
            var list = query.GroupBy(m => new { m.a.CompanyId, m.a.CompanyName, m.OperateDate, m.a.Name, m.a.Id, m.tt.userId, m.tt.userName }).Select(m => new AttendanceBranchCountView
            {
                //sort = i + 1,
                CompanyId       = m.Key.CompanyId.ToString(),
                CompanyName     = m.Key.CompanyName,
                AttendanceCount = m.Count(),//总考勤人数
                dateTime        = m.Key.OperateDate.ToString(),
                Name            = m.Key.Name,
                projectId       = m.Key.Id.ToString(),
                userName        = m.Key.userName,
                userID          = m.Key.userId.ToString(),
            }).ToList();


            if (list.Count > 0)
            {
                foreach (var item in list)
                {
                    //if (item.a.Id.ToString()== "1211848000893227008" || item.a.Id.ToString() == "1211872754194845696")
                    //{
                    AttendanceBranchCountView view = new AttendanceBranchCountView();
                    view.PreName          = item.CompanyName ?? "";                                            //分公司
                    view.Name             = item.Name ?? "";                                                   //项目名字
                    view.dateTime         = item.dateTime == null ? "" : item.dateTime == "" ? "" : item.dateTime.Substring(0, 11);
                    view.userName         = item.userName;                                                     //考勤人员
                    view.RegulationsCount = 1 * 2;                                                             // 总考勤次数(人数* 规定打卡次数)

                    view.ActualCount = GetUserAttendanceUserCount(item.projectId, item.userID, view.dateTime); //实际打卡总数

                    if (view.ActualCount != 0 && view.RegulationsCount != 0)
                    {
                        double percent = Math.Round(view.ActualCount * 1.00 / view.RegulationsCount * 100.0, 4);
                        view.AttendanceRate = percent.ToString() + "%";//得到5.8824%
                    }
                    listView.Add(view);
                    // }
                }
            }

            if (list.Count > 0)
            {
                result.AllRowsCount = listView.Count;
                listView            = listView.OrderByDescending(t => t.dateTime).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
                result.Data         = listView;
                result.Flag         = EResultFlag.Success;
            }
            else
            {
                result.Data = null;
                result.Flag = EResultFlag.Failure;
            }

            return(result);
        }
        public Result <List <AttendanceBranchCountView> > GetBranchProjectCount(string name, string companyId, string startTime, string endTime, int pageIndex, int pageSize)
        {
            Result <List <AttendanceBranchCountView> > result = new Result <List <AttendanceBranchCountView> >();
            int num = DataOperateBusiness <Epm_ProjectAttendance> .Get().GetList(p => p.IsDelete == false).OrderBy(p => p.StartTime).GroupBy(p => p.StartTime).Count();


            var query = from a in context.Epm_Project.Where(p => p.IsDelete == false)
                        join b in context.Epm_SignInformation.Where(p => p.IsDelete == false) on a.Id equals b.projectId into temp
                        from tt in temp.DefaultIfEmpty()
                        select new
            {
                a,
                tt,
                OperateDate = DbFunctions.TruncateTime(tt.SignTime)
            };

            if (!string.IsNullOrEmpty(companyId))
            {
                query = query.Where(p => p.a.CompanyId.ToString() == companyId);
            }
            if (!string.IsNullOrEmpty(startTime))
            {
                DateTime stime = Convert.ToDateTime(startTime);
                query = query.Where(p => p.tt.SignTime >= stime);
            }
            if (!string.IsNullOrEmpty(endTime))
            {
                DateTime stime = Convert.ToDateTime(endTime);
                query = query.Where(p => p.tt.SignTime <= stime);
            }
            if (!string.IsNullOrEmpty(name))
            {
                query = query.Where(p => p.a.Name.Contains(name));
            }
            List <AttendanceBranchCountView> listView = new List <AttendanceBranchCountView>();

            var list = query.GroupBy(m => new { m.a.CompanyId, m.a.CompanyName, m.OperateDate, m.a.Name, m.a.Id }).Select(m => new AttendanceBranchCountView
            {
                CompanyId       = m.Key.CompanyId.ToString(),
                CompanyName     = m.Key.CompanyName,
                AttendanceCount = m.Count(),//总考勤人数
                dateTime        = m.Key.OperateDate.ToString(),
                Name            = m.Key.Name,
                projectId       = m.Key.Id.ToString(),
            }).ToList();

            if (list.Count > 0)
            {
                foreach (var item in list)
                {
                    AttendanceBranchCountView view = new AttendanceBranchCountView();
                    view.PreName  = item.CompanyName ?? "";
                    view.Name     = item.Name ?? "";//项目名字
                    view.dateTime = item.dateTime == null ? "" : item.dateTime == "" ? "" : item.dateTime.Substring(0, 11);

                    view.AttendanceCount = GetProjectAllActualCount(item.projectId.ToString());                   //总考勤人数(每个项目下考勤的人数)

                    view.RegulationsCount = view.AttendanceCount * num;                                           //总考勤次数(人数*规定打卡次数)
                    view.ActualCount      = GetProjectActualCount(item.projectId.ToString(), view.dateTime, num); //实际打卡总数

                    if (view.ActualCount != 0 && view.RegulationsCount != 0)
                    {
                        double percent = Math.Round(view.ActualCount * 1.00 / view.RegulationsCount * 100.0, 4);
                        view.AttendanceRate = percent.ToString() + "%";//得到5.8824%
                    }
                    listView.Add(view);
                }
            }

            if (list.Count > 0)
            {
                result.AllRowsCount = listView.Count;
                listView            = listView.OrderByDescending(t => t.dateTime).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
                result.Data         = listView;
                result.Flag         = EResultFlag.Success;
            }
            else
            {
                result.Data = null;
                result.Flag = EResultFlag.Failure;
            }

            return(result);
        }