deve sheet

parent 049c606c
......@@ -126,12 +126,12 @@ public ApiResponse Import([FromForm] IFormCollection form)
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
if (!FileHelper.CreateFile(path, bytes))
return new ApiResponse(ResponseType.Fail, $"{file.FileName}失败");
return new ApiResponse(ResponseType.Fail, $"{file.FileName}失败");
allot.Path = path;
allot.States = 1;
allot.UploadDate = DateTime.Now;
if (!_allotService.Update(allot))
return new ApiResponse(ResponseType.Fail, $"{file.FileName}成功,修改状态失败");
return new ApiResponse(ResponseType.Fail, $"{file.FileName}成功,修改状态失败");
}
return new ApiResponse(ResponseType.OK);
......
......@@ -35,6 +35,10 @@ public class PerData : IPerData
/// </summary>
public decimal? CellValue { get; set; }
/// <summary>
/// 1 加 2 减 3 乘
/// </summary>
public Nullable<int> ComputRule { get; set; }
/// <summary>
/// 系数值
/// </summary>
public decimal? FactorValue { get; set; }
......@@ -43,6 +47,10 @@ public class PerData : IPerData
/// </summary>
public bool IsFactor { get; set; }
/// <summary>
/// 1 汇总 2原始数据
/// </summary>
public Nullable<int> IsSum { get; set; }
/// <summary>
/// 行号
/// </summary>
public int RowNumber { get; set; }
......
......@@ -7,7 +7,7 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Performance.EntityModels
namespace Performance.EntityModels
{
/// <summary>
/// im_data Entity Model
......@@ -18,58 +18,68 @@ public class im_data
///
/// </summary>
[Key]
public int ID { get; set; }
public int ID { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> SheetID { get; set; }
/// <summary>
/// 核算单元类别 1 医生组 2护理组
/// </summary>
public Nullable<int> UnitType { get; set; }
/// <summary>
/// 行号
/// </summary>
public Nullable<int> RowNumber { get; set; }
/// <summary>
/// 核算单元名称
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室名称
/// </summary>
public string Department { get; set; }
/// <summary>
/// 列头类型名称
/// </summary>
public string TypeName { get; set; }
/// <summary>
/// 单元格value
/// </summary>
public Nullable<decimal> CellValue { get; set; }
/// <summary>
/// 1 加 2 减 3 乘
/// </summary>
public Nullable<int> ComputRule { get; set; }
/// <summary>
/// 1 汇总 2原始数据
/// </summary>
public Nullable<int> IsSum { get; set; }
/// <summary>
/// 是否带入系数计算 1 带入 2 不带入
/// </summary>
public Nullable<int> IsFactor { get; set; }
/// <summary>
/// 系数值
/// </summary>
public Nullable<decimal> FactorValue { get; set; }
/// <summary>
/// 单元格注释
/// </summary>
public string Annotation { get; set; }
/// <summary>
/// 单元格备注
/// </summary>
......
......@@ -174,6 +174,7 @@ private List<PerHeader> ReadHeadMatrix(ISheet sheet, PerSheetPoint point, List<L
CellValue = sheet.GetRow(point.HeaderFirstRowNum.Value + r)
?.GetCell(point.HeaderFirstCellNum.Value + c)
?.ToString()
?.Trim()
?.RemoveLineBreak()
};
headerList.Add(header);
......
......@@ -51,7 +51,7 @@ public SheetType GetSheetType(string sheetName)
if (sheetName.StartsWith("1.0"))
return SheetType.OtherIncome;
//else if (sheetName.StartsWith("1.1"))
//return SheetType.Income;
//return SheetType.Income;
else if (sheetName.StartsWith("2."))
return SheetType.Expend;
else if (sheetName.StartsWith("3."))
......@@ -65,12 +65,17 @@ 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(excel);
var economic = economicCompute.ProcessCompute(mergeResult);
perSheet.Add(economic);
var workloadCompute = new PerSheetDataComputeWorkload();
var workload = workloadCompute.ProcessCompute(excel);
var workload = workloadCompute.ProcessCompute(excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.Workload));
perSheet.Add(workload);
return perSheet;
......
......@@ -12,6 +12,6 @@ public interface IPerSheetDataCompute
/// </summary>
/// <param name="sheet"></param>
/// <returns></returns>
PerSheet ProcessCompute(PerExcel excel);
PerSheet ProcessCompute(PerSheet excel);
}
}
......@@ -18,82 +18,71 @@ public class PerSheetDataComputeEconomic : IPerSheetDataCompute
/// </summary>
/// <param name="excel"></param>
/// <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 = "科室经济核算汇总表",
ModuleName = "科室经济核算汇总表",
PerHeader = new List<PerHeader>(),
PerData = new List<IPerData>()
};
if (header.IsHasChildren)
{
header.PointCell = header.PointCell + phead;
header.Children.ForEach(item => item.PointCell = item.PointCell + phead);
phead = phead + 2;
}
}
List<PerHeader> perHeadList = new List<PerHeader>();
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)
//插入合计结果
foreach (var header in sheet.PerHeader)
{
//取出当前sheet类型数据
var sheetList = excel.PerSheet.Where(t => t.SheetType == type);
if (sheetList.Any())
if (header.IsHasChildren)
{
List<PerHeader> headList = new List<PerHeader>();
//子集列号为父级列号
int childPointCell = pointCell;
foreach (var sheet in sheetList)
var maxcell = header.Children.Max(t => t.PointCell);
var parentHead = new PerHeader(0, maxcell + 1, $" {header.CellValue}合计", 0, 1, 2, new List<PerHeader>());
perHeadList.Add(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 dataList = sheet.PerData.Select(t => (PerData)t);
foreach (var group in dataList.GroupBy(t => t.UnitType))
pointcell++;
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 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
});
perDataList.AddRange(ds);
//创建子集头部信息
PerHeader childHeader = new PerHeader(1, childPointCell, typeName, 1, 1, 1, null);
headList.Add(childHeader);
childPointCell++;
var sd = new PerData
{
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)
.GroupBy(t => t.AccountingUnit).Select(t => new PerData
{
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()
});
perDataList.AddRange(ds);
}
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;
sheet.PerHeader.AddRange(perHeadList);
sheet.PerData.AddRange(perDataList);
return sheet;
}
}
}
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
/// </summary>
public class PerSheetDataComputeWorkload : IPerSheetDataCompute
{
public PerSheet ProcessCompute(PerExcel excel)
public PerSheet ProcessCompute(PerSheet excel)
{
PerSheet compSheet = new PerSheet
{
......@@ -22,50 +22,7 @@ public PerSheet ProcessCompute(PerExcel excel)
PerHeader = new List<PerHeader>(),
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;
}
private string GetCleanSheetName(string sheetName)
......
......@@ -109,7 +109,7 @@ public SheetExportResponse SheetExport(int sheetID)
}
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);
......
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