Commit ae146fc4 by ruyun.zhang@suvalue.com

Merge branch 'feature/baodi' into develop

parents e4e7326c 960cfb78
......@@ -473,6 +473,41 @@
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.GuaranteeController.Guarantee(Performance.DtoModels.GuaranteeRequest)">
<summary>
保底绩效配置列表
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.GuaranteeController.GuarantInsert(Performance.DtoModels.GuaranteeRequest)">
<summary>
新增保底绩效配置
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.GuaranteeController.GuarantUpdate(Performance.DtoModels.GuaranteeRequest)">
<summary>
修改保底绩效配置
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.GuaranteeController.GuarantDelete(Performance.DtoModels.GuaranteeRequest)">
<summary>
删除保底绩效配置
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.GuaranteeController.Accounting(Performance.DtoModels.GuaranteeRequest)">
<summary>
医院核算单元
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.HospitalController.GetHospitalList">
<summary>
获取当前登录用户管辖医院列表
......
......@@ -1243,6 +1243,24 @@
邮箱
</summary>
</member>
<member name="P:Performance.DtoModels.GuaranteeRequest.Id">
<summary> </summary>
</member>
<member name="P:Performance.DtoModels.GuaranteeRequest.AllotId">
<summary> </summary>
</member>
<member name="P:Performance.DtoModels.GuaranteeRequest.Priority">
<summary> 优先级 </summary>
</member>
<member name="P:Performance.DtoModels.GuaranteeRequest.UnitType">
<summary> 核算单元类型 1 医生组 2 护理组 3 医技组 </summary>
</member>
<member name="P:Performance.DtoModels.GuaranteeRequest.Target">
<summary> 保底科室 </summary>
</member>
<member name="P:Performance.DtoModels.GuaranteeRequest.Source">
<summary> 保底来源科室 </summary>
</member>
<member name="T:Performance.DtoModels.HospitalRequest">
<summary>
登录请求
......@@ -1622,6 +1640,36 @@
实发绩效
</summary>
</member>
<member name="P:Performance.DtoModels.DeptDataDetails.Pandect">
<summary> 概览</summary>
</member>
<member name="P:Performance.DtoModels.DeptDataDetails.Detail">
<summary> 收入明细 </summary>
</member>
<member name="P:Performance.DtoModels.DetailDtos.ItemName">
<summary> 收入项名称 </summary>
</member>
<member name="P:Performance.DtoModels.DetailDtos.IncomeType">
<summary> 1、收入 2、支出 3、工作量 </summary>
</member>
<member name="P:Performance.DtoModels.DetailDtos.Amount">
<summary> 金额 </summary>
</member>
<member name="P:Performance.DtoModels.DetailDtos.Items">
<summary> 详情 </summary>
</member>
<member name="P:Performance.DtoModels.DetailModule.ItemName">
<summary> 明细项 </summary>
</member>
<member name="P:Performance.DtoModels.DetailModule.CellValue">
<summary> 原始值 </summary>
</member>
<member name="P:Performance.DtoModels.DetailModule.Factor">
<summary> 系数 </summary>
</member>
<member name="P:Performance.DtoModels.DetailModule.ItemValue">
<summary> 结算值 </summary>
</member>
<member name="P:Performance.DtoModels.DeptResponse.ID">
<summary>
......
......@@ -46,6 +46,9 @@
<member name="P:Performance.EntityModels.PerformanceDbContext.cof_drugtype">
<summary> 药占比费用列头名称 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.cof_guarantee">
<summary> 保底科室配置 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.cof_income">
<summary> ICU医生护士有效收入汇总计算系数 </summary>
</member>
......@@ -722,6 +725,41 @@
费用名称
</summary>
</member>
<member name="T:Performance.EntityModels.cof_guarantee">
<summary>
保底科室配置
</summary>
</member>
<member name="P:Performance.EntityModels.cof_guarantee.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.cof_guarantee.AllotId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.cof_guarantee.Priority">
<summary>
优先级
</summary>
</member>
<member name="P:Performance.EntityModels.cof_guarantee.UnitType">
<summary>
核算单元类型 1 医生组 2 护理组 3 医技组
</summary>
</member>
<member name="P:Performance.EntityModels.cof_guarantee.Target">
<summary>
保底科室
</summary>
</member>
<member name="P:Performance.EntityModels.cof_guarantee.Source">
<summary>
保底来源科室
</summary>
</member>
<member name="T:Performance.EntityModels.cof_income">
<summary>
ICU医生护士有效收入汇总计算系数
......
......@@ -142,6 +142,8 @@ public enum MinimumType
保底护士 = 3,
[Description("保底绩效行政工勤人均绩效")]
保底工勤 = 4,
[Description("自定义保底绩效")]
自定义保底 = 5,
}
///// <summary>
......
......@@ -27,6 +27,8 @@ public class ProcessComputService : IAutoInjection
private PerforCofdrugtypeRepository perforCofdrugtypeRepository;
private PerforCofworkitemRepository perforCofworkitemRepository;
private readonly LogManageService logManageService;
private readonly GuaranteeService guaranteeService;
public ProcessComputService(PerforCofincomeRepository perforCofincomeRepository,
PerforCofdrugpropRepository perforCofdrugpropRepository,
PerforPersheetRepository perforPerSheetRepository,
......@@ -37,7 +39,8 @@ public class ProcessComputService : IAutoInjection
PerforResbaiscnormRepository perforResbaiscnormRepository,
PerforCofdrugtypeRepository perforCofdrugtypeRepository,
PerforCofworkitemRepository perforCofworkitemRepository,
LogManageService logManageService)
LogManageService logManageService,
GuaranteeService guaranteeService)
{
this.perforCofincomeRepository = perforCofincomeRepository;
this.perforCofdrugpropRepository = perforCofdrugpropRepository;
......@@ -50,6 +53,7 @@ public class ProcessComputService : IAutoInjection
this.perforCofdrugtypeRepository = perforCofdrugtypeRepository;
this.perforCofworkitemRepository = perforCofworkitemRepository;
this.logManageService = logManageService;
this.guaranteeService = guaranteeService;
}
///// <summary>
......@@ -232,6 +236,7 @@ public void Save(List<PerSheet> perSheets, int allotId)
return (perSheet, mergeSheets);
}
/// <summary>
/// 计算科室绩效
/// </summary>
......@@ -279,9 +284,16 @@ public List<PerSheet> Compute(PerExcel excel, List<PerSheet> perSheet, List<res_
workDoctor = info.Data.FirstOrDefault(t => t.AccountingUnit == dept.Department && t.UnitType == UnitType.医生组.ToString());
}
//保底绩效
var minimum = baiscnormList.FirstOrDefault(t => t.PositionName == dept.MinimumReference);
if (!string.IsNullOrEmpty(dept.MinimumReference) && minimum != null)
dept.MinimumFee = minimum.AvgValue * (dept.MinimumFactor ?? 0) * (dept.ManagerNumber + dept.Number);
if (!string.IsNullOrEmpty(dept.MinimumReference))
{
string minimumReference = dept.MinimumReference;
if (dept.MinimumReference == EnumHelper.GetDescription(MinimumType.自定义保底))
minimumReference = GetCustomMinimumName(dept.Department);
var minimum = baiscnormList.FirstOrDefault(t => t.PositionName == minimumReference);
if (minimum != null)
dept.MinimumFee = minimum.AvgValue * (dept.MinimumFactor ?? 0) * (dept.ManagerNumber + dept.Number);
}
dept.ScoringAverage = dept.ScoringAverage == 0m ? 1 : dept.ScoringAverage;
dept.AdjustFactor = dept.AdjustFactor == 0m ? 1 : dept.AdjustFactor;
......@@ -397,6 +409,89 @@ public List<res_baiscnorm> ComputeMinimum(PerExcel excel, List<PerSheet> perShee
}
/// <summary>
/// 计算科室自定义保底绩效范围(根据配置的科室范围计算人均绩效)
/// </summary>
/// <param name="excel"></param>
/// <param name="perSheet"></param>
/// <param name="baiscnormList"></param>
/// <param name="allotId"></param>
public void ComputeCustomMinimum(PerExcel excel, List<PerSheet> perSheet, List<res_baiscnorm> baiscnormList, int allotId)
{
var guaranteeList = guaranteeService.Guarantee(allotId);
if (guaranteeList == null || !guaranteeList.Any())
return;
var guaranteeGroupList = guaranteeList
.Where(t => !string.IsNullOrEmpty(t.Target) && !string.IsNullOrEmpty(t.Source))
.GroupBy(t => new { t.UnitType, t.Target })
.Select(t => new { t.Key.UnitType, t.Key.Target, Priority = t.Min(m => m.Priority), Items = t.Select(m => m.Source) });
var deptAccounting = excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.AccountBasic);
var accountList = deptAccounting.PerData.Select(t => (PerDataAccountBaisc)t);
var economicData = perSheet.FirstOrDefault(t => t.SheetType == SheetType.ComputeEconomic)?.PerData.Select(t => (PerData)t);
var doctorWorkloadData = perSheet.FirstOrDefault(t => t.SheetType == SheetType.ComputeDoctorWorkload)?.PerData.Select(t => (PerData)t);
var nurseWorkloadData = perSheet.FirstOrDefault(t => t.SheetType == SheetType.ComputeNurseWorkload)?.PerData.Select(t => (PerData)t);
var basicRuleList = new[]
{
new { Data = doctorWorkloadData, UnitType = UnitType.医生组 },
new { Data = doctorWorkloadData, UnitType = UnitType.医技组 },
new { Data = nurseWorkloadData, UnitType = UnitType.护理组 },
};
List<res_baiscnorm> newBaiscnormList = new List<res_baiscnorm>();
foreach (var guaranteeGroup in guaranteeGroupList)
{
var unitType = (UnitType)guaranteeGroup.UnitType;
var dataList = accountList.Where(t => t.UnitType == unitType.ToString() && guaranteeGroup.Items.Contains(t.Department));
var count = dataList.Sum(t => t.ManagerNumber + t.Number);
decimal totalValue = 0m;
foreach (var dept in dataList)
{
var econDoctor = economicData.FirstOrDefault(t => t.UnitType == unitType.ToString() && t.AccountingUnit == dept.Department);
var workdata = basicRuleList.FirstOrDefault(t => t.UnitType == unitType)?.Data;
var workload = workdata == null ? null : workdata.FirstOrDefault(t => t.UnitType == unitType.ToString() && t.AccountingUnit == dept.Department);
//保底绩效
var minimum = baiscnormList.FirstOrDefault(t => t.PositionName == dept.MinimumReference);
if (!string.IsNullOrEmpty(dept.MinimumReference) && minimum != null)
dept.MinimumFee = minimum.AvgValue * (dept.MinimumFactor ?? 0) * (dept.ManagerNumber + dept.Number);
dept.ScoringAverage = dept.ScoringAverage == 0m ? 1 : dept.ScoringAverage;
dept.AdjustFactor = dept.AdjustFactor == 0m ? 1 : dept.AdjustFactor;
dept.Income = econDoctor?.CellValue ?? 0;
dept.WorkloadFee = workload?.CellValue ?? 0;
dept.PerforFee = dept.Income * (dept.BasicFactor + dept.SlopeFactor);
dept.PerforTotal = dept.PerforFee + dept.WorkloadFee + dept.OtherPerfor1 + (dept.MinimumFee ?? 0);
dept.RealGiveFee = (dept.PerforTotal * dept.ScoringAverage + dept.Extra + dept.OtherPerfor2) * dept.AdjustFactor;
dept.Avg = dept.ManagerNumber + dept.Number == 0 ? 0 : dept.PerforTotal / (dept.ManagerNumber + dept.Number);
totalValue += (dept.RealGiveFee ?? 0);
}
var baiscnorm = new res_baiscnorm
{
AllotID = allotId,
PositionName = GetCustomMinimumName(guaranteeGroup.Target),
TotelNumber = count,
TotelValue = totalValue,
AvgValue = count == 0 ? 0 : totalValue / count
};
baiscnormList.Add(baiscnorm);
}
}
/// <summary>
/// 生成自定义保底名称
/// </summary>
/// <param name="department"></param>
/// <returns></returns>
private string GetCustomMinimumName(string department)
{
return $"{EnumHelper.GetDescription(MinimumType.自定义保底)}({department})";
}
/// <summary>
/// 获取药占比分割比例
/// </summary>
/// <param name="excel"></param>
......
......@@ -256,6 +256,10 @@ public void Generate(per_allot allot, string mail)
logManageService.WriteMsg("计算保底绩效参考标准值", "计算科室业绩", 1, allot.ID, "ReceiveMessage", true);
var sheet = processComputService.Compute(excel, mergeSheets, minimumBaiscnorm);
//计算科室自定义保底绩效范围
logManageService.WriteMsg("计算保底绩效参考标准值", "正在计算科室自定义保底绩效范围", 1, allot.ID, "ReceiveMessage", true);
processComputService.ComputeCustomMinimum(excel, mergeSheets, minimumBaiscnorm, allot.ID);
//计算各人群人均保底绩效
logManageService.WriteMsg("计算保底绩效参考标准值", "正在生成保底绩效行政工勤人均绩效", 1, allot.ID, "ReceiveMessage", true);
var minimumBaiscnorm2 = resultComputeService.Compute(allot, excel, sheet, false);
......
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