Commit e2c16919 by 钟博

Merge branch 'feature/新二次分配' into release/v20210625绩效划拨二次分配合并

parents ca60e766 be4f69ee
......@@ -73,7 +73,7 @@ public class RequestRateLimitingMiddleware
var response = new ApiResponse
{
State = ResponseType.TooManyRequests,
Message = "访问过于频繁,请稍后重试"
Message = "您的操作正在处理,请稍等片刻!"
};
await context.Response.WriteAsync(JsonHelper.Serialize(response));
}
......
......@@ -8,7 +8,7 @@
},
"AppConnection": {
//"PerformanceConnectionString": "server=112.124.13.17;database=db_performance;uid=suvalue;pwd=suvalue2016;pooling=true;charset=utf8;convert zero datetime=true;port=3306;connection timeout=120;max pool size=512;allow user variables=true;",
"PerformanceConnectionString": "server=192.168.18.166;database=db_test_yuyao;uid=root;pwd=1234qwer;pooling=true;charset=utf8;convert zero datetime=true;port=3306;connection timeout=120;max pool size=512;allow user variables=true;",
"PerformanceConnectionString": "server=192.168.18.166;database=db_performance_screen;uid=root;pwd=1234qwer;pooling=true;charset=utf8;convert zero datetime=true;port=3306;connection timeout=120;max pool size=512;allow user variables=true;",
"HangfireConnectionString": "server=192.168.18.166;database=db_hangfire;uid=root;pwd=1234qwer;port=3306;allow user variables=true;",
"RedisConnectionString": "116.62.245.55:6379,defaultDatabase=2"
},
......@@ -38,7 +38,13 @@
"HttpPost": "http://localhost:50997/api/"
},
"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", // 单位为秒
"Limit": 1
}
......
......@@ -1646,6 +1646,55 @@
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionLoad(Performance.DtoModels.SecondLoadDto)">
<summary>
二次绩效录入页面
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionCheck(Performance.DtoModels.SecondComputeDto)">
<summary>
提交数据正确性检验
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionCompute(Performance.DtoModels.SecondComputeDto)">
<summary>
二次绩效结果计算
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionSave(Performance.DtoModels.SecondComputeDto)">
<summary>
二次绩效保存
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionSubmit(Performance.DtoModels.SecondComputeDto)">
<summary>
二次绩效提交
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionEmployee(Performance.DtoModels.SecondEmployeeDto)">
<summary>
二次分配人员字典带出
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RedistributionDetail(Performance.DtoModels.SecondBaseDto)">
<summary>
二次分配审核后查看详情
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SheetController.SheetList(Performance.DtoModels.SheetRequest)">
<summary>
sheet 列表
......
......@@ -149,7 +149,7 @@
<summary> 正在生成绩效 </summary>
</member>
<member name="F:Performance.DtoModels.AllotStates.GenerateSucceed">
<summary> 绩效结果通过审核,允许下发 </summary>
<summary> 绩效下发 </summary>
</member>
<member name="F:Performance.DtoModels.AllotStates.GenerateFail">
<summary> 绩效解析失败 </summary>
......@@ -182,6 +182,12 @@
<member name="F:Performance.DtoModels.DataFormat.小数">
<summary> 小数 </summary>
</member>
<member name="F:Performance.DtoModels.DataFormat.小数1">
<summary> 小数 </summary>
</member>
<member name="F:Performance.DtoModels.DataFormat.整数">
<summary> 整数 </summary>
</member>
<member name="F:Performance.DtoModels.DataFormat.货币">
<summary> 货币 </summary>
</member>
......@@ -3693,6 +3699,11 @@
夜班工作量绩效
</summary>
</member>
<member name="P:Performance.DtoModels.SecPrintResponse.ReservedRatio">
<summary>
预留比例
</summary>
</member>
<member name="P:Performance.DtoModels.SecPrintResponse.RealAmount">
<summary>
实发绩效工资金额
......@@ -3788,6 +3799,81 @@
绩效系数
</summary>
</member>
<member name="T:Performance.DtoModels.Second.ComputeMode">
<summary>
二次分配计算方式
</summary>
</member>
<member name="F:Performance.DtoModels.Second.ComputeMode.NotCalculate">
<summary>
填报(不计算)
</summary>
</member>
<member name="F:Performance.DtoModels.Second.ComputeMode.Horizontal">
<summary>
横向计算
</summary>
</member>
<member name="F:Performance.DtoModels.Second.ComputeMode.Vertical">
<summary>
纵向计算
</summary>
</member>
<member name="P:Performance.DtoModels.SecondBaseDto.ComputeMode">
<summary>
计算方式:11 不计算 12 横向计算 13 纵向计算
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Label">
<summary>
描述
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Key">
<summary>
主键
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.IsTrue">
<summary>
是否显示 true显示
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Width">
<summary>
宽度
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Sort">
<summary>
排序
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Site">
<summary>
位置 Top、Table
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Type">
<summary>
类型 单项奖励:SingleAwards,工作量:Workload
</summary>
</member>
<member name="P:Performance.DtoModels.SecondColumnDictionary.Color">
<summary>
颜色class名称
</summary>
</member>
<member name="P:Performance.DtoModels.SecondEmployeeDto.ComputeMode">
<summary>
计算方式:11 不计算 12 横向计算 13 纵向计算
</summary>
</member>
<member name="P:Performance.DtoModels.SecondLoadDto.OverrideMode">
<summary>
数据加载方式:0 保存,1 上次,2 字典
</summary>
</member>
<member name="P:Performance.DtoModels.SelectionOptions.SelectionID">
<summary>
ID
......@@ -3843,24 +3929,29 @@
数据集合
</summary>
</member>
<member name="T:Performance.DtoModels.TitleValue`1">
<member name="T:Performance.DtoModels.TitleValue`2">
<summary>
title value
</summary>
</member>
<member name="P:Performance.DtoModels.TitleValue`1.Title">
<member name="P:Performance.DtoModels.TitleValue`2.Title">
<summary>
Title
</summary>
</member>
<member name="P:Performance.DtoModels.TitleValue`1.Value">
<member name="P:Performance.DtoModels.TitleValue`2.Value">
<summary>
Value
</summary>
</member>
<member name="P:Performance.DtoModels.TitleValue`1.State">
<member name="P:Performance.DtoModels.TitleValue`2.State">
<summary>
1、已选,2、未选,3、已被选择
存储数据
</summary>
</member>
<member name="T:Performance.DtoModels.TitleValue`1">
<summary>
title value
</summary>
</member>
<member name="T:Performance.DtoModels.TitleValue">
......
......@@ -469,24 +469,19 @@
职称系数
</summary>
</member>
<member name="P:Performance.EntityModels.ag_bodysource.TitlePerformance">
<summary>
职称绩效
</summary>
</member>
<member name="P:Performance.EntityModels.ag_bodysource.ManagementAllowance">
<member name="P:Performance.EntityModels.ag_bodysource.TitlePerformanceScore">
<summary>
管理津贴
职称绩效得分
</summary>
</member>
<member name="P:Performance.EntityModels.ag_bodysource.IndividualReward">
<member name="P:Performance.EntityModels.ag_bodysource.TitlePerformance">
<summary>
单项奖励
职称绩效
</summary>
</member>
<member name="P:Performance.EntityModels.ag_bodysource.AllocationOfKeySpecialty">
<member name="P:Performance.EntityModels.ag_bodysource.WorkPerformance">
<summary>
重点专科分配
工作量绩效
</summary>
</member>
<member name="P:Performance.EntityModels.ag_bodysource.DeptReward">
......@@ -936,12 +931,12 @@
</member>
<member name="P:Performance.EntityModels.ag_headsource.TheTotalAllocationOfPerformanceResults">
<summary>
科室单项奖励
业绩分配绩效总额
</summary>
</member>
<member name="P:Performance.EntityModels.ag_headsource.BasisPerformance">
<member name="P:Performance.EntityModels.ag_headsource.TotalDeptReward">
<summary>
业绩分配绩效总额
科室单项奖励
</summary>
</member>
<member name="P:Performance.EntityModels.ag_headsource.SeniorityTitlesAccountedPerformance">
......
......@@ -65,8 +65,8 @@ public enum AllotStates
/// <summary> 正在生成绩效 </summary>
[Description("正在生成绩效")]
InGenerate = 5,
/// <summary> 绩效结果通过审核,允许下发 </summary>
[Description("数据验证通过")]
/// <summary> 绩效下发 </summary>
[Description("绩效下发")]
GenerateSucceed = 6,
/// <summary> 绩效解析失败 </summary>
[Description("绩效解析失败")]
......@@ -102,6 +102,10 @@ public enum DataFormat
普通格式,
/// <summary> 小数 </summary>
小数,
/// <summary> 小数 </summary>
小数1,
/// <summary> 整数 </summary>
整数,
/// <summary> 货币 </summary>
货币,
/// <summary> 百分比 </summary>
......
......@@ -6,23 +6,35 @@
namespace Performance.DtoModels
{
public class HandsonTable
public class HandsonTableBase
{
public HandsonTableBase()
{
ColHeaders = new List<string>();
Columns = new List<HandsonColumn>();
Data = new List<Dictionary<string, object>>();
NestedHeadersArray = new List<List<string>>();
}
public List<string> ColHeaders { get; set; }
public List<Dictionary<string, object>> Data { get; set; }
public List<HandsonColumn> Columns { get; set; }
public List<List<string>> NestedHeadersArray { get; set; }
}
public class HandsonTable : HandsonTableBase
{
private IEnumerable<collect_permission> _permissions;
private List<Dictionary<string, string>> _data;
public HandsonTable(int sheetType, string[] cols, List<collect_permission> permissions)
: base()
{
_permissions = permissions;
_data = new List<Dictionary<string, string>>();
InitColHeaders(sheetType, cols);
InitColumns(permissions);
}
public string[] ColHeaders { get; private set; }
public List<Dictionary<string, string>> Data => _data;
public HandsonColumn[] Columns { get; private set; }
/// <summary>
///
......@@ -43,7 +55,7 @@ public void SetRowData(IEnumerable<HandsonRowData> datas, bool isTypein)
else if (dic.ContainsKey(item.Name.ToLower()) && _permissions.Any(w => w.HeadName.ToLower() == item.Name.ToLower()))
dic[item.Name.ToLower()] = item.Value?.ToString() ?? "";
}
_data.Add(dic);
Data.Add(dic);
}
}
......@@ -68,7 +80,7 @@ private void InitColHeaders(int sheetType, string[] cols)
if (!_permissions.Any(w => w.HeadName.ToLower() == item && w.Visible == 1))
necessitys.Remove(item);
}
ColHeaders = necessitys.ToArray();
ColHeaders = necessitys;
}
private void InitColumns(List<collect_permission> permissions)
......@@ -80,12 +92,12 @@ private void InitColumns(List<collect_permission> permissions)
var readnoly = _permissions.FirstOrDefault(f => f.HeadName == item)?.Readnoly == 1;
columns.Add(new HandsonColumn(item.ToLower(), readnoly));
}
Columns = columns.ToArray();
Columns = columns;
}
private Dictionary<string, string> CreateDataRow(string key, string value)
private Dictionary<string, object> CreateDataRow(string key, string value)
{
var temp = new Dictionary<string, string>() { { key, value } };
var temp = new Dictionary<string, object>() { { key, value } };
foreach (var item in ColHeaders)
{
if (!temp.ContainsKey(item))
......@@ -113,6 +125,16 @@ public HandsonColumn(string data, bool readOnly = false, DataFormat format = Dat
NumericFormat = new NumericFormat { Pattern = "0,00.00" };
break;
case DataFormat.小数1:
Type = "numeric";
NumericFormat = new NumericFormat { Pattern = "0,00.0" };
break;
case DataFormat.整数:
Type = "numeric";
NumericFormat = new NumericFormat { Pattern = "0,00" };
break;
case DataFormat.百分比:
Type = "numeric";
NumericFormat = new NumericFormat { Pattern = "0,00.00%" };
......@@ -124,7 +146,7 @@ public HandsonColumn(string data, bool readOnly = false, DataFormat format = Dat
public bool ReadOnly { get; set; }
public string Type { get; set; }
public string[] Source { get; set; }
public bool Strict { get; set; } = false;
public NumericFormat NumericFormat { get; set; }
}
......
......@@ -14,5 +14,6 @@ public enum ResponseType
ParameterError = 6,
Disable = 7,
TooManyRequests = 8,
Warning = 9,
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
namespace Performance.DtoModels.Second
{
/// <summary>
/// 二次分配计算方式
/// </summary>
public enum ComputeMode
{
/// <summary>
/// 填报(不计算)
/// </summary>
[Description("填报")]
NotCalculate = 11,
/// <summary>
/// 横向计算
/// </summary>
[Description("横向计算")]
Horizontal = 12,
/// <summary>
/// 纵向计算
/// </summary>
[Description("纵向计算")]
Vertical = 13,
}
}
namespace Performance.DtoModels
{
public class SecondBaseDto
{
public int SecondId { get; set; }
/// <summary>
/// 计算方式:11 不计算 12 横向计算 13 纵向计算
/// </summary>
public int ComputeMode { get; set; }
}
}
namespace Performance.DtoModels
{
public class SecondColumnDictionary
{
/// <summary>
/// 描述
/// </summary>
public string Label { get; set; }
/// <summary>
/// 主键
/// </summary>
public string Key { get; set; }
/// <summary>
/// 是否显示 true显示
/// </summary>
public bool IsTrue { get; set; }
/// <summary>
/// 宽度
/// </summary>
public string Width { get; set; }
/// <summary>
/// 排序
/// </summary>
public int Sort { get; set; }
/// <summary>
/// 位置 Top、Table
/// </summary>
public string Site { get; set; }
/// <summary>
/// 类型 单项奖励:SingleAwards,工作量:Workload
/// </summary>
public string Type { get; set; }
/// <summary>
/// 颜色class名称
/// </summary>
public string Color { get; set; }
public SecondColumnDictionary()
{
}
public SecondColumnDictionary(string label, string key, bool isTrue, int sort, string site = "Table", string type = "", string color = "")
{
Label = label;
Key = key;
IsTrue = isTrue;
Sort = sort;
Site = site;
Type = type;
Color = color;
Width = ((label ?? "").Length * 20 + 10).ToString();
}
}
}
namespace Performance.DtoModels
{
public class SecondComputeCheckResultDto
{
public SecondComputeCheckResultDto(string level, string personnelNumber, string personnelName, string message)
{
Level = level;
PersonnelNumber = personnelNumber;
PersonnelName = personnelName;
Message = message;
}
public string Level { get; set; }
public string PersonnelNumber { get; set; }
public string PersonnelName { get; set; }
public string Message { get; set; }
}
}
using System.Collections.Generic;
namespace Performance.DtoModels
{
public class SecondComputeDto : SecondLoadDto
{
public Dictionary<string, object> Head { get; set; }
public List<Dictionary<string, object>> Body { get; set; }
}
}
using System.Collections.Generic;
namespace Performance.DtoModels
{
public class SecondDetailDto
{
public object Head { get; set; }
public HandsonTableBase Body { get; set; }
public List<SecondColumnDictionary> Dic { get; set; }
}
}
namespace Performance.DtoModels
{
public class SecondEmployeeDto : PersonParamsRequest
{
public int SecondId { get; set; }
/// <summary>
/// 计算方式:11 不计算 12 横向计算 13 纵向计算
/// </summary>
public int ComputeMode { get; set; }
}
}
namespace Performance.DtoModels
{
public class SecondLoadDto : SecondBaseDto
{
/// <summary>
/// 数据加载方式:0 保存,1 上次,2 字典
/// </summary>
public int OverrideMode { get; set; }
}
}
using System;
using System.Collections.Generic;
namespace Performance.DtoModels
{
public class SecondWorkLoadDto
{
public SecondWorkLoadDto(string name)
{
Name = name;
Unit_Price = 0m;
Items = new List<string>();
AssessmentScore = $"AssessmentScore_{Name}";
WorkPerformance = $"WorkPerformance_{Name}";
WorkloadScore = $"WorkloadScore_{Name}";
}
public string AssessmentScore { get; set; }
public string WorkPerformance { get; set; }
public string WorkloadScore { get; set; }
public decimal Unit_Price { get; set; }
public List<string> Items { get; set; }
public string Name { get; set; }
public void AddItem(string name)
{
if (!Items.Contains(name))
Items.Add(name);
}
}
}
......@@ -7,7 +7,7 @@ namespace Performance.DtoModels
/// <summary>
/// title value
/// </summary>
public class TitleValue<T>
public class TitleValue<TV, TS>
{
/// <summary>
/// Title
......@@ -16,11 +16,17 @@ public class TitleValue<T>
/// <summary>
/// Value
/// </summary>
public T Value { get; set; }
public TV Value { get; set; }
/// <summary>
/// 1、已选,2、未选,3、已被选择
/// 存储数据
/// </summary>
public int State { get; set; }
public TS State { get; set; }
}
/// <summary>
/// title value
/// </summary>
public class TitleValue<T> : TitleValue<T, int>
{
}
/// <summary>
/// title value
......
......@@ -72,24 +72,34 @@ public class ag_bodysource
public Nullable<decimal> TitleCoefficient { get; set; }
/// <summary>
/// 职称绩效
/// 职称绩效得分
/// </summary>
public Nullable<decimal> TitlePerformance { get; set; }
public Nullable<decimal> TitlePerformanceScore { get; set; }
/// <summary>
/// 管理津贴
/// 职称绩效
/// </summary>
public Nullable<decimal> ManagementAllowance { get; set; }
public Nullable<decimal> TitlePerformance { get; set; }
/// <summary>
/// 单项奖励
/// 工作量绩效
/// </summary>
public Nullable<decimal> IndividualReward { get; set; }
public Nullable<decimal> WorkPerformance { get; set; }
/// <summary>
/// 重点专科分配
/// </summary>
public Nullable<decimal> AllocationOfKeySpecialty { get; set; }
///// <summary>
///// 管理津贴
///// </summary>
//public Nullable<decimal> ManagementAllowance { get; set; }
///// <summary>
///// 单项奖励
///// </summary>
//public Nullable<decimal> IndividualReward { get; set; }
///// <summary>
///// 重点专科分配
///// </summary>
//public Nullable<decimal> AllocationOfKeySpecialty { get; set; }
/// <summary>
/// 科室单项奖励
......
......@@ -52,14 +52,19 @@ public class ag_headsource
public Nullable<decimal> DirectorBasisPerformance { get; set; }
/// <summary>
/// 科室单项奖励
/// 业绩分配绩效总额
/// </summary>
public Nullable<decimal> TheTotalAllocationOfPerformanceResults { get; set; }
/// <summary>
/// 业绩分配绩效总额
/// 科室单项奖励
/// </summary>
public Nullable<decimal> BasisPerformance { get; set; }
public Nullable<decimal> TotalDeptReward { get; set; }
///// <summary>
///// 业绩分配绩效总额
///// </summary>
//public Nullable<decimal> BasisPerformance { get; set; }
/// <summary>
/// 年资职称绩效占比
......
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
namespace Performance.Infrastructure
{
public static partial class UtilExtensions
{
public static string ToRGB(this Color color)
{
return $"{color.R},{color.G},{color.B}";
}
}
}
......@@ -18,8 +18,9 @@ public static partial class UtilExtensions
/// <returns></returns>
public static T GetValue<T>(this Dictionary<string, object> keyValues, string key, T defaultValue = default(T))
{
object value;
if (keyValues.TryGetValue(key, out value))
if (keyValues.TryGetValue(key, out object value))
return ConvertHelper.To<T>(value, defaultValue);
else if (keyValues.TryGetValue(key.ToLower(), out value))
return ConvertHelper.To<T>(value, defaultValue);
return defaultValue;
}
......@@ -33,13 +34,62 @@ public static T GetValue<T>(this Dictionary<string, object> keyValues, string ke
/// <returns></returns>
public static T GetValue<T>(this SortedDictionary<string, object> keyValues, string key, T defaultValue = default(T))
{
object value;
if (keyValues.TryGetValue(key, out value))
if (keyValues.TryGetValue(key, out object value))
return ConvertHelper.To<T>(value, defaultValue);
else if (keyValues.TryGetValue(key.ToLower(), out value))
return ConvertHelper.To<T>(value, defaultValue);
return defaultValue;
}
/// <summary>
/// 添加或修改
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="keyValues"></param>
/// <param name="key"></param>
/// <returns></returns>
public static void AddOrUpdate(this Dictionary<string, object> keyValues, string key, object value)
{
var pair = keyValues.FirstOrDefault(w => w.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
if (default(KeyValuePair<string, object>).Equals(pair))
keyValues.Add(key, value);
else
keyValues[key] = value;
}
/// <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 || string.IsNullOrEmpty(value.ToString().Trim()) ? 0m : decimal.Parse(value.ToString());
else if (keyValues.TryGetValue(key.ToLower(), out value))
return value == null || string.IsNullOrEmpty(value.ToString().Trim()) ? 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 转换 键值对
/// </summary>
/// <param name="pairs"></param>
......
......@@ -26,5 +26,27 @@ public static string[] SplitRemoveEmpty(this string text, params string[] separa
{
return text.Split(separator, StringSplitOptions.RemoveEmptyEntries);
}
/// <summary>
/// 确定此字符串实例的开头是否与指定的匹配 忽略字母的大小写
/// </summary>
/// <param name="text"></param>
/// <param name="value"></param>
/// <returns></returns>
public static bool StartsWithIgnoreCase(this string text, string value)
{
return text.StartsWith(value, StringComparison.OrdinalIgnoreCase);
}
/// <summary>
/// 确定此字符串是否与指定的字符串对象具有相同的值 忽略字母的大小写
/// </summary>
/// <param name="text"></param>
/// <param name="value"></param>
/// <returns></returns>
public static bool EqualsIgnoreCase(this string text, string value)
{
return text.Equals(value, StringComparison.OrdinalIgnoreCase);
}
}
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Text.RegularExpressions;
namespace Performance.Infrastructure
{
......@@ -17,5 +19,26 @@ public static string GetSmsCode()
return code.ToString().PadLeft(4, '0');
}
public static List<Color> Color(Color sColor, Color eColor, int number)
{
int sr = sColor.R;
int sg = sColor.G;
int sb = sColor.B;
int er = eColor.R;
int eg = eColor.G;
int eb = eColor.B;
var colorList = new List<Color>();
for (int i = 0; i < number; i++)
{
var rAverage = sr + (int)((er - sr) * i / number);
var gAverage = sg + (int)((eg - sg) * i / number);
var bAverage = sb + (int)((eb - sb) * i / number);
colorList.Add(System.Drawing.Color.FromArgb(rAverage, gAverage, bAverage));
}
return colorList;
}
}
}
......@@ -12,7 +12,7 @@
namespace Performance.Repository
{
/// <summary>
/// per_apr_amount Repository
/// per_apr_amount_hide Repository
/// </summary>
public partial class PerforPerapramounthideRepository : PerforRepository<per_apr_amount_hide>
{
......
......@@ -208,7 +208,7 @@ public PageList<per_employee> GetPersons(int allotId, int userId, PersonParamsRe
if (request != null && !string.IsNullOrEmpty(request.SearchQuery))
{
exp = exp.And(t => true && (t.AccountingUnit.Contains(request.SearchQuery) || t.DoctorName.Contains(request.SearchQuery) || t.Department.Contains(request.SearchQuery)));
exp = exp.And(t => true && (t.AccountingUnit.Contains(request.SearchQuery) || t.PersonnelNumber.Contains(request.SearchQuery) || t.DoctorName.Contains(request.SearchQuery) || t.Department.Contains(request.SearchQuery)));
}
var result = new List<per_employee>();
......
......@@ -530,10 +530,11 @@ private void SupplementOtherPerfor(ag_secondallot secondAllot, List<BodyItem> bo
new Tuple<string, string, Func<per_employee, object>>("人员系数", "StaffCoefficient", (t) => 1),
new Tuple<string, string, Func<per_employee, object>>("职称", "JobTitle", (t) => t.JobTitle),
new Tuple<string, string, Func<per_employee, object>>("预留年度考核比例", "ReservedRatio", (t) => t.ReservedRatio),
new Tuple<string, string, Func<per_employee, object>>("医院其他绩效", "OtherPerformance", (t) => 0)
new Tuple<string, string, Func<per_employee, object>>("医院其他绩效", "OtherPerformance", (t) => 0),
new Tuple<string, string, Func<per_employee, object>>("实发绩效工资金额", "ShifaAmountOfPerformancePay", (t) => 0)
};
var specialColumns = new string[] { "FullName", "OtherPerformance" };
var specialColumns = new string[] { "FullName", "OtherPerformance", "ShifaAmountOfPerformancePay" };
foreach (var item in groupData)
{
......@@ -548,10 +549,12 @@ private void SupplementOtherPerfor(ag_secondallot secondAllot, List<BodyItem> bo
var data = new BodyItem(headItem);
data.RowNumber = lastNumber;
if (specialColumns.Contains(column.Item2))
{
data.Value = column.Item2 == "OtherPerformance" ? item.Amount : item.DoctorName;
}
if (column.Item2 == "FullName")
data.Value = item.DoctorName;
else if (column.Item2 == "OtherPerformance")
data.Value = item.Amount;
else if (column.Item2 == "ShifaAmountOfPerformancePay")
data.Value = item.Amount;
else
{
var value = column.Item3.Invoke(employee);
......@@ -923,7 +926,7 @@ private void SupplementSecondDetail(ag_secondallot second, List<per_employee> em
/// <param name="hospitalId"></param>
/// <param name="secondAllot"></param>
/// <returns></returns>
private ag_secondallot GetPreviousSecondAllot(int hospitalId, ag_secondallot secondAllot)
public ag_secondallot GetPreviousSecondAllot(int hospitalId, ag_secondallot secondAllot)
{
// 历史删除绩效时,未删除对应的二次绩效记录
var allotList = perallotRepository.GetEntities(w => w.HospitalId == hospitalId)?.OrderBy(s => s.Year).ThenBy(s => s.Month).ToList();
......
......@@ -482,26 +482,23 @@ public void SaveSecondAllotData(int secondId, dynamic saveData)
/// </summary>
/// <param name="secondId"></param>
/// <param name="json"></param>
private void SaveSecondAllotHeadData(int secondId, string json)
public void SaveSecondAllotHeadData(int secondId, string json)
{
if (string.IsNullOrEmpty(json)) return;
ag_headsource headsource = JsonHelper.Deserialize<ag_headsource>(json);
if (headsource == null) return;
var exist = agheadsourceRepository.GetEntity(w => w.SecondId == secondId);
if (exist != null)
agheadsourceRepository.Remove(exist);
headsource.SecondId = secondId;
if (headsource.Id == 0)
{
agheadsourceRepository.Add(headsource);
}
else
{
agheadsourceRepository.UpdateByState(headsource);
}
agheadsourceRepository.Add(headsource);
string[] prefix = new string[] { "Workload_Ratio_", "Workload_Amount_" };
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())
return;
......@@ -512,7 +509,7 @@ private void SaveSecondAllotHeadData(int secondId, string json)
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)
{
update.Value = ConvertHelper.To<decimal>(dict[key]);
......@@ -527,7 +524,7 @@ private void SaveSecondAllotHeadData(int secondId, string json)
/// <param name="hospitalId"></param>
/// <param name="second"></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);
......@@ -556,12 +553,12 @@ private void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dyna
if (!result) continue;
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;
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;
workloadSources.Add(new ag_workload_source
......@@ -581,6 +578,23 @@ private void SaveSecondAllotBodyData(int hospitalId, ag_secondallot second, dyna
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
}
}
......@@ -1420,7 +1420,7 @@ private List<ag_secondallot> GetNotAuditSeconds(int hospitalId, ag_workload_type
/**
* 添加数据时注意避免给已经提交过的数据添加,否则会造成提交时的数据和显示数据不一致
*/
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;
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>
......@@ -1605,15 +1605,19 @@ bool VerifySubmissioAmount(decimal? submitDataAmount, decimal? realGiveFee)
if (!VerifySubmissioAmount(total, second.RealGiveFee))
throw new PerformanceException($"总金额与考核后金额不一致!可分配金额:{second.RealGiveFee},提交金额:{total}");
}
else if (new int[] { 9, 10 }.Contains(temp.UseTempId.Value))
else /*if (new int[] { 9, 10 }.Contains(temp.UseTempId.Value))*/
{
var data = agbodysourceRepository.GetEntities(t => t.SecondId == second.Id);
if (data == null || !data.Any())
throw new PerformanceException("提交时未检测到数据!");
var nightShiftWorkPerforFee = data.Sum(w => w.NightWorkPerformance ?? 0);
if (!VerifySubmissioAmount(nightShiftWorkPerforFee, second.NightShiftWorkPerforFee))
throw new PerformanceException($"夜班绩效金额不一致!夜班绩效金额:{second.NightShiftWorkPerforFee ?? 0:0.####},提交金额:{nightShiftWorkPerforFee:0.####}");
var total = data.Sum(t => (t.DistPerformance ?? 0) + (t.NightWorkPerformance ?? 0));
if (!VerifySubmissioAmount(total, second.RealGiveFee))
throw new PerformanceException($"总金额与考核后金额不一致!可分配金额:{second.RealGiveFee},提交金额:{total}");
throw new PerformanceException($"总金额与考核后金额不一致!可分配金额:{second.RealGiveFee:0.####},提交金额:{total:0.####}");
}
second.UseTempId = temp.UseTempId;
second.Status = 2;
......@@ -1803,7 +1807,7 @@ public bool NursingDeptAudit(int userId, SecondAuditRequest request)
/// </summary>
/// <param name="secondId">二次绩效Id</param>
/// <returns></returns>
public ag_secondallot GetSecondallot(int secondId)
public ag_secondallot GetSecondAllot(int secondId)
{
return agsecondallotRepository.GetEntity(t => t.Id == secondId);
}
......@@ -2097,30 +2101,7 @@ public List<SecPrintResponse> Print(int secondId)
result = Mapper.Map<List<SecPrintResponse>>(data);
}
else if (second.UseTempId.HasValue && (new int[] { 9, 10 }).Contains(second.UseTempId.Value))
{
var data = agbodysourceRepository.GetEntities(t => t.SecondId == secondId);
if (data == null || !data.Any()) return new List<SecPrintResponse>();
var bodyDynamic = agworkloadsourceRepository.GetEntities(t => data.Select(w => w.Id).Contains(t.BodyId));
if (data == null || !data.Any()) return new List<SecPrintResponse>();
result = data.Select(w => new SecPrintResponse
{
JobNumber = w.WorkNumber,
PersonName = w.Name,
Department = w.Department,
RealAmount = w.RealAmount,
WorkPost = w.Post,
TitlePerfor = w.TitlePerformance,
WorkPerformance = bodyDynamic?.Where(b => b.BodyId == w.Id && b.ItemId.StartsWith("WorkPerformance_")).Sum(b => b.Value) ?? 0,
DeptReward = w.DeptReward,
DistPerformance = w.DistPerformance,
OtherPerformance = w.OtherPerformance,
NightWorkPerformance = w.NightWorkPerformance,
}).ToList();
}
else
else if (second.UseTempId.HasValue && (new int[] { 7, 8 }).Contains(second.UseTempId.Value))
{
var itemname = new List<string> { "人员工号", "姓名", "职称", "职称绩效", "工作量绩效工资", "单项奖励小计", "可分配绩效", "医院其他绩效", "夜班工作量绩效" };
var fixaitems = agfixatitemRepository.GetEntities(t => t.SecondId == secondId && itemname.Contains(t.ItemName));
......@@ -2150,6 +2131,29 @@ public List<SecPrintResponse> Print(int secondId)
result.Add(sec);
}
}
else
{
var data = agbodysourceRepository.GetEntities(t => t.SecondId == secondId);
if (data == null || !data.Any()) return new List<SecPrintResponse>();
var bodyDynamic = agworkloadsourceRepository.GetEntities(t => data.Select(w => w.Id).Contains(t.BodyId));
if (data == null || !data.Any()) return new List<SecPrintResponse>();
result = data.Select(w => new SecPrintResponse
{
JobNumber = w.WorkNumber,
PersonName = w.Name,
Department = w.Department,
RealAmount = w.RealAmount,
WorkPost = w.Post,
TitlePerfor = w.TitlePerformance,
WorkPerformance = bodyDynamic?.Where(b => b.BodyId == w.Id && b.ItemId.StartsWith("WorkPerformance_")).Sum(b => b.Value) ?? 0,
DeptReward = w.DeptReward,
DistPerformance = w.DistPerformance,
OtherPerformance = w.OtherPerformance,
NightWorkPerformance = w.NightWorkPerformance,
}).ToList();
}
// 补充医院其他绩效 及 预留比例
var perapramounts = perapramountRepository.GetFullAmount(t => t.AllotId == second.AllotId && t.Status == 3);
......
......@@ -25,5 +25,15 @@ public static bool IsOffice(string unit)
{
return !string.IsNullOrEmpty(unit) && (unit == "行政后勤" || unit == "行政工勤");
}
/// <summary>
/// 核算单元类型是否相同
/// </summary>
/// <param name="left"></param>
/// <returns></returns>
public static bool IsEqualsUnitType(string left, string right)
{
return left?.Replace("行政后勤", "行政工勤") == right?.Replace("行政后勤", "行政工勤");
}
}
}
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