Commit 80cfbc09 by lcx

二次绩效其他模板详情

parent 68811594
......@@ -401,7 +401,8 @@ public ApiResponse NursingDeptAuditResult([FromBody] SecondAuditRequest request)
[HttpPost]
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
{
header = secondAllotService.OtherListHeader(request.SecondId, result?.Sum(t => t.RealAmount)),
......
......@@ -9,6 +9,10 @@ public class AgOtherRequest
{
public int SecondId { get; set; }
public int IsArchive { get; set; }
public int EmployeeSource { get; set; }
public List<ag_othersource> Othersources { get; set; }
}
}
......@@ -17,9 +17,11 @@ public class SecondAllotDetails : IAutoInjection
private readonly PerforAgworkloadRepository agworkloadRepository;
private readonly PerforAgworkloadtypeRepository agworkloadtypeRepository;
private readonly PerforAgfixatitemRepository agfixatitemRepository;
private readonly PerforAgothersourceRepository agothersourceRepository;
private readonly PerforPerallotRepository perallotRepository;
private readonly PerforCofagainRepository cofagainRepository;
private readonly PerforPerapramountRepository perapramountRepository;
private readonly PerforRescomputeRepository rescomputeRepository;
private readonly PersonService personService;
public SecondAllotDetails(
......@@ -29,9 +31,11 @@ public class SecondAllotDetails : IAutoInjection
PerforAgworkloadRepository agworkloadRepository,
PerforAgworkloadtypeRepository agworkloadtypeRepository,
PerforAgfixatitemRepository agfixatitemRepository,
PerforAgothersourceRepository agothersourceRepository,
PerforPerallotRepository perallotRepository,
PerforCofagainRepository cofagainRepository,
PerforPerapramountRepository perapramountRepository,
PerforRescomputeRepository rescomputeRepository,
PersonService personService
)
{
......@@ -41,12 +45,16 @@ PersonService personService
this.agworkloadRepository = agworkloadRepository;
this.agworkloadtypeRepository = agworkloadtypeRepository;
this.agfixatitemRepository = agfixatitemRepository;
this.agothersourceRepository = agothersourceRepository;
this.perallotRepository = perallotRepository;
this.cofagainRepository = cofagainRepository;
this.perapramountRepository = perapramountRepository;
this.rescomputeRepository = rescomputeRepository;
this.personService = personService;
}
#region 横向纵向模板详情
/// <summary>
/// 二次绩效详情
/// </summary>
......@@ -189,7 +197,7 @@ public List<BodyItem> GetBodyItems(int userId, int employeeSource, ag_secondallo
return GetEmployeeFromEmployeeDict(userId, secondAllot, otherShowColumns);
case (int)EmployeeSource.PrevSecondAllot:
return GetEmployeeFromPrevData(prevSecondAllot, otherShowColumns);
return GetEmployeeFromPrevData(userId, secondAllot, prevSecondAllot, otherShowColumns);
default:
return new List<BodyItem>();
......@@ -244,26 +252,25 @@ public List<BodyItem> GetEmployeeFromEmployeeDict(int userId, ag_secondallot sec
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;
var perapramounts = perapramountRepository.GetEntities(t => t.AllotId == secondAllot.AllotId && t.Status == 3);
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())
?.Sum(w => w.Amount);
//var perapramounts = perapramountRepository.GetEntities(t => t.AllotId == secondAllot.AllotId && t.Status == 3);
//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())
// ?.Sum(w => w.Amount);
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>>("姓名", "FullName", (t) => t.DoctorName),
new Tuple<string, string, Func<per_employee, object>>(
"岗位",
"Post",
"岗位", "Post",
(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>>("职称", "JobTitle", (t) => t.JobTitle),
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;
......@@ -279,10 +286,11 @@ public List<BodyItem> GetEmployeeFromEmployeeDict(int userId, ag_secondallot sec
var value = column.Item3.Invoke(employee);
tableFixedData.Value = value?.ToString();
tableFixedData.RowNumber = rowNumber;
tableFixedDataList.Add(tableFixedData);
}
rowNumber++;
}
SupplementOtherPerfor(secondAllot, tableFixedDataList);
return tableFixedDataList;
}
......@@ -292,7 +300,7 @@ public List<BodyItem> GetEmployeeFromEmployeeDict(int userId, ag_secondallot sec
/// <param name="prevSecondAllot"></param>
/// <param name="otherShowColumns"></param>
/// <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>();
......@@ -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);
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();
if (rowNumberList != null && rowNumberList.Any())
{
foreach (var rowNumber in rowNumberList)
{
foreach (var column in otherShowColumns)
foreach (var column in employeeColumns)
{
var tableFixedData = new BodyItem(column);
var savedData = savedDataList.FirstOrDefault(w => w.RowNumber == rowNumber && w.Type == column.Type && w.ItemName == column.FiledName);
var headItem = otherShowColumns.FirstOrDefault(w => w.FiledName == column.Item1 && w.FiledId == column.Item2 && w.Type == (int)TempColumnType.TableFixedColumns);
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)
{
tableFixedData.Value = savedData.ItemValue;
......@@ -317,32 +340,27 @@ public List<BodyItem> GetEmployeeFromPrevData(ag_secondallot prevSecondAllot, Li
}
tableFixedDataList.Add(tableFixedData);
}
}
}
return tableFixedDataList;
}
/// <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("未查询到符合的绩效记录");
#region 获取人员字典中录入的出勤
var allot = allotList.FirstOrDefault(w => w.ID == secondAllot.AllotId);
if (allot == null) throw new PerformanceException("未查询到符合的绩效记录");
var attenItem = otherShowColumns.FirstOrDefault(w => w.FiledName == "出勤" && w.FiledId == "ActualAttendance" && w.Type == (int)TempColumnType.TableFixedColumns);
if (attenItem == null) continue;
var attendance = new BodyItem(attenItem);
var index = allotList.IndexOf(allot);
if (index == 0) return null;
var jobNumber = savedDataList.FirstOrDefault(w => w.RowNumber == rowNumber && w.ItemName == "人员工号")?.ItemValue;
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];
var prevSecondAllot = agsecondallotRepository.GetEntity(w => w.AllotId == prevAllot.ID && w.UnitType == secondAllot.UnitType && w.Department == secondAllot.Department);
return prevSecondAllot;
attendance.Value = employeeAttendance;
attendance.RowNumber = rowNumber;
tableFixedDataList.Add(attendance);
#endregion 获取人员字典中录入的出勤
}
SupplementOtherPerfor(secondAllot, tableFixedDataList);
}
return tableFixedDataList;
}
/// <summary>
......@@ -402,7 +420,7 @@ private void SupplementOtherPerfor(ag_secondallot secondAllot, List<BodyItem> bo
var fullName = rowData.FirstOrDefault(w => w.FiledId == "FullName")?.Value;
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);
var otherPerfor = rowData.FirstOrDefault(w => w.FiledId == "OtherPerformance");
if (otherPerfor != null)
......@@ -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>
......
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