Commit 86af1c0c by lcx

保存接口调整、保证提交审核后数据和提交时数据一致,对workloadtype、workload进行统一修改(添加worktype时补充非提交二次的worktyp…

保存接口调整、保证提交审核后数据和提交时数据一致,对workloadtype、workload进行统一修改(添加worktype时补充非提交二次的worktypesource,删除时删除非提交二次的worktypesource,加载详情时对该次二次绩效的worktypesource进行补充),worktype、workload字典接口修改
parent 24774025
......@@ -87,7 +87,7 @@ public enum AgWorkloadType
/// <summary>
/// 单项奖励
/// </summary>
SingleAwards = 1,
SingleAwards = -1,
/// <summary>
/// 工作量
/// </summary>
......
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
// <copyright file=" ag_workload_source.cs">
// * FileName: .cs
// </copyright>
......@@ -34,6 +34,31 @@ public class ag_workload_source
/// <summary>
///
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 工作量考核项ID
/// </summary>
public string ItemId { get; set; }
/// <summary>
/// 工作量名称
/// </summary>
public string ItemName { get; set; }
/// <summary>
/// 工作量系数
/// </summary>
public Nullable<decimal> FactorValue { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> Sort { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> Value { get; set; }
}
}
......@@ -15,6 +15,11 @@ public partial class SecondAllotService : IAutoInjection
{
#region 二次绩效详情
private bool IsAudit(int? secondStatus)
{
return new int[] { 2, 3 }.Contains(secondStatus ?? 1);
}
public SecondAllotResponse GetSecondSavedData(int userId, int secondId, int employeeSource)
{
var second = agsecondallotRepository.GetEntity(t => t.Id == secondId);
......@@ -23,6 +28,9 @@ public SecondAllotResponse GetSecondSavedData(int userId, int secondId, int empl
var allot = perallotRepository.GetEntity(t => t.ID == second.AllotId);
if (allot == null) throw new PerformanceException("绩效记录不存在!");
if (!IsAudit(second.Status))
AddWorkTypeDefaultHeadValue(allot.HospitalId, second);
var detail = new Detail()
{
TempId = GetUsingTempId(allot.HospitalId, second),
......@@ -99,7 +107,7 @@ private JArray GetBodyItemsByEmployeeSource(int userId, int employeeSource, ag_s
}
SupplementOtherPerfor(second, bodysources, employeeList);
return GetBodyResult(allot.HospitalId, second, bodysources);
return IsAudit(second.Status) ? GetBodyResultAfterAudit(allot.HospitalId, second, bodysources) : GetBodyResult(allot.HospitalId, second, bodysources);
}
/// <summary>
......@@ -249,7 +257,7 @@ private JArray GetBodyResult(int hospitalId, ag_secondallot second, List<ag_body
?.OrderBy(t => t.WorkTypeId).ThenBy(t => t.Sort).ToList();
if (workloads != null && workloads.Any())
{
foreach (var item in bodysources.OrderBy(t => t.RowNumber).ThenBy(t => t.Id))
foreach (var item in bodysources.OrderBy(t => t.Id))
{
JObject jObj = JObject.Parse(JsonConvert.SerializeObject(item)); //使用jsonHelper会自动隐藏空值的项
foreach (var workitem in workloads)
......@@ -263,6 +271,39 @@ private JArray GetBodyResult(int hospitalId, ag_secondallot second, List<ag_body
return jArray;
}
/// <summary>
/// 获取审核通过后body的结果集
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="second"></param>
/// <param name="bodysources"></param>
/// <returns></returns>
private JArray GetBodyResultAfterAudit(int hospitalId, ag_secondallot second, List<ag_bodysource> bodysources)
{
JArray jArray = new JArray();
if (bodysources == null || !bodysources.Any())
return jArray;
var bodyDynamic = agworkloadsourceRepository.GetEntities(t => bodysources.Select(w => w.Id).Contains(t.BodyId));
foreach (var item in bodysources.OrderBy(t => t.Id))
{
JObject jObj = JObject.Parse(JsonConvert.SerializeObject(item)); //使用jsonHelper会自动隐藏空值的项
if (bodyDynamic != null && bodyDynamic.Any(t => t.BodyId == item.Id))
{
foreach (var col in bodyDynamic.Where(t => t.BodyId == item.Id))
{
jObj.Add(new JProperty(col.ItemId, col.Value));
}
}
jArray.Add(jObj);
}
return jArray;
}
/// <summary>
/// 获取当前使用的模板
/// </summary>
......@@ -275,7 +316,7 @@ private int GetUsingTempId(int hospitalId, ag_secondallot second)
var usedTemp = agusetempRepository.GetEntity(t => t.HospitalId == hospitalId && t.Department == second.Department && t.UnitType == second.UnitType);
if (usedTemp == null) return usingTempId;
if (new int[] { 2, 3 }.Contains(second.Status ?? 1))
if (IsAudit(second.Status))
usingTempId = (second.UseTempId ?? 0) == 0 ? (int)Temp.other : second.UseTempId.Value;
return usingTempId;
}
......@@ -363,10 +404,13 @@ public dynamic GetWorkloadDict(int secondId)
var second = agsecondallotRepository.GetEntity(t => t.Id == secondId);
if (second == null) throw new PerformanceException("参数SecondId无效!");
if (IsAudit(second.Status)) return GetWorkloadDictAfterAudit(secondId);
var allot = perallotRepository.GetEntity(t => t.ID == second.AllotId);
if (allot == null) throw new PerformanceException("绩效记录不存在!");
var workloads = agworkloadRepository.GetEntities(t => t.HospitalId == allot.HospitalId && t.Department == second.Department && t.UnitType == second.UnitType) ?? new List<ag_workload>();
var workloads = agworkloadRepository.GetEntities(t => t.HospitalId == allot.HospitalId && t.Department == second.Department && t.UnitType == second.UnitType)
?? new List<ag_workload>();
return workloads.OrderBy(t => t.WorkTypeId).ThenBy(t => t.Sort).Select(t => new
{
Title = t.ItemId,
......@@ -375,6 +419,22 @@ public dynamic GetWorkloadDict(int secondId)
});
}
private dynamic GetWorkloadDictAfterAudit(int secondId)
{
var bodysources = agbodysourceRepository.GetEntities(t => t.SecondId == secondId);
var workloadsources = agworkloadsourceRepository.GetEntities(t => bodysources.Select(w => w.Id).Contains(t.BodyId));
var dict = workloadsources.GroupBy(t => new { t.ItemId, t.ItemName, t.FactorValue }).Select(t => new
{
Title = t.Key.ItemId,
Value = t.Key.ItemName,
Factor = t.Key.FactorValue
});
return dict;
}
#endregion
#region 保存数据
......@@ -382,11 +442,17 @@ public void SaveSecondAllotData(int secondId, dynamic saveData)
{
try
{
var second = agsecondallotRepository.GetEntity(t => t.Id == secondId);
if (second == null) throw new PerformanceException("参数SecondId无效!");
var allot = perallotRepository.GetEntity(t => t.ID == second.AllotId);
if (allot == null) throw new PerformanceException("绩效记录不存在!");
var head = saveData["head"];
SaveSecondAllotHeadData(secondId, JsonHelper.Serialize(head));
var body = saveData["body"];
SaveSecondAllotBodyData(secondId, body);
SaveSecondAllotBodyData(allot.HospitalId, second, body);
}
catch (Exception ex)
{
......@@ -406,9 +472,9 @@ private void SaveSecondAllotHeadData(int secondId, string json)
ag_headsource headsource = JsonHelper.Deserialize<ag_headsource>(json);
if (headsource == null) return;
headsource.SecondId = secondId;
if (headsource.Id == 0)
{
headsource.SecondId = secondId;
agheadsourceRepository.Add(headsource);
}
else
......@@ -441,12 +507,13 @@ private void SaveSecondAllotHeadData(int secondId, string json)
/// <summary>
/// 保存Body相关数据
/// </summary>
/// <param name="secondId"></param>
/// <param name="hospitalId"></param>
/// <param name="second"></param>
/// <param name="body"></param>
private void SaveSecondAllotBodyData(int secondId, dynamic body)
private void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dynamic body)
{
// 允许空行数据提交,删除数据库存数数据
var bodyEntities = agbodysourceRepository.GetEntities(t => t.SecondId == secondId);
var bodyEntities = agbodysourceRepository.GetEntities(t => t.SecondId == second.Id);
if (bodyEntities != null && bodyEntities.Any())
{
var workloadEntities = agworkloadsourceRepository.GetEntities(t => bodyEntities.Select(w => w.Id).Contains(t.BodyId));
......@@ -456,33 +523,40 @@ private void SaveSecondAllotBodyData(int secondId, dynamic body)
agbodysourceRepository.RemoveRange(bodyEntities.ToArray());
}
if (body == null || !body.Any()) return;
if (body == null || !((IEnumerable<dynamic>)body).Any()) return;
var workloads = agworkloadRepository.GetEntities(t => t.HospitalId == hospitalId && t.Department == second.Department && t.UnitType == second.UnitType)?.ToList();
if (workloads == null || !workloads.Any()) return;
string[] prefix = new string[] { "WorkloadScore_", "AssessmentScore_", "WorkPerformance_", $"{AgWorkloadType.SingleAwards}_", $"{AgWorkloadType.Workload}_" };
List<ag_workload_source> workloadSources = new List<ag_workload_source>();
foreach (var rowitem in body)
{
ag_bodysource bodySource = JsonHelper.Deserialize<ag_bodysource>(JsonHelper.Serialize(rowitem));
bodySource.SecondId = second.Id;
var result = agbodysourceRepository.Add(bodySource);
if (!result) continue;
Dictionary<string, object> dict = JsonHelper.Deserialize<Dictionary<string, object>>(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]));
if (keys == null || !keys.Any()) continue;
foreach (var key in keys)
{
string[] fields = key.Split('_');
if (fields.Length != 3) continue;
var workload = workloads.FirstOrDefault(t => t.ItemId == key);
if (workload == null) continue;
var workloadId = ConvertHelper.To<int>(fields[3]);
workloadSources.Add(new ag_workload_source
{
WorkloadId = workloadId,
WorkloadId = workload.Id,
BodyId = bodySource.Id,
ItemId = workload.ItemId,
ItemName = workload.ItemName,
FactorValue = workload.FactorValue,
Sort = workload.Sort,
Value = ConvertHelper.To<decimal>(dict[key])
}); ;
});
}
}
if (workloadSources != null && workloadSources.Any())
......
......@@ -1105,10 +1105,12 @@ private void AddWorkTypeDefaultValues(ag_workload_type type)
{
foreach (var item in defaultValues)
{
if (!workItems.Any(t => t.ItemId.StartsWith(item.Item2)))
if (!workItems.Any(t => t.ItemId == $"{item.Item2}_{type.Id}"))
addItems.Add(item);
}
}
else
addItems = defaultValues;
if (addItems == null || !addItems.Any()) return;
......@@ -1120,7 +1122,8 @@ private void AddWorkTypeDefaultValues(ag_workload_type type)
ItemId = $"{t.Item2}_{type.Id}",
ItemName = t.Item1,
FactorValue = null,
Sort = 100 + t.Item3
Sort = 100 + t.Item3,
WorkTypeId = type.Id
});
agworkloadRepository.AddRange(insertData.ToArray());
}
......@@ -1133,10 +1136,7 @@ private void AddWorkTypeDefaultValues(ag_workload_type type)
private void AddWorkTypeDefaultHeadValue(int hospitalId, ag_workload_type type)
{
List<ag_worktype_source> insertData = new List<ag_worktype_source>();
var allots = perallotRepository.GetEntities(t => t.HospitalId == hospitalId);
if (allots == null || !allots.Any()) return;
var seconds = agsecondallotRepository.GetEntities(t => allots.Select(w => w.ID).Contains(t.AllotId.Value) && t.Department == type.Department && t.UnitType == type.UnitType);
var seconds = GetNotAuditSeconds(hospitalId, type);
if (seconds == null || !seconds.Any())
return;
......@@ -1183,6 +1183,70 @@ private void AddWorkTypeDefaultHeadValue(int hospitalId, ag_workload_type type)
}
/// <summary>
/// 添加工作量类型默认配置 - 顶部数据中的占比、金额
/// </summary>
/// <param name="hospitalId"></param>
/// <param name="second"></param>
private void AddWorkTypeDefaultHeadValue(int hospitalId, ag_secondallot second)
{
/**
*
* 二次绩效提交时,跳过该绩效新增工作量类型
* 防止在二次绩效审核期间新增工作量类型,进行数据补充
*
*/
if (second == null || IsAudit(second.Status)) return;
var worktypeSources = agworktypesourceRepository.GetEntities(t => t.SecondId == second.Id);
var worktypes = agworkloadtypeRepository.GetEntities(t => t.HospitalId == hospitalId && t.Department == second.Department && t.UnitType == second.UnitType);
if (worktypes == null || !worktypes.Any())
{
if (worktypeSources != null && worktypeSources.Any())
agworktypesourceRepository.RemoveRange(worktypeSources.ToArray());
return;
}
List<ag_worktype_source> insertData = new List<ag_worktype_source>(), updateData = new List<ag_worktype_source>();
foreach (var type in worktypes)
{
var sources = worktypeSources.Where(t => t.WorkTypeId == type.Id)?.ToList();
if (sources != null && sources.Any())
{
sources.ForEach(t => t.FieldName = type.TypeName + t.FieldName.Substring(t.FieldName.Length - 2));
updateData.AddRange(sources);
}
else
{
insertData.Add(new ag_worktype_source
{
WorkTypeId = type.Id,
SecondId = second.Id,
FieldId = $"{AgWorkloadType.Workload}_Ratio_{type.Id}",
FieldName = type.TypeName.EndsWith("占比") ? type.TypeName : type.TypeName + "占比"
});
}
}
if (insertData != null && insertData.Any())
{
var amounts = insertData.Select(t => new ag_worktype_source
{
WorkTypeId = t.Id,
SecondId = second.Id,
FieldId = $"{AgWorkloadType.Workload}_Amount_{t.Id}",
FieldName = t.FieldName.Substring(0, t.FieldName.Length - 2) + "金额"
}).ToList();
insertData.AddRange(amounts);
agworktypesourceRepository.AddRange(insertData.OrderBy(t => t.WorkTypeId).ThenBy(t => t.FieldName).ToArray());
}
if (updateData != null && updateData.Any())
{
agworktypesourceRepository.UpdateRange(updateData.ToArray());
}
}
/// <summary>
/// 检查默认工作量项是否已添加,添加默认的工作量得分、考核得分、工作量绩效工资
/// </summary>
/// <param name="hospitalId"></param>
......@@ -1201,6 +1265,8 @@ private void CheckDefaultWorkload(int hospitalId, string department, string unit
addItems.Add(item);
}
}
else
addItems = defaultValues;
if (addItems == null || !addItems.Any()) return;
......@@ -1212,7 +1278,8 @@ private void CheckDefaultWorkload(int hospitalId, string department, string unit
ItemId = t.Item2 + "_Default",
ItemName = t.Item1,
FactorValue = null,
Sort = 100 + t.Item3
Sort = 100 + t.Item3,
WorkTypeId = (int)AgWorkloadType.Workload
});
agworkloadRepository.AddRange(insertData.ToArray());
}
......@@ -1237,9 +1304,15 @@ public bool DeleteWorkType(WorkloadRequest request)
var items = agworkloadRepository.GetEntities(t => t.WorkTypeId == request.Id);
if (items != null && items.Any())
agworkloadRepository.RemoveRange(items.ToArray());
var sources = agworktypesourceRepository.GetEntities(t => t.WorkTypeId == request.Id);
var seconds = GetNotAuditSeconds(entity.HospitalId, entity);
if (seconds != null && seconds.Any())
{
// 删除未提交驳回的二次绩效的数据
var sources = agworktypesourceRepository.GetEntities(t => t.WorkTypeId == request.Id && seconds.Select(w => w.Id).Contains(t.SecondId));
if (sources != null && sources.Any())
agworktypesourceRepository.RemoveRange(sources.ToArray());
}
return agworkloadtypeRepository.Remove(entity);
}
......@@ -1276,7 +1349,7 @@ public bool WorkloadAdd(WorkloadRequest request)
FactorValue = request.FactorValue ?? 1,
ItemName = request.ItemName,
Sort = request.Sort ?? 1,
WorkTypeId = request.WorkTypeId,
WorkTypeId = request.IsSingleAwards ? (int)AgWorkloadType.SingleAwards : request.WorkTypeId
};
var result = agworkloadRepository.Add(workload);
if (result)
......@@ -1307,7 +1380,7 @@ public bool WorkloadUpdate(WorkloadRequest request)
workload.ItemName = request.ItemName;
workload.Sort = request.Sort;
workload.ItemId = getWorkloadItemId.Invoke(request.IsSingleAwards, request.WorkTypeId, workload.Id); ;
workload.WorkTypeId = request.WorkTypeId;
workload.WorkTypeId = request.IsSingleAwards ? (int)AgWorkloadType.SingleAwards : request.WorkTypeId;
return agworkloadRepository.Update(workload);
}
......@@ -1332,6 +1405,21 @@ public bool WorkloadUpdate(WorkloadRequest request)
};
/// <summary>
/// 获取等待提交或驳回的二次绩效(同一医院同一科室)
/// </summary>
private List<ag_secondallot> GetNotAuditSeconds(int hospitalId, ag_workload_type type)
{
List<ag_secondallot> seconds = new List<ag_secondallot>();
var allots = perallotRepository.GetEntities(t => t.HospitalId == hospitalId);
if (allots == null || !allots.Any()) return seconds;
/**
* 添加数据时注意避免给已经提交过的数据添加,否则会造成提交时的数据和显示数据不一致
*/
return agsecondallotRepository.GetEntities(t => allots.Select(w => w.ID).Contains(t.AllotId.Value) && t.Department == type.Department && t.UnitType == type.UnitType && IsAudit(t.Status)) ?? seconds;
}
/// <summary>
/// 删除工作量绩效配置
/// </summary>
/// <param name="id"></param>
......
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