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方法 /// /// 通过Ajax获取图表数据 /// /// 数据类型: total, annual, monthly /// 图表标识: One, Two, Three, Four /// 序列化的图表数据 [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 辅助方法 // ... existing code ... /// /// 获取人力统计数据 /// /// 筛选类型 /// 图表标题 /// 年份(可选) /// 月份(可选) /// BusinessColumn对象 public string GetManpowerData(string filterType, string chartTitle, string year = null, string month = null) { try { List series = new List(); Model.BusinessColumn businessColumn = new Model.BusinessColumn(); List listCategories = new List(); 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 actualData; Dictionary 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 actualSeries = allDates.Select(date => actualData.ContainsKey(date) ? actualData[date] : 0).ToList(); List 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); } } // ... existing code ... #endregion #region 五环管理人员统计分析 /// /// 五环管理人员统计分析 /// public string One { get { string dataType = Request.QueryString["type"] ?? "total"; return GetManpowerData(dataType, "五环管理人员统计分析"); } } #endregion #region 施工单位管理人员统计分析 /// /// 施工单位管理人员统计分析 /// public string Two { get { string dataType = Request.QueryString["type"] ?? "total"; return GetManpowerData(dataType, "施工单位管理人员统计分析"); } } #endregion #region 作业人员统计分析 /// /// 作业人员统计分析 /// public string Three { get { string dataType = Request.QueryString["type"] ?? "total"; return GetManpowerData(dataType, "作业人员统计分析"); } } #endregion #region 过程人力统计分析 /// /// 过程人力统计分析 /// public string Four { get { string dataType = Request.QueryString["type"] ?? "total"; return GetManpowerData(dataType, "过程人力统计分析"); } } #endregion } }