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

422 lines
17 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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