deve sheet

parent 049c606c
...@@ -126,12 +126,12 @@ public ApiResponse Import([FromForm] IFormCollection form) ...@@ -126,12 +126,12 @@ public ApiResponse Import([FromForm] IFormCollection form)
byte[] bytes = new byte[stream.Length]; byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length); stream.Read(bytes, 0, bytes.Length);
if (!FileHelper.CreateFile(path, bytes)) if (!FileHelper.CreateFile(path, bytes))
return new ApiResponse(ResponseType.Fail, $"{file.FileName}失败"); return new ApiResponse(ResponseType.Fail, $"{file.FileName}失败");
allot.Path = path; allot.Path = path;
allot.States = 1; allot.States = 1;
allot.UploadDate = DateTime.Now; allot.UploadDate = DateTime.Now;
if (!_allotService.Update(allot)) if (!_allotService.Update(allot))
return new ApiResponse(ResponseType.Fail, $"{file.FileName}成功,修改状态失败"); return new ApiResponse(ResponseType.Fail, $"{file.FileName}成功,修改状态失败");
} }
return new ApiResponse(ResponseType.OK); return new ApiResponse(ResponseType.OK);
......
...@@ -35,6 +35,10 @@ public class PerData : IPerData ...@@ -35,6 +35,10 @@ public class PerData : IPerData
/// </summary> /// </summary>
public decimal? CellValue { get; set; } public decimal? CellValue { get; set; }
/// <summary> /// <summary>
/// 1 加 2 减 3 乘
/// </summary>
public Nullable<int> ComputRule { get; set; }
/// <summary>
/// 系数值 /// 系数值
/// </summary> /// </summary>
public decimal? FactorValue { get; set; } public decimal? FactorValue { get; set; }
...@@ -43,6 +47,10 @@ public class PerData : IPerData ...@@ -43,6 +47,10 @@ public class PerData : IPerData
/// </summary> /// </summary>
public bool IsFactor { get; set; } public bool IsFactor { get; set; }
/// <summary> /// <summary>
/// 1 汇总 2原始数据
/// </summary>
public Nullable<int> IsSum { get; set; }
/// <summary>
/// 行号 /// 行号
/// </summary> /// </summary>
public int RowNumber { get; set; } public int RowNumber { get; set; }
......
...@@ -56,6 +56,16 @@ public class im_data ...@@ -56,6 +56,16 @@ public class im_data
public Nullable<decimal> CellValue { get; set; } public Nullable<decimal> CellValue { get; set; }
/// <summary> /// <summary>
/// 1 加 2 减 3 乘
/// </summary>
public Nullable<int> ComputRule { get; set; }
/// <summary>
/// 1 汇总 2原始数据
/// </summary>
public Nullable<int> IsSum { get; set; }
/// <summary>
/// 是否带入系数计算 1 带入 2 不带入 /// 是否带入系数计算 1 带入 2 不带入
/// </summary> /// </summary>
public Nullable<int> IsFactor { get; set; } public Nullable<int> IsFactor { get; set; }
......
...@@ -174,6 +174,7 @@ private List<PerHeader> ReadHeadMatrix(ISheet sheet, PerSheetPoint point, List<L ...@@ -174,6 +174,7 @@ private List<PerHeader> ReadHeadMatrix(ISheet sheet, PerSheetPoint point, List<L
CellValue = sheet.GetRow(point.HeaderFirstRowNum.Value + r) CellValue = sheet.GetRow(point.HeaderFirstRowNum.Value + r)
?.GetCell(point.HeaderFirstCellNum.Value + c) ?.GetCell(point.HeaderFirstCellNum.Value + c)
?.ToString() ?.ToString()
?.Trim()
?.RemoveLineBreak() ?.RemoveLineBreak()
}; };
headerList.Add(header); headerList.Add(header);
......
...@@ -65,12 +65,17 @@ internal List<PerSheet> ProcessCompute(PerExcel excel) ...@@ -65,12 +65,17 @@ 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(excel); var economic = economicCompute.ProcessCompute(mergeResult);
perSheet.Add(economic); perSheet.Add(economic);
var workloadCompute = new PerSheetDataComputeWorkload(); var workloadCompute = new PerSheetDataComputeWorkload();
var workload = workloadCompute.ProcessCompute(excel); var workload = workloadCompute.ProcessCompute(excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.Workload));
perSheet.Add(workload); perSheet.Add(workload);
return perSheet; return perSheet;
......
...@@ -12,6 +12,6 @@ public interface IPerSheetDataCompute ...@@ -12,6 +12,6 @@ public interface IPerSheetDataCompute
/// </summary> /// </summary>
/// <param name="sheet"></param> /// <param name="sheet"></param>
/// <returns></returns> /// <returns></returns>
PerSheet ProcessCompute(PerExcel excel); PerSheet ProcessCompute(PerSheet excel);
} }
} }
...@@ -18,82 +18,71 @@ public class PerSheetDataComputeEconomic : IPerSheetDataCompute ...@@ -18,82 +18,71 @@ public class PerSheetDataComputeEconomic : IPerSheetDataCompute
/// </summary> /// </summary>
/// <param name="excel"></param> /// <param name="excel"></param>
/// <returns></returns> /// <returns></returns>
public PerSheet ProcessCompute(PerExcel excel) public PerSheet ProcessCompute(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 = "科室经济核算汇总表", if (header.IsHasChildren)
ModuleName = "科室经济核算汇总表", {
PerHeader = new List<PerHeader>(), header.PointCell = header.PointCell + phead;
PerData = new List<IPerData>() header.Children.ForEach(item => item.PointCell = item.PointCell + phead);
}; phead = phead + 2;
}
}
List<PerHeader> perHeadList = new List<PerHeader>();
List<PerData> perDataList = new List<PerData>(); List<PerData> perDataList = new List<PerData>();
//初始核算单元列头 //插入合计结果
compSheet.PerHeader.Add(new PerHeader { CellValue = "核算单元", Level = 0, MergeCell = 1, MergeRow = 2, PointCell = 0, PointRow = 0 }); foreach (var header in sheet.PerHeader)
//起始列
int pointCell = 1;
//计算需从以下sheet中拿取数据
SheetType[] types = { SheetType.Income, SheetType.OtherIncome, SheetType.Expend };
foreach (var type in types)
{ {
//取出当前sheet类型数据 if (header.IsHasChildren)
var sheetList = excel.PerSheet.Where(t => t.SheetType == type);
if (sheetList.Any())
{ {
List<PerHeader> headList = new List<PerHeader>(); var maxcell = header.Children.Max(t => t.PointCell);
//子集列号为父级列号 var parentHead = new PerHeader(0, maxcell + 1, $" {header.CellValue}合计", 0, 1, 2, new List<PerHeader>());
int childPointCell = pointCell; perHeadList.Add(parentHead);
foreach (var sheet in sheetList)
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 dataList = sheet.PerData.Select(t => (PerData)t); pointcell++;
foreach (var group in dataList.GroupBy(t => t.UnitType)) parentHead.Children.Add(new PerHeader(1, maxcell + pointcell, group.Key, 1, 1, 1, null));
foreach (var t in group.Where(t => t.CellValue.HasValue && t.CellValue.Value > 0).GroupBy(t => t.AccountingUnit))
{
var sd = new PerData
{ {
var typeName = $"{GetCleanSheetName(sheet.SheetName)}({ group.Key})"; UnitType = group.Key,
AccountingUnit = t.Key,
CellValue = t.Sum(s => s.CellValue),
TypeName = group.Key,
RowNumber = 0,
IsSum = 1,
PointCell = maxcell + pointcell,
ComputRule = t.Select(s => s.ComputRule).Distinct().First()
};
}
var ds = group.Where(t => t.CellValue.HasValue && t.CellValue.Value > 0) var ds = group.Where(t => t.CellValue.HasValue && t.CellValue.Value > 0)
.GroupBy(t => t.AccountingUnit).Select(t => new PerData .GroupBy(t => t.AccountingUnit).Select(t => new PerData
{ {
UnitType = group.Key, UnitType = group.Key,
AccountingUnit = t.Key, AccountingUnit = t.Key,
CellValue = t.Sum(s => s.IsFactor ? (s.CellValue * (s.FactorValue ?? 0)) : s.CellValue), CellValue = t.Sum(s => s.CellValue),
TypeName = typeName, TypeName = group.Key,
RowNumber = dataList.FirstOrDefault(s => s.AccountingUnit == t.Key && s.UnitType == group.Key)?.RowNumber ?? 0 RowNumber = 0,
IsSum = 1,
PointCell = maxcell + pointcell,
ComputRule = t.Select(s => s.ComputRule).Distinct().First()
}); });
perDataList.AddRange(ds); perDataList.AddRange(ds);
//创建子集头部信息
PerHeader childHeader = new PerHeader(1, childPointCell, typeName, 1, 1, 1, null);
headList.Add(childHeader);
childPointCell++;
}
} }
PerHeader header = new PerHeader(0, pointCell, EnumHelper.GetDescription(type), 1, 1, headList.Count, headList);
compSheet.PerHeader.Add(header);
//父级列号为当前列号+子集个数
pointCell = pointCell + headList.Count;
} }
} }
int number = 0; sheet.PerHeader.AddRange(perHeadList);
foreach (var accountingUnit in perDataList.OrderBy(t => t.RowNumber).Select(t => t.AccountingUnit).Distinct()) sheet.PerData.AddRange(perDataList);
{ return sheet;
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
.Replace("医生组", "")
.Replace("护理组", "")
.Replace(".", "");
sheetName = Regex.Replace(sheetName, @"\d", "");
return sheetName;
} }
} }
} }
using Performance.DtoModels;
using Performance.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace Performance.Services
{
/// <summary>
/// 合并科室经济
/// </summary>
public class PerSheetDataComputeMerge
{
/// <summary>
/// 计算科室经济核算汇总表
/// </summary>
/// <param name="excel"></param>
/// <returns></returns>
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})";
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.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);
//创建子集头部信息
PerHeader childHeader = new PerHeader(1, childPointCell, typeName, 1, 1, 1, null);
headList.Add(childHeader);
childPointCell++;
}
}
PerHeader header = new PerHeader(0, pointCell, EnumHelper.GetDescription(type), 1, 1, headList.Count, headList);
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
.Replace("医生组", "")
.Replace("护理组", "")
.Replace(".", "");
sheetName = Regex.Replace(sheetName, @"\d", "");
return sheetName;
}
}
}
...@@ -13,7 +13,7 @@ namespace Performance.Services ...@@ -13,7 +13,7 @@ namespace Performance.Services
/// </summary> /// </summary>
public class PerSheetDataComputeWorkload : IPerSheetDataCompute public class PerSheetDataComputeWorkload : IPerSheetDataCompute
{ {
public PerSheet ProcessCompute(PerExcel excel) public PerSheet ProcessCompute(PerSheet excel)
{ {
PerSheet compSheet = new PerSheet PerSheet compSheet = new PerSheet
{ {
...@@ -23,49 +23,6 @@ public PerSheet ProcessCompute(PerExcel excel) ...@@ -23,49 +23,6 @@ public PerSheet ProcessCompute(PerExcel excel)
PerData = new List<IPerData>() PerData = new List<IPerData>()
}; };
//初始核算单元列头
compSheet.PerHeader.Add(new PerHeader { CellValue = "核算单元", Level = 0, MergeCell = 1, MergeRow = 2, PointCell = 0, PointRow = 0 });
//起始列
int pointCell = 1;
//计算需从以下sheet中拿取数据
SheetType[] types = { SheetType.Workload };
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})";
var ds = group.GroupBy(t => t.AccountingUnit).Select(t => new PerData
{
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
});
compSheet.PerData.AddRange(ds);
//创建子集头部信息
PerHeader childHeader = new PerHeader(1, childPointCell, typeName, 1, 1, 1, null);
headList.Add(childHeader);
childPointCell++;
}
}
PerHeader header = new PerHeader(0, pointCell, EnumHelper.GetDescription(type), 1, 1, headList.Count, headList);
compSheet.PerHeader.Add(header);
//父级列号为当前列号+子集个数
pointCell = pointCell + headList.Count;
}
}
return compSheet; return compSheet;
} }
private string GetCleanSheetName(string sheetName) private string GetCleanSheetName(string sheetName)
......
...@@ -109,7 +109,7 @@ public SheetExportResponse SheetExport(int sheetID) ...@@ -109,7 +109,7 @@ public SheetExportResponse SheetExport(int sheetID)
} }
else else
{ {
var headList = _perforImHeaderRepository.GetEntities(t => t.SheetID == sheetID); var headList = _perforImHeaderRepository.GetEntities(t => t.SheetID == sheetID).OrderBy(t => t.PointCell);
var dataList = _perforImDataRepository.GetEntities(t => t.SheetID == sheetID); var dataList = _perforImDataRepository.GetEntities(t => t.SheetID == sheetID);
......
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