二次分配审核后查看详情

parent 4f7b6d4a
...@@ -797,6 +797,35 @@ public ApiResponse RedistributionEmployee([FromBody] SecondEmployeeDto request) ...@@ -797,6 +797,35 @@ public ApiResponse RedistributionEmployee([FromBody] SecondEmployeeDto request)
var employees = _redistributionService.RedistributionEmployee(request); var employees = _redistributionService.RedistributionEmployee(request);
return new ApiResponse(ResponseType.OK, employees); return new ApiResponse(ResponseType.OK, employees);
} }
/// <summary>
/// 二次分配审核后查看详情
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("api/second/redistribution/detail")]
[HttpPost]
public ApiResponse RedistributionDetail([FromBody] SecondBaseDto request)
{
if (!Enum.IsDefined(typeof(ComputeMode), request.ComputeMode))
throw new PerformanceException("暂不支持当前计算方式!");
var second = secondAllotService.GetSecondAllot(request.SecondId);
if (second == null) throw new PerformanceException("参数SecondId无效!");
var allot = _allotService.GetAllot(second.AllotId.Value);
if (allot == null)
throw new PerformanceException("绩效记录不存在!");
// 年资职称绩效占比与工作量绩效占比 校验
var loads = _redistributionService.GetWorkLoads(allot.HospitalId, second.UnitType, second.Department);
var workloadGroups = _redistributionService.GetTopWorkloadBodyGroups(loads);
// 返回信息
var (head, rows) = _redistributionService.RedistributionDetail((ComputeMode)request.ComputeMode, allot, second);
var dic = _redistributionService.GetTableHeaderDictionary((ComputeMode)request.ComputeMode, second, loads, workloadGroups);
return new ApiResponse(ResponseType.OK, new { Head = head, Body = rows, Dic = dic });
}
#endregion #endregion
} }
} }
...@@ -1654,6 +1654,13 @@ ...@@ -1654,6 +1654,13 @@
<param name="request"></param> <param name="request"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionDetail(Performance.DtoModels.SecondBaseDto)">
<summary>
二次分配审核后查看详情
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SheetController.SheetList(Performance.DtoModels.SheetRequest)"> <member name="M:Performance.Api.Controllers.SheetController.SheetList(Performance.DtoModels.SheetRequest)">
<summary> <summary>
sheet 列表 sheet 列表
......
...@@ -3781,12 +3781,52 @@ ...@@ -3781,12 +3781,52 @@
纵向计算 纵向计算
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.SecondEmployeeDto.ComputeMode"> <member name="P:Performance.DtoModels.SecondBaseDto.ComputeMode">
<summary>
计算方式:11 不计算 12 横向计算 13 纵向计算
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Label">
<summary>
描述
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Key">
<summary>
主键
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.IsTrue">
<summary>
是否显示 true显示
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Fixed">
<summary> <summary>
计算方式:1 不计算 2 横向计算 3 纵向计算 是否固定
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.SecondLoadDto.ComputeMode"> <member name="P:Performance.DtoModels.SecondColumnDictionary.Sort">
<summary>
排序
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Site">
<summary>
位置 Top、Table
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Type">
<summary>
类型 单项奖励:SingleAwards,工作量:Workload
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Color">
<summary>
颜色class名称
</summary>
</member>
<member name="P:Performance.DtoModels.SecondEmployeeDto.ComputeMode">
<summary> <summary>
计算方式:11 不计算 12 横向计算 13 纵向计算 计算方式:11 不计算 12 横向计算 13 纵向计算
</summary> </summary>
......
namespace Performance.DtoModels
{
public class SecondBaseDto
{
public int SecondId { get; set; }
/// <summary>
/// 计算方式:11 不计算 12 横向计算 13 纵向计算
/// </summary>
public int ComputeMode { get; set; }
}
}
...@@ -2,13 +2,37 @@ ...@@ -2,13 +2,37 @@
{ {
public class SecondColumnDictionary public class SecondColumnDictionary
{ {
/// <summary>
/// 描述
/// </summary>
public string Label { get; set; } public string Label { get; set; }
/// <summary>
/// 主键
/// </summary>
public string Key { get; set; } public string Key { get; set; }
/// <summary>
/// 是否显示 true显示
/// </summary>
public bool IsTrue { get; set; } public bool IsTrue { get; set; }
/// <summary>
/// 是否固定
/// </summary>
public string Fixed { get; set; } public string Fixed { get; set; }
/// <summary>
/// 排序
/// </summary>
public int Sort { get; set; } public int Sort { get; set; }
/// <summary>
/// 位置 Top、Table
/// </summary>
public string Site { get; set; } public string Site { get; set; }
/// <summary>
/// 类型 单项奖励:SingleAwards,工作量:Workload
/// </summary>
public string Type { get; set; } public string Type { get; set; }
/// <summary>
/// 颜色class名称
/// </summary>
public string Color { get; set; } public string Color { get; set; }
public SecondColumnDictionary() public SecondColumnDictionary()
......
namespace Performance.DtoModels namespace Performance.DtoModels
{ {
public class SecondLoadDto public class SecondLoadDto : SecondBaseDto
{ {
public int SecondId { get; set; }
/// <summary>
/// 计算方式:11 不计算 12 横向计算 13 纵向计算
/// </summary>
public int ComputeMode { get; set; }
/// <summary> /// <summary>
/// 数据加载方式:0 保存,1 上次,2 字典 /// 数据加载方式:0 保存,1 上次,2 字典
/// </summary> /// </summary>
......
...@@ -149,10 +149,10 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute ...@@ -149,10 +149,10 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute
new SecondColumnDictionary("科室",nameof(ag_bodysource.Department),true,100, fix:"Left"), new SecondColumnDictionary("科室",nameof(ag_bodysource.Department),true,100, fix:"Left"),
new SecondColumnDictionary("主管",nameof(ag_bodysource.Post),true,100 ), new SecondColumnDictionary("主管",nameof(ag_bodysource.Post),true,100 ),
new SecondColumnDictionary("人员系数",nameof(ag_bodysource.StaffCoefficient),false,200, color: Color.DarkTurquoise.ToRGB() ), new SecondColumnDictionary("人员系数",nameof(ag_bodysource.StaffCoefficient),false,200, color: "title_color" ),
new SecondColumnDictionary("出勤",nameof(ag_bodysource.ActualAttendance),false,201, color: Color.DarkTurquoise.ToRGB() ), new SecondColumnDictionary("出勤",nameof(ag_bodysource.ActualAttendance),false,201, color: "title_color" ),
new SecondColumnDictionary("职称",nameof(ag_bodysource.JobTitle),false,202, color: Color.DarkTurquoise.ToRGB() ), new SecondColumnDictionary("职称",nameof(ag_bodysource.JobTitle),false,202, color: "title_color" ),
new SecondColumnDictionary("职称系数",nameof(ag_bodysource.TitleCoefficient),false,203, color: Color.DarkTurquoise.ToRGB() ), new SecondColumnDictionary("职称系数",nameof(ag_bodysource.TitleCoefficient),false,203, color: "title_color" ),
new SecondColumnDictionary("职称绩效",nameof(ag_bodysource.TitlePerformance),true,299 ), new SecondColumnDictionary("职称绩效",nameof(ag_bodysource.TitlePerformance),true,299 ),
new SecondColumnDictionary("工作量绩效合计",nameof(ag_bodysource.WorkPerformance),true,399 ), new SecondColumnDictionary("工作量绩效合计",nameof(ag_bodysource.WorkPerformance),true,399 ),
...@@ -174,16 +174,11 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute ...@@ -174,16 +174,11 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute
if (workloadGroups == null) if (workloadGroups == null)
workloadGroups = GetTopWorkloadBodyGroups(loads); workloadGroups = GetTopWorkloadBodyGroups(loads);
var colors = RandomHelper.Color(Color.LightGreen, Color.LawnGreen, workloadGroups.Count);
var index = 0;
int workloadSort = 300; int workloadSort = 300;
foreach (var item in loads.Where(w => !w.Title.StartsWithIgnoreCase("SingleAwards_"))) foreach (var item in loads.Where(w => !w.Title.StartsWithIgnoreCase("SingleAwards_")))
{ {
if (workloadGroups.Any(w => w.Items?.FirstOrDefault() == item.Title)) var index = workloadGroups.FindIndex(w => w.Items != null && w.Items.Any(im => im.EqualsIgnoreCase(item.Title)));
index = workloadGroups.FindIndex(w => w.Items?.FirstOrDefault() == item.Title); maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++workloadSort, type: "Workload", color: $"workload_color{index}"));
var color = index < colors.Count ? colors[index].ToRGB() : "";
maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++workloadSort, type: "Workload", color: color));
} }
// 多工作量加载 // 多工作量加载
...@@ -200,7 +195,7 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute ...@@ -200,7 +195,7 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute
int singleAwardsSort = 400; int singleAwardsSort = 400;
foreach (var item in loads.Where(w => w.Title.StartsWithIgnoreCase("SingleAwards_"))) foreach (var item in loads.Where(w => w.Title.StartsWithIgnoreCase("SingleAwards_")))
{ {
maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++singleAwardsSort, type: "SingleAwards", color: Color.Cyan.ToRGB())); maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++singleAwardsSort, type: "SingleAwards", color: "singleawards_color"));
} }
return maps.OrderBy(w => w.Sort).ToList(); return maps.OrderBy(w => w.Sort).ToList();
} }
...@@ -281,17 +276,12 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute ...@@ -281,17 +276,12 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute
// 横向 纵向 特有顶部信息 // 横向 纵向 特有顶部信息
if (computeMode != ComputeMode.NotCalculate) if (computeMode != ComputeMode.NotCalculate)
{ {
head.AddOrUpdate(nameof(ag_headsource.DaysFullAttendance), DateTime.DaysInMonth(allot.Year, allot.Month));
head.AddOrUpdate(nameof(ag_headsource.SeniorityTitlesAccountedPerformance), 0.2m);
head.AddOrUpdate(nameof(ag_headsource.Workload_Ratio_Default), 0.8m);
var history = _agheadsourceRepository.GetEntity(t => t.SecondId == second.Id); var history = _agheadsourceRepository.GetEntity(t => t.SecondId == second.Id);
if (history != null)
{ head.AddOrUpdate(nameof(ag_headsource.SeniorityTitlesAccountedPerformance), history?.SeniorityTitlesAccountedPerformance ?? 0.2m);
head.AddOrUpdate(nameof(ag_headsource.SeniorityTitlesAccountedPerformance), history.SeniorityTitlesAccountedPerformance); head.AddOrUpdate(nameof(ag_headsource.Workload_Ratio_Default), history?.Workload_Ratio_Default ?? 0.8m);
head.AddOrUpdate(nameof(ag_headsource.Workload_Ratio_Default), history.Workload_Ratio_Default); head.AddOrUpdate(nameof(ag_headsource.DaysFullAttendance), history?.DaysFullAttendance ?? DateTime.DaysInMonth(allot.Year, allot.Month));
head.AddOrUpdate(nameof(ag_headsource.DaysFullAttendance), history.DaysFullAttendance);
}
// 多工作量加载 // 多工作量加载
var headDynamic = _agworktypesourceRepository.GetEntities(t => t.SecondId == second.Id); var headDynamic = _agworktypesourceRepository.GetEntities(t => t.SecondId == second.Id);
if (headDynamic != null && headDynamic.Any()) if (headDynamic != null && headDynamic.Any())
...@@ -689,84 +679,6 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he ...@@ -689,84 +679,6 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he
} }
/// <summary> /// <summary>
/// 科室查询人员字典
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public List<Dictionary<string, object>> RedistributionEmployee(SecondEmployeeDto request)
{
List<Dictionary<string, object>> result = new List<Dictionary<string, object>>();
var second = _secondallotRepository.GetEntity(t => t.Id == request.SecondId);
if (second == null) throw new PerformanceException("参数SecondId无效!");
var allot = _perallotRepository.GetEntity(t => t.ID == second.AllotId);
if (allot == null)
throw new PerformanceException("绩效记录不存在!");
// 当前二次分配配置工作量
var loads = GetWorkLoads(allot.HospitalId, second.UnitType, second.Department);
Expression<Func<per_employee, bool>> exp = t => t.AllotId == second.AllotId;
if (request != null && !string.IsNullOrEmpty(request.SearchQuery))
{
exp = exp.And(t => true && (t.AccountingUnit.Contains(request.SearchQuery) || t.PersonnelNumber.Contains(request.SearchQuery) || t.DoctorName.Contains(request.SearchQuery) || t.Department.Contains(request.SearchQuery)));
}
// 分页查询
var employees = _peremployeeRepository.GetEntitiesForPaging(request.PageNumber, request.PageSize, exp);
if (employees != null)
{
Func<per_employee, decimal?> getDistPerformance = (emp) => 0;
// 不计算模板时,带出工作量绩效(一次分配中的应发绩效)
if (request.ComputeMode == (int)ComputeMode.NotCalculate)
{
if (UnitTypeUtil.IsOffice(second.UnitType))
{
var distPerformance = _rescomputeRepository.GetEntities(t => t.AllotID == second.AllotId && employees.Select(s => s.PersonnelNumber).Contains(t.JobNumber));
getDistPerformance = (emp) =>
{
if (second.Department == emp.AccountingUnit)
return distPerformance?.Where(w => w.JobNumber?.Trim() == emp.PersonnelNumber?.Trim())?.Sum(w => w.GiveFee);
return 0;
};
}
}
var monthDays = DateTime.DaysInMonth(allot.Year, allot.Month);
foreach (var employee in employees)
{
Dictionary<string, object> item = new Dictionary<string, object>();
// 不计算模板时,带出工作量绩效(一次分配中的应发绩效)
if (request.ComputeMode == (int)ComputeMode.NotCalculate)
{
item.Add(nameof(ag_bodysource.WorkPerformance), getDistPerformance(employee));
}
item.Add(nameof(per_employee.UnitType), employee.UnitType);
item.Add(nameof(ag_bodysource.SecondId), request.SecondId);
item.Add(nameof(ag_bodysource.Department), employee.AccountingUnit);
item.Add(nameof(ag_bodysource.Name), employee.DoctorName);
item.Add(nameof(ag_bodysource.WorkNumber), employee.PersonnelNumber);
item.Add(nameof(ag_bodysource.JobTitle), employee.JobTitle);
item.Add(nameof(ag_bodysource.Post), "否");
item.Add(nameof(ag_bodysource.TitleCoefficient), 1);
item.Add(nameof(ag_bodysource.ActualAttendance), employee.AttendanceDay > monthDays ? monthDays : employee.AttendanceDay);
item.Add(nameof(ag_bodysource.StaffCoefficient), 1);
if (loads != null)
{
foreach (var score in loads.Where(w => w.Title.StartsWithIgnoreCase("AssessmentScore_")).ToList())
{
if (score.Value == null)
item.AddOrUpdate(score.Title, 100);
}
}
result.Add(item);
}
}
return result;
}
/// <summary>
/// 重算顶部医院其他绩效、重算行内实发绩效、重算顶部工作量 /// 重算顶部医院其他绩效、重算行内实发绩效、重算顶部工作量
/// </summary> /// </summary>
/// <param name="head"></param> /// <param name="head"></param>
...@@ -1219,5 +1131,104 @@ public List<SecondComputeCheckResultDto> CheckData(ag_secondallot second, List<D ...@@ -1219,5 +1131,104 @@ public List<SecondComputeCheckResultDto> CheckData(ag_secondallot second, List<D
return result; return result;
} }
#endregion #endregion
#region 二次分配审核后查看详情
/// <summary>
/// 二次分配审核后查看详情
/// </summary>
/// <param name="computeMode"></param>
/// <param name="allot"></param>
/// <param name="second"></param>
/// <returns></returns>
public (Dictionary<string, object> head, List<Dictionary<string, object>> rows) RedistributionDetail(ComputeMode computeMode, per_allot allot, ag_secondallot second)
{
var head = LoadHead(computeMode, allot, second);
var loadEmployees = _agbodysourceRepository.GetEntities(w => w.SecondId == second.Id);
var rows = LoadWorkload(allot, second, loadEmployees);
return (head, rows);
}
#endregion
#region 科室查询人员字典
/// <summary>
/// 科室查询人员字典
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public object RedistributionEmployee(SecondEmployeeDto request)
{
List<Dictionary<string, object>> result = new List<Dictionary<string, object>>();
var second = _secondallotRepository.GetEntity(t => t.Id == request.SecondId);
if (second == null) throw new PerformanceException("参数SecondId无效!");
var allot = _perallotRepository.GetEntity(t => t.ID == second.AllotId);
if (allot == null)
throw new PerformanceException("绩效记录不存在!");
// 当前二次分配配置工作量
var loads = GetWorkLoads(allot.HospitalId, second.UnitType, second.Department);
Expression<Func<per_employee, bool>> exp = t => t.AllotId == second.AllotId;
if (request != null && !string.IsNullOrEmpty(request.SearchQuery))
{
exp = exp.And(t => true && (t.AccountingUnit.Contains(request.SearchQuery) || t.PersonnelNumber.Contains(request.SearchQuery) || t.DoctorName.Contains(request.SearchQuery) || t.Department.Contains(request.SearchQuery)));
}
// 分页查询
var employees = _peremployeeRepository.GetEntitiesForPaging(request.PageNumber, request.PageSize, exp);
if (employees != null)
{
Func<per_employee, decimal?> getDistPerformance = (emp) => 0;
// 不计算模板时,带出工作量绩效(一次分配中的应发绩效)
if (request.ComputeMode == (int)ComputeMode.NotCalculate)
{
if (UnitTypeUtil.IsOffice(second.UnitType))
{
var distPerformance = _rescomputeRepository.GetEntities(t => t.AllotID == second.AllotId && employees.Select(s => s.PersonnelNumber).Contains(t.JobNumber));
getDistPerformance = (emp) =>
{
if (second.Department == emp.AccountingUnit)
return distPerformance?.Where(w => w.JobNumber?.Trim() == emp.PersonnelNumber?.Trim())?.Sum(w => w.GiveFee);
return 0;
};
}
}
var monthDays = DateTime.DaysInMonth(allot.Year, allot.Month);
foreach (var employee in employees)
{
Dictionary<string, object> item = new Dictionary<string, object>();
// 不计算模板时,带出工作量绩效(一次分配中的应发绩效)
if (request.ComputeMode == (int)ComputeMode.NotCalculate)
{
item.Add(nameof(ag_bodysource.WorkPerformance), getDistPerformance(employee));
}
item.Add(nameof(per_employee.UnitType), employee.UnitType);
item.Add(nameof(ag_bodysource.SecondId), request.SecondId);
item.Add(nameof(ag_bodysource.Department), employee.AccountingUnit);
item.Add(nameof(ag_bodysource.Name), employee.DoctorName);
item.Add(nameof(ag_bodysource.WorkNumber), employee.PersonnelNumber);
item.Add(nameof(ag_bodysource.JobTitle), employee.JobTitle);
item.Add(nameof(ag_bodysource.Post), "否");
item.Add(nameof(ag_bodysource.TitleCoefficient), 1);
item.Add(nameof(ag_bodysource.ActualAttendance), employee.AttendanceDay > monthDays ? monthDays : employee.AttendanceDay);
item.Add(nameof(ag_bodysource.StaffCoefficient), 1);
if (loads != null)
{
foreach (var score in loads.Where(w => w.Title.StartsWithIgnoreCase("AssessmentScore_")).ToList())
{
if (score.Value == null)
item.AddOrUpdate(score.Title, 100);
}
}
result.Add(item);
}
}
return new { employees.CurrentPage, employees.TotalPages, employees.PageSize, employees.TotalCount, list = result };
}
#endregion
} }
} }
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