科室核算

parent b13d0549
......@@ -145,47 +145,7 @@ public ApiResponse Generate([CustomizeValidator(RuleSet = "Delete"), FromBody]Al
if (null == allot || string.IsNullOrEmpty(allot.Path))
throw new PerformanceException("当前绩效记录不存在或没有上传数据文件");
// 拷贝配置信息
_perExcelService.Copy(allot.ID);
// 导出数据
var excel = _perExcelService.Import(allot.Path);
// 保存数据
_perExcelService.Save(excel.PerSheet, allot.ID, 1);
// 计算合并数据
List<PerSheet> list = _perExcelService.ProcessCompute(excel);
// 保存过程数据
_perExcelService.Save(list, allot.ID, 2);
// 计算最总数据
_perExcelService.Compute(excel);
//Action<PerExcelService> action = (service) =>
//{
// // 拷贝配置信息
// service.Copy(allot.ID);
// // 导出数据
// var excel = service.Import(allot.Path);
// // 保存数据
// //service.ImportSave(excel);
// // 计算合并数据
// service.ProcessCompute(excel);
// // 保存过程数据
// service.ProcessSave(excel, allot.ID);
// // 计算最总数据
// service.Compute(excel);
//};
//BackgroundJob.Enqueue(() => action.Invoke(_perExcelService));
BackgroundJob.Schedule(() => _perExcelService.Execute(allot), TimeSpan.FromSeconds(10));
return new ApiResponse(ResponseType.OK);
}
}
......
......@@ -18,7 +18,7 @@
<PackageReference Include="CSRedisCore" Version="3.0.45" />
<PackageReference Include="FluentValidation.AspNetCore" Version="8.1.3" />
<PackageReference Include="Hangfire" Version="1.6.22" />
<PackageReference Include="Hangfire.Redis.StackExchange" Version="1.8.0" />
<PackageReference Include="Hangfire.MySql.Core" Version="2.2.2" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.0" />
......
......@@ -2,6 +2,7 @@
using FluentValidation;
using FluentValidation.AspNetCore;
using Hangfire;
using Hangfire.MySql.Core;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
......@@ -113,11 +114,11 @@ public void ConfigureServices(IServiceCollection services)
var csredis = new CSRedis.CSRedisClient(connection.Value.RedisConnectionString);
RedisHelper.Initialization(csredis);
////后台任务调度
//services.AddHangfire(config =>
//{
// config.UseRedisStorage(connection.Value.HangfireRedisConnectionString);
//});
//后台任务调度
services.AddHangfire(config =>
{
config.UseStorage(new MySqlStorage(connection.Value.HangfireConnectionString));
});
services.AddDbContext<PerformanceDbContext>(options =>
{
......@@ -148,11 +149,19 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
// c.RoutePrefix = string.Empty;
//});
//app.UseHangfireServer();
//app.UseHangfireDashboard();
app.UseHangfireServer();
app.UseHangfireDashboard("/hangfire", new DashboardOptions { Authorization = new[] { new HangfireAuthorizationFilter() } });
loggerFactory.CreateLogger<Startup>().LogDebug(env.EnvironmentName);
app.UseMvc();
}
}
public class HangfireAuthorizationFilter : Hangfire.Dashboard.IDashboardAuthorizationFilter
{
//这里需要配置权限规则
public bool Authorize(Hangfire.Dashboard.DashboardContext context)
{
return true;
}
}
}
......@@ -8,6 +8,7 @@
},
"AppConnection": {
"PerformanceConnectionString": "server=192.168.18.166;database=db_performance;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=1"
},
"Application": {
......
......@@ -7,8 +7,8 @@
//连接字符串
"AppConnection": {
"PerformanceConnectionString": "server=116.62.245.55;database=db_performance;uid=suvalue;pwd=suvalue2017;pooling=true;charset=utf8;convert zero datetime=true;port=3306;connection timeout=120;max pool size=512;allow user variables=true;",
"HangfireRedisConnectionString": "116.62.245.55:6379,defaultDatabase=1",
"RedisConnectionString": "116.62.245.55:6379,defaultDatabase=2"
"HangfireConnectionString": "server=116.62.245.55;database=db_hangfire;uid=suvalue;pwd=suvalue2017;port=3306;allow user variables=true;",
"redisconnectionstring": "116.62.245.55:6379,defaultdatabase=2"
},
//互亿
"HuyiSmsConfig": {
......
......@@ -7,7 +7,7 @@
//连接字符串
"AppConnection": {
"PerformanceConnectionString": "server=116.62.245.55;database=db_performance;uid=suvalue;pwd=suvalue2017;pooling=true;charset=utf8;convert zero datetime=true;port=3306;connection timeout=120;max pool size=512;allow user variables=true;",
"HangfireRedisConnectionString": "116.62.245.55:6379,defaultDatabase=1",
"HangfireConnectionString": "server=192.168.18.166;database=db_hangfire;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;",
"RedisConnectionString": "116.62.245.55:6379,defaultDatabase=2"
},
//互亿
......
......@@ -11,6 +11,6 @@ public class AppConnection
{
public string PerformanceConnectionString { get; set; }
public string RedisConnectionString { get; set; }
public string HangfireRedisConnectionString { get; set; }
public string HangfireConnectionString { get; set; }
}
}
......@@ -70,7 +70,34 @@ public AutoMapperConfigs()
.ForMember(dest => dest.UnitType, opt => opt.MapFrom(src => src.UnitType == "医生组" ? 1 : (src.UnitType == "护理组" ? 2 : 0)));
CreateMap<PerDataEmployee, im_employee>();
CreateMap<PerDataDeptAccounting, im_deptaccounting>();
CreateMap<PerDataAccountBaisc, PerDataAccountDoctor>()
.ForMember(dest => dest.AccountingUnit, opt => opt.MapFrom(src => src.AccountingUnit))
.ForMember(dest => dest.Department, opt => opt.MapFrom(src => src.Department))
.ForMember(dest => dest.Number, opt => opt.MapFrom(src => src.DoctorNumber))
.ForMember(dest => dest.BasicFactor, opt => opt.MapFrom(src => src.DoctorBasicFactor))
.ForMember(dest => dest.SlopeFactor, opt => opt.MapFrom(src => src.DoctorSlopeFactor))
.ForMember(dest => dest.OtherPerfor1, opt => opt.MapFrom(src => src.DoctorOtherPerfor1))
.ForMember(dest => dest.OtherPerfor2, opt => opt.MapFrom(src => src.DoctorOtherPerfor2))
.ForMember(dest => dest.Extra, opt => opt.MapFrom(src => src.DoctorExtra))
.ForMember(dest => dest.ScoringAverage, opt => opt.MapFrom(src => src.DoctorScoringAverage))
.ForMember(dest => dest.AdjustFactor, opt => opt.MapFrom(src => src.DoctorAdjustFactor));
CreateMap<PerDataAccountBaisc, PerDataAccountNurse>()
.ForMember(dest => dest.AccountingUnit, opt => opt.MapFrom(src => src.AccountingUnit))
.ForMember(dest => dest.Department, opt => opt.MapFrom(src => src.Department))
.ForMember(dest => dest.Number, opt => opt.MapFrom(src => src.NurseNumber))
.ForMember(dest => dest.BasicFactor, opt => opt.MapFrom(src => src.NurseBasicFactor))
.ForMember(dest => dest.SlopeFactor, opt => opt.MapFrom(src => src.NurseSlopeFactor))
.ForMember(dest => dest.OtherPerfor1, opt => opt.MapFrom(src => src.NurseOtherPerfor1))
.ForMember(dest => dest.OtherPerfor2, opt => opt.MapFrom(src => src.NurseOtherPerfor2))
.ForMember(dest => dest.Extra, opt => opt.MapFrom(src => src.NurseExtra))
.ForMember(dest => dest.ScoringAverage, opt => opt.MapFrom(src => src.NurseScoringAverage))
.ForMember(dest => dest.AdjustFactor, opt => opt.MapFrom(src => src.NurseAdjustFactor));
CreateMap<PerDataAccountBaisc, im_accountbasic>();
CreateMap<PerDataAccountDoctor, im_accountdoctor>();
CreateMap<PerDataAccountNurse, im_accountnurse>();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
/// <summary>
/// 门诊药占比分值
/// </summary>
public class CofDrugProp
{
public string AccoutingUnit { get; set; }
/// <summary>
/// 占比
/// </summary>
public decimal Prop { get; set; }
/// <summary>
/// 分值
/// </summary>
public decimal Factor { get; set; }
}
}
......@@ -31,5 +31,11 @@ public enum SheetType
SpecialUnit = 8,
[Description("核算单元统一系数")]
DeptAccounting = 9,
ComputeEconomic = 10,
ComputeDoctorWorkload = 11,
ComputeNurseWorkload = 12,
ComputeDoctorAccount = 13,
ComputeNurseAccount = 14,
}
}
......@@ -4,7 +4,7 @@
namespace Performance.DtoModels
{
public class PerDataDeptAccounting : IPerData
public class PerDataAccountBaisc : IPerData
{
/// <summary>
/// 核算单元
......@@ -19,65 +19,84 @@ public class PerDataDeptAccounting : IPerData
/// <summary>
/// 核算单元医生数量
/// </summary>
public Nullable<int> DoctorNumber { get; set; }
public decimal DoctorNumber { get; set; }
/// <summary>
/// 医生预设总系数
/// 医生基础系数
/// </summary>
public Nullable<decimal> DoctorFactor { get; set; }
public decimal DoctorBasicFactor { get; set; }
/// <summary>
/// 倾斜系数
/// </summary>
public decimal DoctorSlopeFactor { get; set; }
/// <summary>
/// 其他绩效1
/// </summary>
public Nullable<decimal> DoctorOtherPerfor1 { get; set; }
public decimal DoctorOtherPerfor1 { get; set; }
/// <summary>
/// 其他绩效2
/// </summary>
public Nullable<decimal> DoctorOtherPerfor2 { get; set; }
public decimal DoctorOtherPerfor2 { get; set; }
/// <summary>
/// 医院奖罚
/// </summary>
public Nullable<decimal> DoctorExtra { get; set; }
public decimal DoctorExtra { get; set; }
/// <summary>
/// 考核对分率
/// </summary>
public Nullable<decimal> DoctorScoringAverage { get; set; }
public decimal DoctorScoringAverage { get; set; }
/// <summary>
/// 调节系数
/// </summary>
public decimal DoctorAdjustFactor { get; set; }
/// <summary>
/// 核算单元护士数量
/// </summary>
public Nullable<int> NurseNumber { get; set; }
public decimal NurseNumber { get; set; }
/// <summary>
/// 护理预设总系数
/// 护理基础系数
/// </summary>
public Nullable<decimal> NurseFactor { get; set; }
public decimal NurseBasicFactor { get; set; }
/// <summary>
/// 护理倾斜系数
/// </summary>
public decimal NurseSlopeFactor { get; set; }
/// <summary>
/// 其他绩效1
/// </summary>
public Nullable<decimal> NurseOtherPerfor1 { get; set; }
public decimal NurseOtherPerfor1 { get; set; }
/// <summary>
/// 其他绩效2
/// </summary>
public Nullable<decimal> NurseOtherPerfor2 { get; set; }
public decimal NurseOtherPerfor2 { get; set; }
/// <summary>
/// 医院奖罚
/// </summary>
public Nullable<decimal> NurseExtra { get; set; }
public decimal NurseExtra { get; set; }
/// <summary>
/// 考核对分率
/// </summary>
public Nullable<decimal> NurseScoringAverage { get; set; }
public decimal NurseScoringAverage { get; set; }
/// <summary>
/// 调节系数
/// </summary>
public decimal NurseAdjustFactor { get; set; }
/// <summary>
/// 行号
/// </summary>
public int RowNumber { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class PerDataAccountDoctor : IPerData
{
/// <summary>
/// 核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室名称
/// </summary>
public string Department { get; set; }
/// <summary>
/// 核算单元医生数量
/// </summary>
public decimal Number { get; set; }
/// <summary>
/// 医生基础系数
/// </summary>
public decimal BasicFactor { get; set; }
/// <summary>
/// 倾斜系数
/// </summary>
public decimal SlopeFactor { get; set; }
/// <summary>
/// 其他绩效1
/// </summary>
public decimal OtherPerfor1 { get; set; }
/// <summary>
/// 其他绩效2
/// </summary>
public decimal OtherPerfor2 { get; set; }
/// <summary>
/// 医院奖罚
/// </summary>
public decimal Extra { get; set; }
/// <summary>
/// 考核对分率
/// </summary>
public decimal ScoringAverage { get; set; }
/// <summary>
/// 调节系数
/// </summary>
public decimal AdjustFactor { get; set; }
/// <summary>
/// 科室业绩
/// </summary>
public decimal Income { get; set; }
/// <summary>
/// 工作量绩效
/// </summary>
public decimal WorkloadFee { get; set; }
private decimal perforFee;
private decimal perforTotal;
private decimal avg;
private decimal giveFee;
/// <summary>
/// 绩效合计
/// </summary>
public decimal PerforTotal { get => PerforFee + WorkloadFee + OtherPerfor1; set => perforTotal = value; }
/// <summary>
/// 业绩绩效
/// </summary>
public decimal PerforFee { get => Income * (BasicFactor + (BasicFactor * SlopeFactor)); set => perforFee = value; }
/// <summary>
/// 实发绩效
/// </summary>
public decimal GiveFee { get => (PerforTotal * ScoringAverage + Extra + OtherPerfor2) * AdjustFactor; set => giveFee = value; }
/// <summary>
/// 人均绩效
/// </summary>
public decimal Avg { get => Number == 0 ? 0 : PerforTotal / Number; set => avg = value; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class PerDataAccountNurse : IPerData
{
/// <summary>
/// 核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室名称
/// </summary>
public string Department { get; set; }
/// <summary>
/// 核算单元护士数量
/// </summary>
public decimal Number { get; set; }
/// <summary>
/// 护理基础系数
/// </summary>
public decimal BasicFactor { get; set; }
/// <summary>
/// 护理倾斜系数
/// </summary>
public decimal SlopeFactor { get; set; }
/// <summary>
/// 其他绩效1
/// </summary>
public decimal OtherPerfor1 { get; set; }
/// <summary>
/// 其他绩效2
/// </summary>
public decimal OtherPerfor2 { get; set; }
/// <summary>
/// 医院奖罚
/// </summary>
public decimal Extra { get; set; }
/// <summary>
/// 考核对分率
/// </summary>
public decimal ScoringAverage { get; set; }
/// <summary>
/// 调节系数
/// </summary>
public decimal AdjustFactor { get; set; }
/// <summary>
/// 科室业绩
/// </summary>
public decimal Income { get; set; }
/// <summary>
/// 工作量绩效
/// </summary>
public decimal WorkloadFee { get; set; }
private decimal perforFee;
private decimal perforTotal;
private decimal avg;
private decimal giveFee;
/// <summary>
/// 绩效合计
/// </summary>
public decimal PerforTotal { get => PerforFee + WorkloadFee + OtherPerfor1; set => perforTotal = value; }
/// <summary>
/// 业绩绩效
/// </summary>
public decimal PerforFee { get => Income * (BasicFactor + (BasicFactor * SlopeFactor)); set => perforFee = value; }
/// <summary>
/// 实发绩效
/// </summary>
public decimal GiveFee { get => (PerforTotal * ScoringAverage + Extra + OtherPerfor2) * AdjustFactor; set => giveFee = value; }
/// <summary>
/// 人均绩效
/// </summary>
public decimal Avg { get => Number == 0 ? 0 : PerforTotal / Number; set => avg = value; }
}
}
......@@ -26,5 +26,16 @@ public class PerSheet
/// sheet数据
/// </summary>
public List<IPerData> PerData { get; set; }
public PerSheet() { }
public PerSheet(string sheetName, string moduleName, SheetType sheetType, List<PerHeader> perHeader, List<IPerData> perData)
{
SheetName = sheetName;
ModuleName = moduleName;
SheetType = sheetType;
PerHeader = perHeader;
PerData = perData;
}
}
}
......@@ -24,6 +24,9 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
public virtual DbSet<im_employee> Im_Employee { get; set; }
public virtual DbSet<im_header> Im_Header { get; set; }
public virtual DbSet<im_data> Im_Data { get; set; }
public virtual DbSet<im_deptaccounting> Im_DeptAccounting { get; set; }
public virtual DbSet<im_accountbasic> Im_AccountBasic { get; set; }
public virtual DbSet<im_accountdoctor> Im_AccountDoctor { get; set; }
public virtual DbSet<im_accountnurse> Im_AccountNurse { get; set; }
public virtual DbSet<cof_drugprop> Cof_DrugProp { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" cof_drugprop.cs">
// * FileName: cof_drugprop.cs
// * history : 2019-03-20 16:16:15
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
namespace Performance.EntityModels
{
/// <summary>
/// cof_drugprop Entity Model
/// </summary>
public class cof_drugprop
{
/// <summary>
///
/// </summary>
[Key]
public int ID { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> AllotID { get; set; }
/// <summary>
/// >
/// </summary>
public Nullable<decimal> MaxRange { get; set; }
/// <summary>
/// <=
/// </summary>
public Nullable<decimal> MinRange { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> Value { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" im_deptaccounting.cs">
// * FileName: im_deptaccounting.cs
// * history : 2019-03-19 13:24:29
// <copyright file=" im_accountbasic.cs">
// * FileName: im_accountbasic.cs
// * history : 2019-03-20 09:47:33
// </copyright>
//-----------------------------------------------------------------------
using System;
......@@ -10,9 +10,9 @@
namespace Performance.EntityModels
{
/// <summary>
/// im_deptaccounting Entity Model
/// im_accountbasic Entity Model
/// </summary>
public class im_deptaccounting
public class im_accountbasic
{
/// <summary>
///
......@@ -23,7 +23,7 @@ public class im_deptaccounting
/// <summary>
///
/// </summary>
public int SheetID { get; set; }
public Nullable<int> SheetID { get; set; }
/// <summary>
/// 核算单元
......@@ -38,12 +38,17 @@ public class im_deptaccounting
/// <summary>
/// 核算单元医生数量
/// </summary>
public Nullable<int> DoctorNumber { get; set; }
public Nullable<decimal> DoctorNumber { get; set; }
/// <summary>
/// 医生预设总系数
/// 医生基础系数
/// </summary>
public Nullable<decimal> DoctorFactor { get; set; }
public Nullable<decimal> DoctorBasicFactor { get; set; }
/// <summary>
/// 倾斜系数
/// </summary>
public Nullable<decimal> DoctorSlopeFactor { get; set; }
/// <summary>
/// 其他绩效1
......@@ -66,14 +71,24 @@ public class im_deptaccounting
public Nullable<decimal> DoctorScoringAverage { get; set; }
/// <summary>
/// 核算单元护士数量
/// 调节系数
/// </summary>
public Nullable<decimal> DoctorAdjustFactor { get; set; }
/// <summary>
/// 护士人数
/// </summary>
public Nullable<int> NurseNumber { get; set; }
/// <summary>
/// 护理预设总系数
/// 护理基础系数
/// </summary>
public Nullable<decimal> NurseFactor { get; set; }
public Nullable<decimal> NurseBasicFactor { get; set; }
/// <summary>
/// 倾斜系数
/// </summary>
public Nullable<decimal> NurseSlopeFactor { get; set; }
/// <summary>
/// 其他绩效1
......@@ -94,5 +109,10 @@ public class im_deptaccounting
/// 考核对分率
/// </summary>
public Nullable<decimal> NurseScoringAverage { get; set; }
/// <summary>
/// 调节系数
/// </summary>
public Nullable<decimal> NurseAdjustFactor { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" im_accountdoctor.cs">
// * FileName: im_accountdoctor.cs
// * history : 2019-03-20 09:47:33
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
namespace Performance.EntityModels
{
/// <summary>
/// im_accountdoctor Entity Model
/// </summary>
public class im_accountdoctor
{
/// <summary>
///
/// </summary>
[Key]
public int ID { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> SheetID { get; set; }
/// <summary>
/// 核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 核算单元医生数量
/// </summary>
public Nullable<decimal> Number { get; set; }
/// <summary>
/// 医生基础系数
/// </summary>
public Nullable<decimal> BasicFactor { get; set; }
/// <summary>
/// 倾斜系数
/// </summary>
public Nullable<decimal> SlopeFactor { get; set; }
/// <summary>
/// 其他绩效1
/// </summary>
public Nullable<decimal> OtherPerfor1 { get; set; }
/// <summary>
/// 其他绩效2
/// </summary>
public Nullable<decimal> OtherPerfor2 { get; set; }
/// <summary>
/// 医院奖罚
/// </summary>
public Nullable<decimal> Extra { get; set; }
/// <summary>
/// 考核对分率
/// </summary>
public Nullable<decimal> ScoringAverage { get; set; }
/// <summary>
/// 调节系数
/// </summary>
public Nullable<decimal> AdjustFactor { get; set; }
/// <summary>
/// 科室业绩
/// </summary>
public Nullable<decimal> Income { get; set; }
/// <summary>
/// 业绩绩效
/// </summary>
public Nullable<decimal> PerforFee { get; set; }
/// <summary>
/// 工作量绩效
/// </summary>
public Nullable<decimal> WorkloadFee { get; set; }
/// <summary>
/// 绩效合计
/// </summary>
public Nullable<decimal> PerforTotal { get; set; }
/// <summary>
/// 人均绩效
/// </summary>
public Nullable<decimal> Avg { get; set; }
/// <summary>
/// 实发绩效
/// </summary>
public Nullable<decimal> GiveFee { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" im_accountnurse.cs">
// * FileName: im_accountnurse.cs
// * history : 2019-03-20 09:47:33
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
namespace Performance.EntityModels
{
/// <summary>
/// im_accountnurse Entity Model
/// </summary>
public class im_accountnurse
{
/// <summary>
///
/// </summary>
[Key]
public int ID { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> SheetID { get; set; }
/// <summary>
/// 核算单元
/// </summary>
public string AccountingUnit { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 护士人数
/// </summary>
public Nullable<decimal> Number { get; set; }
/// <summary>
/// 护理基础系数
/// </summary>
public Nullable<decimal> BasicFactor { get; set; }
/// <summary>
/// 倾斜系数
/// </summary>
public Nullable<decimal> SlopeFactor { get; set; }
/// <summary>
/// 其他绩效1
/// </summary>
public Nullable<decimal> OtherPerfor1 { get; set; }
/// <summary>
/// 其他绩效2
/// </summary>
public Nullable<decimal> OtherPerfor2 { get; set; }
/// <summary>
/// 医院奖罚
/// </summary>
public Nullable<decimal> Extra { get; set; }
/// <summary>
/// 考核对分率
/// </summary>
public Nullable<decimal> ScoringAverage { get; set; }
/// <summary>
/// 调节系数
/// </summary>
public Nullable<decimal> AdjustFactor { get; set; }
/// <summary>
/// 科室业绩
/// </summary>
public Nullable<decimal> Income { get; set; }
/// <summary>
/// 业绩绩效
/// </summary>
public Nullable<decimal> PerforFee { get; set; }
/// <summary>
/// 工作量绩效
/// </summary>
public Nullable<decimal> WorkloadFee { get; set; }
/// <summary>
/// 绩效合计
/// </summary>
public Nullable<decimal> PerforTotal { get; set; }
/// <summary>
/// 人均绩效
/// </summary>
public Nullable<decimal> Avg { get; set; }
/// <summary>
/// 实发绩效
/// </summary>
public Nullable<decimal> GiveFee { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" cof_drugprop.cs">
// * FileName: cof_drugprop.cs
// * history : Created by T4 2019-03-20 16:16:18
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// cof_drugprop Repository
/// </summary>
public class PerforCofdrugpropRepository : PerforRepository<cof_drugprop>
{
public PerforCofdrugpropRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" im_deptaccounting.cs">
// * FileName: im_deptaccounting.cs
// * history : Created by T4 2019-03-19 13:24:26
// <copyright file=" im_accountbasic.cs">
// * FileName: im_accountbasic.cs
// * history : Created by T4 2019-03-20 09:47:36
// </copyright>
//-----------------------------------------------------------------------
using Performance.EntityModels;
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// im_deptaccounting Repository
/// im_accountbasic Repository
/// </summary>
public class PerforImDeptAccountingRepository : PerforRepository<im_deptaccounting>
public class PerforImaccountbasicRepository : PerforRepository<im_accountbasic>
{
public PerforImDeptAccountingRepository(PerformanceDbContext context) : base(context)
public PerforImaccountbasicRepository(PerformanceDbContext context) : base(context)
{
}
}
......
//-----------------------------------------------------------------------
// <copyright file=" im_accountdoctor.cs">
// * FileName: im_accountdoctor.cs
// * history : Created by T4 2019-03-20 09:47:36
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// im_accountdoctor Repository
/// </summary>
public class PerforImaccountdoctorRepository : PerforRepository<im_accountdoctor>
{
public PerforImaccountdoctorRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" im_accountnurse.cs">
// * FileName: im_accountnurse.cs
// * history : Created by T4 2019-03-20 09:47:36
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// im_accountnurse Repository
/// </summary>
public class PerforImaccountnurseRepository : PerforRepository<im_accountnurse>
{
public PerforImaccountnurseRepository(PerformanceDbContext context) : base(context)
{
}
}
}
......@@ -22,14 +22,20 @@ public class PerExcelService : IAutoInjection
private PerforImDataRepository _perforImDataRepository;
private PerforImHeaderRepository _perforImHeaderRepository;
private PerforImEmployeeRepository _perforImEmployeeRepository;
private PerforImDeptAccountingRepository _perforImDeptAccountingRepository;
private PerforImaccountbasicRepository _perforImaccountbasicRepository;
private PerforImaccountdoctorRepository _perforImaccountdoctorRepository;
private PerforImaccountnurseRepository _perforImaccountnurseRepository;
private PerforCofdrugpropRepository _perforCofdrugpropRepository;
public PerExcelService(PerSheetService perSheetService,
PerHeaderService perHeaderService,
PerforImSheetRepository perforImSheetRepository,
PerforImDataRepository perforImDataRepository,
PerforImHeaderRepository perforImHeaderRepository,
PerforImEmployeeRepository perforImEmployeeRepository,
PerforImDeptAccountingRepository perforImDeptAccountingRepository)
PerforImaccountbasicRepository perforImaccountbasicRepository,
PerforImaccountdoctorRepository perforImaccountdoctorRepository,
PerforImaccountnurseRepository perforImaccountnurseRepository,
PerforCofdrugpropRepository perforCofdrugpropRepository)
{
_perSheetService = perSheetService;
_perHeaderService = perHeaderService;
......@@ -37,7 +43,33 @@ public class PerExcelService : IAutoInjection
_perforImDataRepository = perforImDataRepository;
_perforImHeaderRepository = perforImHeaderRepository;
_perforImEmployeeRepository = perforImEmployeeRepository;
_perforImDeptAccountingRepository = perforImDeptAccountingRepository;
_perforImaccountbasicRepository = perforImaccountbasicRepository;
_perforImaccountdoctorRepository = perforImaccountdoctorRepository;
_perforImaccountnurseRepository = perforImaccountnurseRepository;
_perforCofdrugpropRepository = perforCofdrugpropRepository;
}
public void Execute(sys_allot allot)
{
// 拷贝配置信息
Copy(allot.ID);
// 导出数据
var excel = Import(allot.Path);
// 保存数据
Save(excel.PerSheet, allot.ID, 1);
// 计算合并数据
List<PerSheet> list = ProcessCompute(excel);
// 保存过程数据
Save(list, allot.ID, 2);
// 计算最总数据
Compute(excel);
}
/// <summary>
......@@ -88,7 +120,35 @@ public void Copy(int iD)
/// <param name="excel"></param>
public List<PerSheet> ProcessCompute(PerExcel excel)
{
return _perSheetService.ProcessCompute(excel);
var confs = GetDrugConfig(excel);
return _perSheetService.ProcessCompute(excel, confs);
}
private List<CofDrugProp> GetDrugConfig(PerExcel excel)
{
//计算药占比
List<CofDrugProp> cofs = new List<CofDrugProp>();
var incomeSheet = excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.Income && t.SheetName.Contains("门诊") && t.SheetName.Contains("就诊"));
var datalist = incomeSheet.PerData.Select(t => (PerData)t);
var drugData = datalist.Where(t => t.TypeName == "西药费" && t.TypeName == "中成药费").GroupBy(t => t.AccountingUnit).Select(t => new { AccountingUnit = t.Key, SumValue = t.Sum(s => s.CellValue) });
var allData = datalist.GroupBy(t => t.AccountingUnit).Select(t => new { AccountingUnit = t.Key, SumValue = t.Sum(s => s.CellValue) });
var cofList = _perforCofdrugpropRepository.GetEntities();
var unitList = drugData.Select(t => t.AccountingUnit).Union(allData.Select(t => t.AccountingUnit));
foreach (var unit in unitList)
{
var dsv = drugData.FirstOrDefault(t => t.AccountingUnit == unit)?.SumValue;
var asv = allData.FirstOrDefault(t => t.AccountingUnit == unit)?.SumValue;
var prop = asv.HasValue || asv.Value == 0 ? 0 : Math.Round(dsv.Value / asv.Value, 2);
var fvalue = prop == 0
? 0
: cofList.FirstOrDefault(t => prop > t.MinRange && prop <= t.MaxRange)?.Value ?? 0;
cofs.Add(new CofDrugProp { AccoutingUnit = unit, Factor = fvalue, Prop = prop });
}
return cofs;
}
/// <summary>
......@@ -115,12 +175,32 @@ public void Save(List<PerSheet> perSheets, int allotId, int source)
}
else if (sheet.SheetType == SheetType.DeptAccounting)
{
var dataList = sheet.PerData.Select(t => (PerDataDeptAccounting)t);
var dataList = sheet.PerData.Select(t => (PerDataAccountBaisc)t);
foreach (var data in dataList)
{
var imdata = Mapper.Map<im_accountbasic>(data);
imdata.SheetID = imsheet.ID;
_perforImaccountbasicRepository.Add(imdata);
}
}
else if (sheet.SheetType == SheetType.ComputeDoctorAccount)
{
var dataList = sheet.PerData.Select(t => (PerDataAccountDoctor)t);
foreach (var data in dataList)
{
var imdata = Mapper.Map<im_accountdoctor>(data);
imdata.SheetID = imsheet.ID;
_perforImaccountdoctorRepository.Add(imdata);
}
}
else if (sheet.SheetType == SheetType.ComputeNurseAccount)
{
var dataList = sheet.PerData.Select(t => (PerDataAccountNurse)t);
foreach (var data in dataList)
{
var imdata = Mapper.Map<im_deptaccounting>(data);
var imdata = Mapper.Map<im_accountnurse>(data);
imdata.SheetID = imsheet.ID;
_perforImDeptAccountingRepository.Add(imdata);
_perforImaccountnurseRepository.Add(imdata);
}
}
else
......
using NPOI.SS.UserModel;
using AutoMapper;
using NPOI.SS.UserModel;
using Performance.DtoModels;
using Performance.Infrastructure;
using System;
......@@ -62,10 +63,11 @@ public SheetType GetSheetType(string sheetName)
return SheetType.Unidentifiable;
}
internal List<PerSheet> ProcessCompute(PerExcel excel)
internal List<PerSheet> ProcessCompute(PerExcel excel, List<CofDrugProp> confs)
{
List<PerSheet> perSheet = new List<PerSheet>();
//合并科室收入、支出
var economicCompute = new PerSheetDataComputeEconomic();
var mergeResult = economicCompute.MergeCompute(excel);
......@@ -74,6 +76,8 @@ internal List<PerSheet> ProcessCompute(PerExcel excel)
//二次计算
var twiceEconomicResult = economicCompute.TwiceCompute(onceEconomic);
twiceEconomicResult.Sheet.SheetType = SheetType.ComputeEconomic;
perSheet.Add(twiceEconomicResult.Sheet);
//工作量
......@@ -82,9 +86,11 @@ internal List<PerSheet> ProcessCompute(PerExcel excel)
workload1.SheetName = "医生组工作量绩效测算表";
//医生组 一次计算
var onceWorkload1 = workloadCompute.OnceCompute(workload1);
var onceWorkload1 = workloadCompute.OnceCompute(workload1, confs);
//医生组 二次计算
var twiceWorkloadResult1 = workloadCompute.TwiceCompute(onceWorkload1);
twiceWorkloadResult1.Sheet.SheetType = SheetType.ComputeDoctorWorkload;
perSheet.Add(twiceWorkloadResult1.Sheet);
var workload2 = excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.Workload && t.SheetName.Contains("护理组"));
......@@ -93,8 +99,34 @@ internal List<PerSheet> ProcessCompute(PerExcel excel)
var onceWorkload2 = workloadCompute.OnceCompute(workload2);
//护理组 二次计算
var twiceWorkloadResult2 = workloadCompute.TwiceCompute(onceWorkload2);
twiceWorkloadResult2.Sheet.SheetType = SheetType.ComputeNurseWorkload;
perSheet.Add(twiceWorkloadResult2.Sheet);
var deptAccounting = excel.PerSheet.FirstOrDefault(t => t.SheetType == SheetType.DeptAccounting);
var dataList = deptAccounting.PerData.Select(t => (PerDataAccountBaisc)t);
PerSheet doctorSheet = new PerSheet("医生组临床科室单元核算表", "医生组临床科室单元核算表", SheetType.ComputeDoctorAccount, new List<PerHeader>(), new List<IPerData>());
PerSheet nurseSheet = new PerSheet("护理组临床科室单元核算表", "护理组临床科室单元核算表", SheetType.ComputeNurseAccount, new List<PerHeader>(), new List<IPerData>());
foreach (var dept in dataList)
{
var doctor = Mapper.Map<PerDataAccountDoctor>(dept);
var econDoctor = twiceEconomicResult.PerData.FirstOrDefault(t => t.UnitType == "医生组" && t.AccountingUnit == dept.AccountingUnit);
doctor.Income = econDoctor?.CellValue ?? 0;
var workDoctor = twiceWorkloadResult1.PerData.FirstOrDefault(t => t.UnitType == "医生组" && t.AccountingUnit == dept.AccountingUnit);
doctor.WorkloadFee = workDoctor?.CellValue ?? 0;
doctorSheet.PerData.Add(doctor);
var nurse = Mapper.Map<PerDataAccountNurse>(dept);
var econNurse = twiceEconomicResult.PerData.FirstOrDefault(t => t.UnitType == "护理组" && t.AccountingUnit == dept.AccountingUnit);
nurse.Income = econNurse?.CellValue ?? 0;
var workNurse = twiceWorkloadResult2.PerData.FirstOrDefault(t => t.UnitType == "医生组" && t.AccountingUnit == dept.AccountingUnit);
nurse.WorkloadFee = workNurse?.CellValue ?? 0;
nurseSheet.PerData.Add(nurse);
}
perSheet.Add(doctorSheet);
perSheet.Add(nurseSheet);
return perSheet;
}
}
......
......@@ -174,7 +174,10 @@ public PerSheet OnceCompute(PerSheet sheet)
public (PerSheet Sheet, List<PerData> PerData) TwiceCompute(PerSheet sheet)
{
//获取最大列坐标位置
int thiscell = sheet.PerHeader.OrderByDescending(t => t.PointCell).FirstOrDefault().Children.Max(t => t.PointCell) + 1;
var maxhead = sheet.PerHeader.OrderByDescending(t => t.PointCell).FirstOrDefault();
int thiscell = maxhead.Children != null && maxhead.Children.Count > 0
? maxhead.Children.Max(t => t.PointCell) + 1
: maxhead.PointCell;
PerHeader perHead = new PerHeader(0, thiscell, "科室可核算业绩收入", 0, 1, 2, new List<PerHeader>(), 1);
var dataList = sheet.PerData.Select(t => (PerData)t);
......
......@@ -18,8 +18,9 @@ public class PerSheetDataComputeWorkload
/// 工作量一次计算
/// </summary>
/// <param name="sheet"></param>
/// <param name="confs">药占比分值</param>
/// <returns></returns>
public PerSheet OnceCompute(PerSheet sheet)
public PerSheet OnceCompute(PerSheet sheet, List<CofDrugProp> confs = null)
{
var dataList = sheet.PerData.Select(t => (PerData)t);
int phead = 0;
......@@ -48,6 +49,7 @@ public PerSheet OnceCompute(PerSheet sheet)
var typeClass = dataList.Where(t => header.Children.Select(s => s.CellValue).Contains(t.TypeName));
int pointcell = 0;
foreach (var group in typeClass.GroupBy(t => t.UnitType))
{
var ds = group.Where(t => t.CellValue.HasValue && t.CellValue.Value > 0)
......@@ -55,7 +57,7 @@ public PerSheet OnceCompute(PerSheet sheet)
{
UnitType = group.Key,
AccountingUnit = t.Key,
CellValue = t.Sum(s => s.CellValue),
CellValue = ComputValue(header, confs, t),
TypeName = group.Key,
RowNumber = t.FirstOrDefault()?.RowNumber ?? 0,
IsTotal = 1,
......@@ -75,6 +77,18 @@ public PerSheet OnceCompute(PerSheet sheet)
return sheet;
}
private static decimal? ComputValue(PerHeader header, List<CofDrugProp> confs, IGrouping<string, PerData> group)
{
var value = group.Sum(s => s.CellValue);
if (header.CellValue == "门急诊工作量")
{
var factor = confs.FirstOrDefault(t => t.AccoutingUnit == group.Key)?.Factor ?? 0;
value = value * factor;
}
return value;
}
#endregion
......
......@@ -32,24 +32,27 @@ public List<IPerData> ReadData(ISheet sheet, List<PerHeader> perHeader)
var accountingUnit = row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "核算单元").PointCell).ToString();
if (string.IsNullOrEmpty(accountingUnit))
continue;
PerDataDeptAccounting unifyUnit = new PerDataDeptAccounting
{
RowNumber = r,
AccountingUnit = row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "核算单元").PointCell).ToString(),
Department = row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "科室").PointCell).ToString(),
DoctorNumber = ConvertHelper.To<int?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "核算单元医生数量" && p.Parent.CellValue == "医生组").PointCell).ToString()),
DoctorFactor = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "医生预设总系数" && p.Parent.CellValue == "医生组").PointCell).ToString()),
DoctorOtherPerfor1 = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "其他绩效1" && p.Parent.CellValue == "医生组").PointCell).ToString()),
DoctorOtherPerfor2 = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "其他绩效2" && p.Parent.CellValue == "医生组").PointCell).ToString()),
DoctorExtra = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "医院奖罚" && p.Parent.CellValue == "医生组").PointCell).ToString()),
DoctorScoringAverage = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "考核对分率" && p.Parent.CellValue == "医生组").PointCell).ToString()),
NurseNumber = ConvertHelper.To<int?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "核算单元护士数量" && p.Parent.CellValue == "护理组").PointCell).ToString()),
NurseFactor = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "护理预设总系数" && p.Parent.CellValue == "护理组").PointCell).ToString()),
NurseOtherPerfor1 = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "其他绩效1" && p.Parent.CellValue == "护理组").PointCell).ToString()),
NurseOtherPerfor2 = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "其他绩效2" && p.Parent.CellValue == "护理组").PointCell).ToString()),
NurseExtra = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "医院奖罚" && p.Parent.CellValue == "护理组").PointCell).ToString()),
NurseScoringAverage = ConvertHelper.To<decimal?>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "考核对分率" && p.Parent.CellValue == "护理组").PointCell).ToString()),
};
PerDataAccountBaisc unifyUnit = new PerDataAccountBaisc();
unifyUnit.RowNumber = r;
unifyUnit.AccountingUnit = row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "核算单元").PointCell).ToString();
unifyUnit.Department = row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "科室").PointCell).ToString();
unifyUnit.DoctorNumber = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "核算单元医生数量" && p.Parent.CellValue == "医生组").PointCell).ToString());
unifyUnit.DoctorBasicFactor = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "基础系数" && p.Parent.CellValue == "医生组").PointCell).ToString());
unifyUnit.DoctorSlopeFactor = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "倾斜系数" && p.Parent.CellValue == "医生组").PointCell).ToString());
unifyUnit.DoctorOtherPerfor1 = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "其他绩效1" && p.Parent.CellValue == "医生组").PointCell).ToString());
unifyUnit.DoctorOtherPerfor2 = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "其他绩效2" && p.Parent.CellValue == "医生组").PointCell).ToString());
unifyUnit.DoctorExtra = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "医院奖罚" && p.Parent.CellValue == "医生组").PointCell).ToString());
unifyUnit.DoctorScoringAverage = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "考核得分率" && p.Parent.CellValue == "医生组").PointCell).ToString());
unifyUnit.DoctorAdjustFactor = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "调节系数" && p.Parent.CellValue == "医生组").PointCell).ToString());
unifyUnit.NurseNumber = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "核算单元护士数量" && p.Parent.CellValue == "护理组").PointCell).ToString());
unifyUnit.NurseBasicFactor = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "基础系数" && p.Parent.CellValue == "护理组").PointCell).ToString());
unifyUnit.NurseSlopeFactor = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "倾斜系数" && p.Parent.CellValue == "护理组").PointCell).ToString());
unifyUnit.NurseOtherPerfor1 = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "其他绩效1" && p.Parent.CellValue == "护理组").PointCell).ToString());
unifyUnit.NurseOtherPerfor2 = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "其他绩效2" && p.Parent.CellValue == "护理组").PointCell).ToString());
unifyUnit.NurseExtra = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "医院奖罚" && p.Parent.CellValue == "护理组").PointCell).ToString());
unifyUnit.NurseScoringAverage = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "考核得分率" && p.Parent.CellValue == "护理组").PointCell).ToString());
unifyUnit.NurseAdjustFactor = ConvertHelper.To<decimal>(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "调节系数" && p.Parent.CellValue == "护理组").PointCell).ToString());
dataList.Add(unifyUnit);
}
......
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