375 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			375 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using Newtonsoft.Json; | |||
|  | using System; | |||
|  | using System.Collections.Generic; | |||
|  | using System.Linq; | |||
|  | using System.Web.Services; | |||
|  | using BLL; | |||
|  | 
 | |||
|  | namespace FineUIPro.Web.JDGL.SGManPower | |||
|  | { | |||
|  |     public partial class ManPowerStat : PageBase | |||
|  |     { | |||
|  |         protected void Page_Load(object sender, EventArgs e) | |||
|  |         { | |||
|  |             if (!IsPostBack) | |||
|  |             { | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         #region Ajax方法 | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// 通过Ajax获取图表数据 | |||
|  |         /// </summary> | |||
|  |         /// <param name="type">数据类型: total, annual, monthly</param> | |||
|  |         /// <param name="chart">图表标识: One, Two, Three, Four</param> | |||
|  |         /// <returns>序列化的图表数据</returns> | |||
|  |         [WebMethod(EnableSession = true)] | |||
|  |         public static string GetChartData(string type, string chart, string year = null, string month = null) | |||
|  |         { | |||
|  |             try | |||
|  |             { | |||
|  |                 // 创建页面实例以访问非静态方法 | |||
|  |                 ManPowerStat pageInstance = new ManPowerStat(); | |||
|  | 
 | |||
|  |                 string title = ""; | |||
|  |                 switch (chart) | |||
|  |                 { | |||
|  |                     case "One": | |||
|  |                         title = "五环管理人员统计分析"; | |||
|  |                         break; | |||
|  |                     case "Two": | |||
|  |                         title = "施工单位管理人员统计分析"; | |||
|  |                         break; | |||
|  |                     case "Three": | |||
|  |                         title = "作业人员统计分析"; | |||
|  |                         break; | |||
|  |                     case "Four": | |||
|  |                         title = "过程人力统计分析"; | |||
|  |                         break; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 string result = pageInstance.GetManpowerData(type, title, year, month); | |||
|  |                 return result; | |||
|  |             } | |||
|  |             catch (Exception ex) | |||
|  |             { | |||
|  |                 // 记录异常日志 | |||
|  |                 throw new Exception("数据获取失败: " + ex.Message); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region 辅助方法 | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// 获取人力统计数据 | |||
|  |         /// </summary> | |||
|  |         /// <param name="filterType">筛选类型</param> | |||
|  |         /// <param name="chartTitle">图表标题</param> | |||
|  |         /// <param name="year">年份(可选)</param> | |||
|  |         /// <param name="month">月份(可选)</param> | |||
|  |         /// <returns>BusinessColumn对象</returns> | |||
|  |         public string GetManpowerData(string filterType, string chartTitle, string year = null, string month = null) | |||
|  |         { | |||
|  |             try | |||
|  |             { | |||
|  |                 List<Model.SingleSerie> series = new List<Model.SingleSerie>(); | |||
|  |                 Model.BusinessColumn businessColumn = new Model.BusinessColumn(); | |||
|  |                 List<string> listCategories = new List<string>(); | |||
|  |                 businessColumn.title = chartTitle; | |||
|  |                 businessColumn.xFontNum = 8; | |||
|  | 
 | |||
|  |                 // 延迟执行查询,只获取需要的数据 | |||
|  |                 var actualBaseQuery = Funs.DB.T_d_EmployInOutRecord.Where(x => | |||
|  |                     x.ProjectId == this.CurrUser.LoginProjectId); | |||
|  | 
 | |||
|  |                 var planBaseQuery = | |||
|  |                     Funs.DB.JDGL_SGManPower.Where(x => x.ProjectId == this.CurrUser.LoginProjectId); | |||
|  | 
 | |||
|  |                 //var UnitType = string.Empty; //1:总包 2:分包 | |||
|  |                 // var PostType = string.Empty; //1:一般管理岗位 4:特种管理岗位 | |||
|  |                 var Units = (from x in Funs.DB.Project_ProjectUnit | |||
|  |                     join y in Funs.DB.Base_Unit on x.UnitId equals y.UnitId | |||
|  |                     where x.ProjectId == this.CurrUser.LoginProjectId && x.UnitType == "2" | |||
|  |                     select x.UnitId).ToList(); | |||
|  | 
 | |||
|  |                 var workPosts = (from x in Funs.DB.Base_WorkPost | |||
|  |                     where (x.PostType == "1" || x.PostType == "4") | |||
|  |                     select x.WorkPostId).ToList(); | |||
|  | 
 | |||
|  |                 if (chartTitle == "五环管理人员统计分析") | |||
|  |                 { | |||
|  |                     actualBaseQuery = actualBaseQuery.Where(x => x.UnitId == Const.UnitId_CWCEC); | |||
|  |                     planBaseQuery = planBaseQuery.Where(x => x.UnitId == Const.UnitId_CWCEC); | |||
|  |                 } | |||
|  |                 else if (chartTitle == "施工单位管理人员统计分析") | |||
|  |                 { | |||
|  |                     actualBaseQuery = | |||
|  |                         actualBaseQuery.Where(x => Units.Contains(x.UnitId) && workPosts.Contains(x.PostId)); | |||
|  |                     planBaseQuery = | |||
|  |                         planBaseQuery.Where(x => Units.Contains(x.UnitId) && workPosts.Contains(x.WorkPostId)); | |||
|  |                 } | |||
|  |                 else if (chartTitle == "作业人员统计分析") | |||
|  |                 { | |||
|  |                     actualBaseQuery = | |||
|  |                         actualBaseQuery.Where(x => Units.Contains(x.UnitId) && !workPosts.Contains(x.PostId)); | |||
|  |                     planBaseQuery = | |||
|  |                         planBaseQuery.Where(x => Units.Contains(x.UnitId) && !workPosts.Contains(x.WorkPostId)); | |||
|  |                 } | |||
|  |                 else if (chartTitle == "过程人力统计分析") | |||
|  |                 { | |||
|  |                 } | |||
|  | 
 | |||
|  |                 // 根据年份或月份筛选数据 | |||
|  |                 if (filterType == "annual" && !string.IsNullOrEmpty(year)) | |||
|  |                 { | |||
|  |                     int selectedYear = int.Parse(year); | |||
|  |                     actualBaseQuery = actualBaseQuery.Where(x => | |||
|  |                         x.RecordDate.HasValue && x.RecordDate.Value.Year == selectedYear); | |||
|  |                     planBaseQuery = | |||
|  |                         planBaseQuery.Where(x => x.PlanDate.HasValue && x.PlanDate.Value.Year == selectedYear); | |||
|  |                 } | |||
|  |                 else if (filterType == "monthly" && !string.IsNullOrEmpty(year) && !string.IsNullOrEmpty(month)) | |||
|  |                 { | |||
|  |                     int selectedYear = int.Parse(year); | |||
|  |                     int selectedMonth = int.Parse(month); | |||
|  |                     actualBaseQuery = actualBaseQuery.Where(x => x.RecordDate.HasValue && | |||
|  |                                                                  x.RecordDate.Value.Year == selectedYear && | |||
|  |                                                                  x.RecordDate.Value.Month == selectedMonth); | |||
|  |                     planBaseQuery = planBaseQuery.Where(x => x.PlanDate.HasValue && | |||
|  |                                                              x.PlanDate.Value.Year == selectedYear && | |||
|  |                                                              x.PlanDate.Value.Month == selectedMonth); | |||
|  |                 } | |||
|  | 
 | |||
|  |                 // 根据筛选类型进行不同的分组统计 | |||
|  |                 Dictionary<DateTime, double> actualData; | |||
|  |                 Dictionary<DateTime, double> planData; | |||
|  | 
 | |||
|  |                 switch (filterType) | |||
|  |                 { | |||
|  |                     case "annual": | |||
|  |                         // 按月分组(年度视图显示每个月的数据) | |||
|  |                         var actualAnnualQuery = from x in actualBaseQuery | |||
|  |                             where x.RecordDate.HasValue | |||
|  |                             group x by new { x.RecordDate.Value.Year, x.RecordDate.Value.Month } | |||
|  |                             into g | |||
|  |                             select new | |||
|  |                             { | |||
|  |                                 Year = g.Key.Year, | |||
|  |                                 Month = g.Key.Month, | |||
|  |                                 ActualCount = g.Count() | |||
|  |                             }; | |||
|  | 
 | |||
|  |                         var planAnnualQuery = from x in planBaseQuery | |||
|  |                             where x.PlanDate.HasValue | |||
|  |                             group x by new { x.PlanDate.Value.Year, x.PlanDate.Value.Month } | |||
|  |                             into g | |||
|  |                             select new | |||
|  |                             { | |||
|  |                                 Year = g.Key.Year, | |||
|  |                                 Month = g.Key.Month, | |||
|  |                                 PlanCount = g.Sum(x => x.Quantity ?? 0) | |||
|  |                             }; | |||
|  | 
 | |||
|  |                         actualData = actualAnnualQuery.ToDictionary( | |||
|  |                             x => new DateTime(x.Year, x.Month, 1), | |||
|  |                             x => (double)x.ActualCount); | |||
|  | 
 | |||
|  |                         planData = planAnnualQuery.ToDictionary( | |||
|  |                             x => new DateTime(x.Year, x.Month, 1), | |||
|  |                             x => (double)x.PlanCount); | |||
|  |                         break; | |||
|  | 
 | |||
|  |                     case "monthly": | |||
|  |                         // 按天分组(月度视图显示每天的数据) | |||
|  |                         var actualMonthlyQuery = from x in actualBaseQuery | |||
|  |                             where x.RecordDate.HasValue | |||
|  |                             group x by new { x.RecordDate.Value.Year, x.RecordDate.Value.Month, x.RecordDate.Value.Day } | |||
|  |                             into g | |||
|  |                             select new | |||
|  |                             { | |||
|  |                                 Year = g.Key.Year, | |||
|  |                                 Month = g.Key.Month, | |||
|  |                                 Day = g.Key.Day, | |||
|  |                                 ActualCount = g.Count() | |||
|  |                             }; | |||
|  | 
 | |||
|  |                         var planMonthlyQuery = from x in planBaseQuery | |||
|  |                             where x.PlanDate.HasValue | |||
|  |                             group x by new { x.PlanDate.Value.Year, x.PlanDate.Value.Month, x.PlanDate.Value.Day } | |||
|  |                             into g | |||
|  |                             select new | |||
|  |                             { | |||
|  |                                 Year = g.Key.Year, | |||
|  |                                 Month = g.Key.Month, | |||
|  |                                 Day = g.Key.Day, | |||
|  |                                 PlanCount = g.Sum(x => x.Quantity ?? 0) | |||
|  |                             }; | |||
|  | 
 | |||
|  |                         actualData = actualMonthlyQuery.ToDictionary( | |||
|  |                             x => new DateTime(x.Year, x.Month, x.Day), | |||
|  |                             x => (double)x.ActualCount); | |||
|  | 
 | |||
|  |                         planData = planMonthlyQuery.ToDictionary( | |||
|  |                             x => new DateTime(x.Year, x.Month, x.Day), | |||
|  |                             x => (double)x.PlanCount); | |||
|  |                         break; | |||
|  | 
 | |||
|  |                     case "total": | |||
|  |                     default: | |||
|  |                         // 按月分组(默认情况) | |||
|  |                         var actualDefaultQuery = from x in actualBaseQuery | |||
|  |                             where x.RecordDate.HasValue | |||
|  |                             group x by new { x.RecordDate.Value.Year, x.RecordDate.Value.Month } | |||
|  |                             into g | |||
|  |                             select new | |||
|  |                             { | |||
|  |                                 Year = g.Key.Year, | |||
|  |                                 Month = g.Key.Month, | |||
|  |                                 ActualCount = g.Count() | |||
|  |                             }; | |||
|  | 
 | |||
|  |                         var planDefaultQuery = from x in planBaseQuery | |||
|  |                             where x.PlanDate.HasValue | |||
|  |                             group x by new { x.PlanDate.Value.Year, x.PlanDate.Value.Month } | |||
|  |                             into g | |||
|  |                             select new | |||
|  |                             { | |||
|  |                                 Year = g.Key.Year, | |||
|  |                                 Month = g.Key.Month, | |||
|  |                                 PlanCount = g.Sum(x => x.Quantity ?? 0) | |||
|  |                             }; | |||
|  | 
 | |||
|  |                         actualData = actualDefaultQuery.ToDictionary( | |||
|  |                             x => new DateTime(x.Year, x.Month, 1), | |||
|  |                             x => (double)x.ActualCount); | |||
|  | 
 | |||
|  |                         planData = planDefaultQuery.ToDictionary( | |||
|  |                             x => new DateTime(x.Year, x.Month, 1), | |||
|  |                             x => (double)x.PlanCount); | |||
|  |                         break; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 // 获取所有日期并排序 | |||
|  |                 var allDates = actualData.Keys.Union(planData.Keys).Distinct().OrderBy(d => d).ToList(); | |||
|  | 
 | |||
|  |                 // 准备数据系列 | |||
|  |                 List<double> actualSeries = | |||
|  |                     allDates.Select(date => actualData.ContainsKey(date) ? actualData[date] : 0).ToList(); | |||
|  |                 List<double> planSeries = | |||
|  |                     allDates.Select(date => planData.ContainsKey(date) ? planData[date] : 0).ToList(); | |||
|  | 
 | |||
|  |                 // 准备类别(横坐标) | |||
|  |                 switch (filterType) | |||
|  |                 { | |||
|  |                     case "annual": | |||
|  |                         // 显示选定年份的12个月份 | |||
|  |                         listCategories = allDates.Select(date => date.ToString("yyyy年MM月")).ToList(); | |||
|  |                         break; | |||
|  |                     case "monthly": | |||
|  |                         // 显示选定月份的每日数据 | |||
|  |                         listCategories = allDates.Select(date => date.ToString("MM月dd日")).ToList(); | |||
|  |                         break; | |||
|  |                     case "total": | |||
|  |                     default: | |||
|  |                         listCategories = allDates.Select(date => date.ToString("yyyy年MM月")).ToList(); | |||
|  |                         break; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 // 实际数据系列 | |||
|  |                 Model.SingleSerie actualSerie = new Model.SingleSerie | |||
|  |                 { | |||
|  |                     name = "实际", | |||
|  |                     data = actualSeries | |||
|  |                 }; | |||
|  |                 series.Add(actualSerie); | |||
|  | 
 | |||
|  |                 // 计划数据系列 | |||
|  |                 Model.SingleSerie planSerie = new Model.SingleSerie | |||
|  |                 { | |||
|  |                     name = "计划", | |||
|  |                     data = planSeries | |||
|  |                 }; | |||
|  |                 series.Add(planSerie); | |||
|  | 
 | |||
|  |                 businessColumn.categories = listCategories; | |||
|  |                 businessColumn.series = series; | |||
|  |                 return JsonConvert.SerializeObject(businessColumn); | |||
|  |             } | |||
|  |             catch (Exception ex) | |||
|  |             { | |||
|  |                 // 记录异常日志 | |||
|  |                 // LogHelper.Error("获取人力统计数据失败", ex); | |||
|  |                 throw new Exception("数据获取失败: " + ex.Message); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region 五环管理人员统计分析 | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// 五环管理人员统计分析 | |||
|  |         /// </summary> | |||
|  |         public string One | |||
|  |         { | |||
|  |             get | |||
|  |             { | |||
|  |                 string dataType = Request.QueryString["type"] ?? "total"; | |||
|  |                 return GetManpowerData(dataType, "五环管理人员统计分析"); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region 施工单位管理人员统计分析 | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// 施工单位管理人员统计分析 | |||
|  |         /// </summary> | |||
|  |         public string Two | |||
|  |         { | |||
|  |             get | |||
|  |             { | |||
|  |                 string dataType = Request.QueryString["type"] ?? "total"; | |||
|  |                 return GetManpowerData(dataType, "施工单位管理人员统计分析"); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region 作业人员统计分析 | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// 作业人员统计分析 | |||
|  |         /// </summary> | |||
|  |         public string Three | |||
|  |         { | |||
|  |             get | |||
|  |             { | |||
|  |                 string dataType = Request.QueryString["type"] ?? "total"; | |||
|  |                 return GetManpowerData(dataType, "作业人员统计分析"); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region 过程人力统计分析 | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// 过程人力统计分析 | |||
|  |         /// </summary> | |||
|  |         public string Four | |||
|  |         { | |||
|  |             get | |||
|  |             { | |||
|  |                 string dataType = Request.QueryString["type"] ?? "total"; | |||
|  |                 return GetManpowerData(dataType, "过程人力统计分析"); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  |     } | |||
|  | } |