using BLL;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
namespace FineUIPro.Web.PHTGL.ContractCompile
{
public partial class ContractTrackProgressDetectionGrid : PageBase
{
#region Page_Init
// 注意:动态创建的代码需要放置于Page_Init(不是Page_Load),这样每次构造页面时都会执行
protected void Page_Init(object sender, EventArgs e)
{
InitGrid();
}
public DataTable GridTable = new DataTable();
private void InitGrid()
{
FineUIPro.BoundField bf;
FineUIPro.RenderField rf;
FineUIPro.TextBox txTextBox;
ContractId = Request.Params["ContractId"];
GridTable.Columns.Add("Id");
GridTable.Columns.Add("SerialNumber");
ListItem[] list = new ListItem[8];
list[0] = new ListItem("主项号", "MainItemCode");
list[1] = new ListItem("主项名称", "MainItemName");
list[2] = new ListItem("专业工程名称", "MajorName");
list[3] = new ListItem("专业代码", "MajorCode");
//list[4] = new ListItem("分部工程", "SubProject");
//list[5] = new ListItem("子分部工程", "SubItemProject");
list[4] = new ListItem("项目编码", "ProjectCode");
list[5] = new ListItem("项目名称", "ProjectName");
list[6] = new ListItem("项目特征描述", "ProjectDescription");
list[7] = new ListItem("计量单位", "UnitOfMeasurement");
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);
}
if (!string.IsNullOrEmpty(ContractId))
{
Model.PHTGL_ContractTrack queryContractTrack = new Model.PHTGL_ContractTrack();
queryContractTrack.ProjectId = this.CurrUser.LoginProjectId;
queryContractTrack.ContractId = this.ContractId;
var modelContractTracks = BLL.PhtglContractTrackService.GetFirstPHTGL_ContractTrackByModle(queryContractTrack);
if (modelContractTracks == null) return;
Model.PHTGL_ContractTrackProgress table = new Model.PHTGL_ContractTrackProgress();
table.ContractTrackId = modelContractTracks.Id;
var tb = BLL.PhtglContracttrackprogressService.GetPHTGL_ContractTrackProgressByModle(table);
foreach (var item in tb)
{
//string date = item.Date.Replace("-", "");
string date = item.Date + "#";
GroupField p = new GroupField();
p.HeaderText = item.Date;
p.TextAlign = TextAlign.Center;
GroupField p1 = new GroupField();
p1.HeaderText = "当月进展情况";
p1.TextAlign = TextAlign.Center;
GroupField p1BCWS = new GroupField();
p1BCWS.HeaderText = "BCWS";
p1BCWS.TextAlign = TextAlign.Center;
p1BCWS.Attributes["data-color"] = "color1";
GroupField p1ACWP = new GroupField();
p1ACWP.HeaderText = "ACWP";
p1ACWP.TextAlign = TextAlign.Center;
GroupField p2 = new GroupField();
p2.HeaderText = "累计进展情况";
p2.TextAlign = TextAlign.Center;
GroupField p2BCWS = new GroupField();
p2BCWS.HeaderText = "BCWS";
p2BCWS.TextAlign = TextAlign.Center;
p2BCWS.Attributes["data-color"] = "color1";
GroupField p2ACWP = new GroupField();
p2ACWP.HeaderText = "ACWP";
p2ACWP.TextAlign = TextAlign.Center;
#region 当月进展情况
#region BCWS
txTextBox = new FineUIPro.TextBox();
txTextBox.ID = "txt" + date + "BCWS_Quantity";
rf = new RenderField();
rf.ColumnID = date + "BCWS_Quantity";
rf.DataField = date + "BCWS_Quantity";
rf.HeaderText = "工程量";
rf.TextAlign = FineUIPro.TextAlign.Left;
rf.Editor.Add(txTextBox);
p1BCWS.Columns.Add(rf);
GridTable.Columns.Add(date + "BCWS_Quantity");
bf = new FineUIPro.BoundField();
bf.ColumnID = date + "BCWS_OutputValue";
bf.DataField = date + "BCWS_OutputValue";
bf.HeaderText = "产值(元)";
bf.HeaderTextAlign = TextAlign.Center;
bf.TextAlign = TextAlign.Center;
p1BCWS.Columns.Add(bf);
GridTable.Columns.Add(date + "BCWS_OutputValue");
bf = new FineUIPro.BoundField();
bf.ColumnID = date + "BCWS_Percentage";
bf.DataField = date + "BCWS_Percentage";
bf.HeaderText = "百分比/%";
bf.HeaderTextAlign = TextAlign.Center;
bf.TextAlign = TextAlign.Center;
p1BCWS.Columns.Add(bf);
GridTable.Columns.Add(date + "BCWS_Percentage");
#endregion
#region ACWP
txTextBox = new FineUIPro.TextBox();
txTextBox.ID = "txt" + date + "ACWP_Quantity";
rf = new RenderField();
rf.ColumnID = date + "ACWP_Quantity";
rf.DataField = date + "ACWP_Quantity";
rf.HeaderText = "工程量";
rf.TextAlign = FineUIPro.TextAlign.Left;
rf.Editor.Add(txTextBox);
p1ACWP.Columns.Add(rf);
GridTable.Columns.Add(date + "ACWP_Quantity");
bf = new FineUIPro.BoundField();
bf.ColumnID = date + "ACWP_OutputValue";
bf.DataField = date + "ACWP_OutputValue";
bf.HeaderText = "产值(元)";
bf.HeaderTextAlign = TextAlign.Center;
bf.TextAlign = TextAlign.Center;
p1ACWP.Columns.Add(bf);
GridTable.Columns.Add(date + "ACWP_OutputValue");
bf = new FineUIPro.BoundField();
bf.ColumnID = date + "ACWP_Percentage";
bf.DataField = date + "ACWP_Percentage";
bf.HeaderText = "百分比/%";
bf.HeaderTextAlign = TextAlign.Center;
bf.TextAlign = TextAlign.Center;
p1ACWP.Columns.Add(bf);
GridTable.Columns.Add(date + "ACWP_Percentage");
#endregion
#endregion
#region 累计进展情况
#region BCWS
txTextBox = new FineUIPro.TextBox();
txTextBox.ID = "txt" + date + "SumBCWS_Quantity";
rf = new RenderField();
rf.ColumnID = date + "SumBCWS_Quantity";
rf.DataField = date + "SumBCWS_Quantity";
rf.HeaderText = "工程量";
rf.TextAlign = FineUIPro.TextAlign.Left;
rf.Editor.Add(txTextBox);
p2BCWS.Columns.Add(rf);
GridTable.Columns.Add(date + "SumBCWS_Quantity");
bf = new FineUIPro.BoundField();
bf.ColumnID = date + "SumBCWS_OutputValue";
bf.DataField = date + "SumBCWS_OutputValue";
bf.HeaderText = "产值(元)";
bf.HeaderTextAlign = TextAlign.Center;
bf.TextAlign = TextAlign.Center;
p2BCWS.Columns.Add(bf);
GridTable.Columns.Add(date + "SumBCWS_OutputValue");
bf = new FineUIPro.BoundField();
bf.ColumnID = date + "SumBCWS_Percentage";
bf.DataField = date + "SumBCWS_Percentage";
bf.HeaderText = "百分比/%";
bf.HeaderTextAlign = TextAlign.Center;
bf.TextAlign = TextAlign.Center;
p2BCWS.Columns.Add(bf);
GridTable.Columns.Add(date + "SumBCWS_Percentage");
#endregion
#region ACWP
txTextBox = new FineUIPro.TextBox();
txTextBox.ID = "txt" + date + "SumACWP_Quantity";
rf = new RenderField();
rf.ColumnID = date + "SumACWP_Quantity";
rf.DataField = date + "SumACWP_Quantity";
rf.HeaderText = "工程量";
rf.TextAlign = FineUIPro.TextAlign.Left;
rf.Editor.Add(txTextBox);
p2ACWP.Columns.Add(rf);
GridTable.Columns.Add(date + "SumACWP_Quantity");
bf = new FineUIPro.BoundField();
bf.ColumnID = date + "SumACWP_OutputValue";
bf.DataField = date + "SumACWP_OutputValue";
bf.HeaderText = "产值(元)";
bf.HeaderTextAlign = TextAlign.Center;
bf.TextAlign = TextAlign.Center;
p2ACWP.Columns.Add(bf);
GridTable.Columns.Add(date + "SumACWP_OutputValue");
bf = new FineUIPro.BoundField();
bf.ColumnID = date + "SumACWP_Percentage";
bf.DataField = date + "SumACWP_Percentage";
bf.HeaderText = "百分比/%";
bf.HeaderTextAlign = TextAlign.Center;
bf.TextAlign = TextAlign.Center;
p2ACWP.Columns.Add(bf);
GridTable.Columns.Add(date + "SumACWP_Percentage");
#endregion
#endregion
p1.Columns.Add(p1BCWS);
p1.Columns.Add(p1ACWP);
p2.Columns.Add(p2BCWS);
p2.Columns.Add(p2ACWP);
p.Columns.Add(p1);
p.Columns.Add(p2);
Grid1.Columns.Add(p);
}
}
}
#endregion
public string ContractId
{
get => (string)ViewState["ContractId"];
set => ViewState["ContractId"] = value;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.GetButtonPower();
PHTGL_QuantityService.IniGetMajorItems3DownList(drpMajorItems, true);
// 绑定表格
this.BindGrid();
}
}
#region 绑定数据
///
/// 绑定数据
///
private void BindGrid()
{
if (!string.IsNullOrEmpty(ContractId))
{
Model.PHTGL_ContractTrack queryContractTrack = new Model.PHTGL_ContractTrack();
queryContractTrack.ProjectId = this.CurrUser.LoginProjectId;
queryContractTrack.ContractId = this.ContractId;
queryContractTrack.MainItemName = this.txtMainItemName.Text.Trim();
if (drpMajorItems.SelectedValue != Const._Null)
{
queryContractTrack.MajorName = drpMajorItems.SelectedValue;
}
var modelContractTracks =
BLL.PhtglContractTrackService.GetPHTGL_ContractTrackByModle(queryContractTrack);
var count = BLL.PhtglContractTrackService.GetPHTGL_ContractTrackByModle(queryContractTrack).Count();
modelContractTracks = modelContractTracks.Skip(Grid1.PageSize * Grid1.PageIndex).Take(Grid1.PageSize).ToList();
var splitContractTracks = Funs.SplitList(modelContractTracks, 10);
ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = Environment.ProcessorCount;
var concurrentGridTable = new ConcurrentDictionary();
// 使用 Parallel.ForEach 来并行处理拆分后的列表
Parallel.ForEach(splitContractTracks, parallelOptions, sublist =>
{
var tempTable = GridTable.Clone(); // 创建临时的 DataTable
foreach (var item in sublist)
{
DataRow row = tempTable.NewRow();
row["SerialNumber"] = item.SerialNumber;
row["Id"] = item.Id;
row["MainItemCode"] = item.MainItemCode;
row["MainItemName"] = item.MainItemName;
row["MajorName"] = item.MajorName;
row["MajorCode"] = item.MajorCode;
//row["SubProject"] = item.SubProject;
//row["SubItemProject"] = item.SubItemProject;
row["ProjectCode"] = item.ProjectCode;
row["ProjectName"] = item.ProjectName;
row["ProjectDescription"] = item.ProjectDescription;
row["UnitOfMeasurement"] = item.UnitOfMeasurement;
Model.PHTGL_ContractTrackProgress qContractTrackProgress = new Model.PHTGL_ContractTrackProgress();
qContractTrackProgress.ContractTrackId = item.Id;
var modelContractTrackProgresses = BLL.PhtglContracttrackprogressService.GetPHTGL_ContractTrackProgressByModle(qContractTrackProgress);
foreach (var detail in modelContractTrackProgresses)
{
// var date=detail.Date.Replace("-", "");
var date = detail.Date + "#";
row[date + "BCWS_Quantity"] = detail.BCWS_Quantity;
row[date + "BCWS_OutputValue"] = detail.BCWS_OutputValue;
row[date + "BCWS_Percentage"] = detail.BCWS_Percentage;
row[date + "ACWP_Quantity"] = detail.ACWP_Quantity;
row[date + "ACWP_OutputValue"] = detail.ACWP_OutputValue;
row[date + "ACWP_Percentage"] = detail.ACWP_Percentage;
var SumModel = PhtglContracttrackprogressService.GetSumProgress(detail.ContractTrackProgressId);
row[date + "SumBCWS_Quantity"] = SumModel.BCWS_Quantity;
row[date + "SumBCWS_OutputValue"] = SumModel.BCWS_OutputValue;
row[date + "SumBCWS_Percentage"] = SumModel.BCWS_Percentage;
row[date + "SumACWP_Quantity"] = SumModel.ACWP_Quantity;
row[date + "SumACWP_OutputValue"] = SumModel.ACWP_OutputValue;
row[date + "SumACWP_Percentage"] = SumModel.ACWP_Percentage;
}
concurrentGridTable.TryAdd(item.Id, 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["SerialNumber"].ToString(), new CustomComparer()); ;
Grid1.DataBind();
}
}
protected void Grid1_OnRowDataBound(object sender, GridRowEventArgs e)
{
if (!string.IsNullOrEmpty(ContractId))
{
Model.PHTGL_ContractTrack queryContractTrack = new Model.PHTGL_ContractTrack();
queryContractTrack.ProjectId = this.CurrUser.LoginProjectId;
queryContractTrack.ContractId = this.ContractId;
var modelContractTracks = BLL.PhtglContractTrackService.GetFirstPHTGL_ContractTrackByModle(queryContractTrack);
if (modelContractTracks == null) return;
Model.PHTGL_ContractTrackProgress qContractTrackProgress = new Model.PHTGL_ContractTrackProgress();
qContractTrackProgress.ContractTrackId = modelContractTracks.Id;
var modelContractTrackProgresses = BLL.PhtglContracttrackprogressService.GetPHTGL_ContractTrackProgressByModle(qContractTrackProgress);
foreach (var detail in modelContractTrackProgresses)
{
var date = detail.Date + "#";
RenderField rfRenderField1 = Grid1.FindColumn(date + "BCWS_Quantity") as RenderField;
BoundField bf1 = Grid1.FindColumn(date + "BCWS_OutputValue") as BoundField;
BoundField bf2 = Grid1.FindColumn(date + "BCWS_Percentage") as BoundField;
e.CellAttributes[rfRenderField1.ColumnIndex]["data-color"] = "color1";
e.CellAttributes[bf1.ColumnIndex]["data-color"] = "color1";
e.CellAttributes[bf2.ColumnIndex]["data-color"] = "color1";
RenderField rfRenderField2 = Grid1.FindColumn(date + "SumBCWS_Quantity") as RenderField;
BoundField bf3 = Grid1.FindColumn(date + "SumBCWS_OutputValue") as BoundField;
BoundField bf4 = Grid1.FindColumn(date + "SumBCWS_Percentage") as BoundField;
e.CellAttributes[rfRenderField2.ColumnIndex]["data-color"] = "color1";
e.CellAttributes[bf3.ColumnIndex]["data-color"] = "color1";
e.CellAttributes[bf4.ColumnIndex]["data-color"] = "color1";
}
}
}
#endregion
#region GV 数据操作
///
/// 过滤表头
///
///
///
//protected void Grid1_FilterChange(object sender, EventArgs e)
//{
// this.BindGrid();
//}
///
/// 分页
///
///
///
protected void Grid1_PageIndexChange(object sender, GridPageEventArgs e)
{
this.Grid1.PageIndex = e.NewPageIndex;
this.BindGrid();
}
///
/// 排序
///
///
///
protected void Grid1_Sort(object sender, GridSortEventArgs e)
{
this.Grid1.SortDirection = e.SortDirection;
this.Grid1.SortField = e.SortField;
this.BindGrid();
}
///
/// 分页显示条数下拉框
///
///
///
protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e)
{
this.BindGrid();
}
#endregion
#region 数据编辑事件
///
/// 编辑按钮
///
///
///
protected void btnEdit_Click(object sender, EventArgs e)
{
if (Grid1.SelectedRowIndexArray.Length == 0)
{
Alert.ShowInTop("请至少选择一条记录!", MessageBoxIcon.Warning);
return;
}
string ID = Grid1.SelectedRowID;
var model = BLL.PhtglContractTrackService.GetPHTGL_ContractTrackById(ID);
if (model != null) ///已上报时不能删除
{
PageContext.RegisterStartupScript(Window1.GetShowReference(String.Format("ContractTrackEdit.aspx?Id={0}", ID, "编辑 - ")));
}
}
///
/// Grid行双击事件
///
///
///
protected void Grid1_RowDoubleClick(object sender, GridRowClickEventArgs e)
{
this.btnEdit_Click(null, null);
}
protected void btnSave_OnClick(object sender, EventArgs e)
{
JArray EditorArr = Grid1.GetMergedData();
if (EditorArr.Count > 0)
{
for (int i = 0; i < EditorArr.Count; i++)
{
JObject objects = (JObject)EditorArr[i];
var listfiled = objects["values"].ToList();
var Id = objects["id"].ToString();
var model = BLL.PhtglContractTrackService.GetPHTGL_ContractTrackById(Id);
if (model != null)
{
foreach (var item in listfiled) //遍历行中的字段
{
var b = item;
var txtname = b.First.Path.Substring(b.First.Path.LastIndexOf('.') + 1);
var txtvalue = b.First.Value();
string date = txtname.Split('#')[0].ToString();
string filed = txtname.Split('#')[1].ToString();
var modelContractTrackProgress = PhtglContracttrackprogressService.GetPHTGL_ContractTrackProgressByTrackIdAndDate(Id, date);
if (modelContractTrackProgress != null)
{
switch (filed)
{
case "ACWP_Quantity":
modelContractTrackProgress.ACWP_Quantity = Funs.GetNewDecimalOrZero(txtvalue);
break;
case "BCWS_Quantity":
modelContractTrackProgress.BCWS_Quantity = Funs.GetNewDecimalOrZero(txtvalue);
break;
}
}
PhtglContracttrackprogressService.UpdatePHTGL_ContractTrackProgress(modelContractTrackProgress);
}
}
}
}
CheckProgressd();
BindGrid();
}
///
/// 修改产值/百分比
///
private void CheckProgressd()
{
if (!string.IsNullOrEmpty(ContractId))
{
Model.PHTGL_ContractTrack queryContractTrack = new Model.PHTGL_ContractTrack();
queryContractTrack.ProjectId = this.CurrUser.LoginProjectId;
queryContractTrack.ContractId = this.ContractId;
var modelContractTracks =
BLL.PhtglContractTrackService.GetPHTGL_ContractTrackByModle(queryContractTrack);
foreach (var item in modelContractTracks)
{
PhtglContracttrackprogressService.CheckProgressByContractTrackId(item.Id);
}
}
}
protected void btnQuery_OnClick(object sender, EventArgs e)
{
BindGrid();
}
protected void btnGetChart_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(ContractId))
{
var model = ContractService.GetContractById(ContractId);
if (model != null)
{
PageContext.RegisterStartupScript(
Window2.GetShowReference(string.Format("ContractTrackProgressChart.aspx?ContractId={0}", model.ContractId, "图表 - ")));
}
}
else
{
ShowNotify("请选择施工分包合同", MessageBoxIcon.Question);
}
}
#endregion
#region 获取权限按钮
///
/// 获取按钮权限
///
///
///
private void GetButtonPower()
{
var buttonList = BLL.CommonService.GetAllButtonList(this.CurrUser.LoginProjectId, this.CurrUser.PersonId, BLL.Const.PHTGL_ContractTrackProgressDetectionMenuId);
if (buttonList.Count > 0)
{
if (buttonList.Contains(BLL.Const.BtnAdd))
{
//this.btnNew.Hidden = false;
}
if (buttonList.Contains(BLL.Const.BtnModify))
{
// this.btnMenuEdit.Hidden = false;
}
if (buttonList.Contains(BLL.Const.BtnDelete))
{
// this.btnMenuDelete.Hidden = false;
}
}
}
#endregion
#region 关闭弹出窗
///
/// 关闭弹出窗
///
///
///
protected void Window1_Close(object sender, WindowCloseEventArgs e)
{
BindGrid();
}
#endregion
#region 导出按钮
/// 导出按钮
///
///
///
protected void btnOut_Click(object sender, EventArgs e)
{
Response.ClearContent();
string filename = Funs.GetNewFileName();
Response.AddHeader("content-disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode("进度检测表" + filename, System.Text.Encoding.UTF8) + ".xls");
Response.ContentType = "application/excel";
Response.ContentEncoding = System.Text.Encoding.UTF8;
this.Grid1.PageSize = 500;
this.BindGrid();
Response.Write(GetGridTableHtml(Grid1));
Response.End();
}
///
/// 导出方法
///
///
///
//private string GetGridTableHtml(Grid grid)
//{
// StringBuilder sb = new StringBuilder();
// sb.Append("");
// sb.Append("");
// sb.Append("");
// foreach (GridColumn column in grid.Columns)
// {
// sb.AppendFormat("| {0} | ", column.HeaderText);
// }
// sb.Append("
");
// foreach (GridRow row in grid.Rows)
// {
// sb.Append("");
// foreach (GridColumn column in grid.Columns)
// {
// string html = row.Values[column.ColumnIndex].ToString();
// if (column.ColumnID == "tfNumber")
// {
// html = (row.FindControl("lblNumber") as System.Web.UI.WebControls.Label).Text;
// }
// sb.AppendFormat("| {0} | ", html);
// }
// sb.Append("
");
// }
// sb.Append("
");
// return sb.ToString();
//}
private string GetGridTableHtml(Grid grid)
{
StringBuilder sb = new StringBuilder();
MultiHeaderTable mht = new MultiHeaderTable();
mht.ResolveMultiHeaderTable(Grid1.Columns);
sb.Append("");
sb.Append("");
foreach (List
");
return sb.ToString();
}
#endregion
}
}