696 lines
28 KiB
C#
696 lines
28 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using Model;
|
||
using System.Data;
|
||
|
||
|
||
namespace BLL
|
||
{
|
||
public class SGManPowerService
|
||
{
|
||
/// <summary>
|
||
/// 检查并发送人力资源预警
|
||
/// </summary>
|
||
public static List<ToDoItem> CheckAndSendPersonWarning(string userId)
|
||
{
|
||
var responeData = new Model.ResponeData();
|
||
// 合并两个集合
|
||
var allItems = new List<ToDoItem>();
|
||
var projects = Funs.DB.Base_Project.Where(p => p.ProjectState == BLL.Const.ProjectState_1).ToList();
|
||
foreach (var project in projects)
|
||
{
|
||
// 检查管理人员到期未到岗情况
|
||
// var items1 = CheckManagerNotArrived(project.ProjectId);
|
||
var items1 = CheckHistoricalContinuousShortage(project.ProjectId);
|
||
|
||
// 检查作业人员人力偏差情况
|
||
var items2 = CheckWorkerDeviation(project.ProjectId);
|
||
|
||
|
||
if (items1 != null)
|
||
{
|
||
allItems.AddRange(items1);
|
||
}
|
||
|
||
if (items2 != null)
|
||
{
|
||
allItems.AddRange(items2);
|
||
}
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(userId))
|
||
{
|
||
//过滤出指定用户的数据
|
||
allItems = allItems.Where(x => x.UserId == userId).ToList();
|
||
}
|
||
|
||
return allItems;
|
||
}
|
||
|
||
|
||
/*/// <summary>
|
||
/// 检查管理人员到期未到岗情况(超过一周发出预警)
|
||
/// </summary>
|
||
/// <param name="projectId">项目ID</param>
|
||
private static IEnumerable<ToDoItem> CheckManagerNotArrived(string projectId)
|
||
{
|
||
//获取计划的最新版本
|
||
var version = "1";
|
||
var sgMan = Funs.DB.JDGL_SGManPower.Where(x => x.ProjectId == projectId).OrderByDescending(x => x.Version)
|
||
.FirstOrDefault();
|
||
if (sgMan != null)
|
||
{
|
||
version = sgMan.Version;
|
||
}
|
||
|
||
// 先获取计划表超过一周的管理岗位有哪些
|
||
var dataList = (from x in Funs.DB.JDGL_SGManPower
|
||
join p in Funs.DB.Base_WorkPost on x.WorkPostId equals p.WorkPostId into pp
|
||
from y in pp.DefaultIfEmpty()
|
||
where x.ProjectId == projectId && (y.PostType == "4" || y.PostType == "1") &&
|
||
x.PlanDate <= DateTime.Now.AddDays(-7) && x.Version == version
|
||
select x).ToList();
|
||
|
||
var lItems = new List<ToDoItem>();
|
||
//循环检查实际考勤中的人数
|
||
foreach (var data in dataList)
|
||
{
|
||
//根据人员计划表获取计划中的管理人员数
|
||
int num = getInOutRecordNum(data);
|
||
if (data.Quantity > num)
|
||
{
|
||
lItems = SendManagerWarning(data.UnitId, projectId, data.WorkPostId, data.UnitWorkId, data.PlanDate,
|
||
data.Quantity, num);
|
||
}
|
||
}
|
||
|
||
return lItems;
|
||
}*/
|
||
|
||
/*//获取实际考勤人员数
|
||
private static int getInOutRecordNum(JDGL_SGManPower sgManPower)
|
||
{
|
||
string strSql = @"
|
||
SELECT e.UnitId, e.PostId, e.RecordDate, p.WorkAreaId as UnitWorkId
|
||
FROM T_d_EmployInOutRecord e INNER JOIN SitePerson_Person p ON e.IDCardNo = p.IdentityCard AND e.ProjectId = p.ProjectId
|
||
WHERE e.PostId IS NOT NULL AND e.PostId != ''
|
||
AND e.ProjectId = @ProjectId
|
||
AND e.RecordDate = @RecordDate
|
||
AND e.UnitId = @UnitId
|
||
AND e.PostId = @PostId";
|
||
|
||
var parameters = new List<System.Data.SqlClient.SqlParameter>
|
||
{
|
||
new System.Data.SqlClient.SqlParameter("@ProjectId", sgManPower.ProjectId),
|
||
new System.Data.SqlClient.SqlParameter("@RecordDate", sgManPower.PlanDate),
|
||
new System.Data.SqlClient.SqlParameter("@UnitId", sgManPower.UnitId),
|
||
new System.Data.SqlClient.SqlParameter("@PostId", sgManPower.WorkPostId),
|
||
};
|
||
|
||
// 执行查询获取分组数据
|
||
var dt = SQLHelper.GetDataTableRunText(strSql, parameters.ToArray());
|
||
|
||
// 创建一个新的DataTable来存储处理后的数据
|
||
DataTable processedDt = dt.Clone();
|
||
|
||
foreach (System.Data.DataRow row in dt.Rows)
|
||
{
|
||
string ids = row["UnitWorkId"] != DBNull.Value ? row["UnitWorkId"].ToString() : string.Empty;
|
||
if (!string.IsNullOrEmpty(ids))
|
||
{
|
||
string[] unitWorkIdArray = ids.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
||
foreach (string unitWorkId in unitWorkIdArray)
|
||
{
|
||
// 往processedDt里面添加数据,每个UnitWorkId一行
|
||
DataRow newRow = processedDt.NewRow();
|
||
newRow["UnitId"] = row["UnitId"];
|
||
newRow["PostId"] = row["PostId"];
|
||
newRow["RecordDate"] = row["RecordDate"];
|
||
newRow["UnitWorkId"] = unitWorkId.Trim();
|
||
processedDt.Rows.Add(newRow);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DataRow newRow = processedDt.NewRow();
|
||
newRow["UnitId"] = row["UnitId"];
|
||
newRow["PostId"] = row["PostId"];
|
||
newRow["RecordDate"] = row["RecordDate"];
|
||
newRow["UnitWorkId"] = string.Empty;
|
||
processedDt.Rows.Add(newRow);
|
||
}
|
||
}
|
||
|
||
// 确定要用于后续处理的数据源
|
||
IEnumerable<DataRow> dataSource = processedDt.AsEnumerable();
|
||
|
||
if (string.IsNullOrEmpty(sgManPower.UnitWorkId))
|
||
{
|
||
dataSource = dataSource.Where(x => x["UnitWorkId"] == null);
|
||
}
|
||
else
|
||
{
|
||
dataSource = dataSource.Where(x =>
|
||
x["UnitWorkId"] != DBNull.Value && x["UnitWorkId"].ToString() == sgManPower.UnitWorkId);
|
||
}
|
||
|
||
return dataSource.Count();
|
||
}*/
|
||
|
||
/// <summary>
|
||
/// 发送管理人员预警
|
||
/// </summary>
|
||
/// <param name="projectId">项目ID</param>
|
||
/// <param name="unitId">单位id</param>
|
||
private static List<ToDoItem> SendManagerWarning(string unitId, string projectId, string workPostId,
|
||
string unitWorkId, DateTime? startDate, DateTime? endDate, int? quantity, int num)
|
||
{
|
||
// 发送预警信息
|
||
var toDoItems = new List<ToDoItem>();
|
||
|
||
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<string> toUserIds = new List<string>();
|
||
|
||
// 施工单位人员推送至施工单位项目经理和总包单位施工经理
|
||
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);
|
||
}
|
||
|
||
// // 添加岗位参数(如果已选择)
|
||
// if (quantity.HasValue)
|
||
// {
|
||
// urlParams += "&quantity=" + quantity.Value;
|
||
// }
|
||
//
|
||
// // 添加岗位参数(如果已选择)
|
||
// if (num >= 0)
|
||
// {
|
||
// urlParams += "&num=" + num;
|
||
// }
|
||
// else
|
||
// {
|
||
// urlParams += "&num=0";
|
||
// }
|
||
|
||
|
||
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;
|
||
}
|
||
|
||
// /// <summary>
|
||
// /// 检查作业人员人力偏差情况(一周内累计偏差值超过计划的10%)
|
||
// /// </summary>
|
||
// /// <param name="projectId">项目ID</param>
|
||
private static IEnumerable<ToDoItem> CheckWorkerDeviation(string projectId)
|
||
{
|
||
//获取计划的最新版本
|
||
var version = "1";
|
||
var sgMan = Funs.DB.JDGL_SGManPower.Where(x => x.ProjectId == projectId).OrderByDescending(x => x.Version)
|
||
.FirstOrDefault();
|
||
if (sgMan != null)
|
||
{
|
||
version = sgMan.Version;
|
||
}
|
||
|
||
//当前时间
|
||
var endDate = DateTime.Now;
|
||
//当前时间前7天
|
||
var startDate = DateTime.Now.AddDays(-7);
|
||
// 先获取计划表一周的作业岗位有哪些
|
||
var dataList = (from x in Funs.DB.JDGL_SGManPower
|
||
join p in Funs.DB.Base_WorkPost on x.WorkPostId equals p.WorkPostId into pp
|
||
from y in pp.DefaultIfEmpty()
|
||
where x.ProjectId == projectId && (y.PostType == "2" || y.PostType == "3") &&
|
||
x.PlanDate >= startDate && x.PlanDate <= endDate && x.Version == version
|
||
group x by new
|
||
{
|
||
x.UnitId,
|
||
x.UnitWorkId,
|
||
x.WorkPostId
|
||
}
|
||
into g
|
||
select new
|
||
{
|
||
UnitId = g.Key.UnitId,
|
||
UnitWorkId = g.Key.UnitWorkId,
|
||
WorkPostId = g.Key.WorkPostId,
|
||
QuantitySum = g.Sum(x => x.Quantity)
|
||
}).ToList();
|
||
|
||
var lItems = new List<ToDoItem>();
|
||
//循环检查实际考勤中的人数
|
||
foreach (var data in dataList)
|
||
{
|
||
//根据人员计划表获取计划中的作业人员数
|
||
int num = getInOutRecordNum1(data.UnitId, data.UnitWorkId, data.WorkPostId, projectId);
|
||
|
||
// 计算偏差百分比
|
||
if (data.QuantitySum != 0)
|
||
{
|
||
double deviationPercentage = Math.Abs((double)((data.QuantitySum - num) / data.QuantitySum));
|
||
// 如果偏差超过10%,发出预警
|
||
if (deviationPercentage > 0.1)
|
||
{
|
||
lItems = SendWorkerDeviationWarning(data.UnitId, projectId, data.WorkPostId, data.UnitWorkId,
|
||
startDate, endDate, data.QuantitySum, num);
|
||
}
|
||
}
|
||
}
|
||
|
||
return lItems;
|
||
}
|
||
|
||
|
||
//获取实际考勤人员数
|
||
private static int getInOutRecordNum1(string unitId, string unitWorkId, string workPostId, string projectId)
|
||
{
|
||
string strSql = @"
|
||
SELECT e.UnitId, e.PostId, e.RecordDate, p.WorkAreaId as UnitWorkId
|
||
FROM T_d_EmployInOutRecord e INNER JOIN SitePerson_Person p ON e.IDCardNo = p.IdentityCard AND e.ProjectId = p.ProjectId
|
||
WHERE e.PostId IS NOT NULL AND e.PostId != ''
|
||
AND e.ProjectId = @ProjectId
|
||
AND e.UnitId = @UnitId
|
||
AND e.PostId = @PostId
|
||
AND e.RecordDate >= @StartDate
|
||
AND e.RecordDate <= @EndDate";
|
||
|
||
var parameters = new List<System.Data.SqlClient.SqlParameter>
|
||
{
|
||
new System.Data.SqlClient.SqlParameter("@ProjectId", projectId),
|
||
new System.Data.SqlClient.SqlParameter("@UnitId", unitId),
|
||
new System.Data.SqlClient.SqlParameter("@PostId", workPostId),
|
||
new System.Data.SqlClient.SqlParameter("@StartDate", DateTime.Now.AddDays(-7)),
|
||
new System.Data.SqlClient.SqlParameter("@EndDate", DateTime.Now),
|
||
};
|
||
|
||
// 执行查询获取分组数据
|
||
var dt = SQLHelper.GetDataTableRunText(strSql, parameters.ToArray());
|
||
|
||
// 创建一个新的DataTable来存储处理后的数据
|
||
DataTable processedDt = dt.Clone();
|
||
|
||
foreach (System.Data.DataRow row in dt.Rows)
|
||
{
|
||
string ids = row["UnitWorkId"] != DBNull.Value ? row["UnitWorkId"].ToString() : string.Empty;
|
||
if (!string.IsNullOrEmpty(ids))
|
||
{
|
||
string[] unitWorkIdArray = ids.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
||
foreach (string id in unitWorkIdArray)
|
||
{
|
||
// 往processedDt里面添加数据,每个UnitWorkId一行
|
||
DataRow newRow = processedDt.NewRow();
|
||
newRow["UnitId"] = row["UnitId"];
|
||
newRow["PostId"] = row["PostId"];
|
||
newRow["RecordDate"] = row["RecordDate"];
|
||
newRow["UnitWorkId"] = id.Trim();
|
||
processedDt.Rows.Add(newRow);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DataRow newRow = processedDt.NewRow();
|
||
newRow["UnitId"] = row["UnitId"];
|
||
newRow["PostId"] = row["PostId"];
|
||
newRow["RecordDate"] = row["RecordDate"];
|
||
newRow["UnitWorkId"] = string.Empty;
|
||
processedDt.Rows.Add(newRow);
|
||
}
|
||
}
|
||
|
||
// 确定要用于后续处理的数据源
|
||
IEnumerable<DataRow> dataSource = processedDt.AsEnumerable();
|
||
|
||
if (string.IsNullOrEmpty(unitWorkId))
|
||
{
|
||
dataSource = dataSource.Where(x => x["UnitWorkId"] == null);
|
||
}
|
||
else
|
||
{
|
||
dataSource = dataSource.Where(x =>
|
||
x["UnitWorkId"] != DBNull.Value && x["UnitWorkId"].ToString() == unitWorkId);
|
||
}
|
||
|
||
return dataSource.Count();
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 发送作业人员偏差预警
|
||
/// </summary>
|
||
/// <param name="projectId">项目ID</param>
|
||
/// <param name="unitId">单位ID</param>
|
||
/// <param name="planTotal">计划总人数</param>
|
||
/// <param name="actualTotal">实际总人数</param>
|
||
/// <param name="deviationPercentage">偏差百分比</param>
|
||
private static List<ToDoItem> SendWorkerDeviationWarning(string unitId, string projectId, string workPostId,
|
||
string unitWorkId,
|
||
DateTime? startDate, DateTime? endDate, int? quantity, int num)
|
||
{
|
||
// 发送预警信息
|
||
var toDoItems = new List<ToDoItem>();
|
||
List<string> toUserIds = new List<string>();
|
||
|
||
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/SGWarningDetails.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 && endDate.HasValue)
|
||
{
|
||
urlParams += "&planDate=" + string.Format("{0:yyyy-MM-dd}", startDate) + "~" +
|
||
string.Format("{0:yyyy-MM-dd}", endDate);
|
||
}
|
||
|
||
|
||
// 添加岗位参数(如果已选择)
|
||
if (quantity.HasValue)
|
||
{
|
||
urlParams += "&quantity=" + quantity.Value;
|
||
}
|
||
|
||
// 添加岗位参数(如果已选择)
|
||
if (num >= 0)
|
||
{
|
||
urlParams += "&num=" + num;
|
||
}
|
||
else
|
||
{
|
||
urlParams += "&num=0";
|
||
}
|
||
|
||
// 发送预警信息
|
||
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;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 检查所有历史数据中连续一周以上人力不足的情况
|
||
/// </summary>
|
||
private static IEnumerable<ToDoItem> 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.ActualQuantity, 0) AS ActualQuantity,
|
||
CASE WHEN ISNULL(a.ActualQuantity, 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
|
||
* FROM View_EmployInOutRecord
|
||
) a ON p.ProjectId = a.ProjectId
|
||
AND p.UnitId = a.UnitId
|
||
AND p.WorkPostId = a.PostId
|
||
AND p.PlanDate = a.RecordDate
|
||
AND ISNULL(p.UnitWorkId, '') = ISNULL(a.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(ActualQuantity) as ActualQuantity,
|
||
MaxVersion
|
||
FROM ContinuousGroups
|
||
GROUP BY ProjectId, UnitId, UnitWorkId, WorkPostId, GroupId,MaxVersion
|
||
)
|
||
SELECT
|
||
ProjectId,
|
||
UnitId,
|
||
UnitWorkId,
|
||
WorkPostId,
|
||
ContinuousDays,
|
||
MaxVersion,
|
||
StartDate,
|
||
EndDate,PlanQuantity,ActualQuantity
|
||
FROM ContinuousCounts
|
||
WHERE ContinuousDays >= 7";
|
||
|
||
var parameters = new List<System.Data.SqlClient.SqlParameter>
|
||
{
|
||
new System.Data.SqlClient.SqlParameter("@ProjectId", projectId)
|
||
};
|
||
var warningItems = new List<ToDoItem>();
|
||
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["ActualQuantity"])));
|
||
}
|
||
return warningItems;
|
||
}
|
||
|
||
|
||
}
|
||
} |