142 lines
12 KiB
C#
142 lines
12 KiB
C#
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<Model.Base_Project> BeUnderConstructionList = ProjectService.GetProjectWorkList().Where(x => (x.ProjectAttribute == "GONGCHENG" || x.ProjectAttribute == null)).ToList();
|
|
|
|
public static List<Model.InOutRecordProjectStatisticsOutput> GetStatistics( DateTime date)
|
|
{
|
|
List<Model.InOutRecordProjectStatisticsOutput> result = new List<Model.InOutRecordProjectStatisticsOutput>();
|
|
|
|
var units = db.Base_Unit.Where(x => x.IsBranch == true).OrderBy(x => x.UnitCode).ToList();
|
|
int index = 1;
|
|
foreach (var unit in units)
|
|
{
|
|
List<Model.InOutRecordProjectStatisticsOutput> unitResult = new List<Model.InOutRecordProjectStatisticsOutput>();
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|