二次计算完成

parent 0402ea16
......@@ -68,6 +68,8 @@ public AutoMapperConfigs()
CreateMap<PerData, im_data>()
.ForMember(dest => dest.IsFactor, opt => opt.MapFrom(src => src.IsFactor ? 1 : 2))
.ForMember(dest => dest.UnitType, opt => opt.MapFrom(src => src.UnitType == "医生组" ? 1 : (src.UnitType == "护理组" ? 2 : 0)));
CreateMap<PerDataEmployee, im_employee>();
}
}
}
......@@ -21,17 +21,20 @@ public class PerExcelService : IAutoInjection
private PerforImSheetRepository _perforImSheetRepository;
private PerforImDataRepository _perforImDataRepository;
private PerforImHeaderRepository _perforImHeaderRepository;
private PerforImEmployeeRepository _perforImEmployeeRepository;
public PerExcelService(PerSheetService perSheetService,
PerHeaderService perHeaderService,
PerforImSheetRepository perforImSheetRepository,
PerforImDataRepository perforImDataRepository,
PerforImHeaderRepository perforImHeaderRepository)
PerforImHeaderRepository perforImHeaderRepository,
PerforImEmployeeRepository perforImEmployeeRepository)
{
_perSheetService = perSheetService;
_perHeaderService = perHeaderService;
_perforImSheetRepository = perforImSheetRepository;
_perforImDataRepository = perforImDataRepository;
_perforImHeaderRepository = perforImHeaderRepository;
_perforImEmployeeRepository = perforImEmployeeRepository;
}
/// <summary>
......@@ -95,31 +98,43 @@ public void Save(List<PerSheet> perSheets, int allotId, int source)
{
foreach (var sheet in perSheets)
{
var imsheet = new im_sheet { AllotID = allotId, SheetName = sheet.SheetName, Source = source, SheetType = (int)sheet.SheetType };
_perforImSheetRepository.Add(imsheet);
foreach (var header in sheet.PerHeader)
if (sheet.SheetType == SheetType.Employee)
{
var imheader = Mapper.Map<im_header>(header);
imheader.SheetID = imsheet.ID;
_perforImHeaderRepository.Add(imheader);
if (header.IsHasChildren)
var dataList = sheet.PerData.Select(t => (PerDataEmployee)t);
foreach (var data in dataList)
{
foreach (var child in header.Children)
{
var imheaderChild = Mapper.Map<im_header>(child);
imheaderChild.SheetID = imsheet.ID;
imheaderChild.ParentID = imheader.ID;
_perforImHeaderRepository.Add(imheaderChild);
}
var imdata = Mapper.Map<im_employee>(data);
_perforImEmployeeRepository.Add(imdata);
}
}
var dataList = sheet.PerData.Select(t => (PerData)t);
foreach (var data in dataList)
else
{
var imdata = Mapper.Map<im_data>(data);
imdata.SheetID = imsheet.ID;
_perforImDataRepository.Add(imdata);
var imsheet = new im_sheet { AllotID = allotId, SheetName = sheet.SheetName, Source = source, SheetType = (int)sheet.SheetType };
_perforImSheetRepository.Add(imsheet);
foreach (var header in sheet.PerHeader)
{
var imheader = Mapper.Map<im_header>(header);
imheader.SheetID = imsheet.ID;
_perforImHeaderRepository.Add(imheader);
if (header.IsHasChildren)
{
foreach (var child in header.Children)
{
var imheaderChild = Mapper.Map<im_header>(child);
imheaderChild.SheetID = imsheet.ID;
imheaderChild.ParentID = imheader.ID;
_perforImHeaderRepository.Add(imheaderChild);
}
}
}
var dataList = sheet.PerData.Select(t => (PerData)t);
foreach (var data in dataList)
{
var imdata = Mapper.Map<im_data>(data);
imdata.SheetID = imsheet.ID;
_perforImDataRepository.Add(imdata);
}
}
}
......
......@@ -44,33 +44,5 @@ public static IPerSheetDataRead GetDataRead(SheetType sheetType)
}
return dataread;
}
/// <summary>
/// 构建excel计算
/// </summary>
/// <param name="sheetType"></param>
/// <returns></returns>
public static IPerSheetDataCompute GetDataCompute(SheetType sheetType)
{
IPerSheetDataCompute dataCompute = null;
switch (sheetType)
{
case SheetType.Income:
case SheetType.OtherIncome:
case SheetType.Expend:
dataCompute = new PerSheetDataComputeEconomic();
break;
case SheetType.Workload:
dataCompute = new PerSheetDataComputeWorkload();
break;
//case SheetType.Overtime:
// dataCompute = new PerSheetDataReadOvertime();
// break;
//case SheetType.UnifyUnit:
// dataread = new PerSheetDataReadUnifyUnit();
// break;
}
return dataCompute;
}
}
}
......@@ -47,10 +47,9 @@ public PerSheet Sheet(ISheet sheet)
/// <returns></returns>
public SheetType GetSheetType(string sheetName)
{
//if (sheetName.StartsWith("医院人员名单"))
// return SheetType.Employee;
//else
if (sheetName.StartsWith("1.0"))
if (sheetName.StartsWith("医院人员名单"))
return SheetType.Employee;
else if (sheetName.StartsWith("1.0"))
return SheetType.OtherIncome;
else if (sheetName.StartsWith("1.1"))
return SheetType.Income;
......@@ -68,17 +67,33 @@ internal List<PerSheet> ProcessCompute(PerExcel excel)
List<PerSheet> perSheet = new List<PerSheet>();
//合并科室收入、支出
var merge = new PerSheetDataComputeMerge();
var mergeResult = merge.MergeCompute(excel);
var economicCompute = new PerSheetDataComputeEconomic();
var economic = economicCompute.ProcessCompute(mergeResult);
perSheet.Add(economic);
var mergeResult = economicCompute.MergeCompute(excel);
//一次计算
var onceEconomic = economicCompute.OnceCompute(mergeResult);
//二次计算
var twiceEconomicResult = economicCompute.TwiceCompute(onceEconomic);
perSheet.Add(twiceEconomicResult.Sheet);
//工作量
var workloadCompute = new PerSheetDataComputeWorkload();
var workload = workloadCompute.ProcessCompute(excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.Workload));
perSheet.Add(workload);
var workload1 = excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.Workload && t.SheetName.Contains("医生组"));
workload1.SheetName = "医生组工作量绩效测算表";
//医生组 一次计算
var onceWorkload1 = workloadCompute.OnceCompute(workload1);
//医生组 二次计算
var twiceWorkloadResult1 = workloadCompute.TwiceCompute(onceWorkload1);
perSheet.Add(twiceWorkloadResult1.Sheet);
var workload2 = excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.Workload && t.SheetName.Contains("护理组"));
workload2.SheetName = "护理组工作量绩效测算表";
//护理组 一次计算
var onceWorkload2 = workloadCompute.OnceCompute(workload2);
//护理组 二次计算
var twiceWorkloadResult2 = workloadCompute.TwiceCompute(onceWorkload2);
perSheet.Add(twiceWorkloadResult2.Sheet);
return perSheet;
}
......
using Performance.DtoModels;
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.Services
{
public interface IPerSheetDataCompute
{
/// <summary>
/// 计算
/// </summary>
/// <param name="sheet"></param>
/// <returns></returns>
PerSheet ProcessCompute(PerSheet excel);
}
}
......@@ -11,14 +11,105 @@ namespace Performance.Services
/// <summary>
/// 科室经济核算汇总表 (收入/其他收入/支出)
/// </summary>
public class PerSheetDataComputeEconomic : IPerSheetDataCompute
public class PerSheetDataComputeEconomic
{
#region 合并科室经济
/// <summary>
/// 计算科室经济核算汇总表
/// </summary>
/// <param name="excel"></param>
/// <returns></returns>
public PerSheet ProcessCompute(PerSheet sheet)
public PerSheet MergeCompute(PerExcel excel)
{
PerSheet compSheet = new PerSheet
{
SheetName = "科室经济核算汇总表",
ModuleName = "科室经济核算汇总表",
PerHeader = new List<PerHeader>(),
PerData = new List<IPerData>()
};
List<PerData> perDataList = new List<PerData>();
//初始核算单元列头
compSheet.PerHeader.Add(new PerHeader { CellValue = "核算单元", Level = 0, MergeCell = 1, MergeRow = 2, PointCell = 0, PointRow = 0 });
//起始列
int pointCell = 1;
//计算需从以下sheet中拿取数据
SheetType[] types = { SheetType.Income, SheetType.OtherIncome, SheetType.Expend };
foreach (var type in types)
{
//取出当前sheet类型数据
var sheetList = excel.PerSheet.Where(t => t.SheetType == type);
if (sheetList.Any())
{
List<PerHeader> headList = new List<PerHeader>();
//子集列号为父级列号
int childPointCell = pointCell;
foreach (var sheet in sheetList)
{
var dataList = sheet.PerData.Select(t => (PerData)t);
foreach (var group in dataList.GroupBy(t => t.UnitType))
{
var typeName = $"{GetCleanSheetName(sheet.SheetName)}({ group.Key})";
//创建子集头部信息
PerHeader childHeader = new PerHeader(1, childPointCell, typeName, 1, 1, 1, null, 2);
headList.Add(childHeader);
var ds = group.Where(t => t.CellValue.HasValue && t.CellValue.Value > 0)
.GroupBy(t => t.AccountingUnit).Select(t => new PerData
{
SignID = childHeader.SignID,
UnitType = group.Key,
AccountingUnit = t.Key,
CellValue = t.Sum(s => s.IsFactor ? (s.CellValue * (s.FactorValue ?? 0)) : s.CellValue),
TypeName = typeName,
RowNumber = dataList.FirstOrDefault(s => s.AccountingUnit == t.Key && s.UnitType == group.Key)?.RowNumber ?? 0,
ComputRule = type == SheetType.Expend ? 2 : 1
});
perDataList.AddRange(ds);
childPointCell++;
}
}
PerHeader header = new PerHeader(0, pointCell, EnumHelper.GetDescription(type), 1, 1, headList.Count, headList, 2);
compSheet.PerHeader.Add(header);
//父级列号为当前列号+子集个数
pointCell = pointCell + headList.Count;
}
}
int number = 0;
foreach (var accountingUnit in perDataList.OrderBy(t => t.RowNumber).Select(t => t.AccountingUnit).Distinct())
{
perDataList.Where(t => t.AccountingUnit == accountingUnit).ToList().ForEach(item => item.RowNumber = number);
number++;
}
compSheet.PerData.AddRange(perDataList);
return compSheet;
}
private string GetCleanSheetName(string sheetName)
{
sheetName = sheetName.Trim()
.Replace("医生组", "")
.Replace("护理组", "")
.Replace(" ", "")
.Replace(".", "");
sheetName = Regex.Replace(sheetName, @"\d", "");
return sheetName;
}
#endregion
#region 一次汇总
/// <summary>
/// 计算科室经济核算一次汇总表
/// </summary>
/// <param name="excel"></param>
/// <returns></returns>
public PerSheet OnceCompute(PerSheet sheet)
{
var dataList = sheet.PerData.Select(t => (PerData)t);
int phead = 0;
......@@ -72,5 +163,48 @@ public PerSheet ProcessCompute(PerSheet sheet)
sheet.PerData.AddRange(perDataList);
return sheet;
}
#endregion
#region 二次计算
/// <summary>
/// 二次计算
/// </summary>
/// <param name="sheet"></param>
/// <returns></returns>
public (PerSheet Sheet, List<PerData> PerData) TwiceCompute(PerSheet sheet)
{
//获取最大列坐标位置
int thiscell = sheet.PerHeader.OrderByDescending(t => t.PointCell).FirstOrDefault().Children.Max(t => t.PointCell) + 1;
PerHeader perHead = new PerHeader(0, thiscell, "科室可核算业绩收入", 0, 1, 2, new List<PerHeader>(), 1);
var dataList = sheet.PerData.Select(t => (PerData)t);
List<PerData> perDataList = new List<PerData>();
//插入合计结果
var groupList = dataList.Where(t => t.IsTotal == 1 && t.CellValue.HasValue && t.CellValue.Value > 0).GroupBy(t => t.UnitType);
foreach (var group in groupList)
{
var childHead = new PerHeader(1, thiscell, group.Key, 1, 1, 1, null, 1);
perHead.Children.Add(childHead);
var ds = group.GroupBy(t => t.AccountingUnit).Select(t => new PerData
{
UnitType = group.Key,
AccountingUnit = t.Key,
CellValue = t.Sum(s => s.ComputRule == 2 ? s.CellValue * -1 : s.CellValue),
TypeName = group.Key,
RowNumber = t.FirstOrDefault()?.RowNumber ?? 0,
IsTotal = 1,
PointCell = thiscell,
ComputRule = t.Select(s => s.ComputRule).Distinct().First(),
SignID = childHead.SignID,
});
perDataList.AddRange(ds);
thiscell++;
}
sheet.PerHeader.Add(perHead);
sheet.PerData.AddRange(perDataList);
return (sheet, perDataList);
}
#endregion
}
}
......@@ -11,7 +11,7 @@ namespace Performance.Services
/// <summary>
/// 合并科室经济
/// </summary>
public class PerSheetDataComputeMerge
public class PerSheetDataComputeEconomicMerge
{
/// <summary>
/// 计算科室经济核算汇总表
......
......@@ -11,30 +11,110 @@ namespace Performance.Services
/// <summary>
/// 工作量
/// </summary>
public class PerSheetDataComputeWorkload : IPerSheetDataCompute
public class PerSheetDataComputeWorkload
{
public PerSheet ProcessCompute(PerSheet excel)
#region 工作量一次计算
/// <summary>
/// 工作量一次计算
/// </summary>
/// <param name="sheet"></param>
/// <returns></returns>
public PerSheet OnceCompute(PerSheet sheet)
{
PerSheet compSheet = new PerSheet
var dataList = sheet.PerData.Select(t => (PerData)t);
int phead = 0;
//修改cell坐标,为新增合计预留位置
foreach (var header in sheet.PerHeader)
{
SheetName = "工作量绩效测算表",
ModuleName = "工作量绩效测算表",
PerHeader = new List<PerHeader>(),
PerData = new List<IPerData>()
};
return compSheet;
if (header.IsHasChildren)
{
header.PointCell = header.PointCell + phead;
header.MergeCell = header.MergeCell + 1;
header.Children.ForEach(item => item.PointCell = item.PointCell + phead);
phead = phead + 1;
}
}
Dictionary<string, PerHeader> perHead = new Dictionary<string, PerHeader>();
List<PerData> perDataList = new List<PerData>();
//插入合计结果
foreach (var header in sheet.PerHeader)
{
if (header.IsHasChildren)
{
var maxcell = header.Children.Max(t => t.PointCell);
var parentHead = new PerHeader(1, maxcell + 1, $" {header.CellValue}合计", 0, 1, 1, new List<PerHeader>(), 1);
perHead.Add(header.SignID, parentHead);
var typeClass = dataList.Where(t => header.Children.Select(s => s.CellValue).Contains(t.TypeName));
int pointcell = 0;
foreach (var group in typeClass.GroupBy(t => t.UnitType))
{
var ds = group.Where(t => t.CellValue.HasValue && t.CellValue.Value > 0)
.GroupBy(t => t.AccountingUnit).Select(t => new PerData
{
UnitType = group.Key,
AccountingUnit = t.Key,
CellValue = t.Sum(s => s.CellValue),
TypeName = group.Key,
RowNumber = t.FirstOrDefault()?.RowNumber ?? 0,
IsTotal = 1,
PointCell = maxcell + pointcell,
ComputRule = t.Select(s => s.ComputRule).Distinct().First(),
SignID = parentHead.SignID,
});
perDataList.AddRange(ds);
}
}
}
foreach (var item in perHead.Keys)
{
sheet.PerHeader.FirstOrDefault(t => t.SignID == item)?.Children.Add(perHead[item]);
}
sheet.PerData.AddRange(perDataList);
return sheet;
}
private string GetCleanSheetName(string sheetName)
#endregion
#region 工作量二次计算
/// <summary>
/// 工作量二次计算
/// </summary>
/// <param name="sheet"></param>
/// <returns></returns>
public (PerSheet Sheet, List<PerData> PerData) TwiceCompute(PerSheet sheet)
{
sheetName = sheetName
.Replace("医生组", "")
.Replace("护理组", "")
.Replace(".", "");
//获取最大列坐标位置
int thiscell = sheet.PerHeader.OrderByDescending(t => t.PointCell).FirstOrDefault().Children.Max(t => t.PointCell) + 1;
PerHeader perHead = new PerHeader(0, thiscell, "工作量绩效合计", 0, 2, 1, new List<PerHeader>(), 1);
sheetName = Regex.Replace(sheetName, @"\d", "");
var dataList = sheet.PerData.Select(t => (PerData)t);
return sheetName;
List<PerData> perDataList = new List<PerData>();
//插入合计结果
var groupList = dataList.Where(t => t.IsTotal == 1 && t.CellValue.HasValue && t.CellValue.Value > 0).GroupBy(t => new { t.UnitType, t.AccountingUnit });
foreach (var group in groupList)
{
var ds = group.Select(t => new PerData
{
UnitType = group.Key.UnitType,
AccountingUnit = group.Key.AccountingUnit,
CellValue = group.Sum(s => s.CellValue),
TypeName = group.Key.UnitType,
RowNumber = group.FirstOrDefault()?.RowNumber ?? 0,
IsTotal = 1,
PointCell = thiscell,
ComputRule = group.Select(s => s.ComputRule).Distinct().First(),
SignID = perHead.SignID,
});
perDataList.AddRange(ds);
}
sheet.PerHeader.Add(perHead);
sheet.PerData.AddRange(perDataList);
return (sheet, perDataList);
}
#endregion
}
}
......@@ -17,7 +17,7 @@ public class PerSheetDataReadWorkload : IPerSheetDataRead
{
HeaderFirstRowNum = 1,
HeaderLastRowNum = 2,
HeaderFirstCellNum = 1,
HeaderFirstCellNum = 0,
DataFirstRowNum = 4,
AccountingUnit = new List<AccountingUnit>
{
......
......@@ -5,6 +5,10 @@
</PropertyGroup>
<ItemGroup>
<Compile Remove="PerExcelService\SheetDataCompute\PerSheetDataComputeEconomicMerge.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CSRedisCore" Version="3.0.45" />
<PackageReference Include="DotNetCore.NPOI" Version="1.2.1" />
</ItemGroup>
......
......@@ -118,7 +118,7 @@ public SheetExportResponse SheetExport(int sheetID)
response.Header.Add(rowhead);
foreach (var header in headList.Where(t => !t.ParentID.HasValue || t.ParentID.Value == 0))
{
rowhead.Data.Add(new Cell(header.PointCell.Value, header.CellValue, header.MergeRow.Value, header.MergeCell.Value, false, false));
rowhead.Data.Add(new Cell(header.PointCell.Value, header.CellValue, header.MergeRow.Value, header.MergeCell.Value, header.IsTotal == 1, false));
}
if (headList.Any(t => t.ParentID.HasValue && t.ParentID.Value > 0))
{
......@@ -126,7 +126,7 @@ public SheetExportResponse SheetExport(int sheetID)
response.Header.Add(rowhead2);
foreach (var header in headList.Where(t => t.ParentID.HasValue && t.ParentID.Value > 0))
{
rowhead2.Data.Add(new Cell(header.PointCell.Value, header.CellValue, header.MergeRow.Value, header.MergeCell.Value, false, false));
rowhead2.Data.Add(new Cell(header.PointCell.Value, header.CellValue, header.MergeRow.Value, header.MergeCell.Value, header.IsTotal == 1, false));
}
}
List<im_header> headers = new List<im_header>();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment