using Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BLL { public static class InOutRecordProjectStatisticsService { public static Model.SUBQHSEDB db = Funs.DB; public static List BeUnderConstructionList = ProjectService.GetProjectWorkList().Where(x => (x.ProjectAttribute == "GONGCHENG" || x.ProjectAttribute == null)).ToList(); public static List GetStatistics( DateTime date) { List result = new List(); var units = db.Base_Unit.Where(x => x.IsBranch == true).OrderBy(x => x.UnitCode).ToList(); int index = 1; foreach (var unit in units) { List unitResult = new List(); var projectList = BeUnderConstructionList.Where(x => x.UnitId == unit.UnitId); foreach (var project in projectList) { Model.InOutRecordProjectStatisticsOutput projectResult = new Model.InOutRecordProjectStatisticsOutput(); var OnDutyCount = db.SitePerson_Person.Where(x => project.ProjectId == x.ProjectId && x.IsUsed == true && x.InTime.Value <= date.Date).ToList(); var CheckInCount = db.SitePerson_PersonInOut.Where(x => x.ChangeTime.Value.Date == date.Date && x.ProjectId == project.ProjectId).Select(x => x.IdentityCard).Distinct().Count(); var LeaveCount = db.SitePerson_PersonLeave .ToList() // 将数据加载到内存中 .Where(x => { if (DateTime.TryParse(x.StartTime, out var startDate) && DateTime.TryParse(x.EndTime, out var endDate)) { return startDate.Date <= date.Date && endDate.Date >= date.Date && x.ProjectId == project.ProjectId; } return false; }) .Select(x => x.IdCrads) .Distinct() .Count(); var LeaveRate= OnDutyCount.Count==0? "0%" : Math.Round((double)(Convert.ToDouble(LeaveCount) / Convert.ToDouble(OnDutyCount.Count)),4)*100 + "%"; var CheckInRate= OnDutyCount.Count==0? "0%" : Math.Round((double)(Convert.ToDouble(CheckInCount) / Convert.ToDouble(OnDutyCount.Count)),4)*100 + "%"; var DoorControlCount= db.SitePerson_PersonInOut.Where(x => x.ChangeTime.Value.Date == date.Date && x.ProjectId == project.ProjectId && x.InOutWay=="1").Select(x => x.IdentityCard).Distinct().Count(); var MobileCheckInCount = db.SitePerson_PersonInOut.Where(x => x.ChangeTime.Value.Date == date.Date && x.ProjectId == project.ProjectId && x.InOutWay=="3").Select(x => x.IdentityCard).Distinct().Count(); var DoorControlRatio = CheckInCount == 0? "0%" : Math.Round((double)(Convert.ToDouble(DoorControlCount) / Convert.ToDouble(CheckInCount)),4)*100 + "%"; var MobileCheckInRatio = CheckInCount == 0? "0%" : Math.Round((double)(Convert.ToDouble(MobileCheckInCount) / Convert.ToDouble(CheckInCount)),4)*100 + "%"; var ContractStatisticsUploadCount= OnDutyCount.Count; var ContractStatisticsUploadSuccessCount = (from x in db.AttachFile join y in db.SitePerson_Person on x.ToKeyId equals y.PersonId+"#2" where y.ProjectId == project.ProjectId && y.IsUsed == true && y.InTime.Value <= date.Date select x).Count(); string ContractStatisticsUploadRatio = ContractStatisticsUploadCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(ContractStatisticsUploadSuccessCount) / Convert.ToDouble(ContractStatisticsUploadCount)),4)*100 + "%"; var EduTrainUploadCount = OnDutyCount.Count; var EduTrainUploadSuccessCount=( from x in db.View_EduTrain_TrainFind join y in db.SitePerson_Person on x.PersonId equals y.PersonId where y.ProjectId == project.ProjectId && y.IsUsed == true && y.InTime.Value <= date.Date && x.TrainTypeName=="入场教育" select x.PersonId).Distinct().Count(); var EduTrainUploadRatio= EduTrainUploadCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(EduTrainUploadSuccessCount) / Convert.ToDouble(EduTrainUploadCount)),4)*100 + "%"; projectResult.Id=project.ProjectId; projectResult.SortIndex= (unitResult.Count+1).ToString(); projectResult.type =1; projectResult.ProjectName = project.ProjectName; projectResult.OnDutyCount = OnDutyCount.Count; projectResult.CheckInCount = CheckInCount; projectResult.LeaveCount = LeaveCount; projectResult.LeaveRate = LeaveRate; projectResult.CheckInRate = CheckInRate; projectResult.DoorControlCount = DoorControlCount; projectResult.DoorControlRatio = DoorControlRatio; projectResult.MobileCheckInCount = MobileCheckInCount; projectResult.MobileCheckInRatio = MobileCheckInRatio; projectResult.ContractStatisticsUploadCount = ContractStatisticsUploadCount; projectResult.ContractStatisticsUploadSuccessCount = ContractStatisticsUploadSuccessCount; projectResult.ContractStatisticsUploadRatio = ContractStatisticsUploadRatio; projectResult.EduTrainUploadCount = EduTrainUploadCount; projectResult.EduTrainUploadSuccessCount = EduTrainUploadSuccessCount; projectResult.EduTrainUploadRatio = EduTrainUploadRatio; unitResult.Add(projectResult); } Model.InOutRecordProjectStatisticsOutput unitModel = new Model.InOutRecordProjectStatisticsOutput(); unitModel.Id = unit.UnitName; unitModel.type = 0; unitModel.SortIndex = Funs.ConvertToChineseNumber(index); unitModel.ProjectName = unit.UnitName; unitModel.OnDutyCount = unitResult.Sum(x => x.OnDutyCount); unitModel.CheckInCount = unitResult.Sum(x => x.CheckInCount); unitModel.LeaveCount = unitResult.Sum(x => x.LeaveCount); unitModel.LeaveRate = unitModel.OnDutyCount==0 ? "0%" : (Math.Round((double)(Convert.ToDouble(unitModel.LeaveCount) / Convert.ToDouble(unitModel.OnDutyCount)), 4) * 100 + "%"); unitModel.CheckInRate = unitModel.OnDutyCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(unitModel.CheckInCount) / Convert.ToDouble(unitModel.OnDutyCount)), 4) * 100 + "%"; unitModel.DoorControlCount = unitResult.Sum(x => x.DoorControlCount); unitModel.MobileCheckInCount = unitResult.Sum(x => x.MobileCheckInCount); unitModel.DoorControlRatio = unitModel.CheckInCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(unitModel.DoorControlCount) / Convert.ToDouble(unitModel.CheckInCount)), 4) * 100 + "%"; unitModel.MobileCheckInRatio = unitModel.CheckInCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(unitModel.MobileCheckInCount) / Convert.ToDouble(unitModel.CheckInCount)), 4) * 100 + "%"; unitModel.ContractStatisticsUploadCount = unitResult.Sum(x => x.ContractStatisticsUploadCount); unitModel.ContractStatisticsUploadSuccessCount = unitResult.Sum(x => x.ContractStatisticsUploadSuccessCount); unitModel.ContractStatisticsUploadRatio = unitModel.ContractStatisticsUploadCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(unitModel.ContractStatisticsUploadSuccessCount) / Convert.ToDouble(unitModel.ContractStatisticsUploadCount)), 4) * 100 + "%"; unitModel.EduTrainUploadCount = unitResult.Sum(x => x.EduTrainUploadCount); unitModel.EduTrainUploadSuccessCount = unitResult.Sum(x => x.EduTrainUploadSuccessCount); unitModel.EduTrainUploadRatio = unitModel.EduTrainUploadCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(unitModel.EduTrainUploadSuccessCount) / Convert.ToDouble(unitModel.EduTrainUploadCount)),4) * 100 + "%"; unitResult.Insert(0,unitModel); result.AddRange(unitResult); index++; } Model.InOutRecordProjectStatisticsOutput thisunitModel = new Model.InOutRecordProjectStatisticsOutput(); var proResult = result.Where(x => x.type == 1).ToList(); thisunitModel.Id = "0"; thisunitModel.type = 0; thisunitModel.SortIndex = ""; thisunitModel.ProjectName ="合计"; thisunitModel.OnDutyCount = proResult.Sum(x => x.OnDutyCount); thisunitModel.CheckInCount = proResult.Sum(x => x.CheckInCount); thisunitModel.LeaveCount = proResult.Sum(x => x.LeaveCount); thisunitModel.LeaveRate = thisunitModel.OnDutyCount == 0 ? "0%" : (Math.Round((double)(Convert.ToDouble(thisunitModel.LeaveCount) / Convert.ToDouble(thisunitModel.OnDutyCount)), 4) * 100 + "%"); thisunitModel.CheckInRate = thisunitModel.OnDutyCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(thisunitModel.CheckInCount) / Convert.ToDouble(thisunitModel.OnDutyCount)), 4) * 100 + "%"; thisunitModel.DoorControlCount = proResult.Sum(x => x.DoorControlCount); thisunitModel.MobileCheckInCount = proResult.Sum(x => x.MobileCheckInCount); thisunitModel.DoorControlRatio = thisunitModel.CheckInCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(thisunitModel.DoorControlCount) / Convert.ToDouble(thisunitModel.CheckInCount)), 4) * 100 + "%"; thisunitModel.MobileCheckInRatio = thisunitModel.CheckInCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(thisunitModel.MobileCheckInCount) / Convert.ToDouble(thisunitModel.CheckInCount)), 4) * 100 + "%"; thisunitModel.ContractStatisticsUploadCount = proResult.Sum(x => x.ContractStatisticsUploadCount); thisunitModel.ContractStatisticsUploadSuccessCount = proResult.Sum(x => x.ContractStatisticsUploadSuccessCount); thisunitModel.ContractStatisticsUploadRatio = thisunitModel.ContractStatisticsUploadCount == 0 ? "0%" : Math.Round((double)(Convert.ToDouble(thisunitModel.ContractStatisticsUploadSuccessCount) / Convert.ToDouble(thisunitModel.ContractStatisticsUploadCount)), 4) * 100 + "%"; thisunitModel.EduTrainUploadCount = proResult.Sum(x => x.EduTrainUploadCount); thisunitModel.EduTrainUploadSuccessCount = proResult.Sum(x => x.EduTrainUploadSuccessCount); thisunitModel.EduTrainUploadRatio = thisunitModel.EduTrainUploadCount == 0 ? "0%" : Math.Round((Convert.ToDouble(thisunitModel.EduTrainUploadSuccessCount) / Convert.ToDouble(thisunitModel.EduTrainUploadCount)), 4) * 100 + "%"; result.Insert(0, thisunitModel); return result; } } }