二次计算完成

parent 0402ea16
...@@ -68,6 +68,8 @@ public AutoMapperConfigs() ...@@ -68,6 +68,8 @@ public AutoMapperConfigs()
CreateMap<PerData, im_data>() CreateMap<PerData, im_data>()
.ForMember(dest => dest.IsFactor, opt => opt.MapFrom(src => src.IsFactor ? 1 : 2)) .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))); .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 ...@@ -21,17 +21,20 @@ public class PerExcelService : IAutoInjection
private PerforImSheetRepository _perforImSheetRepository; private PerforImSheetRepository _perforImSheetRepository;
private PerforImDataRepository _perforImDataRepository; private PerforImDataRepository _perforImDataRepository;
private PerforImHeaderRepository _perforImHeaderRepository; private PerforImHeaderRepository _perforImHeaderRepository;
private PerforImEmployeeRepository _perforImEmployeeRepository;
public PerExcelService(PerSheetService perSheetService, public PerExcelService(PerSheetService perSheetService,
PerHeaderService perHeaderService, PerHeaderService perHeaderService,
PerforImSheetRepository perforImSheetRepository, PerforImSheetRepository perforImSheetRepository,
PerforImDataRepository perforImDataRepository, PerforImDataRepository perforImDataRepository,
PerforImHeaderRepository perforImHeaderRepository) PerforImHeaderRepository perforImHeaderRepository,
PerforImEmployeeRepository perforImEmployeeRepository)
{ {
_perSheetService = perSheetService; _perSheetService = perSheetService;
_perHeaderService = perHeaderService; _perHeaderService = perHeaderService;
_perforImSheetRepository = perforImSheetRepository; _perforImSheetRepository = perforImSheetRepository;
_perforImDataRepository = perforImDataRepository; _perforImDataRepository = perforImDataRepository;
_perforImHeaderRepository = perforImHeaderRepository; _perforImHeaderRepository = perforImHeaderRepository;
_perforImEmployeeRepository = perforImEmployeeRepository;
} }
/// <summary> /// <summary>
...@@ -95,6 +98,17 @@ public void Save(List<PerSheet> perSheets, int allotId, int source) ...@@ -95,6 +98,17 @@ public void Save(List<PerSheet> perSheets, int allotId, int source)
{ {
foreach (var sheet in perSheets) foreach (var sheet in perSheets)
{ {
if (sheet.SheetType == SheetType.Employee)
{
var dataList = sheet.PerData.Select(t => (PerDataEmployee)t);
foreach (var data in dataList)
{
var imdata = Mapper.Map<im_employee>(data);
_perforImEmployeeRepository.Add(imdata);
}
}
else
{
var imsheet = new im_sheet { AllotID = allotId, SheetName = sheet.SheetName, Source = source, SheetType = (int)sheet.SheetType }; var imsheet = new im_sheet { AllotID = allotId, SheetName = sheet.SheetName, Source = source, SheetType = (int)sheet.SheetType };
_perforImSheetRepository.Add(imsheet); _perforImSheetRepository.Add(imsheet);
...@@ -122,6 +136,7 @@ public void Save(List<PerSheet> perSheets, int allotId, int source) ...@@ -122,6 +136,7 @@ public void Save(List<PerSheet> perSheets, int allotId, int source)
_perforImDataRepository.Add(imdata); _perforImDataRepository.Add(imdata);
} }
} }
}
//throw new NotImplementedException(); //throw new NotImplementedException();
} }
......
...@@ -44,33 +44,5 @@ public static IPerSheetDataRead GetDataRead(SheetType sheetType) ...@@ -44,33 +44,5 @@ public static IPerSheetDataRead GetDataRead(SheetType sheetType)
} }
return dataread; 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) ...@@ -47,10 +47,9 @@ public PerSheet Sheet(ISheet sheet)
/// <returns></returns> /// <returns></returns>
public SheetType GetSheetType(string sheetName) public SheetType GetSheetType(string sheetName)
{ {
//if (sheetName.StartsWith("医院人员名单")) if (sheetName.StartsWith("医院人员名单"))
// return SheetType.Employee; return SheetType.Employee;
//else else if (sheetName.StartsWith("1.0"))
if (sheetName.StartsWith("1.0"))
return SheetType.OtherIncome; return SheetType.OtherIncome;
else if (sheetName.StartsWith("1.1")) else if (sheetName.StartsWith("1.1"))
return SheetType.Income; return SheetType.Income;
...@@ -68,17 +67,33 @@ internal List<PerSheet> ProcessCompute(PerExcel excel) ...@@ -68,17 +67,33 @@ internal List<PerSheet> ProcessCompute(PerExcel excel)
List<PerSheet> perSheet = new List<PerSheet>(); List<PerSheet> perSheet = new List<PerSheet>();
//合并科室收入、支出 //合并科室收入、支出
var merge = new PerSheetDataComputeMerge();
var mergeResult = merge.MergeCompute(excel);
var economicCompute = new PerSheetDataComputeEconomic(); var economicCompute = new PerSheetDataComputeEconomic();
var economic = economicCompute.ProcessCompute(mergeResult); var mergeResult = economicCompute.MergeCompute(excel);
perSheet.Add(economic); //一次计算
var onceEconomic = economicCompute.OnceCompute(mergeResult);
//二次计算
var twiceEconomicResult = economicCompute.TwiceCompute(onceEconomic);
perSheet.Add(twiceEconomicResult.Sheet);
//工作量
var workloadCompute = new PerSheetDataComputeWorkload(); var workloadCompute = new PerSheetDataComputeWorkload();
var workload = workloadCompute.ProcessCompute(excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.Workload)); var workload1 = excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.Workload && t.SheetName.Contains("医生组"));
perSheet.Add(workload); 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; 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 ...@@ -11,14 +11,105 @@ namespace Performance.Services
/// <summary> /// <summary>
/// 科室经济核算汇总表 (收入/其他收入/支出) /// 科室经济核算汇总表 (收入/其他收入/支出)
/// </summary> /// </summary>
public class PerSheetDataComputeEconomic : IPerSheetDataCompute public class PerSheetDataComputeEconomic
{ {
#region 合并科室经济
/// <summary> /// <summary>
/// 计算科室经济核算汇总表 /// 计算科室经济核算汇总表
/// </summary> /// </summary>
/// <param name="excel"></param> /// <param name="excel"></param>
/// <returns></returns> /// <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); var dataList = sheet.PerData.Select(t => (PerData)t);
int phead = 0; int phead = 0;
...@@ -72,5 +163,48 @@ public PerSheet ProcessCompute(PerSheet sheet) ...@@ -72,5 +163,48 @@ public PerSheet ProcessCompute(PerSheet sheet)
sheet.PerData.AddRange(perDataList); sheet.PerData.AddRange(perDataList);
return sheet; 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 ...@@ -11,7 +11,7 @@ namespace Performance.Services
/// <summary> /// <summary>
/// 合并科室经济 /// 合并科室经济
/// </summary> /// </summary>
public class PerSheetDataComputeMerge public class PerSheetDataComputeEconomicMerge
{ {
/// <summary> /// <summary>
/// 计算科室经济核算汇总表 /// 计算科室经济核算汇总表
......
...@@ -11,30 +11,110 @@ namespace Performance.Services ...@@ -11,30 +11,110 @@ namespace Performance.Services
/// <summary> /// <summary>
/// 工作量 /// 工作量
/// </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)
{
var dataList = sheet.PerData.Select(t => (PerData)t);
int phead = 0;
//修改cell坐标,为新增合计预留位置
foreach (var header in sheet.PerHeader)
{
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)
{ {
PerSheet compSheet = new PerSheet if (header.IsHasChildren)
{ {
SheetName = "工作量绩效测算表", var maxcell = header.Children.Max(t => t.PointCell);
ModuleName = "工作量绩效测算表", var parentHead = new PerHeader(1, maxcell + 1, $" {header.CellValue}合计", 0, 1, 1, new List<PerHeader>(), 1);
PerHeader = new List<PerHeader>(), perHead.Add(header.SignID, parentHead);
PerData = new List<IPerData>()
};
return compSheet; 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);
}
}
} }
private string GetCleanSheetName(string sheetName) foreach (var item in perHead.Keys)
{ {
sheetName = sheetName sheet.PerHeader.FirstOrDefault(t => t.SignID == item)?.Children.Add(perHead[item]);
.Replace("医生组", "") }
.Replace("护理组", "") sheet.PerData.AddRange(perDataList);
.Replace(".", "");
return sheet;
}
#endregion
sheetName = Regex.Replace(sheetName, @"\d", "");
return sheetName; #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, 2, 1, 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 => 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 ...@@ -17,7 +17,7 @@ public class PerSheetDataReadWorkload : IPerSheetDataRead
{ {
HeaderFirstRowNum = 1, HeaderFirstRowNum = 1,
HeaderLastRowNum = 2, HeaderLastRowNum = 2,
HeaderFirstCellNum = 1, HeaderFirstCellNum = 0,
DataFirstRowNum = 4, DataFirstRowNum = 4,
AccountingUnit = new List<AccountingUnit> AccountingUnit = new List<AccountingUnit>
{ {
......
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Remove="PerExcelService\SheetDataCompute\PerSheetDataComputeEconomicMerge.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CSRedisCore" Version="3.0.45" /> <PackageReference Include="CSRedisCore" Version="3.0.45" />
<PackageReference Include="DotNetCore.NPOI" Version="1.2.1" /> <PackageReference Include="DotNetCore.NPOI" Version="1.2.1" />
</ItemGroup> </ItemGroup>
......
...@@ -118,7 +118,7 @@ public SheetExportResponse SheetExport(int sheetID) ...@@ -118,7 +118,7 @@ public SheetExportResponse SheetExport(int sheetID)
response.Header.Add(rowhead); response.Header.Add(rowhead);
foreach (var header in headList.Where(t => !t.ParentID.HasValue || t.ParentID.Value == 0)) 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)) if (headList.Any(t => t.ParentID.HasValue && t.ParentID.Value > 0))
{ {
...@@ -126,7 +126,7 @@ public SheetExportResponse SheetExport(int sheetID) ...@@ -126,7 +126,7 @@ public SheetExportResponse SheetExport(int sheetID)
response.Header.Add(rowhead2); response.Header.Add(rowhead2);
foreach (var header in headList.Where(t => t.ParentID.HasValue && t.ParentID.Value > 0)) 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>(); 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