using System; using System.Collections.Generic; using System.Linq; using Model; using System.Data; using System.Data.SqlClient; namespace BLL { public class SGManPowerService { /// /// 检查并发送人力资源预警 /// public static List CheckAndSendPersonWarning(string userId) { var responeData = new Model.ResponeData(); // 合并两个集合 var allItems = new List(); var projects = Funs.DB.Base_Project.Where(p => p.ProjectState == BLL.Const.ProjectState_1).ToList(); foreach (var project in projects) { // // 检查管理人员到期未到岗情况 // var items1 = CheckHistoricalContinuousShortage(project.ProjectId); // // // 检查作业人员人力偏差情况 // var items2 = CheckWorkerDeviation(project.ProjectId); // // // if (items1 != null) // { // allItems.AddRange(items1); // } // // if (items2 != null) // { // allItems.AddRange(items2); // } // 从预计算表获取预警数据 var items = GetWarningItemsFromTable(project.ProjectId); if (items != null) { allItems.AddRange(items); } } if (!string.IsNullOrEmpty(userId)) { //过滤出指定用户的数据 allItems = allItems.Where(x => x.UserId == userId).ToList(); } return allItems; } #region 检查所有历史数据中连续一周以上人力不足的情况 /// /// 检查所有历史数据中连续一周以上人力不足的情况 /// private static IEnumerable CheckHistoricalContinuousShortage(string projectId) { string strSql = @"WITH LatestVersions AS ( SELECT ProjectId, MAX(Version) AS MaxVersion FROM JDGL_SGManPower WHERE ProjectId = @ProjectId GROUP BY ProjectId ), PlanVsActual AS ( SELECT p.ProjectId, p.UnitId, p.UnitWorkId, p.WorkPostId, p.PlanDate, p.Quantity AS PlanQuantity, ISNULL(a.num, 0) AS num, CASE WHEN ISNULL(a.num, 0) < p.Quantity THEN 1 ELSE 0 END AS IsShortage, lv.MaxVersion FROM JDGL_SGManPower p INNER JOIN LatestVersions lv ON p.ProjectId = lv.ProjectId AND p.Version = lv.MaxVersion LEFT JOIN ( SELECT ProjectId,UnitId,WorkPostId,IntoOutTime,WorkAreaId,num FROM SitePerson_Checking_Statistics ) a ON p.ProjectId = a.ProjectId AND p.UnitId = a.UnitId AND p.WorkPostId = a.WorkPostId AND p.PlanDate = a.IntoOutTime AND (CHARINDEX(',' + p.UnitWorkId + ',', ',' + ISNULL(a.WorkAreaId, '') + ',') > 0 OR (ISNULL(a.WorkAreaId, '') = '' AND ISNULL(p.UnitWorkId, '') = '')) WHERE p.ProjectId = @ProjectId AND p.PlanDate <= GETDATE() ), ShortageWithRowNum AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY ProjectId, UnitId, UnitWorkId, WorkPostId ORDER BY PlanDate ) AS RowNum FROM PlanVsActual WHERE IsShortage = 1 ), ContinuousGroups AS ( SELECT *, DATEADD(DAY, -RowNum, PlanDate) AS GroupId FROM ShortageWithRowNum ), ContinuousCounts AS ( SELECT ProjectId, UnitId, UnitWorkId, WorkPostId, GroupId, COUNT(*) AS ContinuousDays, MIN(PlanDate) AS StartDate, MAX(PlanDate) AS EndDate, SUM(PlanQuantity) as PlanQuantity, SUM(num) as num, MaxVersion FROM ContinuousGroups GROUP BY ProjectId, UnitId, UnitWorkId, WorkPostId, GroupId,MaxVersion ) SELECT ProjectId, UnitId, UnitWorkId, WorkPostId, ContinuousDays, MaxVersion, StartDate, EndDate,PlanQuantity,num FROM ContinuousCounts WHERE ContinuousDays >= 7"; var parameters = new List { new System.Data.SqlClient.SqlParameter("@ProjectId", projectId) }; var warningItems = new List(); var dt = SQLHelper.GetDataTableRunText(strSql, parameters.ToArray()); foreach (DataRow row in dt.Rows) { warningItems.AddRange(SendManagerWarning(row["UnitId"].ToString(), row["ProjectId"].ToString(), row["WorkPostId"].ToString(), row["UnitWorkId"].ToString(), Convert.ToDateTime(row["StartDate"]), Convert.ToDateTime(row["EndDate"]), Convert.ToInt32(row["PlanQuantity"]), Convert.ToInt32(row["num"]))); } return warningItems; } /// /// 发送管理人员预警 /// /// 项目ID /// 单位id private static List SendManagerWarning(string unitId, string projectId, string workPostId, string unitWorkId, DateTime? startDate, DateTime? endDate, int? quantity, int num) { // 发送预警信息 var toDoItems = new List(); var unitWorks = (from x in Funs.DB.WBS_UnitWork where x.UnitWorkId == unitWorkId select new { x.UnitWorkId, x.UnitWorkName }).FirstOrDefault(); var projectUnits = (from x in Funs.DB.Project_ProjectUnit join y in Funs.DB.Base_Unit on x.UnitId equals y.UnitId where x.UnitId == unitId select new { x.UnitId, y.UnitName, x.UnitType }).FirstOrDefault(); if (projectUnits != null) { List toUserIds = new List(); // 施工单位人员推送至施工单位项目经理和总包单位施工经理 if (projectUnits.UnitType == Const.ProjectUnitType_2) // 施工分包单位 { // 获取施工单位项目经理 var constructionManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ProjectManager) select x).ToList(); if (constructionManagers.Count > 0) { foreach (var projectUser in constructionManagers) { toUserIds.Add(projectUser.UserId); } } // 获取总包单位施工经理 var generalContractorUnit = Funs.DB.Project_ProjectUnit.FirstOrDefault(pu => pu.ProjectId == projectId && pu.UnitType == Const.ProjectUnitType_1); // 总包单位 if (generalContractorUnit != null) { var constructionManagerGCs = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == generalContractorUnit.UnitId && x.IsPost == true && x.RoleId.Contains(Const.ConstructionManager) select x).ToList(); if (constructionManagerGCs.Count > 0) { foreach (var projectUser in constructionManagerGCs) { toUserIds.Add(projectUser.UserId); } } } } // 总包单位人员推送到总包单位施工经理和项目经理 else if (projectUnits.UnitType == Const.ProjectUnitType_1) // 总包单位 { // 获取总包单位施工经理 var constructionManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ConstructionManager) select x).ToList(); if (constructionManagers.Count() > 0) { foreach (var projectUser in constructionManagers) { toUserIds.Add(projectUser.UserId); } } // 获取总包单位项目经理 var projectManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ProjectManager) select x).ToList(); if (projectManagers.Count() > 0) { foreach (var projectUser in projectManagers) { toUserIds.Add(projectUser.UserId); } } } string warningContent = string.Empty; if (unitWorks != null) { warningContent = $"{projectUnits.UnitName}单位{unitWorks.UnitWorkName}装置计划{string.Format("{0:yyyy-MM-dd}", startDate)}~{string.Format("{0:yyyy-MM-dd}", endDate)}投入人力{quantity}人,实际考勤为{num}人。"; } else { warningContent = $"{projectUnits.UnitName}单位计划{string.Format("{0:yyyy-MM-dd}", startDate)}~{string.Format("{0:yyyy-MM-dd}", endDate)}投入人力{quantity}人,实际考勤为{num}人。"; } string urlParams = "JDGL/SGManPower/SGWarningDetailsEdit.aspx?projectId=" + projectId; // 添加单位参数(如果已选择) if (!string.IsNullOrEmpty(unitId)) { urlParams += "&unitId=" + unitId; } // 添加装置参数(如果已选择) if (!string.IsNullOrEmpty(unitWorkId)) { urlParams += "&unitWorkId=" + unitWorkId; } // 添加岗位参数(如果已选择) if (!string.IsNullOrEmpty(workPostId)) { urlParams += "&workPostId=" + workPostId; } // 添加时间参数 if (startDate.HasValue) { urlParams += "&startTime=" + string.Format("{0:yyyy-MM-dd}", startDate); } // 添加时间参数 if (endDate.HasValue) { urlParams += "&endTime=" + string.Format("{0:yyyy-MM-dd}", endDate); } foreach (var userId in toUserIds) { Model.ToDoItem toDoItem = new Model.ToDoItem(); toDoItem.DataId = SQLHelper.GetNewID(typeof(Model.ToDoItem)); toDoItem.MenuId = ""; toDoItem.MenuName = "管理人员到岗预警"; toDoItem.ProjectCode = ""; toDoItem.Content = warningContent; toDoItem.UserId = userId; toDoItem.UserName = UserService.GetUserNameByUserId(userId); toDoItem.DataTime = DateTime.Now; toDoItem.DataTimeStr = DateTime.Now.ToString("yyyy-MM-dd"); toDoItem.PCUrl = urlParams; toDoItems.Add(toDoItem); } } return toDoItems; } #endregion #region 检查作业人员人力偏差情况 // /// // /// 检查作业人员人力偏差情况(一周内(连续7天不是最近七天)累计偏差值超过计划的10%) // /// // /// 项目ID private static IEnumerable CheckWorkerDeviation(string projectId) { string strSql = @"WITH LatestVersions AS ( SELECT ProjectId, MAX(Version) AS MaxVersion FROM JDGL_SGManPower WHERE ProjectId = @ProjectId GROUP BY ProjectId ), PlanVsActual AS ( SELECT p.ProjectId, p.UnitId, p.UnitWorkId, p.WorkPostId, p.PlanDate, p.Quantity AS PlanQuantity, ISNULL(a.num, 0) AS num, CASE WHEN p.Quantity > 0 AND ABS(CAST((p.Quantity - ISNULL(a.num, 0)) AS FLOAT) / p.Quantity) > 0.1 THEN 1 ELSE 0 END AS HasDeviation, lv.MaxVersion FROM JDGL_SGManPower p INNER JOIN LatestVersions lv ON p.ProjectId = lv.ProjectId AND p.Version = lv.MaxVersion LEFT JOIN ( SELECT ProjectId,UnitId,WorkPostId,IntoOutTime,WorkAreaId,num FROM SitePerson_Checking_Statistics ) a ON p.ProjectId = a.ProjectId AND p.UnitId = a.UnitId AND p.WorkPostId = a.WorkPostId AND p.PlanDate = a.IntoOutTime AND (CHARINDEX(',' + p.UnitWorkId + ',', ',' + ISNULL(a.WorkAreaId, '') + ',') > 0 OR (ISNULL(a.WorkAreaId, '') = '' AND ISNULL(p.UnitWorkId, '') = '')) WHERE p.ProjectId = @ProjectId AND p.PlanDate <= GETDATE() ), DeviationWithRowNum AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY ProjectId, UnitId, UnitWorkId, WorkPostId ORDER BY PlanDate ) AS RowNum FROM PlanVsActual WHERE HasDeviation = 1 ), ContinuousGroups AS ( SELECT *, DATEADD(DAY, -RowNum, PlanDate) AS GroupId FROM DeviationWithRowNum ), ContinuousCounts AS ( SELECT ProjectId, UnitId, UnitWorkId, WorkPostId, GroupId, COUNT(*) AS ContinuousDays, MIN(PlanDate) AS StartDate, MAX(PlanDate) AS EndDate, SUM(PlanQuantity) as TotalPlanQuantity, SUM(num) as num, MaxVersion FROM ContinuousGroups GROUP BY ProjectId, UnitId, UnitWorkId, WorkPostId, GroupId, MaxVersion ) SELECT ProjectId, UnitId, UnitWorkId, WorkPostId, ContinuousDays, MaxVersion, StartDate, EndDate, TotalPlanQuantity, num FROM ContinuousCounts WHERE ContinuousDays >= 7"; var parameters = new List { new System.Data.SqlClient.SqlParameter("@ProjectId", projectId) }; var warningItems = new List(); var dt = SQLHelper.GetDataTableRunText(strSql, parameters.ToArray()); foreach (DataRow row in dt.Rows) { warningItems.AddRange(SendWorkerDeviationWarning( row["UnitId"].ToString(), row["ProjectId"].ToString(), row["WorkPostId"].ToString(), row["UnitWorkId"].ToString(), Convert.ToDateTime(row["StartDate"]), Convert.ToDateTime(row["EndDate"]), Convert.ToInt32(row["TotalPlanQuantity"]), Convert.ToInt32(row["num"]) )); } return warningItems; } /// /// 发送作业人员偏差预警 /// /// 项目ID /// 单位ID /// 计划总人数 /// 实际总人数 /// 偏差百分比 private static List SendWorkerDeviationWarning(string unitId, string projectId, string workPostId, string unitWorkId, DateTime? startDate, DateTime? endDate, int? quantity, int num) { // 发送预警信息 var toDoItems = new List(); List toUserIds = new List(); var unitWorks = (from x in Funs.DB.WBS_UnitWork where x.UnitWorkId == unitWorkId select new { x.UnitWorkId, x.UnitWorkName }).FirstOrDefault(); var projectUnits = (from x in Funs.DB.Project_ProjectUnit join y in Funs.DB.Base_Unit on x.UnitId equals y.UnitId where x.UnitId == unitId select new { x.UnitId, y.UnitName, x.UnitType }).FirstOrDefault(); // 获取施工单位项目经理 var constructionManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ProjectManager) select x).ToList(); if (constructionManagers.Count > 0) { foreach (var projectUser in constructionManagers) { toUserIds.Add(projectUser.UserId); } } // 获取总包单位施工经理 var generalContractorUnit = Funs.DB.Project_ProjectUnit.FirstOrDefault(pu => pu.ProjectId == projectId && pu.UnitType == Const.ProjectUnitType_1); // 总包单位 if (generalContractorUnit != null) { var constructionManagerGCs = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == generalContractorUnit.UnitId && x.IsPost == true && x.RoleId.Contains(Const.ConstructionManager) select x).ToList(); if (constructionManagerGCs.Count > 0) { foreach (var projectUser in constructionManagerGCs) { toUserIds.Add(projectUser.UserId); } } } // 构建预警信息内容 string warningContent = string.Empty; if (unitWorks != null) { warningContent = $"{projectUnits.UnitName}单位{unitWorks.UnitWorkName}装置计划投入人力{quantity}人,实际考勤为{num}人。"; } else { warningContent = $"{projectUnits.UnitName}单位计划投入人力{quantity}人,实际考勤为{num}人。"; } string urlParams = "JDGL/SGManPower/SGWarningDetailsEdit.aspx?projectId=" + projectId; // 添加单位参数(如果已选择) if (!string.IsNullOrEmpty(unitId)) { urlParams += "&unitId=" + unitId; } // 添加装置参数(如果已选择) if (!string.IsNullOrEmpty(unitWorkId)) { urlParams += "&unitWorkId=" + unitWorkId; } // 添加岗位参数(如果已选择) if (!string.IsNullOrEmpty(workPostId)) { urlParams += "&workPostId=" + workPostId; } // 添加时间参数 if (startDate.HasValue) { urlParams += "&startTime=" + string.Format("{0:yyyy-MM-dd}", startDate); } // 添加时间参数 if (endDate.HasValue) { urlParams += "&endTime=" + string.Format("{0:yyyy-MM-dd}", endDate); } // 发送预警信息 foreach (var userId in toUserIds) { Model.ToDoItem toDoItem = new Model.ToDoItem(); toDoItem.DataId = SQLHelper.GetNewID(typeof(Model.ToDoItem)); toDoItem.MenuId = ""; toDoItem.MenuName = "人力资源偏差预警"; toDoItem.ProjectCode = ""; toDoItem.Content = warningContent; toDoItem.UserId = userId; toDoItem.UserName = UserService.GetUserNameByUserId(userId); toDoItem.DataTime = DateTime.Now; toDoItem.DataTimeStr = DateTime.Now.ToString("yyyy-MM-dd"); toDoItem.PCUrl = urlParams; toDoItems.Add(toDoItem); } return toDoItems; } #endregion private static IEnumerable GetWarningItemsFromTable(string projectId) { var strSql = @"SELECT UnitId,WarningType,SUM(PlanQuantity) as SumPlanQuantity, SUM(ActualQuantity) as SumActualQuantity FROM SGManPower_WarningResult WHERE ProjectId = @ProjectId "; var parameters = new List { new System.Data.SqlClient.SqlParameter("@ProjectId", projectId) }; strSql += " GROUP BY UnitId,WarningType "; var dt = SQLHelper.GetDataTableRunText(strSql, parameters.ToArray()); var warningItems = new List(); foreach (DataRow row in dt.Rows) { var warningType = row["WarningType"].ToString(); var unitId = row["UnitId"].ToString(); // var workPostId = row["WorkPostId"].ToString(); // var unitWorkId = row["UnitWorkId"].ToString(); // var startDate = Convert.ToDateTime(row["StartDate"]); // var endDate = Convert.ToDateTime(row["EndDate"]); var planQuantity = Convert.ToInt32(row["SumPlanQuantity"]); var actualQuantity = Convert.ToInt32(row["SumActualQuantity"]); if (warningType == "Shortage") { warningItems.AddRange(SendManagerWarning(unitId, projectId,warningType, planQuantity, actualQuantity)); } else if (warningType == "Deviation") { warningItems.AddRange(SendWorkerDeviationWarning(unitId, projectId,warningType, planQuantity, actualQuantity)); } } return warningItems; } private static List SendManagerWarning(string unitId, string projectId,string warningType, int? quantity, int num) { // 发送预警信息 var toDoItems = new List(); var projectUnits = (from x in Funs.DB.Project_ProjectUnit join y in Funs.DB.Base_Unit on x.UnitId equals y.UnitId where x.UnitId == unitId select new { x.UnitId, y.UnitName, x.UnitType }).FirstOrDefault(); if (projectUnits != null) { List toUserIds = new List(); // 施工单位人员推送至施工单位项目经理和总包单位施工经理 if (projectUnits.UnitType == Const.ProjectUnitType_2) // 施工分包单位 { // 获取施工单位项目经理 var constructionManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ProjectManager) select x).ToList(); if (constructionManagers.Count > 0) { foreach (var projectUser in constructionManagers) { toUserIds.Add(projectUser.UserId); } } // 获取总包单位施工经理 var generalContractorUnit = Funs.DB.Project_ProjectUnit.FirstOrDefault(pu => pu.ProjectId == projectId && pu.UnitType == Const.ProjectUnitType_1); // 总包单位 if (generalContractorUnit != null) { var constructionManagerGCs = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == generalContractorUnit.UnitId && x.IsPost == true && x.RoleId.Contains(Const.ConstructionManager) select x).ToList(); if (constructionManagerGCs.Count > 0) { foreach (var projectUser in constructionManagerGCs) { toUserIds.Add(projectUser.UserId); } } } } // 总包单位人员推送到总包单位施工经理和项目经理 else if (projectUnits.UnitType == Const.ProjectUnitType_1) // 总包单位 { // 获取总包单位施工经理 var constructionManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ConstructionManager) select x).ToList(); if (constructionManagers.Count() > 0) { foreach (var projectUser in constructionManagers) { toUserIds.Add(projectUser.UserId); } } // 获取总包单位项目经理 var projectManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ProjectManager) select x).ToList(); if (projectManagers.Count() > 0) { foreach (var projectUser in projectManagers) { toUserIds.Add(projectUser.UserId); } } } string warningContent = $"{projectUnits.UnitName}单位计划投入人力{quantity}人,实际考勤为{num}人。"; string urlParams = "JDGL/SGManPower/SGWarningDetails.aspx?projectId=" + projectId; // 添加单位参数 if (!string.IsNullOrEmpty(unitId)) { urlParams += "&unitId=" + unitId; } if (!string.IsNullOrEmpty(warningType)) { urlParams += "&warningType=" + warningType; } foreach (var userId in toUserIds) { Model.ToDoItem toDoItem = new Model.ToDoItem(); toDoItem.DataId = SQLHelper.GetNewID(typeof(Model.ToDoItem)); toDoItem.MenuId = ""; toDoItem.MenuName = "管理人员到岗预警"; toDoItem.ProjectCode = ""; toDoItem.Content = warningContent; toDoItem.UserId = userId; toDoItem.UserName = UserService.GetUserNameByUserId(userId); toDoItem.DataTime = DateTime.Now; toDoItem.DataTimeStr = DateTime.Now.ToString("yyyy-MM-dd"); toDoItem.PCUrl = urlParams; toDoItems.Add(toDoItem); } } return toDoItems; } private static List SendWorkerDeviationWarning(string unitId, string projectId,string warningType, int? quantity, int num) { // 发送预警信息 var toDoItems = new List(); List toUserIds = new List(); var projectUnits = (from x in Funs.DB.Project_ProjectUnit join y in Funs.DB.Base_Unit on x.UnitId equals y.UnitId where x.UnitId == unitId select new { x.UnitId, y.UnitName, x.UnitType }).FirstOrDefault(); // 获取施工单位项目经理 var constructionManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ProjectManager) select x).ToList(); if (constructionManagers.Count > 0) { foreach (var projectUser in constructionManagers) { toUserIds.Add(projectUser.UserId); } } // 获取总包单位施工经理 var generalContractorUnit = Funs.DB.Project_ProjectUnit.FirstOrDefault(pu => pu.ProjectId == projectId && pu.UnitType == Const.ProjectUnitType_1); // 总包单位 if (generalContractorUnit != null) { var constructionManagerGCs = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == generalContractorUnit.UnitId && x.IsPost == true && x.RoleId.Contains(Const.ConstructionManager) select x).ToList(); if (constructionManagerGCs.Count > 0) { foreach (var projectUser in constructionManagerGCs) { toUserIds.Add(projectUser.UserId); } } } // 构建预警信息内容 string warningContent = $"{projectUnits.UnitName}单位计划投入人力{quantity}人,实际考勤为{num}人。"; string urlParams = "JDGL/SGManPower/SGWarningDetails.aspx?projectId=" + projectId; // 添加单位参数 if (!string.IsNullOrEmpty(unitId)) { urlParams += "&unitId=" + unitId; } if (!string.IsNullOrEmpty(warningType)) { urlParams += "&warningType=" + warningType; } // 发送预警信息 foreach (var userId in toUserIds) { Model.ToDoItem toDoItem = new Model.ToDoItem(); toDoItem.DataId = SQLHelper.GetNewID(typeof(Model.ToDoItem)); toDoItem.MenuId = ""; toDoItem.MenuName = "人力资源偏差预警"; toDoItem.ProjectCode = ""; toDoItem.Content = warningContent; toDoItem.UserId = userId; toDoItem.UserName = UserService.GetUserNameByUserId(userId); toDoItem.DataTime = DateTime.Now; toDoItem.DataTimeStr = DateTime.Now.ToString("yyyy-MM-dd"); toDoItem.PCUrl = urlParams; toDoItems.Add(toDoItem); } return toDoItems; } /// /// 每周执行一次统计上周人力不足 /// public static void SGPersonWarningStatistics() { // 获取上周的开始时间和结束时间 DateTime today = DateTime.Today; int dayOfWeek = (int)today.DayOfWeek; if (dayOfWeek == 0) dayOfWeek = 7; // 将周日设为7,保证周一为1 DateTime lastWeekStart = today.AddDays(-(dayOfWeek + 6)).Date; // 上周一 00:00:00 DateTime lastWeekEnd = today.AddDays(-dayOfWeek).Date.AddDays(1).AddSeconds(-1); // 上周日 23:59:59 var strSql = @" WITH LatestVersions AS ( SELECT ProjectId, MAX(Version) AS MaxVersion FROM JDGL_SGManPower GROUP BY ProjectId ) SELECT p.ProjectId, p.UnitId, (CASE WHEN w.PostType IN ('1', '4') THEN '1' WHEN w.PostType IN ('2', '3') THEN '2' ELSE '' END) AS PersonCategory, SUM(p.Quantity) AS PlanQuantity, SUM(ISNULL(a.num, 0)) AS ActualQuantity FROM JDGL_SGManPower p LEFT JOIN (SELECT ProjectId,UnitId,WorkPostId,IntoOutTime,WorkAreaId,num FROM SitePerson_Checking_Statistics) a ON p.ProjectId = a.ProjectId AND p.UnitId = a.UnitId AND p.WorkPostId = a.WorkPostId AND p.PlanDate = a.IntoOutTime AND (CHARINDEX(',' + p.UnitWorkId + ',', ',' + ISNULL(a.WorkAreaId, '') + ',') > 0 OR (ISNULL(a.WorkAreaId, '') = '' AND ISNULL(p.UnitWorkId, '') = '')) LEFT JOIN Base_WorkPost w ON p.WorkPostId = w.WorkPostId WHERE p.PlanDate <= @lastWeekEnd and p.PlanDate >= @lastWeekStart GROUP BY p.ProjectId, p.UnitId, (CASE WHEN w.PostType IN ('1', '4') THEN '1' WHEN w.PostType IN ('2', '3') THEN '2' ELSE '' END) "; List listStr = new List(); listStr.Add(new SqlParameter("@lastWeekStart", lastWeekStart)); listStr.Add(new SqlParameter("@lastWeekEnd", lastWeekEnd)); SqlParameter[] parameter = listStr.ToArray(); DataTable tb = SQLHelper.GetDataTableRunText(strSql, parameter); foreach (DataRow row in tb.Rows) { string PersonCategory = row["PersonCategory"].ToString(); string UnitId = row["UnitId"].ToString(); string ProjectId = row["ProjectId"].ToString(); int planQty = Convert.ToInt32(row["PlanQuantity"]); int actualQty = Convert.ToInt32(row["ActualQuantity"]); if (planQty > actualQty && planQty > 0) { bool isPass = (planQty - actualQty) * 100 > planQty * 10; if (isPass) { if (!string.IsNullOrEmpty(PersonCategory)) { List userIds = new List(); if (PersonCategory == "1") //管理人员 { userIds = getUserIds(UnitId, ProjectId); } else if (PersonCategory == "2") //作业人员 { userIds = getUserIds2(UnitId, ProjectId); } if (userIds.Count > 0) { foreach (var userId in userIds) { Model.SGManPower_WarningWeeklyStatisticsResult warningWeeklyStatisticsResult = new Model.SGManPower_WarningWeeklyStatisticsResult { ResultId = SQLHelper.GetNewID(typeof(Model.SGManPower_WarningWeeklyStatisticsResult)), UnitId = UnitId, ProjectId = ProjectId, WorkPostType = PersonCategory, UserId = userId, IsRead = false, StartDate = lastWeekStart, EndDate = lastWeekEnd, PlanQuantity = planQty, ActualQuantity = actualQty, }; Funs.DB.SGManPower_WarningWeeklyStatisticsResult.InsertOnSubmit( warningWeeklyStatisticsResult); Funs.DB.SubmitChanges(); } } } } } } } /// /// 发送管理人员预警 /// /// 项目ID /// 单位id private static List getUserIds(string unitId, string projectId) { // 发送预警信息 List toUserIds = new List(); var projectUnits = (from x in Funs.DB.Project_ProjectUnit join y in Funs.DB.Base_Unit on x.UnitId equals y.UnitId where x.UnitId == unitId select new { x.UnitId, y.UnitName, x.UnitType }).FirstOrDefault(); if (projectUnits != null) { // 施工单位人员推送至施工单位项目经理和总包单位施工经理 if (projectUnits.UnitType == Const.ProjectUnitType_2) // 施工分包单位 { // 获取施工单位项目经理 var constructionManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ProjectManager) select x).ToList(); if (constructionManagers.Count > 0) { foreach (var projectUser in constructionManagers) { toUserIds.Add(projectUser.UserId); } } // 获取总包单位施工经理 var generalContractorUnit = Funs.DB.Project_ProjectUnit.FirstOrDefault(pu => pu.ProjectId == projectId && pu.UnitType == Const.ProjectUnitType_1); // 总包单位 if (generalContractorUnit != null) { var constructionManagerGCs = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == generalContractorUnit.UnitId && x.IsPost == true && x.RoleId.Contains(Const.ConstructionManager) select x).ToList(); if (constructionManagerGCs.Count > 0) { foreach (var projectUser in constructionManagerGCs) { toUserIds.Add(projectUser.UserId); } } } } // 总包单位人员推送到总包单位施工经理和项目经理 else if (projectUnits.UnitType == Const.ProjectUnitType_1) // 总包单位 { // 获取总包单位施工经理 var constructionManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ConstructionManager) select x).ToList(); if (constructionManagers.Count() > 0) { foreach (var projectUser in constructionManagers) { toUserIds.Add(projectUser.UserId); } } // 获取总包单位项目经理 var projectManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ProjectManager) select x).ToList(); if (projectManagers.Count() > 0) { foreach (var projectUser in projectManagers) { toUserIds.Add(projectUser.UserId); } } } } return toUserIds; } /// /// 发送作业人员偏差预警 /// /// 项目ID /// 单位ID private static List getUserIds2(string unitId, string projectId) { // 发送预警信息 List toUserIds = new List(); // 获取施工单位项目经理 var constructionManagers = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == unitId && x.IsPost == true && x.RoleId.Contains(Const.ProjectManager) select x).ToList(); if (constructionManagers.Count > 0) { foreach (var projectUser in constructionManagers) { toUserIds.Add(projectUser.UserId); } } // 获取总包单位施工经理 var generalContractorUnit = Funs.DB.Project_ProjectUnit.FirstOrDefault(pu => pu.ProjectId == projectId && pu.UnitType == Const.ProjectUnitType_1); // 总包单位 if (generalContractorUnit != null) { var constructionManagerGCs = (from x in Funs.DB.Project_ProjectUser where x.ProjectId == projectId && x.UnitId == generalContractorUnit.UnitId && x.IsPost == true && x.RoleId.Contains(Const.ConstructionManager) select x).ToList(); if (constructionManagerGCs.Count > 0) { foreach (var projectUser in constructionManagerGCs) { toUserIds.Add(projectUser.UserId); } } } return toUserIds; } } }