Commit 80cfbc09 by lcx

二次绩效其他模板详情

parent 68811594
...@@ -401,7 +401,8 @@ public ApiResponse NursingDeptAuditResult([FromBody] SecondAuditRequest request) ...@@ -401,7 +401,8 @@ public ApiResponse NursingDeptAuditResult([FromBody] SecondAuditRequest request)
[HttpPost] [HttpPost]
public ApiResponse OtherList([FromBody] AgOtherRequest request) public ApiResponse OtherList([FromBody] AgOtherRequest request)
{ {
var result = secondAllotService.OtherList(request.SecondId, claimService.GetUserId()); //var result = secondAllotService.OtherList(request.SecondId, claimService.GetUserId());
var result = secondAllotDetails.GetOtherTempDetails(claimService.GetUserId(), request.SecondId, request.IsArchive, request.EmployeeSource);
var obj = new var obj = new
{ {
header = secondAllotService.OtherListHeader(request.SecondId, result?.Sum(t => t.RealAmount)), header = secondAllotService.OtherListHeader(request.SecondId, result?.Sum(t => t.RealAmount)),
......
...@@ -9,6 +9,10 @@ public class AgOtherRequest ...@@ -9,6 +9,10 @@ public class AgOtherRequest
{ {
public int SecondId { get; set; } public int SecondId { get; set; }
public int IsArchive { get; set; }
public int EmployeeSource { get; set; }
public List<ag_othersource> Othersources { get; set; } public List<ag_othersource> Othersources { get; set; }
} }
} }
...@@ -17,9 +17,11 @@ public class SecondAllotDetails : IAutoInjection ...@@ -17,9 +17,11 @@ public class SecondAllotDetails : IAutoInjection
private readonly PerforAgworkloadRepository agworkloadRepository; private readonly PerforAgworkloadRepository agworkloadRepository;
private readonly PerforAgworkloadtypeRepository agworkloadtypeRepository; private readonly PerforAgworkloadtypeRepository agworkloadtypeRepository;
private readonly PerforAgfixatitemRepository agfixatitemRepository; private readonly PerforAgfixatitemRepository agfixatitemRepository;
private readonly PerforAgothersourceRepository agothersourceRepository;
private readonly PerforPerallotRepository perallotRepository; private readonly PerforPerallotRepository perallotRepository;
private readonly PerforCofagainRepository cofagainRepository; private readonly PerforCofagainRepository cofagainRepository;
private readonly PerforPerapramountRepository perapramountRepository; private readonly PerforPerapramountRepository perapramountRepository;
private readonly PerforRescomputeRepository rescomputeRepository;
private readonly PersonService personService; private readonly PersonService personService;
public SecondAllotDetails( public SecondAllotDetails(
...@@ -29,9 +31,11 @@ public class SecondAllotDetails : IAutoInjection ...@@ -29,9 +31,11 @@ public class SecondAllotDetails : IAutoInjection
PerforAgworkloadRepository agworkloadRepository, PerforAgworkloadRepository agworkloadRepository,
PerforAgworkloadtypeRepository agworkloadtypeRepository, PerforAgworkloadtypeRepository agworkloadtypeRepository,
PerforAgfixatitemRepository agfixatitemRepository, PerforAgfixatitemRepository agfixatitemRepository,
PerforAgothersourceRepository agothersourceRepository,
PerforPerallotRepository perallotRepository, PerforPerallotRepository perallotRepository,
PerforCofagainRepository cofagainRepository, PerforCofagainRepository cofagainRepository,
PerforPerapramountRepository perapramountRepository, PerforPerapramountRepository perapramountRepository,
PerforRescomputeRepository rescomputeRepository,
PersonService personService PersonService personService
) )
{ {
...@@ -41,12 +45,16 @@ PersonService personService ...@@ -41,12 +45,16 @@ PersonService personService
this.agworkloadRepository = agworkloadRepository; this.agworkloadRepository = agworkloadRepository;
this.agworkloadtypeRepository = agworkloadtypeRepository; this.agworkloadtypeRepository = agworkloadtypeRepository;
this.agfixatitemRepository = agfixatitemRepository; this.agfixatitemRepository = agfixatitemRepository;
this.agothersourceRepository = agothersourceRepository;
this.perallotRepository = perallotRepository; this.perallotRepository = perallotRepository;
this.cofagainRepository = cofagainRepository; this.cofagainRepository = cofagainRepository;
this.perapramountRepository = perapramountRepository; this.perapramountRepository = perapramountRepository;
this.rescomputeRepository = rescomputeRepository;
this.personService = personService; this.personService = personService;
} }
#region 横向纵向模板详情
/// <summary> /// <summary>
/// 二次绩效详情 /// 二次绩效详情
/// </summary> /// </summary>
...@@ -189,7 +197,7 @@ public List<BodyItem> GetBodyItems(int userId, int employeeSource, ag_secondallo ...@@ -189,7 +197,7 @@ public List<BodyItem> GetBodyItems(int userId, int employeeSource, ag_secondallo
return GetEmployeeFromEmployeeDict(userId, secondAllot, otherShowColumns); return GetEmployeeFromEmployeeDict(userId, secondAllot, otherShowColumns);
case (int)EmployeeSource.PrevSecondAllot: case (int)EmployeeSource.PrevSecondAllot:
return GetEmployeeFromPrevData(prevSecondAllot, otherShowColumns); return GetEmployeeFromPrevData(userId, secondAllot, prevSecondAllot, otherShowColumns);
default: default:
return new List<BodyItem>(); return new List<BodyItem>();
...@@ -244,26 +252,25 @@ public List<BodyItem> GetEmployeeFromEmployeeDict(int userId, ag_secondallot sec ...@@ -244,26 +252,25 @@ public List<BodyItem> GetEmployeeFromEmployeeDict(int userId, ag_secondallot sec
if (otherShowColumns == null || !otherShowColumns.Any()) return tableFixedDataList; if (otherShowColumns == null || !otherShowColumns.Any()) return tableFixedDataList;
var employeeList = personService.GetPersons(secondAllot.AllotId.Value, userId); ; var employeeList = personService.GetPersons(secondAllot.AllotId.Value, userId);
if (employeeList == null || !employeeList.Any()) return tableFixedDataList; if (employeeList == null || !employeeList.Any()) return tableFixedDataList;
var perapramounts = perapramountRepository.GetEntities(t => t.AllotId == secondAllot.AllotId && t.Status == 3); //var perapramounts = perapramountRepository.GetEntities(t => t.AllotId == secondAllot.AllotId && t.Status == 3);
Func<per_employee, decimal?> getAprAmount = (t) => perapramounts //Func<per_employee, decimal?> getAprAmount = (t) => perapramounts
?.Where(w => w.AccountingUnit?.Trim() == secondAllot.Department?.Trim() && w.DoctorName?.Trim() == t.DoctorName?.Trim() && w.PersonnelNumber?.Trim() == t.JobNumber?.Trim()) // ?.Where(w => w.AccountingUnit?.Trim() == secondAllot.Department?.Trim() && w.DoctorName?.Trim() == t.DoctorName?.Trim() && w.PersonnelNumber?.Trim() == t.JobNumber?.Trim())
?.Sum(w => w.Amount); // ?.Sum(w => w.Amount);
var employeeColumns = new List<Tuple<string, string, Func<per_employee, object>>> var employeeColumns = new List<Tuple<string, string, Func<per_employee, object>>>
{ {
new Tuple<string, string, Func<per_employee, object>>("人员工号", "PersonnelNumber", (t) => t.JobNumber), new Tuple<string, string, Func<per_employee, object>>("人员工号", "PersonnelNumber", (t) => t.JobNumber),
new Tuple<string, string, Func<per_employee, object>>("姓名", "FullName", (t) => t.DoctorName), new Tuple<string, string, Func<per_employee, object>>("姓名", "FullName", (t) => t.DoctorName),
new Tuple<string, string, Func<per_employee, object>>( new Tuple<string, string, Func<per_employee, object>>(
"岗位", "岗位", "Post",
"Post",
(t) => !string.IsNullOrEmpty(t.Duty) && (t.Duty.IndexOf("主任") > -1 || t.Duty.IndexOf("护士长") > -1) ? "主任" : "其他"), (t) => !string.IsNullOrEmpty(t.Duty) && (t.Duty.IndexOf("主任") > -1 || t.Duty.IndexOf("护士长") > -1) ? "主任" : "其他"),
new Tuple<string, string, Func<per_employee, object>>("出勤", "ActualAttendance", (t) => t.AttendanceDay), new Tuple<string, string, Func<per_employee, object>>("出勤", "ActualAttendance", (t) => t.AttendanceDay),
new Tuple<string, string, Func<per_employee, object>>("职称", "JobTitle", (t) => t.JobTitle), new Tuple<string, string, Func<per_employee, object>>("职称", "JobTitle", (t) => t.JobTitle),
new Tuple<string, string, Func<per_employee, object>>("预留比例", "ReservedRatio", (t) => t.ReservedRatio), new Tuple<string, string, Func<per_employee, object>>("预留比例", "ReservedRatio", (t) => t.ReservedRatio),
new Tuple<string, string, Func<per_employee, object>>("医院其他绩效", "OtherPerformance", (t) => getAprAmount(t)) new Tuple<string, string, Func<per_employee, object>>("医院其他绩效", "OtherPerformance", (t) => 0)
}; };
int rowNumber = 0; int rowNumber = 0;
...@@ -279,10 +286,11 @@ public List<BodyItem> GetEmployeeFromEmployeeDict(int userId, ag_secondallot sec ...@@ -279,10 +286,11 @@ public List<BodyItem> GetEmployeeFromEmployeeDict(int userId, ag_secondallot sec
var value = column.Item3.Invoke(employee); var value = column.Item3.Invoke(employee);
tableFixedData.Value = value?.ToString(); tableFixedData.Value = value?.ToString();
tableFixedData.RowNumber = rowNumber; tableFixedData.RowNumber = rowNumber;
tableFixedDataList.Add(tableFixedData); tableFixedDataList.Add(tableFixedData);
} }
rowNumber++;
} }
SupplementOtherPerfor(secondAllot, tableFixedDataList);
return tableFixedDataList; return tableFixedDataList;
} }
...@@ -292,7 +300,7 @@ public List<BodyItem> GetEmployeeFromEmployeeDict(int userId, ag_secondallot sec ...@@ -292,7 +300,7 @@ public List<BodyItem> GetEmployeeFromEmployeeDict(int userId, ag_secondallot sec
/// <param name="prevSecondAllot"></param> /// <param name="prevSecondAllot"></param>
/// <param name="otherShowColumns"></param> /// <param name="otherShowColumns"></param>
/// <returns></returns> /// <returns></returns>
public List<BodyItem> GetEmployeeFromPrevData(ag_secondallot prevSecondAllot, List<HeadItem> otherShowColumns) public List<BodyItem> GetEmployeeFromPrevData(int userId, ag_secondallot secondAllot, ag_secondallot prevSecondAllot, List<HeadItem> otherShowColumns)
{ {
var tableFixedDataList = new List<BodyItem>(); var tableFixedDataList = new List<BodyItem>();
...@@ -301,15 +309,30 @@ public List<BodyItem> GetEmployeeFromPrevData(ag_secondallot prevSecondAllot, Li ...@@ -301,15 +309,30 @@ public List<BodyItem> GetEmployeeFromPrevData(ag_secondallot prevSecondAllot, Li
var savedDataList = agfixatitemRepository.GetEntities(w => w.SecondId == prevSecondAllot.Id && w.RowNumber.HasValue && w.RowNumber > -1); var savedDataList = agfixatitemRepository.GetEntities(w => w.SecondId == prevSecondAllot.Id && w.RowNumber.HasValue && w.RowNumber > -1);
if (savedDataList == null || !savedDataList.Any()) return tableFixedDataList; if (savedDataList == null || !savedDataList.Any()) return tableFixedDataList;
var employeeList = personService.GetPersons(secondAllot.AllotId.Value, userId);
var employeeColumns = new List<Tuple<string, string>>
{
new Tuple<string, string>("人员工号", "PersonnelNumber"),
new Tuple<string, string>("姓名", "FullName"),
new Tuple<string, string>("岗位", "Post"),
new Tuple<string, string>("人员系数", "StaffCoefficient"),
new Tuple<string, string>("职称", "JobTitle"),
new Tuple<string, string>("职称系数", "TitleCoefficient")
};
var rowNumberList = savedDataList.Select(w => w.RowNumber.Value).Distinct().OrderBy(t => t).ToList(); var rowNumberList = savedDataList.Select(w => w.RowNumber.Value).Distinct().OrderBy(t => t).ToList();
if (rowNumberList != null && rowNumberList.Any()) if (rowNumberList != null && rowNumberList.Any())
{ {
foreach (var rowNumber in rowNumberList) foreach (var rowNumber in rowNumberList)
{ {
foreach (var column in otherShowColumns) foreach (var column in employeeColumns)
{ {
var tableFixedData = new BodyItem(column); var headItem = otherShowColumns.FirstOrDefault(w => w.FiledName == column.Item1 && w.FiledId == column.Item2 && w.Type == (int)TempColumnType.TableFixedColumns);
var savedData = savedDataList.FirstOrDefault(w => w.RowNumber == rowNumber && w.Type == column.Type && w.ItemName == column.FiledName); if (headItem == null) continue;
var tableFixedData = new BodyItem(headItem);
var savedData = savedDataList.FirstOrDefault(w => w.RowNumber == rowNumber && w.Type == (int)TempColumnType.TableFixedColumns && w.ItemName == column.Item1);
if (savedData != null) if (savedData != null)
{ {
tableFixedData.Value = savedData.ItemValue; tableFixedData.Value = savedData.ItemValue;
...@@ -317,32 +340,27 @@ public List<BodyItem> GetEmployeeFromPrevData(ag_secondallot prevSecondAllot, Li ...@@ -317,32 +340,27 @@ public List<BodyItem> GetEmployeeFromPrevData(ag_secondallot prevSecondAllot, Li
} }
tableFixedDataList.Add(tableFixedData); tableFixedDataList.Add(tableFixedData);
} }
}
}
return tableFixedDataList;
}
/// <summary> #region 获取人员字典中录入的出勤
/// 获取上一次的二次绩效信息
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="secondAllot"></param>
/// <returns></returns>
private ag_secondallot GetPreviousSecondAllot(int hospitalId, ag_secondallot secondAllot)
{
// 历史删除绩效时,未删除对应的二次绩效记录
var allotList = perallotRepository.GetEntities(w => w.HospitalId == hospitalId)?.OrderBy(s => s.Year).ThenBy(s => s.Month).ToList();
if (allotList == null || !allotList.Any()) throw new PerformanceException("未查询到符合的绩效记录");
var allot = allotList.FirstOrDefault(w => w.ID == secondAllot.AllotId); var attenItem = otherShowColumns.FirstOrDefault(w => w.FiledName == "出勤" && w.FiledId == "ActualAttendance" && w.Type == (int)TempColumnType.TableFixedColumns);
if (allot == null) throw new PerformanceException("未查询到符合的绩效记录"); if (attenItem == null) continue;
var attendance = new BodyItem(attenItem);
var index = allotList.IndexOf(allot); var jobNumber = savedDataList.FirstOrDefault(w => w.RowNumber == rowNumber && w.ItemName == "人员工号")?.ItemValue;
if (index == 0) return null; var personName = savedDataList.FirstOrDefault(w => w.RowNumber == rowNumber && w.ItemName == "姓名")?.ItemValue;
var employeeAttendance = employeeList.FirstOrDefault(w => w.JobNumber == jobNumber && w.DoctorName == personName)?.AttendanceDay.ToString();
var prevAllot = allotList[index - 1]; attendance.Value = employeeAttendance;
var prevSecondAllot = agsecondallotRepository.GetEntity(w => w.AllotId == prevAllot.ID && w.UnitType == secondAllot.UnitType && w.Department == secondAllot.Department); attendance.RowNumber = rowNumber;
return prevSecondAllot; tableFixedDataList.Add(attendance);
#endregion 获取人员字典中录入的出勤
}
SupplementOtherPerfor(secondAllot, tableFixedDataList);
}
return tableFixedDataList;
} }
/// <summary> /// <summary>
...@@ -402,7 +420,7 @@ private void SupplementOtherPerfor(ag_secondallot secondAllot, List<BodyItem> bo ...@@ -402,7 +420,7 @@ private void SupplementOtherPerfor(ag_secondallot secondAllot, List<BodyItem> bo
var fullName = rowData.FirstOrDefault(w => w.FiledId == "FullName")?.Value; var fullName = rowData.FirstOrDefault(w => w.FiledId == "FullName")?.Value;
var amount = perapramounts var amount = perapramounts
?.Where(w => w.AccountingUnit?.Trim() == secondAllot.Department?.Trim() && w.PersonnelNumber?.Trim() == personnelNumber?.Trim() && w.DoctorName?.Trim() == fullName?.Trim()) ?.Where(w => w.AccountingUnit?.Trim() == secondAllot.Department?.Trim() && w.PersonnelNumber?.Trim() == personnelNumber?.Trim())
?.Sum(w => w.Amount); ?.Sum(w => w.Amount);
var otherPerfor = rowData.FirstOrDefault(w => w.FiledId == "OtherPerformance"); var otherPerfor = rowData.FirstOrDefault(w => w.FiledId == "OtherPerformance");
if (otherPerfor != null) if (otherPerfor != null)
...@@ -488,6 +506,144 @@ private void SupplyHeaderByWorkItem(int hospitalId, SecondResponse result, ag_se ...@@ -488,6 +506,144 @@ private void SupplyHeaderByWorkItem(int hospitalId, SecondResponse result, ag_se
} }
} }
} }
#endregion 横向纵向模板详情
#region 其他模板详情
public List<ag_othersource> GetOtherTempDetails(int userId, int secondId, int isArchive, int employeeSource)
{
var secondAllot = agsecondallotRepository.GetEntity(t => t.Id == secondId);
if (secondAllot == null) throw new PerformanceException("二次绩效信息无效!");
var allot = perallotRepository.GetEntity(w => w.ID == secondAllot.AllotId);
if (allot == null) throw new PerformanceException("未查询到匹配的绩效信息");
var prevSecondAllot = GetPreviousSecondAllot(allot.HospitalId, secondAllot);
var result = new List<ag_othersource>();
var savedDataList = agothersourceRepository.GetEntities(t => t.SecondId == secondId);
var isSupplementTitlePerformance = savedDataList == null || !savedDataList.Any();
if (employeeSource == (int)EmployeeSource.Initial)
{
employeeSource = (savedDataList == null || !savedDataList.Any()) && prevSecondAllot == null
? (int)EmployeeSource.EmployeeDict
: (int)EmployeeSource.PrevSecondAllot;
}
if (isArchive == 1 || new List<int> { (int)SecondAllotStatus.WaitReview, (int)SecondAllotStatus.PassAudit }.Contains(secondAllot.Status ?? (int)SecondAllotStatus.Uncommitted))
employeeSource = (int)EmployeeSource.Initial;
var employees = personService.GetPersons(secondAllot.AllotId.Value, userId)?.Where(t => t.UnitType == secondAllot.UnitType).ToList();
switch (employeeSource)
{
case (int)EmployeeSource.Initial:
result = savedDataList.OrderBy(t => t.Id).ToList();
break;
case (int)EmployeeSource.EmployeeDict:
if (employees == null || !employees.Any()) return new List<ag_othersource>();
result = employees.Select(t => new ag_othersource
{
SecondId = secondId,
WorkNumber = t.JobNumber ?? t.PersonnelNumber,
Name = t.DoctorName,
Department = t.Department,
WorkPost = t.JobTitle,
}).ToList();
break;
case (int)EmployeeSource.PrevSecondAllot:
var prevSavedDataList = agothersourceRepository.GetEntities(t => t.SecondId == prevSecondAllot.Id);
isSupplementTitlePerformance = prevSavedDataList == null || !prevSavedDataList.Any();
if (prevSavedDataList != null && prevSavedDataList.Any())
{
result = prevSavedDataList.OrderBy(t => t.Id)
.Select(t => new ag_othersource
{
SecondId = secondId,
WorkNumber = t.WorkNumber,
Name = t.Name,
Department = t.Department,
WorkPost = t.WorkPost,
}).ToList();
}
break;
default:
break;
}
SupplementSecondDetail(secondAllot, employees, result, isSupplementTitlePerformance);
return result;
}
/// <summary>
/// 补充二次分配 人员明细
/// </summary>
/// <param name="second"></param>
/// <param name="employees"></param>
/// <param name="result"></param>
/// <param name="isTitlePerformance">是否补全职称绩效</param>
private void SupplementSecondDetail(ag_secondallot second, List<per_employee> employees, List<ag_othersource> result, bool isTitlePerformance = true)
{
if (employees == null || !employees.Any(t => t.UnitType == second.UnitType))
return;
// 补充医院其他绩效 及 预留比例
var perapramounts = perapramountRepository.GetEntities(t => t.AllotId == second.AllotId && t.Status == 3);
Func<per_employee, decimal?> getAprAmount = (t) => perapramounts
?.Where(w => w.AccountingUnit?.Trim() == second.Department?.Trim() && w.DoctorName?.Trim() == t.DoctorName?.Trim() && w.PersonnelNumber?.Trim() == t.PersonnelNumber?.Trim())
?.Sum(w => w.Amount);
var distPerformance = rescomputeRepository.GetEntities(t => t.AllotID == second.AllotId && employees.Select(s => s.DoctorName).Contains(t.EmployeeName));
Func<per_employee, decimal?> getDistPerformance = (t) => 0;
if (second.UnitType == UnitType.行政后勤.ToString())
getDistPerformance = (t) => distPerformance
?.Where(w => w.AccountingUnit?.Trim() == second.Department?.Trim() && w.EmployeeName?.Trim() == t.DoctorName?.Trim() && w.JobNumber?.Trim() == t.PersonnelNumber?.Trim())
?.Sum(w => w.GiveFee);
foreach (var item in result)
{
var empl = employees.FirstOrDefault(w => w.PersonnelNumber?.Trim() == item.WorkNumber?.Trim() && w.DoctorName?.Trim() == item.Name?.Trim());
if (empl != null)
{
item.ReservedRatio = empl.ReservedRatio;
item.OtherPerformance = getAprAmount(empl);
if (isTitlePerformance)
item.TitlePerformance = getDistPerformance(empl);
}
}
}
#endregion 其他模板详情
/// <summary>
/// 获取上一次的二次绩效
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="secondAllot"></param>
/// <returns></returns>
private ag_secondallot GetPreviousSecondAllot(int hospitalId, ag_secondallot secondAllot)
{
// 历史删除绩效时,未删除对应的二次绩效记录
var allotList = perallotRepository.GetEntities(w => w.HospitalId == hospitalId)?.OrderBy(s => s.Year).ThenBy(s => s.Month).ToList();
if (allotList == null || !allotList.Any()) throw new PerformanceException("未查询到符合的绩效记录");
var allot = allotList.FirstOrDefault(w => w.ID == secondAllot.AllotId);
if (allot == null) throw new PerformanceException("未查询到符合的绩效记录");
var index = allotList.IndexOf(allot);
if (index == 0) return null;
var prevAllot = allotList[index - 1];
var prevSecondAllot = agsecondallotRepository.GetEntity(w => w.AllotId == prevAllot.ID && w.UnitType == secondAllot.UnitType && w.Department == secondAllot.Department);
return prevSecondAllot;
}
} }
/// <summary> /// <summary>
......
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