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
 | |
|     }
 | |
| } |