2023-10-30

This commit is contained in:
2023-10-30 10:40:53 +08:00
parent 11a1709351
commit b3a0193a38
16 changed files with 485 additions and 264 deletions
+1
View File
@@ -271,6 +271,7 @@
<Compile Include="Common\FastReport.cs" />
<Compile Include="Common\IDCardValid.cs" />
<Compile Include="Common\CreateQRCodeService.cs" />
<Compile Include="Common\MultiHeaderTable.cs" />
<Compile Include="Common\NPOIHelper.cs" />
<Compile Include="Common\PrinterDocService.cs" />
<Compile Include="Common\ProjectDataFlowSetService.cs" />
+2 -2
View File
@@ -3424,9 +3424,9 @@ namespace BLL
/// </summary>
public const string TemQuantityTemplateUrl = "File\\Excel\\DataIn\\工程量清单模板.xlsx";
/// <summary>
/// 合同执行跟踪导入模板
/// 合同价格信息导入模板
/// </summary>
public const string TemContractTrackTemplateUrl = "File\\Excel\\DataIn\\合同执行跟踪导入模板.xlsx";
public const string TemContractTrackTemplateUrl = "File\\Excel\\DataIn\\合同价格信息导入模板.xlsx";
#endregion
+142
View File
@@ -0,0 +1,142 @@
using FineUIPro;
using System.Collections.Generic;
using System;
/// <summary>
/// 处理多表头的类
/// </summary>
public class MultiHeaderTable
{
// 包含 rowspancolspan 的多表头,方便生成 HTML 的 table 标签
public List<List<object[]>> MultiTable = new List<List<object[]>>();
// 最终渲染的列数组
public List<GridColumn> Columns = new List<GridColumn>();
public void ResolveMultiHeaderTable(GridColumnCollection columns)
{
List<object[]> row = new List<object[]>();
foreach (GridColumn column in columns)
{
object[] cell = new object[4];
cell[0] = 1; // rowspan
cell[1] = 1; // colspan
cell[2] = column;
cell[3] = null;
row.Add(cell);
}
ResolveMultiTable(row, 0);
ResolveColumns(row);
}
private void ResolveColumns(List<object[]> row)
{
foreach (object[] cell in row)
{
GroupField groupField = cell[2] as GroupField;
if (groupField != null && groupField.Columns.Count > 0)
{
List<object[]> subrow = new List<object[]>();
foreach (GridColumn column in groupField.Columns)
{
subrow.Add(new object[]
{
1,
1,
column,
groupField
});
}
ResolveColumns(subrow);
}
else
{
Columns.Add(cell[2] as GridColumn);
}
}
}
private void ResolveMultiTable(List<object[]> row, int level)
{
List<object[]> nextrow = new List<object[]>();
foreach (object[] cell in row)
{
GroupField groupField = cell[2] as GroupField;
if (groupField != null && groupField.Columns.Count > 0)
{
// 如果当前列包含子列,则更改当前列的 colspan,以及增加父列(向上递归)的colspan
cell[1] = Convert.ToInt32(groupField.Columns.Count);
PlusColspan(level - 1, cell[3] as GridColumn, groupField.Columns.Count - 1);
foreach (GridColumn column in groupField.Columns)
{
nextrow.Add(new object[]
{
1,
1,
column,
groupField
});
}
}
}
MultiTable.Add(row);
// 如果当前下一行,则增加上一行(向上递归)中没有子列的列的 rowspan
if (nextrow.Count > 0)
{
PlusRowspan(level);
ResolveMultiTable(nextrow, level + 1);
}
}
private void PlusRowspan(int level)
{
if (level < 0)
{
return;
}
foreach (object[] cells in MultiTable[level])
{
GroupField groupField = cells[2] as GroupField;
if (groupField != null && groupField.Columns.Count > 0)
{
// ...
}
else
{
cells[0] = Convert.ToInt32(cells[0]) + 1;
}
}
PlusRowspan(level - 1);
}
private void PlusColspan(int level, GridColumn parent, int plusCount)
{
if (level < 0)
{
return;
}
foreach (object[] cells in MultiTable[level])
{
GridColumn column = cells[2] as GridColumn;
if (column == parent)
{
cells[1] = Convert.ToInt32(cells[1]) + plusCount;
PlusColspan(level - 1, cells[3] as GridColumn, plusCount);
}
}
}
}
@@ -310,59 +310,62 @@ namespace BLL
{
var responeData = new ResponeData();
List<PHTGL_ContractTrackDtoIn> rows;
try
var sheetNames = MiniExcel.GetSheetNames(path);
foreach (var sheet in sheetNames) ////多sheet导入
{
rows = MiniExcel.Query<PHTGL_ContractTrackDtoIn>(path).ToList();
}
catch (Exception e)
{
responeData.code = 0;
responeData.message = "模板错误";
return responeData;
}
var mapper =
ObjectMapperManager.DefaultInstance.GetMapper<List<PHTGL_ContractTrackDtoIn>, List<PHTGL_ContractTrack>>();
var modeList = mapper.Map(rows);
if (modeList.Count == 0)
{
responeData.code = 0;
responeData.message = "没有数据";
return responeData;
}
foreach (var item in modeList)
{
item.ContractId = contractid;
item.ProjectId = projectid;
if (string.IsNullOrEmpty(item.ProjectCode)) continue;
var phtglContractTrack = new PHTGL_ContractTrack
try
{
MainItemCode = item.MainItemCode,
ProjectCode = item.ProjectCode,
ContractId = contractid,
ProjectId = projectid,
};
var resultModel = GetPHTGL_ContractTrackByModle(phtglContractTrack);
item.ContractNum = ContractService.GetContractById(contractid)?.ContractNum;
if (!string.IsNullOrEmpty(item.ProjectCode) && !item.ProjectCode.Contains("-"))
{
item.ProjectCode = item.MainItemCode + "-" + item.ProjectCode;
rows = MiniExcel.Query<PHTGL_ContractTrackDtoIn>(path, sheetName: sheet).ToList();
}
if (resultModel.Any())
catch (Exception ex)
{
item.Id = resultModel[0].Id;
UpdatePHTGL_ContractTrack(item);
responeData.code = 0;
responeData.message = sheet+"模板错误:" + ex.ToString();
return responeData;
}
else
{
item.Id = SQLHelper.GetNewID();
AddPHTGL_ContractTrack(item);
}
PhtglContracttrackprogressService.CreateTemplateByContractTrackId(item.Id);
}
var mapper =
ObjectMapperManager.DefaultInstance.GetMapper<List<PHTGL_ContractTrackDtoIn>, List<PHTGL_ContractTrack>>();
var modeList = mapper.Map(rows);
if (modeList.Count == 0)
{
responeData.code = 0;
responeData.message = sheet+ "没有数据";
return responeData;
}
foreach (var item in modeList)
{
item.ContractId = contractid;
item.ProjectId = projectid;
if (string.IsNullOrEmpty(item.ProjectCode)) continue;
var phtglContractTrack = new PHTGL_ContractTrack
{
MainItemCode = item.MainItemCode,
ProjectCode = item.ProjectCode,
ContractId = contractid,
ProjectId = projectid,
};
var resultModel = GetPHTGL_ContractTrackByModle(phtglContractTrack);
item.ContractNum = ContractService.GetContractById(contractid)?.ContractNum;
if (!string.IsNullOrEmpty(item.ProjectCode) && !item.ProjectCode.Contains("-"))
{
item.ProjectCode = item.MainItemCode + "-" + item.ProjectCode;
}
if (resultModel.Any())
{
item.Id = resultModel[0].Id;
UpdatePHTGL_ContractTrack(item);
}
else
{
item.Id = SQLHelper.GetNewID();
AddPHTGL_ContractTrack(item);
}
PhtglContracttrackprogressService.CreateTemplateByContractTrackId(item.Id);
}
}
return responeData;
}