SGGL_JT/SUBQHSE/BLL/Customization/CNCCG/InOutRecordProjectStatistic...

142 lines
12 KiB
C#
Raw Normal View History

2025-04-07 17:43:30 +08:00
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;
}
}
}