SGGL_JT/SUBQHSE/FineUIPro.Web/Door/InOutRecordStatisticsGrid.a...

422 lines
17 KiB
C#
Raw Normal View History

2025-04-07 17:43:30 +08:00
using BLL;
using FineUIPro.Web.Controls;
using MiniExcelLibs;
using MiniExcelLibs.OpenXml;
using Model;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView;
namespace FineUIPro.Web.Door
{
public partial class InOutRecordStatisticsGrid : PageBase
{
public string ProjectId
{
get
{
return (string)ViewState["ProjectId"];
}
set
{
ViewState["ProjectId"] = value;
}
}
public InOutRecordStatisticInput InOutRecordStatisticInput
{
get
{
return (InOutRecordStatisticInput)Session["InOutRecordStatisticInput"];
}
}
private static List<Model.View_SitePerson_Person> getDataLists = new List<View_SitePerson_Person>();
public DataTable GridTable
{
get
{
return (DataTable)ViewState["GridTable"];
}
set
{
ViewState["GridTable"] = value;
}
}
public DataTable GridOutTable
{
get
{
return (DataTable)ViewState["GridOutTable"];
}
set
{
ViewState["GridOutTable"] = value;
}
}
#region Page_Init
// 注意动态创建的代码需要放置于Page_Init不是Page_Load这样每次构造页面时都会执行
protected void Page_Init(object sender, EventArgs e)
{
InitGrid();
}
private void InitGrid()
{
GridTable=new DataTable();
FineUIPro.BoundField bf;
FineUIPro.CheckBoxField rf;
FineUIPro.TextBox txTextBox;
GridTable.Columns.Add("PersonId");
ListItem[] list = new ListItem[6];
list[0] = new ListItem("单位名称", "UnitName");
list[1] = new ListItem("施工队", "TeamGroupName");
list[2] = new ListItem("姓名", "EmployName");
list[3] = new ListItem("身份证", "IDCardNo");
list[4] = new ListItem("工种", "WorkPostName");
list[5] = new ListItem("出勤天数", "AttendanceDays");
var dateList =Funs. GetMonthDay(InOutRecordStatisticInput.date.Year, InOutRecordStatisticInput.date.Month);
foreach (var item in list)
{
bf = new FineUIPro.BoundField();
bf.ColumnID = item.Value;
bf.DataField = item.Value;
bf.HeaderText = item.Text;
bf.HeaderTextAlign = TextAlign.Center;
bf.TextAlign = TextAlign.Center;
bf.Locked = true;
Grid1.Columns.Add(bf);
GridTable.Columns.Add(item.Value);
}
foreach (var item in dateList)
{
rf = new FineUIPro.CheckBoxField();
rf.ColumnID = item.Day.ToString();
rf.DataField= item.Day.ToString();
rf.HeaderText = item.Day.ToString();
rf.HeaderTextAlign = TextAlign.Center;
rf.TextAlign = TextAlign.Center;
rf.RenderAsStaticField = true;
Grid1.Columns.Add(rf);
GridTable.Columns.Add(item.Day.ToString());
}
}
#endregion
/// <summary>
/// 以月和年为参数的函数并返回包含这个月中所有日期的List<DateTime>
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
/// <returns></returns>
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ProjectId = this.CurrUser.LoginProjectId;
// 绑定表格
this.BindGrid();
}
}
#region
/// <summary>
/// 绑定数据
/// </summary>
private void BindGrid()
{
getDataLists=(from x in Funs.DB.View_SitePerson_Person
where x.IsUsed == true && x.ProjectId == InOutRecordStatisticInput.ProjectId
&& (string.IsNullOrEmpty(InOutRecordStatisticInput.UnitId)|| x.UnitId .Contains(InOutRecordStatisticInput.UnitId))
&& (string.IsNullOrEmpty(InOutRecordStatisticInput.TeamGroupId) || x.TeamGroupId.Contains(InOutRecordStatisticInput.TeamGroupId))
&& (string.IsNullOrEmpty(InOutRecordStatisticInput.WorkPostId) || x.WorkPostId.Contains(InOutRecordStatisticInput.WorkPostId))
&& (string.IsNullOrEmpty(InOutRecordStatisticInput.PersonName) || x.PersonName.Contains(InOutRecordStatisticInput.PersonName))
select x).ToList();
var queryEmployInOutRecordList = (from x in Funs.DB.T_d_EmployInOutRecord
where x.ProjectId == InOutRecordStatisticInput.ProjectId
&& x.RecordDate.Value.Year == InOutRecordStatisticInput.date.Year
&& x.RecordDate.Value.Month == InOutRecordStatisticInput.date.Month
select x).ToList();
var count = getDataLists.Count();
// getDataLists = getDataLists.Skip(Grid1.PageSize * Grid1.PageIndex).Take(Grid1.PageSize).ToList();
var splitDataLists = Funs.SplitList(getDataLists.ToList(), 10);
ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = Environment.ProcessorCount;
var concurrentGridTable = new ConcurrentDictionary<string, DataRow>();
// 使用 Parallel.ForEach 来并行处理拆分后的列表
Parallel.ForEach(splitDataLists, parallelOptions, sublist =>
{
var tempTable = GridTable.Clone(); // 创建临时的 DataTable
foreach (var item in sublist)
{
int AttendanceDays = 0;
DataRow row = tempTable.NewRow();
row["PersonId"] = item.PersonId;
row["UnitName"] = item.UnitName;
row["TeamGroupName"] = item.TeamGroupName;
row["EmployName"] = item.PersonName;
row["IDCardNo"] = item.IdentityCard;
row["WorkPostName"] = item.WorkPostName;
var dateList = Funs.GetMonthDay(InOutRecordStatisticInput.date.Year, InOutRecordStatisticInput.date.Month);
foreach (var day in dateList)
{
var model = queryEmployInOutRecordList.FirstOrDefault(x => x.IDCardNo == item.IdentityCard && x.RecordDate.Value.Date == day.Date);
if (model != null)
{
row[day.Day.ToString()] = true;
AttendanceDays++;
}
else
{
row[day.Day.ToString()] = false;
}
}
row["AttendanceDays"] = AttendanceDays;
concurrentGridTable.TryAdd(item.PersonId, row);
// GridTable.Rows.Add(row);
}
});
// 将线程安全的数据拷贝到 GridTable
foreach (var kvp in concurrentGridTable)
{
DataRow newRow = GridTable.NewRow();
newRow.ItemArray = kvp.Value.ItemArray; // 使用 ImportRow 方法创建新的行
GridTable.Rows.Add(newRow);
}
Grid1.RecordCount = count;
Grid1.DataSource = GridTable.AsEnumerable().OrderBy(x => x["UnitName"].ToString()); ;
Grid1.DataBind();
GridOutTable= GridTable.Copy();
}
#endregion
#region GV
/// <summary>
/// 过滤表头
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
//protected void Grid1_FilterChange(object sender, EventArgs e)
//{
// this.BindGrid();
//}
/// <summary>
/// 分页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Grid1_PageIndexChange(object sender, GridPageEventArgs e)
{
this.Grid1.PageIndex = e.NewPageIndex;
this.BindGrid();
}
/// <summary>
/// 排序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Grid1_Sort(object sender, GridSortEventArgs e)
{
this.Grid1.SortDirection = e.SortDirection;
this.Grid1.SortField = e.SortField;
this.BindGrid();
}
/// <summary>
/// 分页显示条数下拉框
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e)
{
this.BindGrid();
}
#endregion
#region
/// <summary>
/// 关闭弹出窗
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Window1_Close(object sender, WindowCloseEventArgs e)
{
BindGrid();
}
#endregion
#region
/// 导出按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnOut_Click1(object sender, EventArgs e)
{
try
{
string path = Funs.RootPath + @"File\Excel\Temp\月度考勤表.xlsx";
path = path.Replace(".xlsx", string.Format("{0:yyyy-MM-dd-HH-mm}", DateTime.Now) + ".xlsx");
GridOutTable.Columns["UnitName"].ColumnName="单位名称";
GridOutTable.Columns["TeamGroupName"].ColumnName = "施工队";
GridOutTable.Columns["EmployName"].ColumnName = "姓名";
GridOutTable.Columns["IDCardNo"].ColumnName = "身份证";
GridOutTable.Columns["WorkPostName"].ColumnName = "工种";
GridOutTable.Columns["AttendanceDays"].ColumnName = "出勤天数";
GridOutTable.Columns.Remove("PersonId");
// 假设 dt 是你的 DataTable 对象columnIndex 是要检查的列的索引
for (int i = 0; i < GridOutTable.Rows.Count; i++)
{
for (int j = 0; j < GridOutTable.Columns.Count; j++)
{
// 检查每个单元格的值
if (GridOutTable.Rows[i][j].ToString() =="True")
{
GridOutTable.Rows[i][j] = "√";
}else if (GridOutTable.Rows[i][j].ToString() == "False")
{
GridOutTable.Rows[i][j] = "×";
}
}
}
MiniExcel.SaveAs(path, GridOutTable);
string fileName= ProjectService.GetProjectNameByProjectId(this.ProjectId)+ "月度考勤表.xlsx".Replace(".xlsx", string.Format("{0:yyyy-MM}", DateTime.Now) + ".xlsx");
FileInfo info = new FileInfo(path);
if (info.Exists)
{
long fileSize = info.Length;
System.Web.HttpContext.Current.Response.BufferOutput = true;
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
System.Web.HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
System.Web.HttpContext.Current.Response.TransmitFile(path, 0, fileSize);
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.Close();
File.Delete(path);
}
}
catch (System.Exception ex)
{
throw;
};
}
protected void btnOut_Click(object sender, EventArgs e)
{
try
{
string path = Funs.RootPath + @"File\Excel\Temp\月度考勤表.xlsx";
path = path.Replace(".xlsx", string.Format("{0:yyyy-MM-dd-HH-mm}", DateTime.Now) + ".xlsx");
GridOutTable.Columns["UnitName"].ColumnName = "单位名称";
GridOutTable.Columns["TeamGroupName"].ColumnName = "施工队";
GridOutTable.Columns["EmployName"].ColumnName = "姓名";
GridOutTable.Columns["IDCardNo"].ColumnName = "身份证";
GridOutTable.Columns["WorkPostName"].ColumnName = "工种";
GridOutTable.Columns["AttendanceDays"].ColumnName = "出勤天数";
// GridOutTable.Columns.Remove("PersonId");
// 假设 dt 是你的 DataTable 对象columnIndex 是要检查的列的索引
for (int i = 0; i < GridOutTable.Rows.Count; i++)
{
var model = DoorServerService.getInOutRecordStatistics(InOutRecordStatisticInput.ProjectId, GridOutTable.Rows[i]["PersonId"].ToString(), InOutRecordStatisticInput.date);
for (int j = 0; j < GridOutTable.Columns.Count; j++)
{
// 检查每个单元格的值
if (GridOutTable.Rows[i][j].ToString() == "True")
{
var todaymodel = model.DayInOutRecordStatistic.FirstOrDefault(x => x.Date.Day.ToString() == GridOutTable.Columns[j].ColumnName);
// GridOutTable.Columns[j].ColumnName
if (todaymodel!=null && todaymodel.State==1)
{
GridOutTable.Rows[i][j] = "√";
}
else if(todaymodel != null && todaymodel.State == 2)
{
GridOutTable.Rows[i][j] = "✰";
}
}
else if (GridOutTable.Rows[i][j].ToString() == "False")
{
GridOutTable.Rows[i][j] = "×";
}
}
}
GridOutTable.Columns.Remove("PersonId");
MiniExcel.SaveAs(path, GridOutTable);
string fileName = ProjectService.GetProjectNameByProjectId(this.ProjectId) + "月度考勤表.xlsx".Replace(".xlsx", string.Format("{0:yyyy-MM}", DateTime.Now) + ".xlsx");
FileInfo info = new FileInfo(path);
if (info.Exists)
{
long fileSize = info.Length;
System.Web.HttpContext.Current.Response.BufferOutput = true;
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
System.Web.HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
System.Web.HttpContext.Current.Response.TransmitFile(path, 0, fileSize);
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.Close();
File.Delete(path);
}
}
catch (System.Exception ex)
{
throw;
};
}
#endregion
}
}