二次分配日志及细节

parent f40cbd61
...@@ -73,7 +73,7 @@ public class RequestRateLimitingMiddleware ...@@ -73,7 +73,7 @@ public class RequestRateLimitingMiddleware
var response = new ApiResponse var response = new ApiResponse
{ {
State = ResponseType.TooManyRequests, State = ResponseType.TooManyRequests,
Message = "访问过于频繁,请稍后重试" Message = "您的操作正在处理,请稍等片刻!"
}; };
await context.Response.WriteAsync(JsonHelper.Serialize(response)); await context.Response.WriteAsync(JsonHelper.Serialize(response));
} }
......
...@@ -38,7 +38,13 @@ ...@@ -38,7 +38,13 @@
"HttpPost": "http://localhost:50997/api/" "HttpPost": "http://localhost:50997/api/"
}, },
"RateLimitingConfig": { "RateLimitingConfig": {
"Endpoints": [ "/api/second/savevalue", "/api/second/savedata", "/api/second/other/save" ], "Endpoints": [
"/api/second/savevalue",
"/api/second/savedata",
"/api/second/other/save",
"/api/second/redistribution/save",
"/api/second/redistribution/submit"
],
"Period": "1", // 单位为秒 "Period": "1", // 单位为秒
"Limit": 1 "Limit": 1
} }
......
...@@ -1628,7 +1628,7 @@ ...@@ -1628,7 +1628,7 @@
</member> </member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionCompute(Performance.DtoModels.SecondComputeDto)"> <member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionCompute(Performance.DtoModels.SecondComputeDto)">
<summary> <summary>
二次绩效录入页面 二次绩效结果计算
</summary> </summary>
<param name="request"></param> <param name="request"></param>
<returns></returns> <returns></returns>
......
...@@ -3768,7 +3768,7 @@ ...@@ -3768,7 +3768,7 @@
</member> </member>
<member name="F:Performance.DtoModels.Second.ComputeMode.NotCalculate"> <member name="F:Performance.DtoModels.Second.ComputeMode.NotCalculate">
<summary> <summary>
不计算 填报(不计算)
</summary> </summary>
</member> </member>
<member name="F:Performance.DtoModels.Second.ComputeMode.Horizontal"> <member name="F:Performance.DtoModels.Second.ComputeMode.Horizontal">
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Text; using System.Text;
namespace Performance.DtoModels.Second namespace Performance.DtoModels.Second
...@@ -10,16 +11,19 @@ namespace Performance.DtoModels.Second ...@@ -10,16 +11,19 @@ namespace Performance.DtoModels.Second
public enum ComputeMode public enum ComputeMode
{ {
/// <summary> /// <summary>
/// 不计算 /// 填报(不计算)
/// </summary> /// </summary>
[Description("填报")]
NotCalculate = 11, NotCalculate = 11,
/// <summary> /// <summary>
/// 横向计算 /// 横向计算
/// </summary> /// </summary>
[Description("横向计算")]
Horizontal = 12, Horizontal = 12,
/// <summary> /// <summary>
/// 纵向计算 /// 纵向计算
/// </summary> /// </summary>
[Description("纵向计算")]
Vertical = 13, Vertical = 13,
} }
} }
...@@ -124,7 +124,7 @@ public SecondDetailDto Load(int secondId, ComputeMode computeMode, EmployeeSourc ...@@ -124,7 +124,7 @@ public SecondDetailDto Load(int secondId, ComputeMode computeMode, EmployeeSourc
} }
var head = LoadHead(computeMode, allot, second); var head = LoadHead(computeMode, allot, second);
var dic = GetTableHeaderDictionary(second, loads); var dic = GetTableHeaderDictionary(computeMode, second, loads);
return new SecondDetailDto { Head = head, Body = handson, Dic = dic }; return new SecondDetailDto { Head = head, Body = handson, Dic = dic };
} }
...@@ -135,7 +135,7 @@ public SecondDetailDto Load(int secondId, ComputeMode computeMode, EmployeeSourc ...@@ -135,7 +135,7 @@ public SecondDetailDto Load(int secondId, ComputeMode computeMode, EmployeeSourc
/// <param name="second"></param> /// <param name="second"></param>
/// <param name="loads"></param> /// <param name="loads"></param>
/// <returns></returns> /// <returns></returns>
public List<SecondColumnDictionary> GetTableHeaderDictionary(ag_secondallot second, List<TitleValue<string, decimal?>> loads) public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode computeMode, ag_secondallot second, List<TitleValue<string, decimal?>> loads)
{ {
var maps = new List<SecondColumnDictionary>() var maps = new List<SecondColumnDictionary>()
{ {
...@@ -164,29 +164,29 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ag_secondallot seco ...@@ -164,29 +164,29 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ag_secondallot seco
}; };
// 工作量 // 工作量
int sort = 300; if (computeMode != ComputeMode.NotCalculate)
foreach (var item in loads.Where(w => !w.Title.StartsWithIgnoreCase("SingleAwards_")))
{ {
maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++sort, type: "Workload")); int workloadSort = 300;
foreach (var item in loads.Where(w => !w.Title.StartsWithIgnoreCase("SingleAwards_")))
{
maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++workloadSort, type: "Workload"));
}
// 多工作量加载
var headDynamic = _agworktypesourceRepository.GetEntities(t => t.SecondId == second.Id);
if (headDynamic != null && headDynamic.Any())
{
foreach (var item in headDynamic.OrderBy(t => t.Id))
{
maps.Add(new SecondColumnDictionary(item.FieldName, item.FieldId, true, 1, "Top"));
}
}
} }
// 单项奖励 // 单项奖励
sort = 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, ++sort, type: "SingleAwards")); maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++singleAwardsSort, type: "SingleAwards"));
}
// 多工作量加载
var headDynamic = _agworktypesourceRepository.GetEntities(t => t.SecondId == second.Id);
if (headDynamic != null && headDynamic.Any())
{
foreach (var item in headDynamic.Where(w => w.FieldId.StartsWithIgnoreCase("Workload_Ratio_")).OrderBy(t => t.Id))
{
maps.Add(new SecondColumnDictionary(item.FieldName, item.FieldId, true, 1, "Top"));
}
} }
return maps.OrderBy(w => w.Sort).ToList(); return maps.OrderBy(w => w.Sort).ToList();
} }
...@@ -253,6 +253,11 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ag_secondallot seco ...@@ -253,6 +253,11 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ag_secondallot seco
{ {
var head = new Dictionary<string, object>(); var head = new Dictionary<string, object>();
// 公共顶部信息 // 公共顶部信息
head.AddOrUpdate(nameof(second.Department), second.Department);
head.AddOrUpdate(nameof(second.UnitType), second.UnitType);
head.AddOrUpdate(nameof(ComputeMode), computeMode);
head.AddOrUpdate("ComputeModeDescription", EnumHelper.GetDescription(computeMode));
head.AddOrUpdate(nameof(ag_headsource.SecondId), second.Id); head.AddOrUpdate(nameof(ag_headsource.SecondId), second.Id);
head.AddOrUpdate(nameof(ag_headsource.PaymentOfTheMonth), $"{allot.Year}{allot.Month.ToString().PadLeft(2, '0')}月"); head.AddOrUpdate(nameof(ag_headsource.PaymentOfTheMonth), $"{allot.Year}{allot.Month.ToString().PadLeft(2, '0')}月");
head.AddOrUpdate(nameof(ag_headsource.TotalDistPerformance), second.RealGiveFee ?? 0); head.AddOrUpdate(nameof(ag_headsource.TotalDistPerformance), second.RealGiveFee ?? 0);
...@@ -549,7 +554,7 @@ private HandsonTableBase ComputeMode_Format3(List<string> colHeaders, List<Hands ...@@ -549,7 +554,7 @@ private HandsonTableBase ComputeMode_Format3(List<string> colHeaders, List<Hands
var fs = handson.Columns.Select(col => var fs = handson.Columns.Select(col =>
{ {
var f = loads.FirstOrDefault(w => w.Title.StartsWithIgnoreCase($"Workload_") && w.Title.EqualsIgnoreCase(col.Data)); var f = loads.FirstOrDefault(w => w.Title.StartsWithIgnoreCase($"Workload_") && w.Title.EqualsIgnoreCase(col.Data));
return f == null ? "" : (f.State ?? 0).ToString("F0"); return f == null ? "" : (f.State ?? 0).ToString("0.####"); ;
}); });
handson.NestedHeadersArray.Add(handson.ColHeaders); handson.NestedHeadersArray.Add(handson.ColHeaders);
...@@ -613,7 +618,7 @@ public void SupplementOtherPerfor(ag_secondallot second, List<Dictionary<string, ...@@ -613,7 +618,7 @@ public void SupplementOtherPerfor(ag_secondallot second, List<Dictionary<string,
/// </summary> /// </summary>
/// <param name="head"></param> /// <param name="head"></param>
/// <param name="rows"></param> /// <param name="rows"></param>
public void OverviewCalculate_OtherPerformance(Dictionary<string, object> head, List<Dictionary<string, object>> rows) private void otherPerformance(Dictionary<string, object> head, List<Dictionary<string, object>> rows)
{ {
//医院其他绩效总和 //医院其他绩效总和
var otherPerformance = rows.Sum(row => GetDecimal2(row, nameof(ag_bodysource.OtherPerformance))); var otherPerformance = rows.Sum(row => GetDecimal2(row, nameof(ag_bodysource.OtherPerformance)));
...@@ -669,6 +674,22 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he ...@@ -669,6 +674,22 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he
} }
/// <summary> /// <summary>
/// 重算顶部医院其他绩效、重算行内实发绩效、重算顶部工作量
/// </summary>
/// <param name="head"></param>
/// <param name="rows"></param>
public void RedistributionCompute(ComputeMode computeMode, Dictionary<string, object> head, List<Dictionary<string, object>> rows)
{
// 重算顶部医院其他绩效
otherPerformance(head, rows);
// 重算行内实发绩效
realAmountCalculate(rows);
// 重算顶部工作量
if (computeMode != ComputeMode.NotCalculate)
overviewCalculate(head, rows);
}
/// <summary>
/// ComputeMode.NotCalculate 不计算时,清空无效数据 /// ComputeMode.NotCalculate 不计算时,清空无效数据
/// </summary> /// </summary>
/// <param name="rows"></param> /// <param name="rows"></param>
...@@ -733,12 +754,12 @@ private void topSeniorityCalculate(Dictionary<string, object> head) ...@@ -733,12 +754,12 @@ private void topSeniorityCalculate(Dictionary<string, object> head)
/// <param name="rows"></param> /// <param name="rows"></param>
private void overviewCalculate(Dictionary<string, object> head, List<Dictionary<string, object>> rows) private void overviewCalculate(Dictionary<string, object> head, List<Dictionary<string, object>> rows)
{ {
// 可分配绩效(顶栏) = 科室总绩效 - 夜班绩效(顶栏)
var totalPerformance = GetDecimal2(head, nameof(ag_headsource.TotalDistPerformance)) - GetDecimal2(head, nameof(ag_headsource.NightShiftWorkPerforTotal));
head.AddOrUpdate(nameof(ag_headsource.TotalPerformance), totalPerformance);
//夜班工作量绩效总和 //夜班工作量绩效总和
var nightShiftWorkPerforTotal = rows.Sum(row => GetDecimal2(row, nameof(ag_bodysource.NightWorkPerformance))); var nightShiftWorkPerforTotal = rows.Sum(row => GetDecimal2(row, nameof(ag_bodysource.NightWorkPerformance)));
head.AddOrUpdate(nameof(ag_headsource.NightShiftWorkPerforTotal), nightShiftWorkPerforTotal); head.AddOrUpdate(nameof(ag_headsource.NightShiftWorkPerforTotal), nightShiftWorkPerforTotal);
// 可分配绩效(顶栏) = 科室总绩效 - 夜班绩效(顶栏)
var totalPerformance = GetDecimal2(head, nameof(ag_headsource.TotalDistPerformance)) - GetDecimal2(head, nameof(ag_headsource.NightShiftWorkPerforTotal));
head.AddOrUpdate(nameof(ag_headsource.TotalPerformance), totalPerformance);
////医院其他绩效总和 ////医院其他绩效总和
//var otherPerformance = rows.Sum(row => GetDecimal2(row, nameof(ag_bodysource.OtherPerformance))); //var otherPerformance = rows.Sum(row => GetDecimal2(row, nameof(ag_bodysource.OtherPerformance)));
//head.AddOrUpdate(nameof(ag_headsource.HosOtherPerformance), otherPerformance); //head.AddOrUpdate(nameof(ag_headsource.HosOtherPerformance), otherPerformance);
...@@ -1085,12 +1106,12 @@ public List<SecondComputeCheckResultDto> CheckData(ag_secondallot second, List<D ...@@ -1085,12 +1106,12 @@ 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), "空", "空", $"第{(i + 1)}行,工号或姓名无效;计算式忽略。")); result.Add(new SecondComputeCheckResultDto(nameof(ResponseType.Error), "空", "空", $"第{(i + 1)}行,工号或姓名无效;请删除!"));
} }
else if (!employees.Any(w => w.PersonnelNumber == number && w.DoctorName == name)) else if (!employees.Any(w => w.PersonnelNumber == number && w.DoctorName == name))
{ {
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
{ {
......
...@@ -477,26 +477,23 @@ public void SaveSecondAllotData(int secondId, dynamic saveData) ...@@ -477,26 +477,23 @@ public void SaveSecondAllotData(int secondId, dynamic saveData)
/// </summary> /// </summary>
/// <param name="secondId"></param> /// <param name="secondId"></param>
/// <param name="json"></param> /// <param name="json"></param>
private void SaveSecondAllotHeadData(int secondId, string json) public void SaveSecondAllotHeadData(int secondId, string json)
{ {
if (string.IsNullOrEmpty(json)) return; if (string.IsNullOrEmpty(json)) return;
ag_headsource headsource = JsonHelper.Deserialize<ag_headsource>(json); ag_headsource headsource = JsonHelper.Deserialize<ag_headsource>(json);
if (headsource == null) return; if (headsource == null) return;
headsource.SecondId = secondId; var exist = agheadsourceRepository.GetEntity(w => w.SecondId == secondId);
if (headsource.Id == 0) if (exist != null)
{ agheadsourceRepository.Remove(exist);
agheadsourceRepository.Add(headsource);
} headsource.SecondId = exist.SecondId;
else agheadsourceRepository.Add(headsource);
{
agheadsourceRepository.UpdateByState(headsource);
}
string[] prefix = new string[] { "Workload_Ratio_", "Workload_Amount_" }; string[] prefix = new string[] { "Workload_Ratio_", "Workload_Amount_" };
Dictionary<string, object> dict = JsonHelper.Deserialize<Dictionary<string, object>>(json); Dictionary<string, object> dict = JsonHelper.Deserialize<Dictionary<string, object>>(json);
var keys = dict.Keys.Where(t => t.StartsWith(prefix[0]) || t.StartsWith(prefix[1])); var keys = dict.Keys.Where(t => t.StartsWithIgnoreCase(prefix[0]) || t.StartsWithIgnoreCase(prefix[1]));
if (keys == null || !keys.Any()) if (keys == null || !keys.Any())
return; return;
...@@ -507,7 +504,7 @@ private void SaveSecondAllotHeadData(int secondId, string json) ...@@ -507,7 +504,7 @@ private void SaveSecondAllotHeadData(int secondId, string json)
foreach (var key in keys) foreach (var key in keys)
{ {
var update = worktypeSources.FirstOrDefault(t => t.FieldId == key); var update = worktypeSources.FirstOrDefault(t => t.FieldId.EqualsIgnoreCase(key));
if (update != null) if (update != null)
{ {
update.Value = ConvertHelper.To<decimal>(dict[key]); update.Value = ConvertHelper.To<decimal>(dict[key]);
...@@ -522,7 +519,7 @@ private void SaveSecondAllotHeadData(int secondId, string json) ...@@ -522,7 +519,7 @@ private void SaveSecondAllotHeadData(int secondId, string json)
/// <param name="hospitalId"></param> /// <param name="hospitalId"></param>
/// <param name="second"></param> /// <param name="second"></param>
/// <param name="body"></param> /// <param name="body"></param>
private void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dynamic body) public void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dynamic body)
{ {
// 允许空行数据提交,删除数据库存数数据 // 允许空行数据提交,删除数据库存数数据
var bodyEntities = agbodysourceRepository.GetEntities(t => t.SecondId == second.Id); var bodyEntities = agbodysourceRepository.GetEntities(t => t.SecondId == second.Id);
...@@ -551,12 +548,12 @@ private void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dyna ...@@ -551,12 +548,12 @@ private void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dyna
if (!result) continue; if (!result) continue;
Dictionary<string, object> dict = JsonHelper.Deserialize<Dictionary<string, object>>(JsonHelper.Serialize(rowitem)); Dictionary<string, object> dict = JsonHelper.Deserialize<Dictionary<string, object>>(JsonHelper.Serialize(rowitem));
var keys = dict.Keys.Where(t => t.StartsWith(prefix[0]) || t.StartsWith(prefix[1]) || t.StartsWith(prefix[2]) || t.StartsWith(prefix[3]) || t.StartsWith(prefix[4])); var keys = dict.Keys.Where(t => t.StartsWithIgnoreCase(prefix[0]) || t.StartsWithIgnoreCase(prefix[1]) || t.StartsWithIgnoreCase(prefix[2]) || t.StartsWithIgnoreCase(prefix[3]) || t.StartsWithIgnoreCase(prefix[4]));
if (keys == null || !keys.Any()) continue; if (keys == null || !keys.Any()) continue;
foreach (var key in keys) foreach (var key in keys)
{ {
var workload = workloads.FirstOrDefault(t => t.ItemId == key); var workload = workloads.FirstOrDefault(t => t.ItemId.EqualsIgnoreCase(key));
if (workload == null) continue; if (workload == null) continue;
workloadSources.Add(new ag_workload_source workloadSources.Add(new ag_workload_source
...@@ -576,6 +573,23 @@ private void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dyna ...@@ -576,6 +573,23 @@ private void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dyna
agworkloadsourceRepository.AddRange(workloadSources.ToArray()); agworkloadsourceRepository.AddRange(workloadSources.ToArray());
} }
public bool RedistributionSave(per_allot allot, ag_secondallot second, Dictionary<string, object> head, List<Dictionary<string, object>> rows)
{
try
{
SaveSecondAllotHeadData(second.Id, JsonHelper.Serialize(head));
SaveSecondAllotBodyData(allot.HospitalId, second, rows);
return true;
}
catch (Exception ex)
{
logger.LogError(ex.ToString());
}
return false;
}
#endregion #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