Commit 5d07740e by 钟博

Merge branch 'develop' of http://192.168.18.110:8880/zry/performance into develop

parents 7d5983de 03106c21
......@@ -163,6 +163,11 @@
<member name="F:Performance.DtoModels.AllotStates.GenerateAccomplish">
<summary> 绩效结果解析成功 </summary>
</member>
<member name="F:Performance.DtoModels.AgWorkloadType.PreAccountingReward">
<summary>
核算前奖励
</summary>
</member>
<member name="F:Performance.DtoModels.AgWorkloadType.SingleAwards">
<summary>
单项奖励
......@@ -2562,7 +2567,7 @@
自定义工作量类型Id(不包括默认工作量绩效类型、单项奖励)
</summary>
</member>
<member name="P:Performance.DtoModels.WorkloadRequest.IsSingleAwards">
<member name="P:Performance.DtoModels.WorkloadRequest.AgWorkloadType">
<summary>
是否是单项奖励
</summary>
......
......@@ -500,6 +500,11 @@
科室单项奖励
</summary>
</member>
<member name="P:Performance.EntityModels.ag_bodysource.PreDeptReward">
<summary>
科室考核前奖励
</summary>
</member>
<member name="P:Performance.EntityModels.ag_bodysource.BasisPerformance">
<summary>
主任基础绩效
......@@ -960,6 +965,11 @@
科室单项奖励
</summary>
</member>
<member name="P:Performance.EntityModels.ag_headsource.TotalPreAccountingReward">
<summary>
科室考核前奖励
</summary>
</member>
<member name="P:Performance.EntityModels.ag_headsource.SeniorityTitlesAccountedPerformance">
<summary>
年资职称绩效占比
......@@ -2660,6 +2670,11 @@
来源
</summary>
</member>
<member name="P:Performance.EntityModels.ex_result.TypeId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.ex_result.DatabaseType">
<summary>
数据库类型1、Sql Server 2、Orcale
......@@ -2695,11 +2710,6 @@
执行sql
</summary>
</member>
<member name="P:Performance.EntityModels.ex_script.DatabaseType">
<summary>
数据库类型1、Sql Server 2、Orcale
</summary>
</member>
<member name="P:Performance.EntityModels.ex_script.TypeId">
<summary>
ExTypeId
......
......@@ -85,6 +85,10 @@ public enum AllotStates
public enum AgWorkloadType
{
/// <summary>
/// 核算前奖励
/// </summary>
PreAccountingReward = -2,
/// <summary>
/// 单项奖励
/// </summary>
SingleAwards = -1,
......
......@@ -50,7 +50,7 @@ public class WorkloadRequest
/// <summary>
/// 是否是单项奖励
/// </summary>
public bool IsSingleAwards { get; set; }
public AgWorkloadType AgWorkloadType { get; set; }
/// <summary>
/// 工作量带出HIS来源
......
......@@ -112,6 +112,11 @@ public class ag_bodysource
public Nullable<decimal> DeptReward { get; set; }
/// <summary>
/// 科室考核前奖励
/// </summary>
public Nullable<decimal> PreDeptReward { get; set; }
/// <summary>
/// 主任基础绩效
/// </summary>
public Nullable<decimal> BasisPerformance { get; set; }
......
......@@ -61,6 +61,11 @@ public class ag_headsource
/// </summary>
public Nullable<decimal> TotalDeptReward { get; set; }
/// <summary>
/// 科室考核前奖励
/// </summary>
public Nullable<decimal> TotalPreAccountingReward { get; set; }
///// <summary>
///// 业绩分配绩效总额
///// </summary>
......
......@@ -57,6 +57,11 @@ public class ex_result
public string Source { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> TypeId { get; set; }
/// <summary>
/// 数据库类型1、Sql Server 2、Orcale
/// </summary>
public int DatabaseType { get; set; }
......
......@@ -26,11 +26,6 @@ public class ex_script
public string ExecScript { get; set; }
/// <summary>
/// 数据库类型1、Sql Server 2、Orcale
/// </summary>
public int DatabaseType { get; set; }
/// <summary>
/// ExTypeId
/// </summary>
public int TypeId { get; set; }
......
......@@ -198,13 +198,13 @@ private List<ex_result> ExtractModuleData(per_allot allot, string groupName, boo
foreach (var script in scripts.Where(t => t.TypeId == typeId))
{
var config = configs.FirstOrDefault(t => t.Id == script.ConfigId) ?? configs.FirstOrDefault(t => t.DataBaseType == script.DatabaseType);
var config = configs.FirstOrDefault(t => t.Id == script.ConfigId);
if (config == null) continue;
try
{
if(!pools.ContainsKey(config.Id))
pools.Add(config.Id, ConnectionBuilder.Create((DatabaseType)config.DataBaseType, config.DbSource, config.DbName, config.DbUser, config.DbPassword));
if (!pools.ContainsKey(config.Id))
pools.Add(config.Id, ConnectionBuilder.Create((DatabaseType)config.DataBaseType, config.DbSource, config.DbName, config.DbUser, config.DbPassword));
IDbConnection connection = pools[config.Id];
......
......@@ -183,9 +183,10 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute
new SecondColumnDictionary("工作量绩效合计",nameof(ag_bodysource.WorkPerformance),true,399 ),
new SecondColumnDictionary("单项奖励合计",nameof(ag_bodysource.DeptReward),true,499 ),
new SecondColumnDictionary("考核前奖励合计",nameof(ag_bodysource.PreDeptReward),true,599 ),
new SecondColumnDictionary("可分配绩效",nameof(ag_bodysource.DistPerformance),true,500 ),
new SecondColumnDictionary("医院发放夜班绩效",nameof(ag_bodysource.NightWorkPerformance),true,502 ),
new SecondColumnDictionary("可分配绩效",nameof(ag_bodysource.DistPerformance),true,600 ),
new SecondColumnDictionary("医院发放夜班绩效",nameof(ag_bodysource.NightWorkPerformance),true,602 ),
//new SecondColumnDictionary("预留比例",nameof(ag_bodysource.ReservedRatio),false,601 ),
//new SecondColumnDictionary("预留金额",nameof(ag_bodysource.ReservedAmount),false,602 ),
......@@ -216,7 +217,7 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute
int workloadSort = 300;
var index = 0;
foreach (var item in loads.Where(w => !w.Title.StartsWithIgnoreCase("SingleAwards_")))
foreach (var item in loads.Where(w => !w.Title.StartsWithIgnoreCase("SingleAwards_") && !w.Title.StartsWithIgnoreCase("PreAccountingReward_")))
{
if (workloadGroups.Any(w => w.Items != null && w.Items.Any(im => im.EqualsIgnoreCase(item.Title))))
index = workloadGroups.FindIndex(w => w.Items != null && w.Items.Any(im => im.EqualsIgnoreCase(item.Title)));
......@@ -259,6 +260,12 @@ public List<SecondColumnDictionary> GetTableHeaderDictionary(ComputeMode compute
{
maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++singleAwardsSort, type: "SingleAwards", color: "singleawards_color"));
}
// 核算前奖励
int preAccountingRewardSort = 500;
foreach (var item in loads.Where(w => w.Title.StartsWithIgnoreCase("PreAccountingReward_")))
{
maps.Add(new SecondColumnDictionary(item.Value, item.Title, false, ++preAccountingRewardSort, type: "PreAccountingReward", color: "preaccountingreward_color"));
}
return maps.OrderBy(w => w.Sort).ToList();
}
......@@ -415,7 +422,8 @@ public void ClearInvalidValue(List<Dictionary<string, object>> datas)
foreach (var key in row.Keys.ToArray())
{
if (key.StartsWithIgnoreCase("SingleAwards_")
|| key.StartsWithIgnoreCase("Workload_"))
|| key.StartsWithIgnoreCase("Workload_")
|| key.StartsWithIgnoreCase("PreAccountingReward_"))
{
var value = row[key]?.ToString() ?? "";
if (value == "0" || Regex.IsMatch(value, "^0.[0]+$"))
......@@ -637,6 +645,12 @@ private List<string> LoadEmployees_OfficeExcel(ag_secondallot second)
colHeaderCustoms.Add(awards.Value);
columnCustoms.Add(new HandsonColumn(awards.Title.ToLower(), format: DataFormat.小数));
}
// 考核前奖励
foreach (var reward in loads.Where(w => w.Title.StartsWithIgnoreCase("PreAccountingReward_")))
{
colHeaderCustoms.Add(reward.Value);
columnCustoms.Add(new HandsonColumn(reward.Title.ToLower(), format: DataFormat.小数));
}
return (colHeaderCustoms, columnCustoms);
}
......@@ -836,6 +850,8 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he
clearPerformanceWorkload(rows, workloadGroups);
// 行内计算单项奖励
deptRewardCalculate(rows);
// 行内计算考核前奖励
preDeptRewardCalculate(rows);
// 行内可分配绩效
distPerformanceCalculate(rows);
// 行内实发绩效
......@@ -845,6 +861,8 @@ public void ResultCompute(ComputeMode computeMode, Dictionary<string, object> he
{
// 行内计算单项奖励
deptRewardCalculate(rows);
// 行内计算考核前奖励
preDeptRewardCalculate(rows);
// 计算顶部相关总和
overviewCalculate(head, rows);
// 行内主任基础绩效
......@@ -916,6 +934,19 @@ private void deptRewardCalculate(List<Dictionary<string, object>> rows)
row.AddOrUpdate(nameof(ag_bodysource.DeptReward), GetDecimal2(total_deptReward));
}
}
/// <summary>
/// 行内计算核算前奖励
/// </summary>
/// <param name="rows"></param>
private void preDeptRewardCalculate(List<Dictionary<string, object>> rows)
{
foreach (var row in rows)
{
decimal total_deptReward = row.Where(w => w.Key.StartsWithIgnoreCase("PreAccountingReward_")).Sum(r => GetDecimal(row, r.Key));
row.AddOrUpdate(nameof(ag_bodysource.PreDeptReward), GetDecimal2(total_deptReward));
}
}
/// <summary>
/// 计算顶部工作量
/// </summary>
......@@ -949,8 +980,11 @@ private void overviewCalculate(Dictionary<string, object> head, List<Dictionary<
//// 夜班工作量绩效总和
//var nightShiftWorkPerforTotal = rows.Sum(row => GetDecimal2(row, nameof(ag_bodysource.NightWorkPerformance)));
//head.AddOrUpdate(nameof(ag_headsource.NightShiftWorkPerforTotal), nightShiftWorkPerforTotal);
// 可分配绩效(顶栏) = 科室总绩效 - 夜班绩效(顶栏)
var totalPerformance = GetDecimal2(head, nameof(ag_headsource.TotalDistPerformance)) - GetDecimal2(head, nameof(ag_headsource.NightShiftWorkPerforTotal));
// 科室考核前奖励
var totalPreAccountingReward = rows.Sum(row => GetDecimal2(row, nameof(ag_bodysource.PreDeptReward)));
head.AddOrUpdate(nameof(ag_headsource.TotalPreAccountingReward), totalPreAccountingReward);
// 可分配绩效(顶栏) = 科室总绩效 - 夜班绩效(顶栏) - 科室考核前奖励
var totalPerformance = GetDecimal2(head, nameof(ag_headsource.TotalDistPerformance)) - GetDecimal2(head, nameof(ag_headsource.NightShiftWorkPerforTotal)) - totalPreAccountingReward;
head.AddOrUpdate(nameof(ag_headsource.TotalPerformance), totalPerformance);
//// 医院其他绩效总和
//var otherPerformance = rows.Sum(row => GetDecimal2(row, nameof(ag_bodysource.OtherPerformance)));
......@@ -1170,9 +1204,10 @@ private void distPerformanceCalculate(List<Dictionary<string, object>> rows)
var workPerformance = GetDecimal2(row, nameof(ag_bodysource.WorkPerformance));
var titlePerformance = GetDecimal2(row, nameof(ag_bodysource.TitlePerformance));
var deptReward = GetDecimal2(row, nameof(ag_bodysource.DeptReward));
var preDeptReward = GetDecimal2(row, nameof(ag_bodysource.PreDeptReward));
var basisPerformance = GetDecimal2(row, nameof(ag_bodysource.BasisPerformance));
// 可分配绩效 =   当前行职称绩效 + 工作量绩效工资 + 当前行单项奖励 + 当前行主任基础绩效 (科主任护士长)
var distPerformance = titlePerformance + workPerformance + deptReward + basisPerformance;
// 可分配绩效 =   当前行职称绩效 + 工作量绩效工资 + 当前行单项奖励 + 当前行主任基础绩效 (科主任护士长)- 考核前奖励
var distPerformance = titlePerformance + workPerformance + deptReward + basisPerformance - preDeptReward;
row.AddOrUpdate(nameof(ag_bodysource.DistPerformance), distPerformance);
}
}
......
......@@ -584,7 +584,7 @@ public void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dynam
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}_" };
string[] prefix = new string[] { "WorkloadScore_", "AssessmentScore_", "WorkPerformance_", $"{AgWorkloadType.SingleAwards}_", $"{AgWorkloadType.Workload}_", $"{AgWorkloadType.PreAccountingReward}_" };
List<ag_workload_source> workloadSources = new List<ag_workload_source>();
foreach (var rowitem in body)
{
......@@ -595,7 +595,7 @@ public void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dynam
if (!result) continue;
Dictionary<string, object> dict = JsonHelper.Deserialize<Dictionary<string, object>>(JsonHelper.Serialize(rowitem));
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]));
var keys = dict.Keys.Where(t => prefix.Any(w => t.StartsWithIgnoreCase(w)));
if (keys == null || !keys.Any()) continue;
foreach (var key in keys)
......
......@@ -1363,15 +1363,7 @@ public List<ag_workload> GetWorkloadList(WorkloadRequest request)
/// <returns></returns>
public bool WorkloadAdd(WorkloadRequest request)
{
Expression<Func<ag_workload, bool>> exp = (t) => t.HospitalId == request.HospitalId && t.Department == request.Department && t.UnitType == request.UnitType;
if (request.IsSingleAwards)
{
exp = exp.And(t => t.ItemId.StartsWith(AgWorkloadType.SingleAwards.ToString()));
}
else
{
exp = exp.And(t => t.ItemId.StartsWith($"{AgWorkloadType.Workload}_"));
}
Expression<Func<ag_workload, bool>> exp = (t) => t.HospitalId == request.HospitalId && t.Department == request.Department && t.UnitType == request.UnitType && t.ItemId.StartsWith($"{request.AgWorkloadType}_");
var workloadList = agworkloadRepository.GetEntities(exp);
if (workloadList != null && workloadList.Any(t => t.ItemName == request.ItemName))
throw new PerformanceException("项目名称重复");
......@@ -1384,12 +1376,12 @@ public bool WorkloadAdd(WorkloadRequest request)
ItemName = request.ItemName,
Sort = request.Sort ?? 1,
SourceCategory = request.SourceCategory,
WorkTypeId = request.IsSingleAwards ? (int)AgWorkloadType.SingleAwards : request.WorkTypeId
WorkTypeId = request.AgWorkloadType == AgWorkloadType.Workload ? request.WorkTypeId : (int)request.AgWorkloadType
};
var result = agworkloadRepository.Add(workload);
if (result)
{
workload.ItemId = getWorkloadItemId.Invoke(request.IsSingleAwards, request.WorkTypeId, workload.Id);
workload.ItemId = getWorkloadItemId.Invoke(request.AgWorkloadType, request.WorkTypeId, workload.Id);
agworkloadRepository.Update(workload);
}
......@@ -1403,15 +1395,7 @@ public bool WorkloadAdd(WorkloadRequest request)
/// <returns></returns>
public bool WorkloadUpdate(WorkloadRequest request)
{
Expression<Func<ag_workload, bool>> exp = (t) => t.HospitalId == request.HospitalId && t.Department == request.Department && t.UnitType == request.UnitType;
if (request.IsSingleAwards)
{
exp = exp.And(t => t.ItemId.StartsWith(AgWorkloadType.SingleAwards.ToString()));
}
else
{
exp = exp.And(t => t.ItemId.StartsWith($"{AgWorkloadType.Workload}_"));
}
Expression<Func<ag_workload, bool>> exp = (t) => t.HospitalId == request.HospitalId && t.Department == request.Department && t.UnitType == request.UnitType && t.ItemId.StartsWith($"{request.AgWorkloadType}_");
var workloadList = agworkloadRepository.GetEntities(exp);
if (workloadList != null && workloadList.Any(t => t.Id != request.Id && t.ItemName == request.ItemName))
throw new PerformanceException("项目名称重复");
......@@ -1424,8 +1408,8 @@ public bool WorkloadUpdate(WorkloadRequest request)
workload.ItemName = request.ItemName;
workload.SourceCategory = request.SourceCategory;
workload.Sort = request.Sort;
workload.ItemId = getWorkloadItemId.Invoke(request.IsSingleAwards, request.WorkTypeId, workload.Id); ;
workload.WorkTypeId = request.IsSingleAwards ? (int)AgWorkloadType.SingleAwards : request.WorkTypeId;
workload.ItemId = getWorkloadItemId.Invoke(request.AgWorkloadType, request.WorkTypeId, workload.Id);
workload.WorkTypeId = request.AgWorkloadType == AgWorkloadType.Workload ? request.WorkTypeId : (int)request.AgWorkloadType;
return agworkloadRepository.Update(workload);
}
......@@ -1433,19 +1417,21 @@ public bool WorkloadUpdate(WorkloadRequest request)
/// <summary>
/// 获取工作量绩效配置的ItemId
/// </summary>
readonly Func<bool, int, int, string> getWorkloadItemId = (isSingleAwards, workTypeId, workloadId) =>
readonly Func<AgWorkloadType, int, int, string> getWorkloadItemId = (agWorkloadType, workTypeId, workloadId) =>
{
/**
* 单项奖励 - SingleAwards_WorkloadId
* 默认工作量类型WorkTypeId=0 - Workload_Default_WorkloadId
* 自定义工作量类型WorkTypeId>0 - Workload_WorkTypeId_WorkloadId
*/
if (isSingleAwards)
return $"{AgWorkloadType.SingleAwards}_{workloadId}";
else
if (agWorkloadType == AgWorkloadType.Workload)
{
return workTypeId == (int)AgWorkloadType.Workload ? $"{AgWorkloadType.Workload}_Default_{workloadId}"
: $"{AgWorkloadType.Workload}_{workTypeId}_{workloadId}";
: $"{AgWorkloadType.Workload}_{workTypeId}_{workloadId}";
}
else
{
return $"{agWorkloadType}_{workloadId}";
}
};
......@@ -1483,7 +1469,7 @@ public bool WorkloadDelete(int id)
public List<ag_workload> GetSingleList(WorkloadRequest request)
{
return agworkloadRepository.GetEntities(t => t.HospitalId == request.HospitalId && t.Department == request.Department
&& t.UnitType == request.UnitType && t.ItemId.StartsWith(AgWorkloadType.SingleAwards.ToString()));
&& t.UnitType == request.UnitType && t.ItemId.StartsWith(request.AgWorkloadType.ToString()));
}
//public (string, string) GetDeptAndUnit(int userId)
......
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