优化

parent cf96e1ed
...@@ -552,9 +552,9 @@ public ApiResponse RedistributionLoad([FromBody] SecondLoadDto request) ...@@ -552,9 +552,9 @@ public ApiResponse RedistributionLoad([FromBody] SecondLoadDto request)
if (!Enum.IsDefined(typeof(ComputeMode), request.ComputeMode)) if (!Enum.IsDefined(typeof(ComputeMode), request.ComputeMode))
throw new PerformanceException("暂不支持当前计算方式!"); throw new PerformanceException("暂不支持当前计算方式!");
var overrideMode = OverrideMode.Initial; var overrideMode = EmployeeSource.Initial;
if (Enum.IsDefined(typeof(OverrideMode), request.OverrideMode)) if (Enum.IsDefined(typeof(EmployeeSource), request.OverrideMode))
overrideMode = (OverrideMode)request.OverrideMode; overrideMode = (EmployeeSource)request.OverrideMode;
var result = _redistributionService.Load(request.SecondId, (ComputeMode)request.ComputeMode, overrideMode); var result = _redistributionService.Load(request.SecondId, (ComputeMode)request.ComputeMode, overrideMode);
return new ApiResponse(ResponseType.OK, result); return new ApiResponse(ResponseType.OK, result);
......
...@@ -3781,26 +3781,6 @@ ...@@ -3781,26 +3781,6 @@
纵向计算 纵向计算
</summary> </summary>
</member> </member>
<member name="T:Performance.DtoModels.Second.OverrideMode">
<summary>
人员带出方式 已保存,上次,字典,测算表
</summary>
</member>
<member name="F:Performance.DtoModels.Second.OverrideMode.Initial">
<summary>
初始化(用户保存后的数据)
</summary>
</member>
<member name="F:Performance.DtoModels.Second.OverrideMode.PrevSecondAllot">
<summary>
上一个二次绩效记录
</summary>
</member>
<member name="F:Performance.DtoModels.Second.OverrideMode.EmployeeDict">
<summary>
人员字典
</summary>
</member>
<member name="P:Performance.DtoModels.SecondLoadDto.ComputeMode"> <member name="P:Performance.DtoModels.SecondLoadDto.ComputeMode">
<summary> <summary>
计算方式:1 不计算 2 横向计算 3 纵向计算 计算方式:1 不计算 2 横向计算 3 纵向计算
......
...@@ -12,34 +12,14 @@ public enum ComputeMode ...@@ -12,34 +12,14 @@ public enum ComputeMode
/// <summary> /// <summary>
/// 不计算 /// 不计算
/// </summary> /// </summary>
NotCalculate = 1, NotCalculate = 11,
/// <summary> /// <summary>
/// 横向计算 /// 横向计算
/// </summary> /// </summary>
Horizontal = 2, Horizontal = 12,
/// <summary> /// <summary>
/// 纵向计算 /// 纵向计算
/// </summary> /// </summary>
Vertical = 3, Vertical = 13,
}
/// <summary>
/// 人员带出方式 已保存,上次,字典,测算表
/// </summary>
public enum OverrideMode
{
/// <summary>
/// 初始化(用户保存后的数据)
/// </summary>
Initial = 0,
/// <summary>
/// 上一个二次绩效记录
/// </summary>
PrevSecondAllot = 1,
/// <summary>
/// 人员字典
/// </summary>
EmployeeDict = 2,
} }
} }
...@@ -5,20 +5,24 @@ public class SecondColumnDictionary ...@@ -5,20 +5,24 @@ public class SecondColumnDictionary
public string Label { get; set; } public string Label { get; set; }
public string Key { get; set; } public string Key { get; set; }
public bool IsTrue { get; set; } public bool IsTrue { get; set; }
public string Fixed { get; set; }
public int Sort { get; set; } public int Sort { get; set; }
public string Site { get; set; } public string Site { get; set; }
public string Type { get; set; }
public SecondColumnDictionary() public SecondColumnDictionary()
{ {
} }
public SecondColumnDictionary(string label, string key, bool isTrue, int sort, string site = "Table") public SecondColumnDictionary(string label, string key, bool isTrue, int sort, string site = "Table", string fix = "", string type = "")
{ {
Label = label; Label = label;
Key = key; Key = key;
IsTrue = isTrue; IsTrue = isTrue;
Sort = sort; Sort = sort;
Site = site; Site = site;
Fixed = fix;
Type = type;
} }
} }
} }
...@@ -72,10 +72,10 @@ public class RedistributionService : IAutoInjection ...@@ -72,10 +72,10 @@ public class RedistributionService : IAutoInjection
/// 加载 /// 加载
/// </summary> /// </summary>
/// <param name="secondId"></param> /// <param name="secondId"></param>
/// <param name="computeMode">计算方式:1 不计算 2 横向计算 3 纵向计算</param> /// <param name="computeMode">计算方式:11 不计算 12 横向计算 13 纵向计算</param>
/// <param name="overrideMode">数据加载方式:0 保存,1 上次,2 字典,3 测算表</param> /// <param name="overrideMode">数据加载方式:0 保存,1 上次,2 字典,3 测算表</param>
/// <returns></returns> /// <returns></returns>
public SecondDetailDto Load(int secondId, ComputeMode computeMode, OverrideMode overrideMode) public SecondDetailDto Load(int secondId, ComputeMode computeMode, EmployeeSource overrideMode)
{ {
var second = _secondallotRepository.GetEntity(t => t.Id == secondId); var second = _secondallotRepository.GetEntity(t => t.Id == secondId);
if (second == null) throw new PerformanceException("参数SecondId无效!"); if (second == null) throw new PerformanceException("参数SecondId无效!");
...@@ -128,45 +128,52 @@ public SecondDetailDto Load(int secondId, ComputeMode computeMode, OverrideMode ...@@ -128,45 +128,52 @@ public SecondDetailDto Load(int secondId, ComputeMode computeMode, OverrideMode
return new SecondDetailDto { Head = head, Body = handson, Dic = dic }; return new SecondDetailDto { Head = head, Body = handson, Dic = dic };
} }
/// <summary>
/// 表格及列头 字典信息
/// </summary>
/// <param name="second"></param>
/// <param name="loads"></param>
/// <returns></returns>
public List<SecondColumnDictionary> GetTableHeaderDictionary(ag_secondallot second, List<TitleValue<string, decimal?>> loads) public List<SecondColumnDictionary> GetTableHeaderDictionary(ag_secondallot second, List<TitleValue<string, decimal?>> loads)
{ {
var maps = new List<SecondColumnDictionary>() var maps = new List<SecondColumnDictionary>()
{ {
new SecondColumnDictionary("人员工号",nameof(ag_bodysource.WorkNumber),true,100 ), new SecondColumnDictionary("人员工号",nameof(ag_bodysource.WorkNumber),true,100, fix:"Left"),
new SecondColumnDictionary("姓名",nameof(ag_bodysource.Name),true,100 ), new SecondColumnDictionary("姓名",nameof(ag_bodysource.Name),true,100, fix:"Left"),
new SecondColumnDictionary("科室",nameof(ag_bodysource.Department),true,100 ), 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),true,200 ), new SecondColumnDictionary("人员系数",nameof(ag_bodysource.StaffCoefficient),false,200 ),
new SecondColumnDictionary("出勤",nameof(ag_bodysource.ActualAttendance),true,201 ), new SecondColumnDictionary("出勤",nameof(ag_bodysource.ActualAttendance),false,201 ),
new SecondColumnDictionary("职称",nameof(ag_bodysource.JobTitle),true,202 ), new SecondColumnDictionary("职称",nameof(ag_bodysource.JobTitle),false,202 ),
new SecondColumnDictionary("职称系数",nameof(ag_bodysource.TitleCoefficient),true,203 ), new SecondColumnDictionary("职称系数",nameof(ag_bodysource.TitleCoefficient),false,203 ),
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 ),
new SecondColumnDictionary("单项奖励计",nameof(ag_bodysource.DeptReward),true,499 ), new SecondColumnDictionary("单项奖励计",nameof(ag_bodysource.DeptReward),true,499 ),
new SecondColumnDictionary("可分配绩效",nameof(ag_bodysource.DistPerformance),true,500 ), new SecondColumnDictionary("可分配绩效",nameof(ag_bodysource.DistPerformance),true,500 ),
new SecondColumnDictionary("医院其他绩效",nameof(ag_bodysource.OtherPerformance),true,501 ), new SecondColumnDictionary("医院其他绩效",nameof(ag_bodysource.OtherPerformance),true,501 ),
new SecondColumnDictionary("夜班工作量绩效",nameof(ag_bodysource.NightWorkPerformance),true,502 ), new SecondColumnDictionary("夜班工作量绩效",nameof(ag_bodysource.NightWorkPerformance),true,502 ),
new SecondColumnDictionary("预留比例",nameof(ag_bodysource.ReservedRatio),true,601 ), //new SecondColumnDictionary("预留比例",nameof(ag_bodysource.ReservedRatio),false,601 ),
new SecondColumnDictionary("预留金额",nameof(ag_bodysource.ReservedAmount),true,602 ), //new SecondColumnDictionary("预留金额",nameof(ag_bodysource.ReservedAmount),false,602 ),
new SecondColumnDictionary("实发绩效工资金额",nameof(ag_bodysource.RealAmount),true,700 ), new SecondColumnDictionary("实发绩效",nameof(ag_bodysource.RealAmount),true,700 ),
}; };
// 工作量 // 工作量
int sort = 300; int sort = 300;
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, ++sort)); maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++sort, type: "Workload"));
} }
// 单项奖励 // 单项奖励
sort = 400; sort = 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, ++sort)); maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++sort, type: "SingleAwards"));
} }
...@@ -284,12 +291,12 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ag_secondallot seco ...@@ -284,12 +291,12 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ag_secondallot seco
/// <param name="secondId"></param> /// <param name="secondId"></param>
/// <param name="mode"></param> /// <param name="mode"></param>
/// <returns></returns> /// <returns></returns>
private List<ag_bodysource> LoadEmployees(per_allot allot, ag_secondallot second, OverrideMode mode) private List<ag_bodysource> LoadEmployees(per_allot allot, ag_secondallot second, EmployeeSource mode)
{ {
var employees = _peremployeeRepository.GetEntities(w => w.AllotId == second.AllotId); var employees = _peremployeeRepository.GetEntities(w => w.AllotId == second.AllotId);
// 默认流程 // 默认流程
if (mode == OverrideMode.Initial) if (mode == EmployeeSource.Initial)
{ {
var saveDatas = _agbodysourceRepository.GetEntities(w => w.SecondId == second.Id); var saveDatas = _agbodysourceRepository.GetEntities(w => w.SecondId == second.Id);
// 数据带出顺序 1 已保存 2 上次 3 科室字典(或EXCEL行政工勤) // 数据带出顺序 1 已保存 2 上次 3 科室字典(或EXCEL行政工勤)
...@@ -311,12 +318,12 @@ private List<ag_bodysource> LoadEmployees(per_allot allot, ag_secondallot second ...@@ -311,12 +318,12 @@ private List<ag_bodysource> LoadEmployees(per_allot allot, ag_secondallot second
else else
{ {
List<string> numbers = new List<string>(); List<string> numbers = new List<string>();
if (mode == OverrideMode.PrevSecondAllot) if (mode == EmployeeSource.PrevSecondAllot)
numbers = LoadEmployees_PrevSecondAllot(allot, second); numbers = LoadEmployees_PrevSecondAllot(allot, second);
// 如果行政工勤科室则默认从EXCEL中带出数据 // 如果行政工勤科室则默认从EXCEL中带出数据
else if (mode == OverrideMode.EmployeeDict && UnitTypeUtil.IsOffice(second.UnitType)) else if (mode == EmployeeSource.EmployeeDict && UnitTypeUtil.IsOffice(second.UnitType))
numbers = LoadEmployees_OfficeExcel(second); numbers = LoadEmployees_OfficeExcel(second);
else if (mode == OverrideMode.EmployeeDict) else if (mode == EmployeeSource.EmployeeDict)
numbers = LoadEmployees_EmployeeDict(second, employees); numbers = LoadEmployees_EmployeeDict(second, employees);
if (numbers == null || numbers.Count == 0) if (numbers == null || numbers.Count == 0)
...@@ -409,11 +416,6 @@ private List<string> LoadEmployees_OfficeExcel(ag_secondallot second) ...@@ -409,11 +416,6 @@ private List<string> LoadEmployees_OfficeExcel(ag_secondallot second)
return numbers; return numbers;
} }
private List<string> LoadEmployees_Save(List<ag_bodysource> saveDatas)
{
return saveDatas.Select(w => w.WorkNumber).ToList();
}
#region 动态生成列头信息 #region 动态生成列头信息
/// <summary> /// <summary>
/// 动态生成列头信息 /// 动态生成列头信息
...@@ -482,7 +484,7 @@ private List<string> LoadEmployees_Save(List<ag_bodysource> saveDatas) ...@@ -482,7 +484,7 @@ private List<string> LoadEmployees_Save(List<ag_bodysource> saveDatas)
private HandsonTableBase ComputeMode_Format1(List<string> colHeaders, List<HandsonColumn> columns) private HandsonTableBase ComputeMode_Format1(List<string> colHeaders, List<HandsonColumn> columns)
{ {
HandsonTableBase handson = new HandsonTableBase(); HandsonTableBase handson = new HandsonTableBase();
handson.ColHeaders.AddRange(new string[] { "工号", "姓名",/* "核算单元",*/ "主管", "职称绩效", "工作量绩效工资", }); handson.ColHeaders.AddRange(new string[] { "工号", "姓名",/* "核算单元", "主管",*/ "职称绩效", "工作量绩效工资", });
handson.Columns.AddRange( handson.Columns.AddRange(
new HandsonColumn[] new HandsonColumn[]
{ {
...@@ -677,13 +679,13 @@ private void clearPerformanceWorkload(List<Dictionary<string, object>> rows, Lis ...@@ -677,13 +679,13 @@ private void clearPerformanceWorkload(List<Dictionary<string, object>> rows, Lis
{ {
foreach (var workload in workloadGroups) foreach (var workload in workloadGroups)
{ {
row.Remove(workload.WorkloadScore); row.AddOrUpdate(workload.WorkloadScore, 0m);
row.Remove(workload.AssessmentScore); row.AddOrUpdate(workload.AssessmentScore, 0m);
row.Remove(workload.WorkPerformance); row.AddOrUpdate(workload.WorkPerformance, 0m);
foreach (var item in workload.Items) foreach (var item in workload.Items)
{ {
row.Remove(item); row.AddOrUpdate(item, 0m);
} }
} }
} }
...@@ -909,6 +911,7 @@ decimal ComputeMode_3(Dictionary<string, object> row, List<TitleValue<string, de ...@@ -909,6 +911,7 @@ decimal ComputeMode_3(Dictionary<string, object> row, List<TitleValue<string, de
}); });
return workload_score; return workload_score;
} }
/// <summary> /// <summary>
/// 2 横向计算 /// 2 横向计算
/// </summary> /// </summary>
...@@ -1082,17 +1085,16 @@ public List<SecondComputeCheckResultDto> CheckData(ag_secondallot second, List<D ...@@ -1082,17 +1085,16 @@ public List<SecondComputeCheckResultDto> CheckData(ag_secondallot second, List<D
if (string.IsNullOrEmpty(number) || string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(number) || string.IsNullOrEmpty(name))
{ {
item.AddOrUpdate(nameof(ResponseType), ResponseType.Warning); item.AddOrUpdate(nameof(ResponseType), ResponseType.Warning);
result.Add(new SecondComputeCheckResultDto(nameof(ResponseType.Warning), number, name, $"第{(i + 1)}行,工号或姓名无效;计算式忽略。")); result.Add(new SecondComputeCheckResultDto(nameof(ResponseType.Warning), "空", "空", $"第{(i + 1)}行,工号或姓名无效;计算式忽略。"));
} }
var emp = employees.FirstOrDefault(w => w.PersonnelNumber == number && w.DoctorName == name); else if (!employees.Any(w => w.PersonnelNumber == number && w.DoctorName == name))
if (emp == null)
{ {
item.AddOrUpdate(nameof(ResponseType), ResponseType.Error); item.AddOrUpdate(nameof(ResponseType), ResponseType.Error);
result.Add(new SecondComputeCheckResultDto(nameof(ResponseType.Error), number, name, $"第{(i + 1)}行,工号和姓名在字典中不存在,请修复。")); result.Add(new SecondComputeCheckResultDto(nameof(ResponseType.Error), number, name, $"第{(i + 1)}行,工号和姓名在字典中不存在,请修复。"));
} }
else else
{ {
var emp = employees.FirstOrDefault(w => w.PersonnelNumber == number && w.DoctorName == name);
item.AddOrUpdate(nameof(ResponseType), ResponseType.OK); item.AddOrUpdate(nameof(ResponseType), ResponseType.OK);
item.AddOrUpdate(nameof(ag_bodysource.Department), emp.AccountingUnit); item.AddOrUpdate(nameof(ag_bodysource.Department), emp.AccountingUnit);
item.AddOrUpdate(nameof(ag_bodysource.ReservedRatio), emp.ReservedRatio); item.AddOrUpdate(nameof(ag_bodysource.ReservedRatio), emp.ReservedRatio);
......
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