Commit ea50492b by 李承祥

Merge branch 'feature/merge' into develop

# Conflicts:
#	performance/Performance.Api/Template/医院绩效模板(无执行科室).xlsx
#	performance/Performance.Api/Template/医院绩效模板.xlsx
#	performance/Performance.Services/AllotCompute/ProcessComputService.cs
#	performance/Performance.Services/PerExcelService/ComputeEmpolyee/ComputeDirector.cs
parents 22460eaf b7e20b26
...@@ -210,7 +210,8 @@ public ApiResponse<UserResponse> Password([FromBody]PasswordRequest request) ...@@ -210,7 +210,8 @@ public ApiResponse<UserResponse> Password([FromBody]PasswordRequest request)
[HttpPost] [HttpPost]
public ApiResponse<List<sys_role>> RoleList() public ApiResponse<List<sys_role>> RoleList()
{ {
var roleList = _userService.RoleList(); var userid = _claim.GetUserId();
var roleList = _userService.RoleList(userid);
return new ApiResponse<List<sys_role>>(ResponseType.OK, "ok", roleList); return new ApiResponse<List<sys_role>>(ResponseType.OK, "ok", roleList);
} }
......
...@@ -29,17 +29,19 @@ public class AllotController : Controller ...@@ -29,17 +29,19 @@ public class AllotController : Controller
private IHostingEnvironment _evn; private IHostingEnvironment _evn;
private ILogger<AllotController> _logger; private ILogger<AllotController> _logger;
private ClaimService _claim; private ClaimService _claim;
private readonly LogManageService logManageService;
public AllotController(AllotService allotService, public AllotController(AllotService allotService,
HospitalService hospitalService, ConfigService configService, HospitalService hospitalService, ConfigService configService,
ILogger<AllotController> logger, IHostingEnvironment evn, ILogger<AllotController> logger, IHostingEnvironment evn,
ClaimService claim) ClaimService claim, LogManageService logManageService)
{ {
_allotService = allotService; _allotService = allotService;
_hospitalService = hospitalService; _hospitalService = hospitalService;
_logger = logger; _logger = logger;
_evn = evn; _evn = evn;
_claim = claim; _claim = claim;
this.logManageService = logManageService;
_configService = configService; _configService = configService;
} }
...@@ -159,12 +161,13 @@ public ApiResponse Generate([CustomizeValidator(RuleSet = "Delete"), FromBody]Al ...@@ -159,12 +161,13 @@ public ApiResponse Generate([CustomizeValidator(RuleSet = "Delete"), FromBody]Al
if (allot.States == (int)AllotStates.Wait) if (allot.States == (int)AllotStates.Wait)
return new ApiResponse(ResponseType.OK, "当前绩效正在等待生成"); return new ApiResponse(ResponseType.OK, "当前绩效正在等待生成");
logManageService.WriteMsg("生成绩效准备中", $"准备生成{allot.Year}-{allot.Month.ToString().PadLeft(2, '0')}月份绩效,请稍等!", 1, allot.ID, "ReceiveMessage", true);
_allotService.UpdateAllotStates(allot.ID, (int)AllotStates.Wait, EnumHelper.GetDescription(AllotStates.Wait)); _allotService.UpdateAllotStates(allot.ID, (int)AllotStates.Wait, EnumHelper.GetDescription(AllotStates.Wait));
if (_evn.IsEnvironment("Localhost")) if (_evn.IsEnvironment("Localhost"))
_allotService.Generate(allot, email); _allotService.Generate(allot, email);
else else
BackgroundJob.Schedule(() => _allotService.Generate(allot, email), TimeSpan.FromSeconds(1)); BackgroundJob.Schedule(() => _allotService.Generate(allot, email), TimeSpan.FromSeconds(1));
logManageService.WriteMsg("等待绩效生成", $"等待绩效生成{allot.Year}-{allot.Month.ToString().PadLeft(2, '0')}月份绩效!", 1, allot.ID, "ReceiveMessage");
//_allotService.Generate(allot, email); //_allotService.Generate(allot, email);
////BackgroundJob.Enqueue(() => _allotService.Generate(allot, email)); ////BackgroundJob.Enqueue(() => _allotService.Generate(allot, email));
return new ApiResponse(ResponseType.OK); return new ApiResponse(ResponseType.OK);
......
...@@ -119,12 +119,20 @@ public ApiResponse<List<DeptResponse>> GetOther([FromBody]ComputerRequest reques ...@@ -119,12 +119,20 @@ public ApiResponse<List<DeptResponse>> GetOther([FromBody]ComputerRequest reques
[HttpPost] [HttpPost]
public ApiResponse<DeptDataDetails> DeptDetail([FromBody]DeptDetailRequest request) public ApiResponse<DeptDataDetails> DeptDetail([FromBody]DeptDetailRequest request)
{ {
var allot = _allotService.GetAllot(request.AllotId); //var allot = _allotService.GetAllot(request.AllotId);
if (null == allot) //if (null == allot)
throw new PerformanceException("当前绩效记录不存在"); // throw new PerformanceException("当前绩效记录不存在");
//DeptDetailResponse response = _computeService.GetDepartmentDetail(request.AllotId, request.AccountID, request.Type); //DeptDetailResponse response = _computeService.GetDepartmentDetail(request.AllotId, request.AccountID, request.Type);
var response = _computeService.DeptDetail(request.AllotId, request.AccountID, request.Type); if (request.AccountID == 0)
{
if (request.SecondId == 0)
return new ApiResponse<DeptDataDetails>(ResponseType.ParameterError, "参数 AccountID或SecondId 无效");
else
request.AccountID = _computeService.GetAccountId(request.SecondId);
}
var response = _computeService.DeptDetail(request.AccountID);
return new ApiResponse<DeptDataDetails>(ResponseType.OK, response); return new ApiResponse<DeptDataDetails>(ResponseType.OK, response);
} }
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
namespace Performance.Api.Controllers namespace Performance.Api.Controllers
{ {
/// <summary>
/// 报表
/// </summary>
[Route("api/[controller]")] [Route("api/[controller]")]
public class ReportController : Controller public class ReportController : Controller
{ {
...@@ -130,5 +133,31 @@ public ApiResponse AvgRatio([CustomizeValidator(RuleSet = "Query"), FromBody]Rep ...@@ -130,5 +133,31 @@ public ApiResponse AvgRatio([CustomizeValidator(RuleSet = "Query"), FromBody]Rep
var list = reportService.AvgRatio(request.HospitalId); var list = reportService.AvgRatio(request.HospitalId);
return new ApiResponse(ResponseType.OK, "", list); return new ApiResponse(ResponseType.OK, "", list);
} }
/// <summary>
/// 首页报表
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("index")]
[HttpPost]
public ApiResponse IndexReport([CustomizeValidator(RuleSet = "Index"), FromBody]ReportRequest request)
{
var list = reportService.IndexReport(request.HospitalId, request.Source);
return new ApiResponse(ResponseType.OK, "", list);
}
/// <summary>
/// 菜单报表
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("menu")]
[HttpPost]
public ApiResponse MenuReport([CustomizeValidator(RuleSet = "Menu"), FromBody]ReportRequest request)
{
var list = reportService.MenuReport(request);
return new ApiResponse(ResponseType.OK, "", list);
}
} }
} }
\ No newline at end of file
...@@ -167,7 +167,7 @@ public void ConfigureServices(IServiceCollection services) ...@@ -167,7 +167,7 @@ public void ConfigureServices(IServiceCollection services)
#region swagger #region swagger
services.AddSwaggerGen(c => services.AddSwaggerGen(c =>
{ {
c.SwaggerDoc("v1", new Info { Version = "v1.0", Title = "食管癌随访API接口" }); c.SwaggerDoc("v1", new Info { Version = "v1.0", Title = "绩效API接口" });
var xmlPath = new string[] var xmlPath = new string[]
{ {
......
...@@ -659,6 +659,11 @@ ...@@ -659,6 +659,11 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:Performance.Api.Controllers.ReportController">
<summary>
报表
</summary>
</member>
<member name="M:Performance.Api.Controllers.ReportController.Survey(Performance.DtoModels.ReportRequest)"> <member name="M:Performance.Api.Controllers.ReportController.Survey(Performance.DtoModels.ReportRequest)">
<summary> <summary>
首页数据概况 首页数据概况
...@@ -715,6 +720,110 @@ ...@@ -715,6 +720,110 @@
<param name="request"></param> <param name="request"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Performance.Api.Controllers.ReportController.IndexReport(Performance.DtoModels.ReportRequest)">
<summary>
首页报表
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.ReportController.MenuReport(Performance.DtoModels.ReportRequest)">
<summary>
菜单报表
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="T:Performance.Api.Controllers.SecondAllotController">
<summary>
二次绩效
</summary>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.List">
<summary>
二次绩效列表(没有需要初始化)
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.SaveValue(System.Int32,System.Collections.Generic.List{Performance.EntityModels.ag_fixatitem})">
<summary>
二次绩效项目内容保存
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.SaveCompute(System.Collections.Generic.List{Performance.EntityModels.ag_compute})">
<summary>
提交二次绩效分配结果
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.SecondDetail(Performance.DtoModels.UseTempRequest)">
<summary>
二次绩效录入页面配置信息
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.Temp(System.Int32)">
<summary>
选择二次绩效模板
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.UseTemp(Performance.DtoModels.UseTempRequest)">
<summary>
保存已选择二次绩效模板
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.RefreshTemp(Performance.DtoModels.UseTempRequest)">
<summary>
刷新已选择模板
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.WorkloadList(Performance.DtoModels.WorkloadRequest)">
<summary>
二次绩效工作量列表
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.WorkloadAdd(Performance.DtoModels.WorkloadRequest)">
<summary>
二次绩效工作量新增
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.WorkloadUpdate(Performance.DtoModels.WorkloadRequest)">
<summary>
二次绩效工作量修改
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.WorkloadDelete(Performance.DtoModels.WorkloadRequest)">
<summary>
二次绩效工作量删除
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.SubmitAudit(System.Int32)">
<summary>
提交审核
</summary>
<param name="secondid">二次绩效Id</param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.AuditList">
<summary>
二次绩效审核列表
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SecondAllotController.AuditResult(Performance.DtoModels.SecondAuditRequest)">
<summary>
二次绩效审核结果;驳回、成功
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.SheetController.SheetList(Performance.DtoModels.SheetRequest)"> <member name="M:Performance.Api.Controllers.SheetController.SheetList(Performance.DtoModels.SheetRequest)">
<summary> <summary>
sheet 列表 sheet 列表
......
...@@ -1038,6 +1038,11 @@ ...@@ -1038,6 +1038,11 @@
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.CofAgainRequest.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.DtoModels.CofAgainRequest.Type"> <member name="P:Performance.DtoModels.CofAgainRequest.Type">
<summary> <summary>
1 职称绩效 2 工作量绩效 3 满勤天数 1 职称绩效 2 工作量绩效 3 满勤天数
...@@ -1083,6 +1088,11 @@ ...@@ -1083,6 +1088,11 @@
绩效id 绩效id
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.DeptDetailRequest.SecondId">
<summary>
二次绩效id
</summary>
</member>
<member name="P:Performance.DtoModels.DeptDetailRequest.Type"> <member name="P:Performance.DtoModels.DeptDetailRequest.Type">
<summary> <summary>
绩效类型(1 医生组、 2 护理组) 绩效类型(1 医生组、 2 护理组)
...@@ -1439,6 +1449,30 @@ ...@@ -1439,6 +1449,30 @@
职位类别 1 普通类别 2 基础绩效来源 职位类别 1 普通类别 2 基础绩效来源
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.ReportRequest.IsIndex">
<summary> 是否为首页 </summary>
</member>
<member name="P:Performance.DtoModels.ReportRequest.OnlyYear">
<summary> 是否以年为单位 </summary>
</member>
<member name="P:Performance.DtoModels.ReportRequest.Source">
<summary> 报表名称 </summary>
</member>
<member name="P:Performance.DtoModels.ReportRequest.Year">
<summary></summary>
</member>
<member name="P:Performance.DtoModels.ReportRequest.Month">
<summary></summary>
</member>
<member name="P:Performance.DtoModels.SecondAuditRequest.SecondId">
<summary> 二次绩效Id </summary>
</member>
<member name="P:Performance.DtoModels.SecondAuditRequest.IsPass">
<summary> 审核结果 1、审核通过 2、驳回 </summary>
</member>
<member name="P:Performance.DtoModels.SecondAuditRequest.Remark">
<summary> 备注 </summary>
</member>
<member name="T:Performance.DtoModels.SetDepartmentRequest"> <member name="T:Performance.DtoModels.SetDepartmentRequest">
<summary> <summary>
登录请求 登录请求
...@@ -1504,11 +1538,49 @@ ...@@ -1504,11 +1538,49 @@
用户科室 用户科室
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.UseTempRequest.IsArchive">
<summary> 是否归档 </summary>
</member>
<member name="P:Performance.DtoModels.WorkItemRequest.Item"> <member name="P:Performance.DtoModels.WorkItemRequest.Item">
<summary> <summary>
工作量绩效项 工作量绩效项
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.WorkloadRequest.Id">
<summary>
绩效ID
</summary>
</member>
<member name="P:Performance.DtoModels.WorkloadRequest.HospitalId">
<summary>
医院ID
</summary>
</member>
<member name="P:Performance.DtoModels.WorkloadRequest.Department">
<summary>
科室
</summary>
</member>
<member name="P:Performance.DtoModels.WorkloadRequest.UnitType">
<summary>
</summary>
</member>
<member name="P:Performance.DtoModels.WorkloadRequest.ItemName">
<summary>
工作量名称
</summary>
</member>
<member name="P:Performance.DtoModels.WorkloadRequest.FactorValue">
<summary>
工作量系数
</summary>
</member>
<member name="P:Performance.DtoModels.WorkloadRequest.Sort">
<summary>
</summary>
</member>
<member name="P:Performance.DtoModels.WorkyearRequest.MaxRange"> <member name="P:Performance.DtoModels.WorkyearRequest.MaxRange">
<summary> <summary>
最大工龄范围(小于) 最大工龄范围(小于)
...@@ -2055,6 +2127,22 @@ ...@@ -2055,6 +2127,22 @@
菜单状态 1 启用 2禁用 菜单状态 1 启用 2禁用
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.SecondListResponse.IsArchive">
<summary> 是否归档 </summary>
</member>
<member name="P:Performance.DtoModels.HeadItem.IsBring">
<summary> 1 带出历史数据 2不带出 </summary>
</member>
<member name="P:Performance.DtoModels.SecondTempResponse.TempName">
<summary>
模板名称
</summary>
</member>
<member name="P:Performance.DtoModels.SecondTempResponse.UnitType">
<summary>
类型
</summary>
</member>
<member name="P:Performance.DtoModels.SheetExportResponse.SheetID"> <member name="P:Performance.DtoModels.SheetExportResponse.SheetID">
<summary> <summary>
sheetID sheetID
......
...@@ -178,6 +178,21 @@ public AutoMapperConfigs() ...@@ -178,6 +178,21 @@ public AutoMapperConfigs()
CreateMap<res_compute, ComputeResponse>(); CreateMap<res_compute, ComputeResponse>();
CreateMap<EmployeeRequest, im_employee>(); CreateMap<EmployeeRequest, im_employee>();
CreateMap<res_compute, ResComputeResponse>(); CreateMap<res_compute, ResComputeResponse>();
CreateMap<UseTempRequest, ag_usetemp>()
.ForMember(dest => dest.UseTempId, opt => opt.MapFrom(src => src.TempId))
.ReverseMap();
CreateMap<ag_tempitem, HeadItem>();
CreateMap<ag_workload, HeadItem>()
.ForMember(dest => dest.FiledId, opt => opt.MapFrom(src => src.ItemId))
.ForMember(dest => dest.FiledName, opt => opt.MapFrom(src => src.ItemName));
CreateMap<ag_fixatitem, BodyItem>()
.ForMember(dest => dest.FiledName, opt => opt.MapFrom(src => src.ItemName))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.ItemValue));
CreateMap<ag_temp, SecondTempResponse>();
CreateMap<ag_secondallot, SecondListResponse>().ReverseMap();
} }
} }
} }
...@@ -13,6 +13,11 @@ public class CofAgainRequest ...@@ -13,6 +13,11 @@ public class CofAgainRequest
public int AllotID { get; set; } public int AllotID { get; set; }
/// <summary> /// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 1 职称绩效 2 工作量绩效 3 满勤天数 /// 1 职称绩效 2 工作量绩效 3 满勤天数
/// </summary> /// </summary>
public int Type { get; set; } public int Type { get; set; }
......
...@@ -16,6 +16,11 @@ public class DeptDetailRequest ...@@ -16,6 +16,11 @@ public class DeptDetailRequest
public int AllotId { get; set; } public int AllotId { get; set; }
/// <summary> /// <summary>
/// 二次绩效id
/// </summary>
public int SecondId { get; set; }
/// <summary>
/// 绩效类型(1 医生组、 2 护理组) /// 绩效类型(1 医生组、 2 护理组)
/// </summary> /// </summary>
public int Type { get; set; } public int Type { get; set; }
...@@ -29,9 +34,9 @@ public class DetailRequestValidator : AbstractValidator<DeptDetailRequest> ...@@ -29,9 +34,9 @@ public class DetailRequestValidator : AbstractValidator<DeptDetailRequest>
{ {
public DetailRequestValidator() public DetailRequestValidator()
{ {
RuleFor(x => x.AllotId).NotNull().GreaterThan(0); //RuleFor(x => x.AllotId).NotNull().GreaterThan(0);
RuleFor(x => x.Type).NotNull().InclusiveBetween(1, 5); //RuleFor(x => x.Type).NotNull().InclusiveBetween(1, 5);
RuleFor(x => x.AccountID).NotNull().GreaterThan(0); //RuleFor(x => x.AccountID).NotNull().GreaterThan(0);
} }
} }
} }
using FluentValidation;
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class FixatItemRequest
{
public int AllotId { get; set; }
public int SecondId { get; set; }
public string UnitType { get; set; }
public List<FixatItem> FixatItems { get; set; }
public int RowNumber { get; set; }
}
public class FixatItemRequestValidator : AbstractValidator<FixatItemRequest>
{
public FixatItemRequestValidator()
{
RuleFor(x => x.AllotId).NotNull().GreaterThan(0);
RuleFor(x => x.SecondId).NotNull().GreaterThan(0);
RuleFor(x => x.UnitType).NotNull().NotEmpty();
}
}
public class FixatItem
{
public int FixatId { get; set; }
public string ItemName { get; set; }
public decimal ItemValue { get; set; }
public decimal FactorValue { get; set; }
public decimal Sort { get; set; }
public int Type { get; set; }
public int SourceType { get; set; }
}
}
...@@ -9,7 +9,20 @@ public class ReportRequest ...@@ -9,7 +9,20 @@ public class ReportRequest
{ {
public int HospitalId { get; set; } public int HospitalId { get; set; }
/// <summary> 是否为首页 </summary>
public int IsIndex { get; set; } public int IsIndex { get; set; }
/// <summary> 是否以年为单位 </summary>
public int OnlyYear { get; set; }
/// <summary> 报表名称 </summary>
public string Source { get; set; }
/// <summary> 年 </summary>
public string Year { get; set; }
/// <summary> 月 </summary>
public string Month { get; set; }
} }
public class ReportRequestValidator : AbstractValidator<ReportRequest> public class ReportRequestValidator : AbstractValidator<ReportRequest>
{ {
...@@ -19,6 +32,19 @@ public ReportRequestValidator() ...@@ -19,6 +32,19 @@ public ReportRequestValidator()
{ {
RuleFor(x => x.HospitalId).NotNull().GreaterThan(0); RuleFor(x => x.HospitalId).NotNull().GreaterThan(0);
}); });
RuleSet("Index", () =>
{
RuleFor(x => x.HospitalId).NotNull().GreaterThan(0);
RuleFor(x => x.Source).NotNull().NotEmpty();
});
RuleSet("Menu", () =>
{
RuleFor(x => x.HospitalId).NotNull().GreaterThan(0);
RuleFor(x => x.OnlyYear).NotNull();
RuleFor(x => x.Source).NotNull().NotEmpty();
});
} }
} }
} }
using FluentValidation;
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class SecondAuditRequest
{
/// <summary> 二次绩效Id </summary>
public int SecondId { get; set; }
/// <summary> 审核结果 1、审核通过 2、驳回 </summary>
public int IsPass { get; set; }
/// <summary> 备注 </summary>
public string Remark { get; set; }
}
public class SecondAuditRequestValidator : AbstractValidator<SecondAuditRequest>
{
public SecondAuditRequestValidator()
{
RuleFor(x => x.SecondId).NotNull().NotEmpty().GreaterThan(0);
RuleFor(x => x.IsPass).NotNull().NotEmpty().InclusiveBetween(1, 2);
RuleFor(x => x.Remark).NotNull().NotEmpty();
}
}
}
using FluentValidation;
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class UseTempRequest
{
public int TempId { get; set; }
public int HospitalId { get; set; }
public string Department { get; set; }
public string UnitType { get; set; }
public int SecondId { get; set; }
/// <summary> 是否归档 </summary>
public int IsArchive { get; set; }
}
public class UseTempRequestValidator : AbstractValidator<UseTempRequest>
{
public UseTempRequestValidator()
{
RuleSet("Use", () =>
{
RuleFor(x => x.TempId).NotNull().GreaterThan(0);
RuleFor(x => x.HospitalId).NotNull().GreaterThan(0);
RuleFor(x => x.Department).NotNull().NotEmpty();
RuleFor(x => x.UnitType).NotNull().NotEmpty();
});
RuleSet("Refresh", () =>
{
RuleFor(x => x.HospitalId).NotNull().GreaterThan(0);
RuleFor(x => x.Department).NotNull().NotEmpty();
RuleFor(x => x.UnitType).NotNull().NotEmpty();
RuleFor(x => x.SecondId).NotNull().GreaterThan(0);
});
}
}
}
using FluentValidation;
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class WorkloadRequest
{
/// <summary>
/// 绩效ID
/// </summary>
public int Id { get; set; }
/// <summary>
/// 医院ID
/// </summary>
public Nullable<int> HospitalId { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
///
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 工作量名称
/// </summary>
public string ItemName { get; set; }
/// <summary>
/// 工作量系数
/// </summary>
public Nullable<decimal> FactorValue { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> Sort { get; set; }
}
public class WorkloadRequestValidator : AbstractValidator<WorkloadRequest>
{
public WorkloadRequestValidator()
{
RuleSet("Add", () =>
{
RuleFor(x => x.HospitalId).NotNull().GreaterThan(0);
RuleFor(x => x.Department).NotNull().NotEmpty();
RuleFor(x => x.UnitType).NotNull().NotEmpty();
RuleFor(x => x.ItemName).NotNull().NotEmpty();
});
RuleSet("Update", () =>
{
RuleFor(x => x.Id).NotNull().GreaterThan(0);
RuleFor(x => x.HospitalId).NotNull().GreaterThan(0);
RuleFor(x => x.ItemName).NotNull().NotEmpty();
});
RuleSet("Delete", () =>
{
RuleFor(x => x.Id).NotNull().GreaterThan(0);
});
RuleSet("Query", () =>
{
RuleFor(x => x.HospitalId).NotNull().GreaterThan(0);
RuleFor(x => x.Department).NotNull().NotEmpty();
RuleFor(x => x.UnitType).NotNull().NotEmpty();
});
}
}
}
using Performance.EntityModels;
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class SecondListResponse : ag_secondallot
{
/// <summary> 是否归档 </summary>
public int IsArchive { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class SecondResponse
{
public List<HeadItem> HeadItems { get; set; }
public List<BodyItem> BodyItems { get; set; }
}
public class HeadItem
{
public string FiledId { get; set; }
public string FiledName { get; set; }
public decimal Sort { get; set; }
public int Type { get; set; }
public decimal FactorValue { get; set; }
public int SourceType { get; set; }
/// <summary> 1 带出历史数据 2不带出 </summary>
public Nullable<int> IsBring { get; set; }
}
public class BodyItem : HeadItem
{
public int RowNumber { get; set; }
public string Value { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.DtoModels
{
public class SecondTempResponse
{
public int Id { get; set; }
/// <summary>
/// 模板名称
/// </summary>
public string TempName { get; set; }
/// <summary>
/// 类型
/// </summary>
public string UnitType { get; set; }
public bool IsSelected { get; set; }
}
}
...@@ -14,12 +14,28 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options) ...@@ -14,12 +14,28 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
/// <summary> 二次分配概览 </summary> /// <summary> 二次分配概览 </summary>
public virtual DbSet<ag_againsituation> ag_againsituation { get; set; } public virtual DbSet<ag_againsituation> ag_againsituation { get; set; }
/// <summary> 二次绩效结果表 </summary>
public virtual DbSet<ag_compute> ag_compute { get; set; }
/// <summary> 二次分配不固定数据 </summary> /// <summary> 二次分配不固定数据 </summary>
public virtual DbSet<ag_data> ag_data { get; set; } public virtual DbSet<ag_data> ag_data { get; set; }
/// <summary> 二次分配人员名单 </summary> /// <summary> 二次分配人员名单 </summary>
public virtual DbSet<ag_employee> ag_employee { get; set; } public virtual DbSet<ag_employee> ag_employee { get; set; }
/// <summary> 二次绩效固定项 </summary>
public virtual DbSet<ag_fixatitem> ag_fixatitem { get; set; }
/// <summary> 二次分配不固定列头数据 </summary> /// <summary> 二次分配不固定列头数据 </summary>
public virtual DbSet<ag_header> ag_header { get; set; } public virtual DbSet<ag_header> ag_header { get; set; }
/// <summary> 科室二次绩效录入内容 </summary>
public virtual DbSet<ag_itemvalue> ag_itemvalue { get; set; }
/// <summary> 二次绩效列表 </summary>
public virtual DbSet<ag_secondallot> ag_secondallot { get; set; }
/// <summary> 二次绩效模板 </summary>
public virtual DbSet<ag_temp> ag_temp { get; set; }
/// <summary> 二次绩效模板项 </summary>
public virtual DbSet<ag_tempitem> ag_tempitem { get; set; }
/// <summary> </summary>
public virtual DbSet<ag_usetemp> ag_usetemp { get; set; }
/// <summary> 二次绩效工作量绩效 </summary>
public virtual DbSet<ag_workload> ag_workload { get; set; }
/// <summary> 考核类别 </summary> /// <summary> 考核类别 </summary>
public virtual DbSet<as_assess> as_assess { get; set; } public virtual DbSet<as_assess> as_assess { get; set; }
/// <summary> 考核列头 </summary> /// <summary> 考核列头 </summary>
......
//-----------------------------------------------------------------------
// <copyright file=" ag_compute.cs">
// * FileName: 二次绩效结果表.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
/// 二次绩效结果表
/// </summary>
[Table("ag_compute")]
public class ag_compute
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
/// 绩效ID
/// </summary>
public Nullable<int> AllotId { get; set; }
/// <summary>
/// 二次绩效ID
/// </summary>
public Nullable<int> SecondId { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 人员名称
/// </summary>
public string PersonName { get; set; }
/// <summary>
/// 实发金额
/// </summary>
public Nullable<decimal> RealGiveFee { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_fixatitem.cs">
// * FileName: 二次绩效固定项.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
/// 二次绩效固定项
/// </summary>
[Table("ag_fixatitem")]
public class ag_fixatitem
{
/// <summary>
///
/// </summary>
[Key]
public int ID { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> AllotId { get; set; }
/// <summary>
/// 二次绩效ID
/// </summary>
public Nullable<int> SecondId { get; set; }
/// <summary>
///
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 行号
/// </summary>
public Nullable<int> RowNumber { get; set; }
/// <summary>
/// 项目名
/// </summary>
public string ItemName { get; set; }
/// <summary>
/// 值
/// </summary>
public string ItemValue { get; set; }
/// <summary>
/// 系数
/// </summary>
public Nullable<decimal> FactorValue { get; set; }
/// <summary>
/// 排序
/// </summary>
public Nullable<decimal> Sort { get; set; }
/// <summary>
/// 字段类型 1 顶部概况 2 表格固定 3 工作量
/// </summary>
public Nullable<int> Type { get; set; }
/// <summary>
/// 1 自动带出 2 计算得出
/// </summary>
public Nullable<int> SourceType { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_itemvalue.cs">
// * FileName: 科室二次绩效录入内容.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
/// 科室二次绩效录入内容
/// </summary>
[Table("ag_itemvalue")]
public class ag_itemvalue
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
/// 绩效Id
/// </summary>
public Nullable<int> AllotId { get; set; }
/// <summary>
/// 二次绩效ID
/// </summary>
public Nullable<int> SecondId { get; set; }
/// <summary>
/// 绩效项来源 1 模板 2 工作量
/// </summary>
public Nullable<int> SourceType { get; set; }
/// <summary>
/// 值
/// </summary>
public string Value { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_secondallot.cs">
// * FileName: 二次绩效列表.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
/// 二次绩效列表
/// </summary>
[Table("ag_secondallot")]
public class ag_secondallot
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
/// 绩效ID
/// </summary>
public Nullable<int> AllotId { get; set; }
/// <summary>
/// 科室类型
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 年
/// </summary>
public Nullable<int> Year { get; set; }
/// <summary>
/// 月
/// </summary>
public Nullable<int> Month { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 科室实发金额
/// </summary>
public Nullable<decimal> RealGiveFee { get; set; }
/// <summary>
/// 状态 1 未提交 2 等待审核 3 审核通过 4 驳回
/// </summary>
public Nullable<int> Status { get; set; }
/// <summary>
/// 提交时间
/// </summary>
public Nullable<DateTime> SubmitTime { get; set; }
/// <summary>
/// 审核时间
/// </summary>
public Nullable<DateTime> AuditTime { get; set; }
/// <summary>
/// 审核人
/// </summary>
public Nullable<int> AuditUser { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_temp.cs">
// * FileName: 二次绩效模板.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
/// 二次绩效模板
/// </summary>
[Table("ag_temp")]
public class ag_temp
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
/// 模板名称
/// </summary>
public string TempName { get; set; }
/// <summary>
/// 类型
/// </summary>
public string UnitType { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_tempitem.cs">
// * FileName: 二次绩效模板项.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
/// 二次绩效模板项
/// </summary>
[Table("ag_tempitem")]
public class ag_tempitem
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
/// 模板ID
/// </summary>
public Nullable<int> TempId { get; set; }
/// <summary>
/// 字段ID
/// </summary>
public string FiledId { get; set; }
/// <summary>
/// 字段名称
/// </summary>
public string FiledName { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> Sort { get; set; }
/// <summary>
/// 字段类型 1 顶部概况 2 表格固定
/// </summary>
public Nullable<int> Type { get; set; }
/// <summary>
/// 1 自动带出 2 计算得出
/// </summary>
public Nullable<int> SourceType { get; set; }
/// <summary>
/// 1 带出历史数据 2不带出
/// </summary>
public Nullable<int> IsBring { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_usetemp.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("ag_usetemp")]
public class ag_usetemp
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> HospitalId { get; set; }
/// <summary>
///
/// </summary>
public string Department { get; set; }
/// <summary>
///
/// </summary>
public string UnitType { get; set; }
/// <summary>
///
/// </summary>
public Nullable<int> UseTempId { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_workload.cs">
// * FileName: 二次绩效工作量绩效.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
/// 二次绩效工作量绩效
/// </summary>
[Table("ag_workload")]
public class ag_workload
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
/// 医院ID
/// </summary>
public Nullable<int> HospitalId { get; set; }
/// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
///
/// </summary>
public string UnitType { get; set; }
/// <summary>
/// 工作量考核项ID
/// </summary>
public string ItemId { get; set; }
/// <summary>
/// 工作量名称
/// </summary>
public string ItemName { get; set; }
/// <summary>
/// 工作量系数
/// </summary>
public Nullable<decimal> FactorValue { get; set; }
/// <summary>
///
/// </summary>
public Nullable<decimal> Sort { get; set; }
}
}
...@@ -27,6 +27,11 @@ public class cof_again ...@@ -27,6 +27,11 @@ public class cof_again
public Nullable<int> AllotID { get; set; } public Nullable<int> AllotID { get; set; }
/// <summary> /// <summary>
/// 科室
/// </summary>
public string Department { get; set; }
/// <summary>
/// 1 职称绩效 2 工作量绩效 3 满勤天数 /// 1 职称绩效 2 工作量绩效 3 满勤天数
/// </summary> /// </summary>
public Nullable<int> Type { get; set; } public Nullable<int> Type { get; set; }
......
...@@ -35,5 +35,10 @@ public class sys_role ...@@ -35,5 +35,10 @@ public class sys_role
/// 菜单状态 1 启用 2禁用 /// 菜单状态 1 启用 2禁用
/// </summary> /// </summary>
public int States { get; set; } public int States { get; set; }
/// <summary>
/// 父级角色
/// </summary>
public string ParentRoles { get; set; }
} }
} }
...@@ -118,9 +118,11 @@ public void Index([FromBody]AllotRequest request) ...@@ -118,9 +118,11 @@ public void Index([FromBody]AllotRequest request)
public void ExtractData([CustomizeValidator, FromBody]ExtractRequest request) public void ExtractData([CustomizeValidator, FromBody]ExtractRequest request)
{ {
LogHelper.Information("请求参数:" + JsonHelper.Serialize(request), "提取绩效数据"); LogHelper.Information("请求参数:" + JsonHelper.Serialize(request), "提取绩效数据");
logger.LogInformation("请求参数:" + JsonHelper.Serialize(request));
string filePath = newExtractService.ExtractData(request.AllotId, request.Email, request.HospitalId); string filePath = newExtractService.ExtractData(request.AllotId, request.Email, request.HospitalId);
if (!string.IsNullOrEmpty(filePath) && FileHelper.IsExistFile(filePath)) if (!string.IsNullOrEmpty(filePath) && FileHelper.IsExistFile(filePath))
{ {
logger.LogInformation("请求路径:" + url.ImportFile + ",请求参数" + JsonHelper.Serialize(new { allotId = request.AllotId, hospitalId = request.HospitalId }));
LogHelper.Information("请求路径:" + url.ImportFile + ",请求参数" + JsonHelper.Serialize(new { allotId = request.AllotId, hospitalId = request.HospitalId }), "保存提取文件"); LogHelper.Information("请求路径:" + url.ImportFile + ",请求参数" + JsonHelper.Serialize(new { allotId = request.AllotId, hospitalId = request.HospitalId }), "保存提取文件");
int i = 1; int i = 1;
while (i <= 5) while (i <= 5)
......
{ {
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Debug", "Default": "Debug",
"System": "Information", "System": "Information",
"Microsoft": "Information" "Microsoft": "Information"
} }
},
"AllowedHosts": "*",
//连接字符串
"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;",
//"PerformanceConnectionString": "server=116.62.245.55;database=db_xindu;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;",
"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"
},
//互亿
"HuyiSmsConfig": {
"Url": "http://106.ihuyi.cn/webservice/sms.php?method=Submit",
"Account": "cf_szjk",
"Password": "123456"
},
//阿里邮箱
"EmailOptions": {
"SmtpServer": "smtpdm.aliyun.com",
"Account": "service@email.suvalue.com",
"Password": "SuValue123456"
},
"Application": {
//登录过期时间
"ExpirationMinutes": "120",
//验证码过期
"SmsCodeMinutes": "30",
//短信模板
"SmsTemplate": "溯直健康提醒您,您的验证码为:[code],当天有效!",
//邮件指定接收人
"Receiver": [ "chengxiang.li@suvalue.com", "486035085@qq.com" ],
"AbsolutePath": "E:\\wwwroot\\testjx.suvalue.com",
"HttpPath": "http://testjx.suvalue.com:81"
},
"WebapiUrl": {
"ImportFirst": "",
"ExtractData": "",
"ImportFile": "http://localhost:5001/api/template/savefile"
} }
} }
{ {
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Warning" "Default": "Warning"
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
//连接字符串 //连接字符串
"AppConnection": { "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;", //"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;",
//"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;", "PerformanceConnectionString": "server=116.62.245.55;database=db_xindu;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;",
"HangfireConnectionString": "server=192.168.18.166;database=db_hangfire;uid=root;pwd=1234qwer;port=3306;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" "RedisConnectionString": "116.62.245.55:6379,defaultDatabase=2"
}, },
//互亿 //互亿
"HuyiSmsConfig": { "HuyiSmsConfig": {
"Url": "http://106.ihuyi.cn/webservice/sms.php?method=Submit", "Url": "http://106.ihuyi.cn/webservice/sms.php?method=Submit",
"Account": "cf_szjk", "Account": "cf_szjk",
"Password": "123456" "Password": "123456"
}, },
//阿里邮箱 //阿里邮箱
"EmailOptions": { "EmailOptions": {
"SmtpServer": "smtpdm.aliyun.com", "SmtpServer": "smtpdm.aliyun.com",
"Account": "service@email.suvalue.com", "Account": "service@email.suvalue.com",
"Password": "SuValue123456" "Password": "SuValue123456"
}, },
"Application": { "Application": {
//登录过期时间 //登录过期时间
"ExpirationMinutes": "120", "ExpirationMinutes": "120",
//验证码过期 //验证码过期
"SmsCodeMinutes": "30", "SmsCodeMinutes": "30",
//短信模板 //短信模板
"SmsTemplate": "溯直健康提醒您,您的验证码为:[code],当天有效!", "SmsTemplate": "溯直健康提醒您,您的验证码为:[code],当天有效!",
//邮件指定接收人 //邮件指定接收人
"Receiver": [ "chengxiang.li@suvalue.com", "486035085@qq.com" ], "Receiver": [ "chengxiang.li@suvalue.com", "486035085@qq.com" ],
"AbsolutePath": "E:\\wwwroot\\testjx.suvalue.com", "AbsolutePath": "E:\\wwwroot\\xindu.suvalue.com",
"HttpPath": "http://testjx.suvalue.com:81" "HttpPath": "https://xindu.suvalue.com"
}, },
"WebapiUrl": { "WebapiUrl": {
"ImportFirst": "", "ImportFirst": "",
"ExtractData": "", "ExtractData": "",
"ImportFile": "http://localhost:5001/api/template/savefile" "ImportFile": "https://xindu.suvalue.com/api/api/template/savefile"
} }
} }
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
public static partial class UtilExtensions
{
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
return first.AndAlso<T>(second, Expression.AndAlso);
}
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
return first.AndAlso<T>(second, Expression.OrElse);
}
private static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2, Func<Expression, Expression, BinaryExpression> func)
{
var parameter = Expression.Parameter(typeof(T));
var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
var left = leftVisitor.Visit(expr1.Body);
var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
var right = rightVisitor.Visit(expr2.Body);
return Expression.Lambda<Func<T, bool>>(
func(left, right), parameter);
}
private class ReplaceExpressionVisitor : ExpressionVisitor
{
private readonly Expression _oldValue;
private readonly Expression _newValue;
public ReplaceExpressionVisitor(Expression oldValue, Expression newValue)
{
_oldValue = oldValue;
_newValue = newValue;
}
public override Expression Visit(Expression node)
{
if (node == _oldValue)
return _newValue;
return base.Visit(node);
}
}
}
\ No newline at end of file
...@@ -15,5 +15,16 @@ public static string RemoveEnter(this string text) ...@@ -15,5 +15,16 @@ public static string RemoveEnter(this string text)
{ {
return text.Replace("\r", ""); return text.Replace("\r", "");
} }
/// <summary>
/// 分隔 移除空项
/// </summary>
/// <param name="text"></param>
/// <param name="separator"></param>
/// <returns></returns>
public static string[] SplitRemoveEmpty(this string text, params string[] separator)
{
return text.Split(separator, StringSplitOptions.RemoveEmptyEntries);
}
} }
} }
...@@ -21,5 +21,18 @@ public bool UpdateAllotStates(int allotId, int states, string remark) ...@@ -21,5 +21,18 @@ public bool UpdateAllotStates(int allotId, int states, string remark)
allot.Remark = remark; allot.Remark = remark;
return Update(allot); return Update(allot);
} }
public int ImportData(int allotId)
{
string sql = @"
delete from report_allot_summary where allotid=@allotId;
insert into report_allot_summary(allotid,year,month,hospitalid,realgivefee)
select allotid,year,month,hospitalid,realgivefee from view_report_allot_summary where allotid=@allotId;
delete from report_original_income where allotid=@allotId;
insert into report_original_income(allotid,year,month,hospitalid,sourcetype,accountingunit,department,typename,cellvalue)
select allotid,year,month,hospitalid,sourcetype,accountingunit,department,typename,cellvalue from view_report_original_income where allotid=@allotId;";
return Execute(sql, new { allotId });
}
} }
} }
//-----------------------------------------------------------------------
// <copyright file=" ag_compute.cs">
// * FileName: ag_compute.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// ag_compute Repository
/// </summary>
public partial class PerforAgcomputeRepository : PerforRepository<ag_compute>
{
public PerforAgcomputeRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_fixatitem.cs">
// * FileName: ag_fixatitem.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// ag_fixatitem Repository
/// </summary>
public partial class PerforAgfixatitemRepository : PerforRepository<ag_fixatitem>
{
public PerforAgfixatitemRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_itemvalue.cs">
// * FileName: ag_itemvalue.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// ag_itemvalue Repository
/// </summary>
public partial class PerforAgitemvalueRepository : PerforRepository<ag_itemvalue>
{
public PerforAgitemvalueRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_secondallot.cs">
// * FileName: ag_secondallot.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// ag_secondallot Repository
/// </summary>
public partial class PerforAgsecondallotRepository : PerforRepository<ag_secondallot>
{
public PerforAgsecondallotRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_temp.cs">
// * FileName: ag_temp.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// ag_temp Repository
/// </summary>
public partial class PerforAgtempRepository : PerforRepository<ag_temp>
{
public PerforAgtempRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_tempitem.cs">
// * FileName: ag_tempitem.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// ag_tempitem Repository
/// </summary>
public partial class PerforAgtempitemRepository : PerforRepository<ag_tempitem>
{
public PerforAgtempitemRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_usetemp.cs">
// * FileName: ag_usetemp.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// ag_usetemp Repository
/// </summary>
public partial class PerforAgusetempRepository : PerforRepository<ag_usetemp>
{
public PerforAgusetempRepository(PerformanceDbContext context) : base(context)
{
}
}
}
//-----------------------------------------------------------------------
// <copyright file=" ag_workload.cs">
// * FileName: ag_workload.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// ag_workload Repository
/// </summary>
public partial class PerforAgworkloadRepository : PerforRepository<ag_workload>
{
public PerforAgworkloadRepository(PerformanceDbContext context) : base(context)
{
}
}
}
...@@ -123,7 +123,7 @@ public List<res_baiscnorm> DocterNurseBaiscnorm(List<res_baiscnorm> baiscnormLis ...@@ -123,7 +123,7 @@ public List<res_baiscnorm> DocterNurseBaiscnorm(List<res_baiscnorm> baiscnormLis
//剔除不同科室相同核算单元 //剔除不同科室相同核算单元
var groupData = perData.Where(t => t.UnitType == info.UnitType.ToString()) var groupData = perData.Where(t => t.UnitType == info.UnitType.ToString())
.GroupBy(t => t.AccountingUnit) .GroupBy(t => t.AccountingUnit)
.Select(t => new { AccountingUnit = t.Key, Number = t.Sum(p => p.ManagerNumber + p.Number), PerforTotal = t.Max(p => p.PerforTotal) }); .Select(t => new { AccountingUnit = t.Key, Number = t.Sum(p => p.ManagerNumber + p.Number), PerforTotal = t.Sum(p => p.PerforTotal) });
var baiscnorm = new res_baiscnorm var baiscnorm = new res_baiscnorm
{ {
......
...@@ -450,7 +450,10 @@ public void ComputeCustomMinimum(PerExcel excel, List<PerSheet> perSheet, List<r ...@@ -450,7 +450,10 @@ public void ComputeCustomMinimum(PerExcel excel, List<PerSheet> perSheet, List<r
var workload = workdata == null ? null : workdata.FirstOrDefault(t => t.UnitType == unitType.ToString() && t.AccountingUnit == dept.Department); var workload = workdata == null ? null : workdata.FirstOrDefault(t => t.UnitType == unitType.ToString() && t.AccountingUnit == dept.Department);
//保底绩效 //保底绩效
var minimum = baiscnormList.FirstOrDefault(t => t.PositionName == dept.MinimumReference); var minimumReference = dept.MinimumReference;
if (dept.MinimumReference == EnumHelper.GetDescription(MinimumType.自定义保底))
minimumReference = GetCustomMinimumName(dept.Department, unitType.ToString());
var minimum = baiscnormList.FirstOrDefault(t => t.PositionName == minimumReference);
if (!string.IsNullOrEmpty(dept.MinimumReference) && minimum != null) if (!string.IsNullOrEmpty(dept.MinimumReference) && minimum != null)
dept.MinimumFee = minimum.AvgValue * (dept.MinimumFactor ?? 0) * (dept.ManagerNumber + dept.Number); dept.MinimumFee = minimum.AvgValue * (dept.MinimumFactor ?? 0) * (dept.ManagerNumber + dept.Number);
...@@ -484,7 +487,7 @@ public void ComputeCustomMinimum(PerExcel excel, List<PerSheet> perSheet, List<r ...@@ -484,7 +487,7 @@ public void ComputeCustomMinimum(PerExcel excel, List<PerSheet> perSheet, List<r
/// <returns></returns> /// <returns></returns>
private string GetCustomMinimumName(string department, string unitType) private string GetCustomMinimumName(string department, string unitType)
{ {
return $"{EnumHelper.GetDescription(MinimumType.自定义保底)}({unitType}{department})"; return $"{EnumHelper.GetDescription(MinimumType.自定义保底)}({unitType}-{department})";
} }
/// <summary> /// <summary>
......
...@@ -140,7 +140,7 @@ public void SpecialUnitCompute(PerExcel excel, per_allot allot, List<res_baiscno ...@@ -140,7 +140,7 @@ public void SpecialUnitCompute(PerExcel excel, per_allot allot, List<res_baiscno
// 新都医院在特殊科室计算时,如果取核算基数计算时带入人数计算 // 新都医院在特殊科室计算时,如果取核算基数计算时带入人数计算
decimal? headcount = null; decimal? headcount = null;
if (typeList.Any(o => o.Description == t.QuantitativeIndicators)) if (typeList.Any(o => o.Description == t.QuantitativeIndicators))
headcount = accountDataList.Sum(p => p.Number); headcount = group.Number;
if (!headcount.HasValue || headcount == 0) if (!headcount.HasValue || headcount == 0)
headcount = 1; headcount = 1;
return t.Quantity * t.QuantitativeIndicatorsValue * headcount; return t.Quantity * t.QuantitativeIndicatorsValue * headcount;
......
...@@ -38,6 +38,7 @@ public class AllotService : IAutoInjection ...@@ -38,6 +38,7 @@ public class AllotService : IAutoInjection
//private readonly IHubContext<AllotLogHub> hubContext; //private readonly IHubContext<AllotLogHub> hubContext;
private readonly LogManageService logManageService; private readonly LogManageService logManageService;
private readonly ReportService reportService;
public AllotService(PerforPerallotRepository allotRepository, public AllotService(PerforPerallotRepository allotRepository,
BaiscNormService baiscNormService, BaiscNormService baiscNormService,
...@@ -55,7 +56,8 @@ public class AllotService : IAutoInjection ...@@ -55,7 +56,8 @@ public class AllotService : IAutoInjection
PerforHospitalRepository perforHospitalRepository, PerforHospitalRepository perforHospitalRepository,
PerforResbaiscnormRepository perforResbaiscnormRepository, PerforResbaiscnormRepository perforResbaiscnormRepository,
//IHubContext<AllotLogHub> hubContext //IHubContext<AllotLogHub> hubContext
LogManageService logManageService) LogManageService logManageService,
ReportService reportService)
{ {
_allotRepository = allotRepository; _allotRepository = allotRepository;
_againallotRepository = againallotRepository; _againallotRepository = againallotRepository;
...@@ -75,6 +77,7 @@ public class AllotService : IAutoInjection ...@@ -75,6 +77,7 @@ public class AllotService : IAutoInjection
this.perforResbaiscnormRepository = perforResbaiscnormRepository; this.perforResbaiscnormRepository = perforResbaiscnormRepository;
//this.hubContext = hubContext; //this.hubContext = hubContext;
this.logManageService = logManageService; this.logManageService = logManageService;
this.reportService = reportService;
} }
#region 基础功能 #region 基础功能
...@@ -294,7 +297,13 @@ public void Generate(per_allot allot, string mail) ...@@ -294,7 +297,13 @@ public void Generate(per_allot allot, string mail)
perforResbaiscnormRepository.AddRange(baiscnormList.ToArray()); perforResbaiscnormRepository.AddRange(baiscnormList.ToArray());
UpdateAllotStates(allot.ID, (int)AllotStates.GenerateSucceed, EnumHelper.GetDescription(AllotStates.GenerateSucceed)); UpdateAllotStates(allot.ID, (int)AllotStates.GenerateSucceed, EnumHelper.GetDescription(AllotStates.GenerateSucceed));
logManageService.WriteMsg("正在生成报表数据", "正在生成报表数据", 1, allot.ID, "ReceiveMessage", true);
var res = reportService.ImportData(allot.ID);
logManageService.WriteMsg("正在生成报表数据", $"报表数据生成完成;受影响:{res}行", 1, allot.ID, "ReceiveMessage", true);
//发送邮件 //发送邮件
logManageService.WriteMsg("正在发送邮件", "正在发送邮件", 1, allot.ID, "ReceiveMessage", true);
SendEmail(allot, mail, 1, time); SendEmail(allot, mail, 1, time);
//logdbug.Add(allot.ID, "绩效开始执行", "绩效生成成功"); //logdbug.Add(allot.ID, "绩效开始执行", "绩效生成成功");
logManageService.WriteMsg("绩效生成结束", "绩效生成成功", 5, allot.ID, "ReceiveMessage", true); logManageService.WriteMsg("绩效生成结束", "绩效生成成功", 5, allot.ID, "ReceiveMessage", true);
...@@ -353,16 +362,20 @@ public void Pigeonhole(per_allot allot) ...@@ -353,16 +362,20 @@ public void Pigeonhole(per_allot allot)
{ {
allot.States = 8; allot.States = 8;
allot.Remark = "归档"; allot.Remark = "归档";
if (_allotRepository.Update(allot)) _allotRepository.Update(allot);
{ //if (_allotRepository.Update(allot))
var again = _againallotRepository.GetEntities(t => t.AllotID == allot.ID); //{
foreach (var item in again) // var again = _againallotRepository.GetEntities(t => t.AllotID == allot.ID);
{ // if (again != null && again.Count > 0)
item.Remark = $"原状态:{item.States},归档更改状态"; // {
item.States = 5; // foreach (var item in again)
_againallotRepository.Update(item); // {
} // item.Remark = $"原状态:{item.States},归档更改状态";
} // item.States = 5;
// _againallotRepository.Update(item);
// }
// }
//}
} }
/// <summary> /// <summary>
......
...@@ -24,6 +24,7 @@ public class ComputeService : IAutoInjection ...@@ -24,6 +24,7 @@ public class ComputeService : IAutoInjection
private readonly PerforAgemployeeRepository _perforAgemployeeRepository; private readonly PerforAgemployeeRepository _perforAgemployeeRepository;
private readonly PerforResbaiscnormRepository perforResbaiscnormRepository; private readonly PerforResbaiscnormRepository perforResbaiscnormRepository;
private readonly PerforCofincomeRepository _perforCofincomeRepository; private readonly PerforCofincomeRepository _perforCofincomeRepository;
private readonly PerforAgsecondallotRepository _perforAgsecondallotRepository;
public ComputeService(PerforResaccountRepository perforResaccountRepository, public ComputeService(PerforResaccountRepository perforResaccountRepository,
//PerforResaccountnurseRepository perforResAccountnurseRepository, //PerforResaccountnurseRepository perforResAccountnurseRepository,
...@@ -35,7 +36,8 @@ public class ComputeService : IAutoInjection ...@@ -35,7 +36,8 @@ public class ComputeService : IAutoInjection
PerforUserRepository perforUserRepository, PerforUserRepository perforUserRepository,
PerforAgemployeeRepository perforAgemployeeRepository, PerforAgemployeeRepository perforAgemployeeRepository,
PerforResbaiscnormRepository perforResbaiscnormRepository, PerforResbaiscnormRepository perforResbaiscnormRepository,
PerforCofincomeRepository perforCofincomeRepository) PerforCofincomeRepository perforCofincomeRepository,
PerforAgsecondallotRepository perforAgsecondallotRepository)
{ {
this.perforResaccountRepository = perforResaccountRepository; this.perforResaccountRepository = perforResaccountRepository;
//this._perforResAccountnurseRepository = perforResAccountnurseRepository; //this._perforResAccountnurseRepository = perforResAccountnurseRepository;
...@@ -48,6 +50,7 @@ public class ComputeService : IAutoInjection ...@@ -48,6 +50,7 @@ public class ComputeService : IAutoInjection
this._perforAgemployeeRepository = perforAgemployeeRepository; this._perforAgemployeeRepository = perforAgemployeeRepository;
this.perforResbaiscnormRepository = perforResbaiscnormRepository; this.perforResbaiscnormRepository = perforResbaiscnormRepository;
this._perforCofincomeRepository = perforCofincomeRepository; this._perforCofincomeRepository = perforCofincomeRepository;
this._perforAgsecondallotRepository = perforAgsecondallotRepository;
} }
/// <summary> /// <summary>
...@@ -306,20 +309,21 @@ public List<res_baiscnorm> GetBaiscnorm(int allotId) ...@@ -306,20 +309,21 @@ public List<res_baiscnorm> GetBaiscnorm(int allotId)
/// <param name="accountId"></param> /// <param name="accountId"></param>
/// <param name="type"></param> /// <param name="type"></param>
/// <returns></returns> /// <returns></returns>
public DeptDataDetails DeptDetail(int allotId, int accountId, int type) public DeptDataDetails DeptDetail(int accountId)
{ {
var sheetType = new List<int> { (int)SheetType.Income, (int)SheetType.OtherIncome, (int)SheetType.Expend, (int)SheetType.Workload }; var sheetType = new List<int> { (int)SheetType.Income, (int)SheetType.OtherIncome, (int)SheetType.Expend, (int)SheetType.Workload };
var doctor = perforResaccountRepository.GetEntity(t => t.UnitType == type && t.AllotID == allotId && t.ID == accountId); var doctor = perforResaccountRepository.GetEntity(t => t.ID == accountId);
string typeValue = EnumHelper.GetItems<UnitType>().FirstOrDefault(t => t.Value == type).Name.ToString(); string typeValue = EnumHelper.GetItems<UnitType>().FirstOrDefault(t => t.Value == doctor.UnitType).Name.ToString();
DeptDataDetails deptDetails = new DeptDataDetails DeptDataDetails deptDetails = new DeptDataDetails
{ {
Pandect = Mapper.Map<PerDataAccountBaisc>(doctor), Pandect = Mapper.Map<PerDataAccountBaisc>(doctor),
Detail = new List<DetailDtos>() Detail = new List<DetailDtos>()
}; };
int type = doctor.UnitType.Value;
if (type == (int)UnitType.专家组 || type == (int)UnitType.其他组) if (type == (int)UnitType.专家组 || type == (int)UnitType.其他组)
type = 1; type = 1;
var basicData = _perforImDataRepository.GetEntities(t => t.AllotID == allotId && t.UnitType == type && t.AccountingUnit == doctor.AccountingUnit); var basicData = _perforImDataRepository.GetEntities(t => t.AllotID == doctor.AllotID && t.UnitType == type && t.AccountingUnit == doctor.AccountingUnit);
var persheet = _perforPerSheetRepository.GetEntities(t => t.AllotID == allotId); var persheet = _perforPerSheetRepository.GetEntities(t => t.AllotID == doctor.AllotID);
//科室经济 //科室经济
var sheetEconomic = persheet.FirstOrDefault(t => t.SheetType == (int)SheetType.ComputeEconomic); var sheetEconomic = persheet.FirstOrDefault(t => t.SheetType == (int)SheetType.ComputeEconomic);
...@@ -353,5 +357,18 @@ public DeptDataDetails DeptDetail(int allotId, int accountId, int type) ...@@ -353,5 +357,18 @@ public DeptDataDetails DeptDetail(int allotId, int accountId, int type)
} }
return deptDetails; return deptDetails;
} }
public int GetAccountId(int secondId)
{
var second = _perforAgsecondallotRepository.GetEntity(t => t.Id == secondId);
if (second != null)
{
var unitType = EnumHelper.GetItems<UnitType>().FirstOrDefault(t => t.Name == second.UnitType);
var account = perforResaccountRepository.GetEntity(t => t.AllotID == second.AllotId && t.UnitType == unitType.Value && t.Department == second.Department);
return account?.ID ?? 0;
}
return 0;
}
} }
} }
...@@ -495,7 +495,7 @@ public void Copy(per_allot allot) ...@@ -495,7 +495,7 @@ public void Copy(per_allot allot)
if (data == null || data.Count == 0) if (data == null || data.Count == 0)
{ {
var again = _againRepository.GetEntities(t => t.AllotID == allotId) ?? _againRepository.GetEntities(t => t.AllotID == -1); var again = _againRepository.GetEntities(t => t.AllotID == allotId) ?? _againRepository.GetEntities(t => t.AllotID == -1);
var newAgains = again.Select(t => new cof_again { AllotID = allot.ID, Type = t.Type, TypeName = t.TypeName, Value = t.Value }); var newAgains = again.Select(t => new cof_again { AllotID = allot.ID, Type = t.Type, Department = t.Department, TypeName = t.TypeName, Value = t.Value });
_againRepository.AddRange(newAgains.ToArray()); _againRepository.AddRange(newAgains.ToArray());
} }
} }
...@@ -537,6 +537,7 @@ public cof_again AgainUpdate(CofAgainRequest request) ...@@ -537,6 +537,7 @@ public cof_again AgainUpdate(CofAgainRequest request)
throw new PerformanceException($"ID不存在 :{request.ID}"); throw new PerformanceException($"ID不存在 :{request.ID}");
again.Type = request.Type; again.Type = request.Type;
again.Department = request.Department;
again.TypeName = request.TypeName; again.TypeName = request.TypeName;
again.Value = request.Value; again.Value = request.Value;
...@@ -592,7 +593,12 @@ public List<TitleValue> WorkHeader(int allotId) ...@@ -592,7 +593,12 @@ public List<TitleValue> WorkHeader(int allotId)
if (sheets == null) if (sheets == null)
return new List<TitleValue>(); return new List<TitleValue>();
var header = perforImheaderRepository.GetEntities(t => sheets.Select(s => s.ID).Contains(t.SheetID.Value) && !t.CellValue.Contains("核算单元") && t.CellValue != "科室名称")?.ToList(); var header = perforImheaderRepository.GetEntities(t => sheets.Select(s => s.ID).Contains(t.SheetID.Value) && !t.CellValue.Contains("核算单元") && t.CellValue != "科室名称")?.ToList();
return header?.Select(t => new TitleValue { Title = t.CellValue, Value = t.CellValue }).Distinct().ToList(); if (header != null && header.Count > 0)
{
var list = header.Select(t => t.CellValue).Where(t => !string.IsNullOrEmpty(t)).Distinct();
return list?.Select(t => new TitleValue { Title = t, Value = t }).ToList();
}
return null;
} }
} }
} }
...@@ -167,7 +167,7 @@ public List<cof_guarantee> GuarantUpdate(GuaranteeRequest request) ...@@ -167,7 +167,7 @@ public List<cof_guarantee> GuarantUpdate(GuaranteeRequest request)
var exist = request.Source.Where(t => t.GId.HasValue && t.GId != 0).Select(t => t.GId); var exist = request.Source.Where(t => t.GId.HasValue && t.GId != 0).Select(t => t.GId);
guaranteeList.ForEach(t => guaranteeList.ForEach(t =>
{ {
if (exist.Contains(t.Id) && !filterList.Select(s => s.Source).Contains(t.Source)) if (exist.Contains(t.Id) && filterList.Select(s => s.Source).Contains(t.Source))
t.Source = request.Source.FirstOrDefault(s => s.GId == t.Id).GValue; t.Source = request.Source.FirstOrDefault(s => s.GId == t.Id).GValue;
else else
delItem.Add(t.Id); delItem.Add(t.Id);
......
...@@ -233,19 +233,19 @@ private void WriteOtherIncome(ISheet sheet, int hospitalId, IPerSheetDataRead sh ...@@ -233,19 +233,19 @@ private void WriteOtherIncome(ISheet sheet, int hospitalId, IPerSheetDataRead sh
//写入列头信息 //写入列头信息
foreach (var item in itemList) foreach (var item in itemList)
{ {
var headcell = head.GetCell(cellStartIndex); var headcell = head.GetCell(cellStartIndex) ?? head.CreateCell(cellStartIndex);
headcell.SetCellValue(item.ItemName); headcell.SetCellValue(item.ItemName);
headcell.CellStyle = CellStyle.CreateCellStyle(workbook, StyleType.列头); headcell.CellStyle = CellStyle.CreateCellStyle(workbook, StyleType.列头);
var doctorcell = doctorFactor.GetCell(cellStartIndex); var doctorcell = doctorFactor.GetCell(cellStartIndex) ?? doctorFactor.CreateCell(cellStartIndex);
doctorcell.SetCellValue(item.FactorValue1 != null ? (double)item.FactorValue1 : 0); doctorcell.SetCellValue(item.FactorValue1 != null ? (double)item.FactorValue1 : 0);
doctorcell.CellStyle = CellStyle.CreateCellStyle(workbook, StyleType.系数, CellFormat.百分比); doctorcell.CellStyle = CellStyle.CreateCellStyle(workbook, StyleType.系数, CellFormat.百分比);
var nursecell = nurseFactor.GetCell(cellStartIndex); var nursecell = nurseFactor.GetCell(cellStartIndex) ?? nurseFactor.CreateCell(cellStartIndex);
nursecell.SetCellValue(item.FactorValue2 != null ? (double)item.FactorValue2 : 0); nursecell.SetCellValue(item.FactorValue2 != null ? (double)item.FactorValue2 : 0);
nursecell.CellStyle = CellStyle.CreateCellStyle(workbook, StyleType.系数, CellFormat.百分比); nursecell.CellStyle = CellStyle.CreateCellStyle(workbook, StyleType.系数, CellFormat.百分比);
var techniciancell = technicianFactor.GetCell(cellStartIndex); var techniciancell = technicianFactor.GetCell(cellStartIndex) ?? technicianFactor.CreateCell(cellStartIndex);
techniciancell.SetCellValue(item.FactorValue3 != null ? (double)item.FactorValue3 : 0); techniciancell.SetCellValue(item.FactorValue3 != null ? (double)item.FactorValue3 : 0);
techniciancell.CellStyle = CellStyle.CreateCellStyle(workbook, StyleType.系数, CellFormat.百分比); techniciancell.CellStyle = CellStyle.CreateCellStyle(workbook, StyleType.系数, CellFormat.百分比);
cellStartIndex++; cellStartIndex++;
......
...@@ -159,8 +159,9 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a ...@@ -159,8 +159,9 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a
{ {
//if (!accountbasic.ManagerNumber.HasValue || accountbasic.ManagerNumber.Value == 0) //if (!accountbasic.ManagerNumber.HasValue || accountbasic.ManagerNumber.Value == 0)
// continue; // continue;
if (!accountbasic.DoctorDirectorNumber.HasValue || accountbasic.DoctorDirectorNumber.Value == 0) if ((!accountbasic.DoctorDirectorNumber.HasValue && "皮肤科" != accountbasic.DoctorAccountingUnit) || (accountbasic.DoctorDirectorNumber.Value == 0 && "皮肤科" != accountbasic.DoctorAccountingUnit))
continue; continue;
//原不存在科主任则跳过科主任绩效计算20190920新都 //原不存在科主任则跳过科主任绩效计算20190920新都
//是否共用核算单元 //是否共用核算单元
var isShare = multi.Any(group => group.UnitType == accountbasic.UnitType && group.DoctorAccountingUnit == accountbasic.DoctorAccountingUnit); var isShare = multi.Any(group => group.UnitType == accountbasic.UnitType && group.DoctorAccountingUnit == accountbasic.DoctorAccountingUnit);
...@@ -172,9 +173,33 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a ...@@ -172,9 +173,33 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a
var resAccount = dataList.Where(t => t.UnitType == accountbasic.UnitType && t.AccountingUnit == accountbasic.DoctorAccountingUnit); var resAccount = dataList.Where(t => t.UnitType == accountbasic.UnitType && t.AccountingUnit == accountbasic.DoctorAccountingUnit);
var number = resAccount.OrderByDescending(t => t.ManagerNumber).Sum(t => t.ManagerNumber + t.Number); var number = resAccount.OrderByDescending(t => t.ManagerNumber).Sum(t => t.ManagerNumber + t.Number);
var perforTotal = resAccount.Sum(t => t.PerforTotal); var perforTotal = resAccount.Sum(t => t.PerforTotal);
var avg = resAccount.Average(t => t.Avg); //var avg = resAccount.Average(t => t.Avg);
//绩效参考标准,不使用实发绩效 //绩效参考标准,不使用实发绩效
var realAvg = resAccount.Sum(t => (t.ManagerNumber + t.Number) == 0 ? 0 : t.RealGiveFee / (t.ManagerNumber + t.Number)) / resAccount.Count(); //var realAvg = resAccount.Sum(t => (t.ManagerNumber + t.Number) == 0 ? 0 : t.RealGiveFee / (t.ManagerNumber + t.Number)) / resAccount.Count();
//var realAvg = resAccount.Sum(t => t.Number + t.ManagerNumber) == 0 ? 0 : resAccount.Sum(t => t.RealGiveFee) / resAccount.Sum(t => t.Number + t.ManagerNumber);
decimal? realAvg = 0;
bool isAvg = true;
//if ("内五科" == accountbasic.DoctorAccountingUnit && isShare)
// realAvg = resAccount.Sum(r => r.Number + r.ManagerNumber) == 0 ? 0 : resAccount.Sum(r => r.RealGiveFee) / resAccount.Sum(r => r.Number);
//else
//{
foreach (var item in resAccount)
{
if ((item.ManagerNumber + item.Number) == 0)
{
isAvg = false;
realAvg = resAccount.Sum(r => r.Number + r.ManagerNumber) == 0 ? 0 : resAccount.Sum(r => r.RealGiveFee) / resAccount.Sum(r => r.Number + r.ManagerNumber);
break;
}
else
{
realAvg += item.RealGiveFee / (item.ManagerNumber + item.Number);
}
}
if (isAvg)
realAvg = realAvg / resAccount.Count();
//}
var realGiveFee = resAccount.Sum(t => t.RealGiveFee); var realGiveFee = resAccount.Sum(t => t.RealGiveFee);
...@@ -210,9 +235,9 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a ...@@ -210,9 +235,9 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a
OtherPerfor = empolyee.OtherPerfor, OtherPerfor = empolyee.OtherPerfor,
Number = number, Number = number,
PerforTotal = perforTotal, PerforTotal = realGiveFee,
Avg = avg, Avg = realAvg,
Efficiency = avg * (accountbasic.DoctorEffic ?? 1), Efficiency = realAvg * (accountbasic.DoctorEffic ?? 1),
Scale = perforTotal * (accountbasic.DoctorScale ?? 1), Scale = perforTotal * (accountbasic.DoctorScale ?? 1),
Adjust = empolyee.Adjust, Adjust = empolyee.Adjust,
Remark = isShare ? "特殊科室主任,共用核算单元" : "" Remark = isShare ? "特殊科室主任,共用核算单元" : ""
...@@ -226,7 +251,7 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a ...@@ -226,7 +251,7 @@ public List<ComputeResult> Compute(List<ComputeEmployee> empolyeeList, List<im_a
//实发绩效 //实发绩效
compute.RealGiveFee = (compute.GiveFee * compute.ScoreAverageRate + (compute.Punishment ?? 0) + (compute.OtherPerfor ?? 0)) * (compute.Adjust ?? 1m); compute.RealGiveFee = (compute.GiveFee * compute.ScoreAverageRate + (compute.Punishment ?? 0) + (compute.OtherPerfor ?? 0)) * (compute.Adjust ?? 1m);
// 参考基数专用绩效合计 // 参考基数专用绩效合计
compute.BaiscNormPerforTotal = avg + compute.ShouldGiveFee; compute.BaiscNormPerforTotal = compute.RealGiveFee;
computeList.Add(compute); computeList.Add(compute);
} }
......
...@@ -63,7 +63,7 @@ public dynamic Survey(int hospitalId) ...@@ -63,7 +63,7 @@ public dynamic Survey(int hospitalId)
var allot = allotList.OrderByDescending(t => t.Year).ThenByDescending(t => t.Month).FirstOrDefault(); var allot = allotList.OrderByDescending(t => t.Year).ThenByDescending(t => t.Month).FirstOrDefault();
var keyvalue = new Dictionary<string, decimal>(); var keyvalue = new Dictionary<string, decimal>();
var basicList = perforResbaiscnormRepository.GetEntities(t => t.AllotID == allot.ID); var basicList = perforResbaiscnormRepository.GetEntities(t => t.AllotID == allot.ID && t.PositionName.IndexOf("保底") < 0);
if (basicList != null) if (basicList != null)
{ {
foreach (var basic in basicList) foreach (var basic in basicList)
...@@ -71,17 +71,6 @@ public dynamic Survey(int hospitalId) ...@@ -71,17 +71,6 @@ public dynamic Survey(int hospitalId)
keyvalue.Add(basic.PositionName, Math.Round(basic.AvgValue.Value, 2)); keyvalue.Add(basic.PositionName, Math.Round(basic.AvgValue.Value, 2));
} }
} }
var fee = perforHospersonfeeRepository.GetEntities(t => t.Year == allot.Year && t.Month == allot.Month);
if (fee != null)
{
keyvalue.Add("门诊患者均次", Math.Round(fee.Where(t => t.Source == "门诊").Sum(t => t.Fee.Value) / fee.Where(t => t.Source == "门诊").Sum(t => t.PersonTime.Value), 2));
keyvalue.Add("住院患者均次", Math.Round(fee.Where(t => t.Source == "住院").Sum(t => t.Fee.Value) / fee.Where(t => t.Source == "住院").Sum(t => t.PersonTime.Value), 2));
}
else
{
keyvalue.Add("门诊患者均次", 0M);
keyvalue.Add("住院患者均次", 0M);
}
return new return new
{ {
year = allot.Year, year = allot.Year,
...@@ -123,7 +112,7 @@ public List<PerReport> DoctorAvg(int hospitalId, int isIndex) ...@@ -123,7 +112,7 @@ public List<PerReport> DoctorAvg(int hospitalId, int isIndex)
} }
/// <summary> /// <summary>
/// 科室医生人均绩效(含科主任 /// 科室护理人均绩效(含护士长
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public List<PerReport> NurseAvg(int hospitalId, int isIndex) public List<PerReport> NurseAvg(int hospitalId, int isIndex)
...@@ -234,5 +223,101 @@ public List<PerReport> Income(int hospitalId, int isIndex) ...@@ -234,5 +223,101 @@ public List<PerReport> Income(int hospitalId, int isIndex)
} }
return perforReportRepository.Income(hospitalId, date); return perforReportRepository.Income(hospitalId, date);
} }
internal int ImportData(int allotId)
{
try
{
return perforPerallotRepository.ImportData(allotId);
}
catch { }
return 0;
}
/// <summary>
/// 首页
/// </summary>
/// <param name="hospitalId"></param>
/// <returns></returns>
public List<PerReport> IndexReport(int hospitalId, string source)
{
var states = new List<int>() { 6, 8 };
var allotList = perforPerallotRepository.GetEntities(t => t.HospitalId == hospitalId && states.Contains(t.States));
if (allotList == null || !allotList.Any())
throw new PerformanceException("用户未创建绩效!");
var allot = allotList.OrderByDescending(t => t.Year).ThenByDescending(t => t.Month).FirstOrDefault();
var currentDate = allot.Year + "-" + allot.Month.ToString().PadLeft(2, '0'); //本月
var yoyDate = (allot.Year - 1) + "-" + allot.Month.ToString().PadLeft(2, '0'); //同比
var chainDate = allot.Year + "-" + (allot.Month - 1).ToString().PadLeft(2, '0'); //环比
var report = new List<PerReport>();
switch (source)
{
case "医院收入结构占比":
report = perforReportRepository.InHosIncome(hospitalId, currentDate);
break;
case "绩效发放金额":
report = perforReportRepository.PerforPayment(hospitalId, currentDate, yoyDate, chainDate);
break;
case "绩效发放金额占全院收入占比":
report = perforReportRepository.IndexPerforRatio(hospitalId, currentDate, yoyDate, chainDate);
break;
case "药占比":
report = perforReportRepository.IndexDrugRatio(hospitalId, currentDate, yoyDate, chainDate);
break;
case "材料占比":
report = perforReportRepository.IndexMaterialRatio(hospitalId, currentDate, yoyDate, chainDate);
break;
case "结构占比":
report = perforReportRepository.IndexStructRatio(hospitalId, currentDate);
break;
}
return report;
}
/// <summary>
/// 菜单
/// </summary>
/// <param name="hospitalId"></param>
/// <returns></returns>
public List<PerReport> MenuReport(ReportRequest request)
{
var report = new List<PerReport>();
switch (request.Source)
{
case "业务总收入":
report = perforReportRepository.GeneralIncome(request);
break;
case "门诊住院业务收入占比":
report = perforReportRepository.InHosIncome(request);
break;
case "业务收入结构占比":
report = perforReportRepository.StructRatio(request);
break;
case "药占比":
report = perforReportRepository.DrugRatio(request);
break;
case "材料占比":
report = perforReportRepository.MaterialRatio(request);
break;
case "绩效发放金额占全院收入占比":
report = perforReportRepository.PerforRatio(request);
break;
case "绩效群体收入":
report = perforReportRepository.PerforGroup(request);
break;
case "医生核算单元人均绩效":
report = perforReportRepository.DoctorAvg(request);
break;
case "护理核算单元人均绩效":
report = perforReportRepository.NurseAvg(request);
break;
}
return report;
}
} }
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
using Performance.DtoModels; using Performance.DtoModels;
using Performance.DtoModels.AppSettings; using Performance.DtoModels.AppSettings;
using Performance.EntityModels; using Performance.EntityModels;
using Performance.Infrastructure;
using Performance.Repository; using Performance.Repository;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
...@@ -303,10 +304,20 @@ public UserResponse UpdatePwd(PasswordRequest request, int userId) ...@@ -303,10 +304,20 @@ public UserResponse UpdatePwd(PasswordRequest request, int userId)
/// 角色列表 /// 角色列表
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public List<sys_role> RoleList() public List<sys_role> RoleList(int userId)
{ {
var role = _roleRepository.GetEntities(t => t.States == 1); var user = _userroleRepository.GetEntity(t => t.UserID == userId);
return role; if (user == null)
throw new PerformanceException("登录用户不存在!");
var roles = _roleRepository.GetEntities(t => t.States == 1);
var role = roles.FirstOrDefault(s => s.ID == user.RoleID);
if (user == null)
throw new PerformanceException("当前用户角色无效!");
List<sys_role> result = new List<sys_role>() { role };
GetChildrenRole(roles, role.ID, result);
return result;
} }
/// <summary> /// <summary>
...@@ -325,5 +336,25 @@ public List<TitleValue> Department(int hospitalID) ...@@ -325,5 +336,25 @@ public List<TitleValue> Department(int hospitalID)
} }
return new List<TitleValue>(); return new List<TitleValue>();
} }
/// <summary>
/// 递归获取所有下属角色
/// </summary>
/// <param name="roles"></param>
/// <param name="roleId"></param>
/// <param name="result"></param>
private void GetChildrenRole(List<sys_role> roles, int roleId, List<sys_role> result)
{
foreach (var role in roles.Where(s => !string.IsNullOrEmpty(s.ParentRoles)))
{
if (role.ParentRoles.SplitRemoveEmpty(",").Contains(roleId.ToString()))
{
result.Add(role);
GetChildrenRole(roles, role.ID, result);
}
}
}
} }
} }
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