读取速度

parent eabaaaf8
...@@ -18,9 +18,10 @@ public static partial class UtilExtensions ...@@ -18,9 +18,10 @@ public static partial class UtilExtensions
/// <returns></returns> /// <returns></returns>
public static T GetValue<T>(this Dictionary<string, object> keyValues, string key, T defaultValue = default(T)) public static T GetValue<T>(this Dictionary<string, object> keyValues, string key, T defaultValue = default(T))
{ {
var pair = keyValues.FirstOrDefault(w => w.Key.Equals(key, StringComparison.OrdinalIgnoreCase)); if (keyValues.TryGetValue(key, out object value))
if (!default(KeyValuePair<string, object>).Equals(pair)) return ConvertHelper.To<T>(value, defaultValue);
return ConvertHelper.To<T>(pair.Value, defaultValue); else if (keyValues.TryGetValue(key.ToLower(), out value))
return ConvertHelper.To<T>(value, defaultValue);
return defaultValue; return defaultValue;
} }
...@@ -33,9 +34,10 @@ public static T GetValue<T>(this Dictionary<string, object> keyValues, string ke ...@@ -33,9 +34,10 @@ public static T GetValue<T>(this Dictionary<string, object> keyValues, string ke
/// <returns></returns> /// <returns></returns>
public static T GetValue<T>(this SortedDictionary<string, object> keyValues, string key, T defaultValue = default(T)) public static T GetValue<T>(this SortedDictionary<string, object> keyValues, string key, T defaultValue = default(T))
{ {
var pair = keyValues.FirstOrDefault(w => w.Key.Equals(key, StringComparison.OrdinalIgnoreCase)); if (keyValues.TryGetValue(key, out object value))
if (!default(KeyValuePair<string, object>).Equals(pair)) return ConvertHelper.To<T>(value, defaultValue);
return ConvertHelper.To<T>(pair.Value, defaultValue); else if (keyValues.TryGetValue(key.ToLower(), out value))
return ConvertHelper.To<T>(value, defaultValue);
return defaultValue; return defaultValue;
} }
...@@ -56,6 +58,38 @@ public static void AddOrUpdate(this Dictionary<string, object> keyValues, string ...@@ -56,6 +58,38 @@ public static void AddOrUpdate(this Dictionary<string, object> keyValues, string
} }
/// <summary> /// <summary>
/// 为了快速读取,忽略大小写,默认:0
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="keyValues"></param>
/// <param name="key"></param>
/// <returns></returns>
public static decimal GetDecimal(this Dictionary<string, object> keyValues, string key)
{
if (keyValues.TryGetValue(key, out object value))
return value == null ? 0m : decimal.Parse(value.ToString());
else if (keyValues.TryGetValue(key.ToLower(), out value))
return value == null ? 0m : decimal.Parse(value.ToString());
return 0m;
}
/// <summary>
/// 为了快速读取,忽略大小写,默认:空值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="keyValues"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string GetString(this Dictionary<string, object> keyValues, string key)
{
if (keyValues.TryGetValue(key, out object value))
return value?.ToString() ?? "";
else if (keyValues.TryGetValue(key.ToLower(), out value))
return value?.ToString() ?? "";
return "";
}
/// <summary>
/// form 转换 键值对 /// form 转换 键值对
/// </summary> /// </summary>
/// <param name="pairs"></param> /// <param name="pairs"></param>
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using Performance.DtoModels.Second; using Performance.DtoModels.Second;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System.Diagnostics;
namespace Performance.Services namespace Performance.Services
{ {
...@@ -578,7 +579,7 @@ public void SupplementOtherPerfor(ag_secondallot second, List<Dictionary<string, ...@@ -578,7 +579,7 @@ public void SupplementOtherPerfor(ag_secondallot second, List<Dictionary<string,
foreach (var row in rows) foreach (var row in rows)
{ {
var personnelNumber = row.GetValue(nameof(ag_bodysource.WorkNumber), ""); var personnelNumber = row.GetString(nameof(ag_bodysource.WorkNumber));
var amounts = perapramounts.Where(w => w.PersonnelNumber?.Trim() == personnelNumber?.Trim()); var amounts = perapramounts.Where(w => w.PersonnelNumber?.Trim() == personnelNumber?.Trim());
row.AddOrUpdate(nameof(ag_bodysource.OtherPerformance), amounts.Sum(w => w.Amount ?? 0)); row.AddOrUpdate(nameof(ag_bodysource.OtherPerformance), amounts.Sum(w => w.Amount ?? 0));
} }
...@@ -589,7 +590,7 @@ public void SupplementOtherPerfor(ag_secondallot second, List<Dictionary<string, ...@@ -589,7 +590,7 @@ public void SupplementOtherPerfor(ag_secondallot second, List<Dictionary<string,
.GroupBy(w => new { PersonnelNumber = w.PersonnelNumber, DoctorName = w.DoctorName, AccountingUnit = w.AccountingUnit, UnitType = w.UnitType, }); .GroupBy(w => new { PersonnelNumber = w.PersonnelNumber, DoctorName = w.DoctorName, AccountingUnit = w.AccountingUnit, UnitType = w.UnitType, });
foreach (var item in groupDatas) foreach (var item in groupDatas)
{ {
if (!rows.Any(row => row.GetValue(nameof(ag_bodysource.WorkNumber), "") == item.Key.PersonnelNumber)) if (!rows.Any(row => row.GetString(nameof(ag_bodysource.WorkNumber)) == item.Key.PersonnelNumber))
{ {
rows.Add(new Dictionary<string, object> rows.Add(new Dictionary<string, object>
{ {
...@@ -636,9 +637,9 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he ...@@ -636,9 +637,9 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he
// 清空无效数据 // 清空无效数据
clearPerformanceWorkload(rows, workloadGroups); clearPerformanceWorkload(rows, workloadGroups);
// 行内可分配绩效 // 行内可分配绩效
distPerformanceCalculate(head, rows, workloadGroups); distPerformanceCalculate(rows);
// 行内实发绩效 // 行内实发绩效
realAmountCalculate(head, rows, specialPostName); realAmountCalculate(rows);
} }
else if (computeMode == ComputeMode.Horizontal || computeMode == ComputeMode.Vertical) else if (computeMode == ComputeMode.Horizontal || computeMode == ComputeMode.Vertical)
{ {
...@@ -657,11 +658,11 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he ...@@ -657,11 +658,11 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he
// 行内工作量分组计算 // 行内工作量分组计算
workloadCalculate(head, rows, computeMode, loads, workloadGroups, specialPostName); workloadCalculate(head, rows, computeMode, loads, workloadGroups, specialPostName);
// 行内可分配绩效 // 行内可分配绩效
distPerformanceCalculate(head, rows, workloadGroups); distPerformanceCalculate(rows);
// 差额从主任或第一个人身上扣除 // 差额从主任或第一个人身上扣除
balanceTotalDistPerformance(head, rows, specialPostName); balanceTotalDistPerformance(head, rows, specialPostName);
// 行内实发绩效 // 行内实发绩效
realAmountCalculate(head, rows, specialPostName); realAmountCalculate(rows);
} }
} }
...@@ -769,7 +770,7 @@ private void basisPerformanceCalculate(Dictionary<string, object> head, List<Dic ...@@ -769,7 +770,7 @@ private void basisPerformanceCalculate(Dictionary<string, object> head, List<Dic
{ {
// 除 科主任/护士长 以外人员没有 主任基础绩效 // 除 科主任/护士长 以外人员没有 主任基础绩效
// 当前行主任基础绩效 = 科室人均 * 当前行人员系数 * 当前行人员出勤/满勤天数 // 当前行主任基础绩效 = 科室人均 * 当前行人员系数 * 当前行人员出勤/满勤天数
var post = row.GetValue(nameof(ag_bodysource.Post), ""); var post = row.GetString(nameof(ag_bodysource.Post));
if (specialPostName.Contains(post)) if (specialPostName.Contains(post))
{ {
var daysFullAttendance = GetDecimal2(head, nameof(ag_headsource.DaysFullAttendance)); var daysFullAttendance = GetDecimal2(head, nameof(ag_headsource.DaysFullAttendance));
...@@ -798,7 +799,7 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic ...@@ -798,7 +799,7 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic
var total_titleCoefficient = 0m; var total_titleCoefficient = 0m;
foreach (var row in rows) foreach (var row in rows)
{ {
var post = row.GetValue(nameof(ag_bodysource.Post), ""); var post = row.GetString(nameof(ag_bodysource.Post));
if (!specialPostName.Contains(post)) if (!specialPostName.Contains(post))
total_titleCoefficient += GetDecimal2(row, nameof(ag_bodysource.ActualAttendance)) * GetDecimal2(row, nameof(ag_bodysource.TitleCoefficient)); total_titleCoefficient += GetDecimal2(row, nameof(ag_bodysource.ActualAttendance)) * GetDecimal2(row, nameof(ag_bodysource.TitleCoefficient));
} }
...@@ -806,7 +807,7 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic ...@@ -806,7 +807,7 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic
var seniorityTitlesPerformance = GetDecimal2(head, nameof(ag_headsource.SeniorityTitlesPerformance)); var seniorityTitlesPerformance = GetDecimal2(head, nameof(ag_headsource.SeniorityTitlesPerformance));
foreach (var row in rows) foreach (var row in rows)
{ {
var post = row.GetValue(nameof(ag_bodysource.Post), ""); var post = row.GetString(nameof(ag_bodysource.Post));
// 科主任/护士长 不参与职称绩效考核 // 科主任/护士长 不参与职称绩效考核
if (specialPostName.Contains(post)) if (specialPostName.Contains(post))
row.AddOrUpdate(nameof(ag_bodysource.TitleCoefficient), 0m); row.AddOrUpdate(nameof(ag_bodysource.TitleCoefficient), 0m);
...@@ -848,21 +849,19 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic ...@@ -848,21 +849,19 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic
row.AddOrUpdate(gp.WorkloadScore, GetDecimal2(workload_score)); row.AddOrUpdate(gp.WorkloadScore, GetDecimal2(workload_score));
} }
} }
// 工作量每分价格计算 // 工作量每分价格计算
foreach (var gp in workloadGroups) foreach (var gp in workloadGroups)
{ {
// 汇总行内工作量总得分 // 汇总行内工作量总得分
var total_score = rows.Sum(row => GetDecimal2(row, gp.WorkloadScore) * GetDecimal2(row, gp.AssessmentScore)); var total_score = rows.Sum(row => GetDecimal2(row, gp.WorkloadScore) * GetDecimal2(row, gp.AssessmentScore));
// 计算每分价格 // 计算每分价格
gp.Unit_Price = total_score == 0 ? 0 : head.GetValue($"Workload_Amount_{gp.Name}", 0m) / total_score; gp.Unit_Price = total_score == 0 ? 0 : head.GetDecimal($"Workload_Amount_{gp.Name}") / total_score;
} }
// 行内工作量绩效计算 // 行内工作量绩效计算
foreach (var row in rows) foreach (var row in rows)
{ {
var workPerformance = 0m; var workPerformance = 0m;
var post = row.GetValue(nameof(ag_bodysource.Post), ""); var post = row.GetString(nameof(ag_bodysource.Post));
foreach (var gp in workloadGroups) foreach (var gp in workloadGroups)
{ {
// 科主任/护士长 不参与工作量考核 // 科主任/护士长 不参与工作量考核
...@@ -872,7 +871,7 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic ...@@ -872,7 +871,7 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic
row.AddOrUpdate(gp.AssessmentScore, 0m); row.AddOrUpdate(gp.AssessmentScore, 0m);
} }
// 工作量绩效 = 工作量得分 * 每分价格 * 考核得分 // 工作量绩效 = 工作量得分 * 每分价格 * 考核得分
var workload_fee = GetDecimal2(row.GetValue(gp.WorkloadScore, 0m) * gp.Unit_Price * row.GetValue(gp.AssessmentScore, 0m)); var workload_fee = GetDecimal2(row.GetDecimal(gp.WorkloadScore) * gp.Unit_Price * row.GetDecimal(gp.AssessmentScore));
row.AddOrUpdate(gp.WorkPerformance, workload_fee); row.AddOrUpdate(gp.WorkPerformance, workload_fee);
workPerformance += workload_fee; workPerformance += workload_fee;
} }
...@@ -900,14 +899,13 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic ...@@ -900,14 +899,13 @@ private void titleCoefficientCalculate(Dictionary<string, object> head, List<Dic
/// <returns></returns> /// <returns></returns>
decimal ComputeMode_3(Dictionary<string, object> row, List<TitleValue<string, decimal?>> loads, SecondWorkLoadDto gp, string[] specialPostName) decimal ComputeMode_3(Dictionary<string, object> row, List<TitleValue<string, decimal?>> loads, SecondWorkLoadDto gp, string[] specialPostName)
{ {
var post = row.GetValue(nameof(ag_bodysource.Post), ""); var post = row.GetString(nameof(ag_bodysource.Post));
var workload_score = gp.Items.Sum((item) => var workload_score = gp.Items.Sum((item) =>
{ {
// 科主任/护士长 不参与工作量考核 // 科主任/护士长 不参与工作量考核
if (specialPostName.Contains(post)) if (specialPostName.Contains(post))
row.AddOrUpdate(item, 0); row.AddOrUpdate(item.ToLower(), 0);
return GetDecimal2(row.GetDecimal(item.ToLower()) * getFactorValue(loads, item));
return GetDecimal2(row.GetValue(item, 0m) * getFactorValue(loads, item));
}); });
return workload_score; return workload_score;
} }
...@@ -920,7 +918,7 @@ decimal ComputeMode_3(Dictionary<string, object> row, List<TitleValue<string, de ...@@ -920,7 +918,7 @@ decimal ComputeMode_3(Dictionary<string, object> row, List<TitleValue<string, de
/// <returns></returns> /// <returns></returns>
decimal ComputeMode_2(Dictionary<string, object> row, SecondWorkLoadDto gp, string[] specialPostName) decimal ComputeMode_2(Dictionary<string, object> row, SecondWorkLoadDto gp, string[] specialPostName)
{ {
var post = row.GetValue(nameof(ag_bodysource.Post), ""); var post = row.GetString(nameof(ag_bodysource.Post));
var workload_score = 0m; var workload_score = 0m;
if (gp.Items.Count % 2 == 0) if (gp.Items.Count % 2 == 0)
{ {
...@@ -932,7 +930,7 @@ decimal ComputeMode_2(Dictionary<string, object> row, SecondWorkLoadDto gp, stri ...@@ -932,7 +930,7 @@ decimal ComputeMode_2(Dictionary<string, object> row, SecondWorkLoadDto gp, stri
row.AddOrUpdate(gp.Items[i], 0m); row.AddOrUpdate(gp.Items[i], 0m);
row.AddOrUpdate(gp.Items[i + 1], 0m); row.AddOrUpdate(gp.Items[i + 1], 0m);
} }
var amount = row.GetValue(gp.Items[i], 0m) * row.GetValue(gp.Items[i + 1], 0m); var amount = row.GetDecimal(gp.Items[i]) * row.GetDecimal(gp.Items[i + 1]);
workload_score += GetDecimal2(amount); workload_score += GetDecimal2(amount);
} }
} }
...@@ -946,7 +944,7 @@ decimal ComputeMode_2(Dictionary<string, object> row, SecondWorkLoadDto gp, stri ...@@ -946,7 +944,7 @@ decimal ComputeMode_2(Dictionary<string, object> row, SecondWorkLoadDto gp, stri
/// <param name="head"></param> /// <param name="head"></param>
/// <param name="rows"></param> /// <param name="rows"></param>
/// <param name="workloadGroups"></param> /// <param name="workloadGroups"></param>
private void distPerformanceCalculate(Dictionary<string, object> head, List<Dictionary<string, object>> rows, List<SecondWorkLoadDto> workloadGroups) private void distPerformanceCalculate(List<Dictionary<string, object>> rows)
{ {
foreach (var row in rows) foreach (var row in rows)
{ {
...@@ -973,7 +971,7 @@ private void balanceTotalDistPerformance(Dictionary<string, object> head, List<D ...@@ -973,7 +971,7 @@ private void balanceTotalDistPerformance(Dictionary<string, object> head, List<D
if (Math.Abs(difference) <= 1) if (Math.Abs(difference) <= 1)
{ {
var atRow = rows.Where(row => specialPostName.Contains(row.GetValue(nameof(ag_bodysource.Post), ""))); var atRow = rows.Where(row => specialPostName.Contains(row.GetString(nameof(ag_bodysource.Post))));
if (atRow == null || atRow.Count() == 0) if (atRow == null || atRow.Count() == 0)
atRow = rows; atRow = rows;
...@@ -990,7 +988,7 @@ private void balanceTotalDistPerformance(Dictionary<string, object> head, List<D ...@@ -990,7 +988,7 @@ private void balanceTotalDistPerformance(Dictionary<string, object> head, List<D
/// <param name="head"></param> /// <param name="head"></param>
/// <param name="rows"></param> /// <param name="rows"></param>
/// <param name="specialPostName"></param> /// <param name="specialPostName"></param>
private void realAmountCalculate(Dictionary<string, object> head, List<Dictionary<string, object>> rows, string[] specialPostName) private void realAmountCalculate(List<Dictionary<string, object>> rows)
{ {
foreach (var row in rows) foreach (var row in rows)
{ {
...@@ -1012,7 +1010,7 @@ private void realAmountCalculate(Dictionary<string, object> head, List<Dictionar ...@@ -1012,7 +1010,7 @@ private void realAmountCalculate(Dictionary<string, object> head, List<Dictionar
/// <param name="pairs"></param> /// <param name="pairs"></param>
/// <param name="key"></param> /// <param name="key"></param>
/// <returns></returns> /// <returns></returns>
private decimal GetDecimal2(Dictionary<string, object> pairs, string key) => GetDecimal2(pairs.GetValue(key, 0m)); private decimal GetDecimal2(Dictionary<string, object> pairs, string key) => GetDecimal2(pairs.GetDecimal(key));
/// <summary> /// <summary>
/// decimal?类型转换decimal 默认:0,保留2位小数 /// decimal?类型转换decimal 默认:0,保留2位小数
...@@ -1078,8 +1076,8 @@ public List<SecondComputeCheckResultDto> CheckData(ag_secondallot second, List<D ...@@ -1078,8 +1076,8 @@ public List<SecondComputeCheckResultDto> CheckData(ag_secondallot second, List<D
var item = body[i]; var item = body[i];
if (item.Where(w => w.Value != null && !string.IsNullOrEmpty(w.Value.ToString())).Count() > 0) if (item.Where(w => w.Value != null && !string.IsNullOrEmpty(w.Value.ToString())).Count() > 0)
{ {
var number = item.GetValue(nameof(ag_bodysource.WorkNumber), ""); var number = item.GetString(nameof(ag_bodysource.WorkNumber));
var name = item.GetValue(nameof(ag_bodysource.Name), ""); var name = item.GetString(nameof(ag_bodysource.Name));
if (string.IsNullOrEmpty(number) || string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(number) || string.IsNullOrEmpty(name))
{ {
......
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