Commit 5cb55851 by 钟博

Merge branch 'feature/费用类型系数' into feature/划拨

# Conflicts:
#	performance/Performance.EntityModels/Context/PerformanceDbContext.cs
parents c80be479 8138b430
using FluentScheduler;
using Microsoft.Extensions.DependencyInjection;
using Performance.Services;
using System;
using System.Linq;
using System.Reflection;
namespace Performance.Api.Configurations
{
public static class FluentSchedulerConfig
{
public static void AddFluentSchedulerConfiguration(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
ServiceLocator.Instance = services.BuildServiceProvider();
JobManager.Initialize(new JobRegistry());
////扫描当前程序集中实现了Registry的类
//var registrys = Assembly.GetExecutingAssembly().GetTypes()
// .Where(t => !t.IsInterface && !t.IsSealed && !t.IsAbstract && typeof(Registry).IsAssignableFrom(t))
// .Select(s => s.Assembly.CreateInstance(s.FullName) as Registry)?.ToArray();
//// 注册同步服务
//JobManager.Initialize(registrys);
}
}
}
using FluentValidation.AspNetCore;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Linq;
......@@ -713,5 +714,30 @@ public ApiResponse SaveSecondaryAlias([FromBody] SaveCollectData request)
}
#endregion
#region 费用类型系数
[HttpPost("drugtype/factor")]
public ApiResponse GetDrugtypeFactor([FromBody] AllotDeptRequest request)
{
var data = _configService.GetDrugtypeFactor(request);
return new ApiResponse(ResponseType.OK, data);
}
[HttpPost("drugtype/factor/config")]
public ApiResponse GetDrugtypeFactorConfig([FromBody] AllotDeptRequest request)
{
var data = _configService.GetDrugtypeFactorConfig(request.HospitalId, request.AllotId);
return new ApiResponse(ResponseType.OK, data);
}
[HttpPost("drugtype/factor/save")]
public ApiResponse SaveDrugtypeFactor([FromBody] DrugtypeFactorRequest request)
{
_configService.SaveDrugtypeFactor(request);
return new ApiResponse(ResponseType.OK, "保存成功!");
}
#endregion
}
}
\ No newline at end of file
......@@ -22,14 +22,19 @@ public class EmployeeController : Controller
private AllotService allotService;
private ClaimService claim;
private IHostingEnvironment evn;
private readonly RoleService roleService;
private readonly UserService userService;
public EmployeeController(EmployeeService employeeService, AllotService allotService,
ClaimService claim, IHostingEnvironment evn)
ClaimService claim, IHostingEnvironment evn, RoleService roleService,
UserService userService)
{
this.employeeService = employeeService;
this.allotService = allotService;
this.claim = claim;
this.evn = evn;
this.roleService = roleService;
this.userService = userService;
}
/// <summary>
......@@ -456,8 +461,20 @@ public ApiResponse<List<TitleValue>> GetPerforTypeDict([FromRoute] int allotId)
[HttpPost]
public ApiResponse AprOverview(int allotId)
{
var relust = employeeService.GetOtherPerStats(allotId);
return new ApiResponse(ResponseType.OK, relust);
var roleType = new[] { 3, 4, 9, 10 };
var userid = claim.GetUserId();
var user = userService.GetUser(userid);
var role = roleService.GetUserRole(user.UserID);
var result = new List<Dictionary<string, string>>();
if (role.Any(t => roleType.Contains(t.Type.Value)))
result = employeeService.GetOtherPerStats(allotId,user.Department??"");
else
result = employeeService.GetOtherPerStats(allotId);
return new ApiResponse(ResponseType.OK, result);
}
#endregion
......
......@@ -8,7 +8,7 @@ public JobRegistry()
{
//Schedule<ExtractDataJob>().ToRunNow().AndEvery(1).Days().At(23, 0);
//Schedule<ExtractDataJob>().ToRunEvery(1).Days().At(23, 0);
Schedule<ExtractGenerateJob>().ToRunEvery(1).Days().At(1, 0);
Schedule<ExtractGenerateJob>().ToRunEvery(1).Days().At(14, 00);
}
}
}
......@@ -87,6 +87,9 @@ public void ConfigureServices(IServiceCollection services)
policy.SetIsOriginAllowed(origin => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();
});
});
// fluentscheduler
services.AddFluentSchedulerConfiguration();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
......
......@@ -179,6 +179,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>
......@@ -836,6 +842,12 @@
<member name="F:Performance.DtoModels.SheetType.Assess">
<summary> 考核 </summary>
</member>
<member name="F:Performance.DtoModels.SheetType.DoctorIncome">
<summary> 医生收入 </summary>
</member>
<member name="F:Performance.DtoModels.SheetType.Custom">
<summary> 自定义抽取模板 </summary>
</member>
<member name="T:Performance.DtoModels.AccountUnitType">
<summary>
核算单元类型
......@@ -3690,6 +3702,11 @@
夜班工作量绩效
</summary>
</member>
<member name="P:Performance.DtoModels.SecPrintResponse.ReservedRatio">
<summary>
预留比例
</summary>
</member>
<member name="P:Performance.DtoModels.SecPrintResponse.RealAmount">
<summary>
实发绩效工资金额
......
......@@ -100,6 +100,9 @@
<member name="P:Performance.EntityModels.PerformanceDbContext.cof_drugtype">
<summary> 药占比费用列头名称 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.cof_drugtype_factor">
<summary> 药占比费用列头名称系数 </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.cof_guarantee">
<summary> 保底科室配置 </summary>
</member>
......@@ -1894,6 +1897,51 @@
费用类别
</summary>
</member>
<member name="T:Performance.EntityModels.cof_drugtype_factor">
<summary>
药占比费用列头名称
</summary>
</member>
<member name="P:Performance.EntityModels.cof_drugtype_factor.ID">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.cof_drugtype_factor.HospitalId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.cof_drugtype_factor.AllotID">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.cof_drugtype_factor.Charge">
<summary>
费用名称
</summary>
</member>
<member name="P:Performance.EntityModels.cof_drugtype_factor.ExModuleId">
<summary>
收入类型
</summary>
</member>
<member name="P:Performance.EntityModels.cof_drugtype_factor.YSZ">
<summary>
医生组
</summary>
</member>
<member name="P:Performance.EntityModels.cof_drugtype_factor.HLZ">
<summary>
护理组
</summary>
</member>
<member name="P:Performance.EntityModels.cof_drugtype_factor.YJZ">
<summary>
医技组
</summary>
</member>
<member name="T:Performance.EntityModels.cof_guarantee">
<summary>
保底科室配置
......@@ -7529,6 +7577,61 @@
</summary>
</member>
<member name="T:Performance.EntityModels.view_dic_category_factor">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.ID">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.HospitalId">
<summary>
医院id
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.AllotID">
<summary>
绩效id
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.Charge">
<summary>
费用名称
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.ChargeType">
<summary>
费用类别
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.ExModuleId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.ModuleName">
<summary>
模块名称
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.YSZ">
<summary>
医生组系数
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.HLZ">
<summary>
护理组系数
</summary>
</member>
<member name="P:Performance.EntityModels.view_dic_category_factor.YJZ">
<summary>
医技组系数
</summary>
</member>
<member name="P:Performance.EntityModels.HisData.HisDepartment">
<summary>
His科室
......
......@@ -99,6 +99,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 object[] { };
}
public List<string> ColHeaders { get; set; }
public List<Dictionary<string, object>> Data { get; set; }
public List<HandsonColumn> Columns { get; set; }
public object[] 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%" };
......@@ -163,4 +185,17 @@ public HandsonCellData(string name, object value)
public string Name { get; set; }
public object Value { get; set; }
}
public class NestedHeader
{
public NestedHeader(string label, int colspan)
{
Label = label;
Colspan = colspan;
}
public string Label { get; set; }
public int Colspan { get; set; }
}
}
......@@ -187,6 +187,14 @@ public enum SheetType
/// <summary> 考核 </summary>
[Description("考核")]
Assess = 38, //该参数作用类似于 其他工作量
/// <summary> 医生收入 </summary>
[Description("医生收入")]
DoctorIncome = 100,
/// <summary> 自定义抽取模板 </summary>
[Description("自定义抽取模板")]
Custom = 101,
}
/// <summary>
......
using System.Collections.Generic;
namespace Performance.DtoModels
{
public class DrugtypeFactorRequest
{
public int HospitalId { get; set; }
public int AllotId { get; set; }
public List<Dictionary<string, object>> Data { get; set; }
}
}
......@@ -47,6 +47,10 @@ public class SecPrintResponse
/// </summary>
public decimal? NightWorkPerformance { get; set; }
/// <summary>
/// 预留比例
/// </summary>
public decimal? ReservedRatio { get; set; }
/// <summary>
/// 实发绩效工资金额
/// </summary>
public decimal? RealAmount { get; set; }
......
......@@ -73,6 +73,8 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
public virtual DbSet<cof_drugprop> cof_drugprop { get; set; }
/// <summary> 药占比费用列头名称 </summary>
public virtual DbSet<cof_drugtype> cof_drugtype { get; set; }
/// <summary> 药占比费用列头名称系数 </summary>
public virtual DbSet<cof_drugtype_factor> cof_drugtype_factor { get; set; }
/// <summary> 保底科室配置 </summary>
public virtual DbSet<cof_guarantee> cof_guarantee { get; set; }
/// <summary> </summary>
......
//-----------------------------------------------------------------------
// <copyright file=" cof_drugtype_factor.cs">
// * FileName: 药占比费用列头名称.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
/// 药占比费用列头名称
/// </summary>
[Table("cof_drugtype_factor")]
public class cof_drugtype_factor
{
/// <summary>
///
/// </summary>
[Key]
public int ID { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> HospitalId { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> AllotID { get; set; }
/// <summary>
/// 费用名称
/// </summary>
public string Charge { get; set; }
/// <summary>
/// 收入类型
/// </summary>
public Nullable<int> ExModuleId { get; set; }
/// <summary>
/// 医生组
/// </summary>
public Nullable<decimal> YSZ { get; set; }
/// <summary>
/// 护理组
/// </summary>
public Nullable<decimal> HLZ { get; set; }
/// <summary>
/// 医技组
/// </summary>
public Nullable<decimal> YJZ { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" view_dic_category_factor.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("view_dic_category_factor")]
public class view_dic_category_factor
{
/// <summary>
///
/// </summary>
[Key]
public int ID { get; set; }
/// <summary>
/// 医院id
/// </summary>
public int HospitalId { get; set; }
/// <summary>
/// 绩效id
/// </summary>
public int AllotID { get; set; }
/// <summary>
/// 费用名称
/// </summary>
public string Charge { get; set; }
/// <summary>
/// 费用类别
/// </summary>
public string ChargeType { get; set; }
/// <summary>
///
/// </summary>
public int ExModuleId { get; set; }
/// <summary>
/// 模块名称
/// </summary>
public string ModuleName { get; set; }
/// <summary>
/// 医生组系数
/// </summary>
public Nullable<decimal> YSZ { get; set; }
/// <summary>
/// 护理组系数
/// </summary>
public Nullable<decimal> HLZ { get; set; }
/// <summary>
/// 医技组系数
/// </summary>
public Nullable<decimal> YJZ { get; set; }
}
}
......@@ -219,5 +219,11 @@ union all
return flag;
}
}
public IEnumerable<view_dic_category_factor> QueryCategoryFactor(int hospitalId, int allotId)
{
return DapperQuery<view_dic_category_factor>("select * from view_dic_category_factor where hospitalid = @hospitalid and allotid = @allotid;", new { hospitalId, allotId });
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" cof_drugtype_factor.cs">
// * FileName: cof_drugtype_factor.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// cof_drugtype_factor Repository
/// </summary>
public partial class PerforCofdrugtypefactorRepository : PerforRepository<cof_drugtype_factor>
{
public PerforCofdrugtypefactorRepository(PerformanceDbContext context) : base(context)
{
}
}
}
......@@ -891,7 +891,7 @@ public List<ComputeResponse> AllCompute(int allotId, int hospitalId, int isShowM
item.ReservedRatioFee = Math.Round(real * (item.ReservedRatio ?? 0), 2, MidpointRounding.AwayFromZero);
item.RealGiveFee = Math.Round(item.ShouldGiveFee - (item.ReservedRatioFee ?? 0) ?? 0, 2, MidpointRounding.AwayFromZero);
// 姓名始终按人员字典显示
item.EmployeeName = employees?.FirstOrDefault(w => w.PersonnelNumber == item.JobNumber)?.DoctorName ?? "";
//item.EmployeeName = employees?.FirstOrDefault(w => w.PersonnelNumber == item.JobNumber)?.DoctorName ?? "";
item.BankCard = employees?.FirstOrDefault(w => w.PersonnelNumber == item.JobNumber)?.BankCard ?? "";
// 人员信息使用人员字典中数据
if (isEmpDic)
......@@ -902,7 +902,7 @@ public List<ComputeResponse> AllCompute(int allotId, int hospitalId, int isShowM
}
}
response.RemoveAll(w => w.PerforSumFee == 0 && w.PerforManagementFee == 0 && w.ShouldGiveFee == 0 && w.OthePerfor == 0 && w.HideOtherPerfor == 0 && w.RealGiveFee == 0);
return response?.OrderByDescending(t => t.UnitType).ThenBy(t => t.AccountingUnit).ToList();
return response?.OrderByDescending(t => t.AccountingUnit).ToList();
}
///// <summary>
......
......@@ -267,7 +267,7 @@ public IEnumerable<dynamic> QueryData(sys_hospitalconfig config, string execsql,
/// </summary>
/// <param name="allot"></param>
/// <returns></returns>
private Dictionary<string, string> GetParameters(per_allot allot)
public Dictionary<string, string> GetParameters(per_allot allot)
{
DateTime beginTime = new DateTime(allot.Year, allot.Month, 1);
......
......@@ -665,10 +665,12 @@ public List<TitleValue> GetPerforTypeDict(int allotId)
/// </summary>
/// <param name="allotId"></param>
/// <returns></returns>
public List<Dictionary<string, string>> GetOtherPerStats(int allotId)
public List<Dictionary<string, string>> GetOtherPerStats(int allotId, string department=null)
{
var others = new List<Dictionary<string, string>>();
var aprAmountList = perapramountRepository.GetFullAmount(w => w.AllotId == allotId && w.Status == 3);
if (department != null)
aprAmountList = aprAmountList.Where(t => t.AccountingUnit == department).ToList();
var perForType = aprAmountList.Select(t => t.PerforType).Distinct();
foreach (var num in aprAmountList.Select(t => t.PersonnelNumber).Distinct())
......
......@@ -82,7 +82,7 @@ public List<ex_module> QueryModule(int hospitalId)
return list;
}
private void DefaultModules(int hospitalId)
public void DefaultModules(int hospitalId)
{
var moduleList = new ex_module[]
{
......@@ -552,7 +552,8 @@ public List<TitleValue> FeeType()
(int)SheetType.Expend,
(int)SheetType.Workload,
(int)SheetType.SpecialUnit,
(int)SheetType.OtherWorkload
(int)SheetType.OtherWorkload,
(int)SheetType.Custom
}.Contains(t.Value));
if (type != null && type.Any())
{
......
......@@ -21,5 +21,19 @@ public class SpecialUnitColumns
public const string AssessBefore = "考核前绩效";
public const string Avg = "人均";
#region Extend
public const string AssessBeforeTotal = "考核前绩效合计";
public const string NewAvg = "新人均";
public const string OldPerformanceTotal = "旧绩效合计";
public const string OldAvg = "旧人均";
public const string AvgDifference = "人均差额";
#endregion
}
}
......@@ -105,7 +105,7 @@ public static void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType s
dataFirstRowNum = point.DataFirstRowNum.Value + rows.Count;
}
if (data == null || !data.Any(t => !string.IsNullOrEmpty(t.Department))) return;
if (data == null || !data.Any()) return;
WriteSheetDataNonexistent(sheet, columnHeader, point, sheetType, style, headers, data, dataFirstRowNum);
}
......@@ -150,7 +150,7 @@ public static void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType s
var value = deptData.FirstOrDefault(t => t.Category.NoBlank() == column)?.Value;
//数据为空,且单元格值不为空,不写入数据(保留原始值)
var notWrite = !value.HasValue && !string.IsNullOrEmpty(cell.ToString());
if (cell.CellType != CellType.Formula && !notWrite)
if (/*cell.CellType != CellType.Formula && */!notWrite)
{
cell.SetCellValue<decimal>(value);
if (headers != null && headers.Contains(column))
......@@ -171,7 +171,7 @@ public static void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType s
private static void WriteSheetDataNonexistent(ISheet sheet, IRow columnHeader, PerSheetPoint point, SheetType sheetType, ExcelStyle style,
List<string> headers, List<ExtractTransDto> data, int dataFirstRowNum)
{
var departments = data.Select(s => s.Department).Where(w => !string.IsNullOrEmpty(w)).Distinct().ToList();
var departments = data.Select(s => s.Department ?? "")/*.Where(w => !string.IsNullOrEmpty(w))*/.Distinct().ToList();
var filed = sheet.SheetName.Contains("住院") ? fieldInpat : fieldOut;
if (sheet.SheetName.Contains("工作量"))
......@@ -186,7 +186,7 @@ public static void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType s
foreach (string department in departments)
{
var deptData = data.Where(t => t.Department == department);
var deptData = data.Where(t => (t.Department ?? "") == department);
if (deptData == null || !deptData.Any()) continue;
var row = sheet.GetOrCreate(dataFirstRowNum);
......@@ -327,7 +327,7 @@ public static void WriteCollectData(ISheet sheet, PerSheetPoint point, SheetType
dataFirstRowNum = point.DataFirstRowNum.Value + rows.Count;
}
if (data == null || !data.Any(t => !string.IsNullOrEmpty(t.Department))) return;
if (data == null || !data.Any()) return;
WriteCollectDataNonexistent(sheet, columnHeader, point, sheetType, style, headers, data, dataFirstRowNum);
}
......@@ -393,7 +393,7 @@ public static void WriteCollectData(ISheet sheet, PerSheetPoint point, SheetType
private static void WriteCollectDataNonexistent(ISheet sheet, IRow columnHeader, PerSheetPoint point, SheetType sheetType, ExcelStyle style,
List<string> headers, List<collect_data> data, int dataFirstRowNum)
{
var departments = data.Select(s => s.Department).Where(w => !string.IsNullOrEmpty(w)).Distinct().ToList();
var departments = data.Select(s => s.Department ?? "")/*.Where(w => !string.IsNullOrEmpty(w))*/.Distinct().ToList();
var filed = new SheetType[] { SheetType.Workload, SheetType.OtherWorkload }.Contains(sheetType)
? collectWork
......@@ -406,7 +406,7 @@ public static void WriteCollectData(ISheet sheet, PerSheetPoint point, SheetType
foreach (string department in departments)
{
var deptData = data.Where(t => t.Department == department);
var deptData = data.Where(t => (t.Department ?? "") == department);
if (deptData == null || !deptData.Any()) continue;
var row = sheet.GetOrCreate(dataFirstRowNum);
......
......@@ -130,7 +130,7 @@ public void ExportFile()
string extractFilePath = extractService.Main(allot.ID, allot.HospitalId, "", "User" + userId, filePath, isSingle);
if (string.IsNullOrEmpty(extractFilePath) || !FileHelper.IsExistFile(extractFilePath)) return;
ImportFile(allot, filePath);
ImportFile(allot, extractFilePath);
allotService.Generate(allot);
}
......
......@@ -21,6 +21,7 @@ public class ExtractService : IAutoInjection
private readonly PerSheetService perSheetService;
private readonly CostTransferDataWrite costTransfer;
private readonly DictionaryService dictionaryService;
private readonly CustomDataWrite customDataWrite;
private readonly PerforPerallotRepository perallotRepository;
private readonly PerforCollectdataRepository collectdataRepository;
private readonly PerforPeremployeeRepository peremployeeRepository;
......@@ -34,6 +35,7 @@ public class ExtractService : IAutoInjection
PerSheetService perSheetService,
CostTransferDataWrite costTransfer,
DictionaryService dictionaryService,
CustomDataWrite customDataWrite,
PerforPerallotRepository perallotRepository,
PerforCollectdataRepository collectdataRepository,
PerforPeremployeeRepository peremployeeRepository,
......@@ -47,6 +49,7 @@ PerforPerdeptdicRepository perdeptdicRepository
this.perSheetService = perSheetService;
this.costTransfer = costTransfer;
this.dictionaryService = dictionaryService;
this.customDataWrite = customDataWrite;
this.perallotRepository = perallotRepository;
this.collectdataRepository = collectdataRepository;
this.peremployeeRepository = peremployeeRepository;
......@@ -146,19 +149,19 @@ private void WriteDataToFile(IWorkbook workbook, per_allot allot, Dictionary<ExD
var types = new List<SheetType> { SheetType.OtherIncome, SheetType.Income, SheetType.Expend, SheetType.Workload, SheetType.OtherWorkload/*, SheetType.AccountBasic*/ };
decimal ratio = 60m;
string accountBasicSheetName = "";
for (int sheetIndex = 0; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
{
var sheetName = workbook.GetSheetAt(sheetIndex).SheetName;
if (!sheetName.StartsWith("4.1"))
continue;
//string accountBasicSheetName = "";
//for (int sheetIndex = 0; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
//{
// var sheetName = workbook.GetSheetAt(sheetIndex).SheetName;
// if (!sheetName.StartsWith("4.1"))
// continue;
accountBasicSheetName = sheetName;
break;
}
// accountBasicSheetName = sheetName;
// break;
//}
var accountBasicSheet = workbook.GetSheet(accountBasicSheetName);
HandleSheet(workbook, allot, exdict, extractDto, groupName, isSingle, accountBasicSheet, ratio, types, factory, style, employeeDict, collectData);
//var accountBasicSheet = workbook.GetSheet(accountBasicSheetName);
//HandleSheet(workbook, allot, exdict, extractDto, groupName, isSingle, accountBasicSheet, ratio, types, factory, style, employeeDict, collectData);
for (int sheetIndex = 0; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
{
......@@ -166,6 +169,8 @@ private void WriteDataToFile(IWorkbook workbook, per_allot allot, Dictionary<ExD
HandleSheet(workbook, allot, exdict, extractDto, groupName, isSingle, sheet, ratio, types, factory, style, employeeDict, collectData);
}
customDataWrite.WriteDataToCustom(workbook, allot, style);
}
private void HandleSheet(IWorkbook workbook, per_allot allot, Dictionary<ExDataDict, object> exdict, List<ExtractTransDto> extractDto, string groupName, bool isSingle,
......@@ -245,6 +250,12 @@ private List<ExtractTransDto> StandDataFormat(int hospitalId, List<ex_result> re
{
if (results == null || !results.Any()) return new List<ExtractTransDto>();
results.ForEach(t =>
{
t.Category = string.IsNullOrEmpty(t.Category) ? "(空白)" : t.Category;
t.Department = string.IsNullOrEmpty(t.Department) ? "(空白)" : t.Department;
});
var dict = personService.GetDepartments(hospitalId)?.ToList();
if (dict == null || !dict.Any())
return results.GroupBy(t => new { t.Department, t.Category, t.Source }).Select(t => new ExtractTransDto
......
......@@ -125,7 +125,7 @@ private List<int> GetQueryScriptIds(int hospitalId, ref Dictionary<ExDataDict, o
{
var extypeIds = new List<int>();
var modules = exmoduleRepository.GetEntities(t => t.HospitalId == hospitalId);
var modules = exmoduleRepository.GetEntities(t => t.HospitalId == hospitalId && t.SheetType != (int)SheetType.Custom);
var items = new List<ex_item>();
if (modules != null && modules.Any())
{
......
using Microsoft.Extensions.Logging;
using NPOI.SS.UserModel;
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Performance.Services.ExtractExcelService.SheetDataWrite
{
public class CustomDataWrite : IAutoInjection
{
private readonly ILogger<CustomDataWrite> logger;
private readonly PerforHospitalconfigRepository hospitalconfigRepository;
private readonly PerforExmoduleRepository exmoduleRepository;
private readonly PerforExscriptRepository exscriptRepository;
private readonly CustomExtractService customExtractService;
public CustomDataWrite(
ILogger<CustomDataWrite> logger,
PerforHospitalconfigRepository hospitalconfigRepository,
PerforExmoduleRepository exmoduleRepository,
PerforExscriptRepository exscriptRepository,
CustomExtractService customExtractService
)
{
this.logger = logger;
this.hospitalconfigRepository = hospitalconfigRepository;
this.exmoduleRepository = exmoduleRepository;
this.exscriptRepository = exscriptRepository;
this.customExtractService = customExtractService;
}
public PerSheetPoint Point => new PerSheetPoint
{
HeaderFirstRowNum = 1,
HeaderFirstCellNum = 6,
DataFirstRowNum = 2,
DataFirstCellNum = 6,
};
public void WriteDataToCustom(IWorkbook workbook, per_allot allot, ExcelStyle style)
{
var modules = exmoduleRepository.GetEntities(t => t.SheetType == (int)SheetType.Custom)?.OrderBy(t => t.ModuleName);
if (modules == null || !modules.Any()) return;
var exscripts = exscriptRepository.GetEntities(t => modules.Select(s => s.TypeId).Contains(t.TypeId));
if (exscripts == null || !exscripts.Any()) return;
var configs = hospitalconfigRepository.GetEntities(t => t.HospitalId == allot.HospitalId);
if (configs == null || !configs.Any()) throw new Exception("医院未配置绩效抽取信息");
var parameters = customExtractService.GetParameters(allot);
var headerStyle = style.SetBgkColorAndFormat(style.GetCellStyle(), StyleType.列头);
var cellStyle = style.SetBgkColorAndFormat(style.GetCellStyle(), StyleType.数据);
foreach (var module in modules)
{
var sheet = workbook.GetSheet(module.ModuleName) ?? workbook.GetSheet(module.ModuleName.NoBlank());
if (sheet == null)
{
sheet = workbook.CreateSheet(module.ModuleName);
workbook.SetSheetOrder(sheet.SheetName, workbook.NumberOfSheets - 1);
}
var exscript = exscripts.FirstOrDefault(t => t.TypeId == module.TypeId);
if (exscript == null) continue;
var conf = configs.FirstOrDefault(w => w.Id == (module.ConfigId ?? exscript.ConfigId));
if (conf == null) continue;
var execsql = exscript.ExecScript;
var dynamics = customExtractService.QueryData(conf, execsql, parameters);
try
{
// 没数据跳过
if (dynamics == null || dynamics.Count() == 0)
continue;
var first = (IDictionary<string, object>)dynamics.ElementAt(0);
var header = sheet.GetOrCreate(Point.HeaderFirstRowNum.Value);
if (header != null)
{
var cellindex = Point.HeaderFirstCellNum.Value;
foreach (var item in first)
{
var cell = header.GetOrCreate(cellindex);
cell.SetCellOValue(item.Key);
cell.CellStyle = headerStyle;
cellindex++;
}
}
var rowindex = Point.DataFirstRowNum.Value;
for (int r = 0; r < dynamics.Count(); r++)
{
var temp = (IDictionary<string, object>)dynamics.ElementAt(r); // 行数据
var row = sheet.GetOrCreate(rowindex);
var cellindex = Point.DataFirstCellNum.Value;
foreach (var item in temp)
{
var cell = row.GetOrCreate(cellindex);
cell.SetCellOValue(item.Value);
cell.CellStyle = cellStyle;
cellindex++;
}
rowindex++;
}
}
catch (Exception ex)
{
logger.LogError($"自定义模板 - {sheet.SheetName}抽取异常:" + ex);
}
}
}
}
}
......@@ -44,7 +44,7 @@ public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetTyp
if (data is List<ExtractTransDto> extractDto && extractDto.Any())
{
var headers = extractDto.Select(t => t.Category.Trim()).Distinct()
var headers = extractDto.Select(t => t.Category?.Trim() ?? "").Distinct()
.Select(t => new ExcelHeader
{
ColumnName = t,
......
......@@ -329,8 +329,13 @@ private void AddMergedRegion(ISheet sheet, List<SpecialCellRange> ranges, List<s
SpecialUnitColumns.Department,
SpecialUnitColumns.PeopleNumber,
SpecialUnitColumns.AdjustFactor,
SpecialUnitColumns.AssessBefore,
SpecialUnitColumns.Avg
//SpecialUnitColumns.AssessBefore,
SpecialUnitColumns.Avg,
SpecialUnitColumns.AssessBeforeTotal,
SpecialUnitColumns.NewAvg,
SpecialUnitColumns.OldPerformanceTotal,
SpecialUnitColumns.OldAvg,
SpecialUnitColumns.AvgDifference
}.Select(t => columns.IndexOf(t));
if (columnIndexs == null || !columnIndexs.Any(t => t > -1)) return;
......
......@@ -36,9 +36,9 @@ public ISheetDataWrite GetWriteData(SheetType sheetType, ILogger logger)
factory = new WorkloadDataWrite(logger);
break;
case SheetType.AccountBasic:
factory = new AccountBasicDataWrite(logger);
break;
//case SheetType.AccountBasic:
// factory = new AccountBasicDataWrite(logger);
// break;
case SheetType.SpecialUnit:
factory = new SpecialUnitDataWrite(logger);
......@@ -52,18 +52,18 @@ public ISheetDataWrite GetWriteData(SheetType sheetType, ILogger logger)
// factory = new DepartmentDataWrite(logger);
// break;
case SheetType.AccountExtra:
case SheetType.AccountDrugAssess:
case SheetType.AccountMaterialsAssess:
case SheetType.AccountScoreAverage:
case SheetType.BudgetRatio:
case SheetType.AssessBeforeOtherFee:
case SheetType.AccountAdjustLaterOtherFee:
case SheetType.WorkloadMedicineProp:
case SheetType.WorkloadCMI:
case SheetType.WorkloadIncline:
factory = new AccountExtraDataWrite(logger);
break;
//case SheetType.AccountExtra:
//case SheetType.AccountDrugAssess:
//case SheetType.AccountMaterialsAssess:
//case SheetType.AccountScoreAverage:
//case SheetType.BudgetRatio:
//case SheetType.AssessBeforeOtherFee:
//case SheetType.AccountAdjustLaterOtherFee:
//case SheetType.WorkloadMedicineProp:
//case SheetType.WorkloadCMI:
//case SheetType.WorkloadIncline:
// factory = new AccountExtraDataWrite(logger);
// break;
default:
return null;
......
......@@ -71,7 +71,7 @@ public string Execture(int allotId)
var configs = hospitalconfigRepository.GetEntities(t => t.HospitalId == allot.HospitalId);
if (configs == null || !configs.Any()) throw new PerformanceException("未添加医院提取配置");
var types = extypeRepository.GetEntities(t => t.Source == 100);
var types = extypeRepository.GetEntities(t => t.Source == (int)SheetType.DoctorIncome);
if (types == null || !types.Any()) throw new PerformanceException("未配置数据提取内容");
Dictionary<string, List<IncomeDataDto>> pairs = new Dictionary<string, List<IncomeDataDto>>();
......
......@@ -378,7 +378,7 @@ public IEnumerable<DeptdicResponse> GetDepartments(int hospitalId)
{ application.DirectorRole, new string[]{ UnitType.医生组.ToString(), UnitType.其他医生组.ToString(), UnitType.医技组.ToString(), UnitType.其他医技组.ToString() } },
{ application.NurseRole, new string[]{ UnitType.护理组.ToString() } },
{ application.SpecialRole, new string[]{ UnitType.特殊核算组.ToString() } },
{ application.OfficeRole, new string[]{ UnitType.行政后勤.ToString() } },
{ application.OfficeRole, new string[]{ UnitType.行政后勤.ToString(), "行政工勤" } },
};
if (dict.Keys.Contains(role.Type.Value))
......@@ -720,6 +720,7 @@ public bool BathSavePerson(int AllotId, int HospitalId, SaveCollectData request)
var dicData = CreateDataRow(request, dict);
List<per_employee> employees = new List<per_employee>();
var persons = peremployeeRepository.GetEntities(t => t.HospitalId == HospitalId && t.AllotId == AllotId);
var delPersonsNum =new List<string>();
foreach (var item in dicData)
{
if (!string.IsNullOrEmpty(item["AttendanceDay"]) && !string.IsNullOrEmpty(item["ReservedRatio"]))
......@@ -732,7 +733,8 @@ public bool BathSavePerson(int AllotId, int HospitalId, SaveCollectData request)
var json = JsonHelper.Serialize(item);
var data = JsonHelper.Deserialize<per_employee>(json);
if (persons != null)
if (persons.Any(t => t.PersonnelNumber?.Trim() == data.PersonnelNumber?.Trim() && t.DoctorName?.Trim() == data.DoctorName?.Trim())) continue;
if (persons.Any(t => t.PersonnelNumber?.Trim() == data.PersonnelNumber?.Trim())) delPersonsNum.Add(data.PersonnelNumber);
var any = employees.Any(w => w.Department?.Trim() == data.Department?.Trim() && w.DoctorName?.Trim() == data.DoctorName?.Trim());
if (!string.IsNullOrEmpty(data.Department?.Trim()) && !string.IsNullOrEmpty(data.AccountingUnit?.Trim()) && !string.IsNullOrEmpty(data.DoctorName?.Trim()) && !any)
......@@ -746,6 +748,8 @@ public bool BathSavePerson(int AllotId, int HospitalId, SaveCollectData request)
employees.Add(data);
}
}
var delPerson = persons.Where(t => delPersonsNum.Contains(t.PersonnelNumber)).ToArray();
peremployeeRepository.RemoveRange(delPerson);
if (employees.Any())
peremployeeRepository.AddRange(employees.ToArray());
......@@ -755,23 +759,27 @@ public bool BathSavePerson(int AllotId, int HospitalId, SaveCollectData request)
public void SaveDeptDicHands(int HospitalId, SaveCollectData request)
{
var dicData = CreateDataRow(request, DeptDic);
var depts = perdeptdicRepository.GetEntities(t => t.HospitalId == HospitalId)?.Select(w => new { w.Department, w.HISDeptName }).Distinct();
var deptDic = perdeptdicRepository.GetEntities(t => t.HospitalId == HospitalId);
var depts =deptDic?.Select(w => new { w.Department, w.HISDeptName }).Distinct();
List<per_dept_dic> deptDics = new List<per_dept_dic>();
var delDepartment = new List<string>();
foreach (var dic in dicData)
{
var json = JsonHelper.Serialize(dic);
var data = JsonHelper.Deserialize<DeptdicHands>(json);
if (depts != null)
if (depts.Any(t => t.Department?.Trim() == data.Department?.Trim())) continue;
var any = deptDics.Any(w => w.Department?.Trim() == data.Department?.Trim());
if (depts.Any(t => t.HISDeptName?.Trim() == data.HISDeptName?.Trim())) delDepartment.Add(data.HISDeptName);
var any = deptDics.Any(w => w.HISDeptName?.Trim() == data.HISDeptName?.Trim());
if (!string.IsNullOrEmpty(data.Department?.Trim()) && !any)
if (!string.IsNullOrEmpty(data.HISDeptName?.Trim()) && !any)
{
DeptDicList(HospitalId, deptDics, data);
}
}
var delDept = deptDic.Where(t => delDepartment.Contains(t.HISDeptName)).ToArray();
perdeptdicRepository.RemoveRange(delDept);
if (deptDics.Any())
perdeptdicRepository.AddRange(deptDics.ToArray());
}
......
......@@ -106,7 +106,7 @@ private JArray GetBodyItemsByEmployeeSource(int userId, int employeeSource, ag_s
break;
case int source when source == (int)EmployeeSource.PrevSecondAllot && prevSecond != null:
bodysources = GetEmployeeFromPrevData(prevSecond, employeeList);
bodysources = GetEmployeeFromPrevData(prevSecond, employeeList, second.Id);
break;
default:
......@@ -149,19 +149,24 @@ public List<ag_bodysource> GetEmployeeFromEmployeeDict(List<per_employee> employ
}
return bodysources;
}
/// <summary>
/// 从上一次的保存信息中获取人员信息
/// </summary>
/// <param name="prevSecondAllot"></param>
/// <param name="otherShowColumns"></param>
/// <param name="prevSecond"></param>
/// <param name="employeeList"></param>
/// <param name="secondId"></param>
/// <returns></returns>
public List<ag_bodysource> GetEmployeeFromPrevData(ag_secondallot prevSecond, List<per_employee> employeeList)
public List<ag_bodysource> GetEmployeeFromPrevData(ag_secondallot prevSecond, List<per_employee> employeeList, int secondId)
{
var result = new List<ag_bodysource>();
var body = agbodysourceRepository.GetEntities(t => t.SecondId == prevSecond.Id);
if (body == null || !body.Any()) return new List<ag_bodysource>();
if (body == null || !body.Any()) return result;
foreach (var item in body.Select(t => new ag_bodysource
var data = body.Select(t => new ag_bodysource
{
Id = 0,
SecondId = secondId,
WorkNumber = t.WorkNumber,
Name = t.Name,
Post = t.Post,
......@@ -169,11 +174,13 @@ public List<ag_bodysource> GetEmployeeFromPrevData(ag_secondallot prevSecond, Li
StaffCoefficient = t.StaffCoefficient,
JobTitle = t.JobTitle,
TitleCoefficient = t.TitleCoefficient
}))
});
foreach (var item in data)
{
item.ActualAttendance = employeeList?.FirstOrDefault(w => w.PersonnelNumber == item.WorkNumber && w.DoctorName == item.Name)?.AttendanceDay;
result.Add(item);
}
return body;
return result;
}
/// <summary>
......
......@@ -2185,7 +2185,10 @@ public List<SecPrintResponse> Print(int secondId)
// 重算实发绩效
foreach (var item in result)
{
item.RealAmount = (item.DistPerformance ?? 0) + (item.OtherPerformance ?? 0) + (item.NightWorkPerformance ?? 0);
per_employee employee = employees?.FirstOrDefault(t => t.PersonnelNumber == item.JobNumber);
if (employee != null)
item.ReservedRatio = employee.ReservedRatio ?? 0;
item.RealAmount = (item.DistPerformance ?? 0) * (1 - (item.ReservedRatio ?? 0)) + (item.OtherPerformance ?? 0) + (item.NightWorkPerformance ?? 0);
}
......
......@@ -143,7 +143,7 @@ public SheetExportResponse SheetExport(int sheetID)
private void CommonExport(int sheetID, SheetExportResponse response)
{
var headList = _perforImHeaderRepository.GetEntities(t => t.SheetID == sheetID)?.OrderBy(t => t.PointCell);
var headList = _perforImHeaderRepository.GetEntities(t => t.SheetID == sheetID)?.OrderBy(t => t.PointCell).ToDistinct(t=>t.CellValue);
if (headList == null) return;
var dataList = _perforImDataRepository.GetEntities(t => t.SheetID == sheetID)?.OrderByDescending(t => t.AccountingUnit).ToList();
......
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